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查看状态机实时状态。