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 文件。
- 修改代码 :编辑
.py或.cpp。 - 编译生效:
- C++ :执行
colcon build --packages-select robot_node。 - Python :若初次构建包含
--symlink-install参数,无需重新编译,保存代码即可。
- 运行:重启节点。
场景 B:修改自定义消息结构
更改 .msg 字段(如增删变量),必须严格按以下顺序执行:
- 修改定义 :更新
.msg文件。 - 重编消息包 :
colcon build --packages-select custom_msgs - 刷新环境(关键) :
source install/setup.bash,确保终端加载最新接口结构。 - 修改代码:在节点代码中适配新字段。
- 重编节点包 :
colcon build --packages-select robot_node(C++ 节点必须重新链接)。 - 运行:重启节点。