ROS2 从零实现自定义消息 + Python 话题收发(踩坑全过程,新手直接抄作业)

📅 2026/7/2 4:37:11
ROS2 从零实现自定义消息 + Python 话题收发(踩坑全过程,新手直接抄作业)
文章目录前言一、项目需求二、使用步骤1.引入库2.读入数据总结前言咱就是说刚学 ROS2 自定义消息的时候我差点被各种 CMake、package.xml 配置搞崩溃编译报错、IDE 疯狂报红、包名写错连环踩坑折腾一下午才跑通完整流程。今天把完整步骤 踩坑记录整理出来零基础同学照着做就能成功代码全是实测可用的不用自己瞎改一、项目需求搭建工作空间 wsy创建两个功能包base_interfaces_demo自定义消息包定义 Student.msg包含姓名、年龄、身高py01_topicPython 话题包实现发布者循环发送学生数据 订阅者接收打印数据二、完整实操步骤1. 创建工作空间 自定义消息包mkdir -p ~/wsy/src cd ~/wsy/src ros2 pkg create --build-type ament_cmake base_interfaces_demo进入包目录新建 msg 文件夹创建 Student.msg 文件cd base_interfaces_demo mkdir msg cd msg nano Student.msg写入消息内容string name int32 age float32 height关键说明目录结构需遵循ROS 2规范消息文件必须放在包的msg目录下消息字段类型支持标准ROS 2类型如string/uint32和数组类型如float32[]保存文件后需在package.xml和CMakeLists.txt中配置消息生成依赖保存退出CtrlO 回车CtrlX2.修改 package.xmlcd ../ nano package.xmlcd ../切换到当前目录的上一级目录。nano package.xml使用nano文本编辑器打开或创建package.xml文件。buildtool_dependrosidl_default_generators/buildtool_depend exec_dependrosidl_default_runtime/exec_depend member_of_grouprosidl_interface_packages/member_of_group找到 buildtool_dependament_cmake/buildtool_depend下面粘贴三行3.修改CMakeLists.txt找到 find_package (ament_cmake REQUIRED)下方加一行find_package(rosidl_default_generators REQUIRED)文件最底部ament_package () 上方插入代码rosidl_generate_interfaces(${PROJECT_NAME} msg/Student.msg ) ament_export_dependencies(rosidl_default_runtime)注意代码前面不能加 #加了等于注释失效4.创建Python功能包新建Python包并编写发布者代码ros2 pkg create --build-type ament_python py01_topic在 py01_topic/py01_topic 文件夹新建两个 py 文件 demo03_talker_stu_py.py发布者发布者实现(demo03_talker_stu_py.py)import rclpy from rclpy.node import Node from base_interfaces_demo.msg import Student class MinimalPublisher(Node): def __init__(self): super().__init__(stu_publisher_py) self.publisher_ self.create_publisher(Student, topic_stu, 10) timer_period 0.5 self.timer self.create_timer(timer_period, self.timer_callback) self.i 0 def timer_callback(self): stu Student() stu.name 李四 stu.age self.i stu.height 1.70 self.publisher_.publish(stu) self.get_logger().info(f发布学生信息(py): name{stu.name},age{stu.age},height{stu.height:.2f}) self.i 1订阅者实现(demo04_listener_stu_py.py)import rclpy from rclpy.node import Node from base_interfaces_demo.msg import Student class MinimalSubscriber(Node): def __init__(self): super().__init__(stu_subscriber_py) self.subscription self.create_subscription( Student, topic_stu, self.listener_callback, 10) def listener_callback(self, msg): self.get_logger().info(f订阅收到学生姓名:{msg.name},年龄:{msg.age},身高:{msg.height:.2f})5.配置 setup.py 注册可执行文件打开 py01_topic 下 setup.py找到 entry_points修改为entry_points{ console_scripts: [ demo03_talker_stu_py py01_topic.demo03_talker_stu_py:main, demo04_listener_stu_py py01_topic.demo04_listener_stu_py:main ], },6. 编译 刷新环境cd ~/wsy rm -rf build install log colcon build . install/setup.bash出现 3 packages finished 代表编译成功7. 双终端运行测试终端 1发布. install/setup.bash ros2 run py01_topic demo03_talker_stu_py终端 2订阅cd ~/wsy . install/setup.bash ros2 run py01_topic demo04_listener_stu_py发布端每隔 0.5s 发送学生数据订阅端实时打印通信成功 CtrlC 可以停止程序。三、踩坑总结写 msg 文件时直接在终端输入 string name报找不到命令 解决必须用 nano 编辑器写入不能直接敲终端编译报错Could not find a package configuration file provided by base_interfaces 原因cpp 包 CMakeLists 里包名少写_demo改成 base_interfaces_demo 即可代码 from base_interfaces_demo.msg import Student终端能跑IDE 疯狂报红 重点这个不算报错程序完全正常运行只是 CodeArts IDE 静态识别不到生成的消息库 解决办法CtrlShiftP执行 Python: Restart Language Server重启语言服务不用硬改只读配置文件改了也保存不了CMakeLists.txt 添加代码前面加 #注释编译后找不到自定义消息 解决新增的消息生成代码不能加注释符号#编译完忘记 source 刷新环境ros2 run 提示找不到节点 每次新开终端都要执行 . install/setup.bash整体流程分三大块自定义消息包配置、Python 收发代码编写、编译运行。 很多新手和我一样卡在 CMake 和 xml 配置其实只要复制粘贴我给的模板包名不写错基本不会报错。 另外 IDE 报红不用焦虑终端能正常收发消息就代表项目功能全部实现