【ROS2】含自定义消息的ROS2节点开发流程

ROS 2 自定义消息(.msg)开发核心原则:接口编译必须先于节点编译。

工程规范要求严格分离消息包与功能包。以下为标准开发与迭代流程。


一、 初次创建与运行全流程

Step 1: 创建工作空间与独立包

消息包必须基于 CMake 构建,不受逻辑节点语言限制。

bash 复制代码
mkdir -p ~/dev_ws/src && cd ~/dev_ws/src

# 创建消息包 (必须为 ament_cmake)
ros2 pkg create --build-type ament_cmake custom_msgs

# 创建功能节点包 (以 Python 为例)
ros2 pkg create --build-type ament_python robot_node --dependencies rclpy custom_msgs

Step 2: 定义消息接口

bash 复制代码
cd custom_msgs && mkdir msg
cat <<EOF > msg/RobotStatus.msg
int32 robot_id
string status_text
float64 battery_level
EOF

Step 3: 配置构建依赖

修改 custom_msgs/CMakeLists.txt,追加:

cmake 复制代码
find_package(rosidl_default_generators REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/RobotStatus.msg"
)

修改 custom_msgs/package.xml,追加:

xml 复制代码
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>

Step 4: 优先编译消息包(强制前置)

未完成此步将导致逻辑节点报模块缺失错误。

bash 复制代码
cd ~/dev_ws
colcon build --packages-select custom_msgs
source install/setup.bash

Step 5: 编写节点代码

文件:robot_node/robot_node/status_publisher.py

python 复制代码
import rclpy
from rclpy.node import Node
from custom_msgs.msg import RobotStatus 

class StatusPub(Node):
    def __init__(self):
        super().__init__('status_pub_node')
        self.pub = self.create_publisher(RobotStatus, 'robot_status', 10)
        self.timer = self.create_timer(1.0, self.timer_cb)

    def timer_cb(self):
        msg = RobotStatus(robot_id=1, status_text="Nominal", battery_level=98.5)
        self.pub.publish(msg)

def main(args=None):
    rclpy.init(args=args)
    rclpy.spin(StatusPub())
    rclpy.shutdown()

if __name__ == '__main__':
    main()

(注:需在 setup.py 的 entry_points 中完成节点注册)

Step 6: 编译并运行

bash 复制代码
cd ~/dev_ws
colcon build --packages-select robot_node
source install/setup.bash
ros2 run robot_node status_publisher

二、 后续开发迭代循环

根据修改内容,迭代分为两条固定路径。

场景 A:仅修改逻辑代码

未更改 .msg 文件。

  1. 修改代码 :编辑 .py 或 .cpp。
  2. 编译生效:
  • C++ :执行 colcon build --packages-select robot_node。
  • Python :若初次构建包含 --symlink-install 参数,无需重新编译,保存代码即可。
  1. 运行:重启节点。
场景 B:修改自定义消息结构

更改 .msg 字段(如增删变量),必须严格按以下顺序执行:

  1. 修改定义 :更新 .msg 文件。
  2. 重编消息包 :colcon build --packages-select custom_msgs
  3. 刷新环境(关键) :source install/setup.bash,确保终端加载最新接口结构。
  4. 修改代码:在节点代码中适配新字段。
  5. 重编节点包 :colcon build --packages-select robot_node(C++ 节点必须重新链接)。
  6. 运行:重启节点。
相关推荐
Light Gao5 小时前
LeRobot 全链路原理:用一个“1+1=2“的例子讲透机械臂与模型如何接入
机器人·具身智能·vla·模仿学习·lerobot
GlobalInfo10 小时前
全球及中国风电叶片检测机器人行业研究报告(2026版):市场现状、行业前景与占有率分析
运维·网络·人工智能·机器人
skywalk816311 小时前
登到192.168.1.5那台机器,看看今天白天,大约从早晨到晚上,都卡住了。看看因为什么卡住,为什么卡住而没有杀死那个导致卡死的进程,为什么
运维·系统·freebsd
天树星智源19 小时前
相机轨迹为什么对不上:问题不在控制模块,而在两段噪声不是同一份
论文阅读·机器人·大模型
Wanda121420 小时前
机器人与机电一体化3D数字孪生机器-Day7
人工智能·3d·机器人·数字孪生
ergevv21 小时前
如何使用 NIS 判断观测是否可靠:从卡尔曼滤波推导到机器人实践
机器人·卡尔曼滤波·nis·观测可靠性
todoitbo1 天前
在 Ubuntu ARM64 上运行 Q1 V3.0 MuJoCo 模型:加载、步进和单执行器响应
linux·运维·ubuntu·ai·机器人·仿真教程·启元
dghongcheng1 天前
喷涂机器人品牌推荐:六轴 vs 协作机器人怎么选
机器人·喷涂·喷漆设备·自动喷涂线·自动喷涂
todoitbo1 天前
Q1 MuJoCo 模型里的 49 项传感器定义与 60 维数据:一次关节和 IMU 输出核验
人工智能·ai·机器人·1024程序员节·启元机器人
SteveSenna2 天前
aubo学习:启动真实机械臂
机器人