ROS
一、創建工作空間目錄
/home/wict/workspace/hudahua/ros/catkin_ws
#初始化工作空間(僅需一次)
catkin_init_workspace
二:回到根目錄編譯
#創建正確的工作空間結構(如果尚未創建)
mkdir -p ~/workspace/hudahua/ros/catkin_ws/src
cd ~/workspace/hudahua/ros/catkin_ws/src
#將你的源碼包包移動到src目錄下(假設原包在上級目錄)
mv ../../my_state_machine .
# 進入工作空間根目錄
cd ~/workspace/hudahua/ros/catkin_ws# 編譯所有包
catkin_make# 編譯后更新環境變量
source devel/setup.bash
驗證包是否被識別
# 檢查ROS能否找到你的包
rospack find my_state_machine
# 應輸出路徑:/home/wict/.../catkin_ws/src/my_state_machine
三、創建ROS包
創建一個新的ROS包并添加依賴:
catkin_create_pkg my_state_machine rospy smach smach_ros std_msgs
cd my_state_machine
mkdir scripts
編寫狀態機代碼
在scripts目錄下創建Python腳本(如state_machine.py),示例代碼如下:
#!/usr/bin/env python3
import rospy
from smach import State, StateMachine
from smach_ros import IntrospectionServer# 定義狀態類
class StateA(State):def __init__(self):State.__init__(self, outcomes=['succeeded', 'failed'])def execute(self, userdata):rospy.loginfo("Executing State A")rospy.sleep(2)return 'succeeded' # 或 'failed' 測試不同轉移class StateB(State):def __init__(self):State.__init__(self, outcomes=['succeeded'])def execute(self, userdata):rospy.loginfo("Executing State B")rospy.sleep(1)return 'succeeded'def main():rospy.init_node('my_state_machine')# 創建狀態機sm = StateMachine(outcomes=['exit'])with sm:# 添加狀態并定義轉移StateMachine.add('STATE_A', StateA(),transitions={'succeeded': 'STATE_B', 'failed': 'exit'})StateMachine.add('STATE_B', StateB(),transitions={'succeeded': 'STATE_A'})# 啟動可視化服務器(可選)sis = IntrospectionServer('smach_server', sm, '/SM_ROOT')sis.start()# 執行狀態機outcome = sm.execute()rospy.spin()sis.stop()if __name__ == '__main__':main()
確保腳本位于正確目錄
根據你的目錄結構,腳本應放在 my_state_machine/scripts 而非 src 目錄下:
chmod +x scripts/state_machine.py
配置CMakeLists.txt
在 my_state_machine/CMakeLists.txt 末尾添加以下內容,確保ROS能識別Python腳本:
# 安裝Python腳本到ROS的包路徑
catkin_install_python(PROGRAMS scripts/state_machine.pyDESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
確認工作空間結構
Catkin工作空間的標準結構如下:
catkin_ws/ # 工作空間根目錄(必須在此運行catkin_make)
├── build/ # 自動生成
├── devel/ # 自動生成
└── src/ # 用戶代碼目錄
└── my_state_machine/ # 你的ROS包(必須在此!)
├── CMakeLists.txt
├── package.xml
└── scripts/
四、編譯并更新環境
# 回到工作空間根目錄
cd ~/workspace/hudahua/ros/catkin_ws# 清理舊編譯緩存(可選)
rm -rf build/ devel/# 重新編譯
catkin_make# 更新環境變量
source devel/setup.bash
五、驗證運行
啟動狀態機
roscore
運行狀態機節點
rosrun my_state_machine state_machine.py
可視化狀態機(可選)
新終端中啟動smach_viewer:
rosrun smach_viewer smach_viewer.py
訪問localhost:8080查看狀態機實時狀態。