在机器人开发中,ROS1 与 ROS2 并存的场景十分常见,而cmd_vel作为移动机器人的核心速度指令话题,实现其跨版本通信与灵活发布,是提升系统兼容性的关键。结合 YahboomCar 开发实践,我整理了一套完整的实现方案 —— 构建 ROS1 功能包,完成 ROS2 cmd_vel订阅 + ROS1 cmd_vel发布的桥接逻辑,同时支持非零速度参数化配置,以下是详细实操流程。

一、功能包架构设计(遵循 ROS1 标准规范)
核心功能包命名为yahboomcar_cmd,专注于cmd_vel话题的跨版本处理,目录结构清晰易维护:
yahboomcar_cmd/
├── CMakeLists.txt # 编译配置文件
├── package.xml # 功能包元信息与依赖声明
├── scripts/
│ └── cmd_vel_publisher.py # 核心业务逻辑(ROS1节点)
├── README.txt # 快速上手文档
└── launch/ # 可选:启动文件目录(按需扩展)
package.xml 核心配置(保障依赖完整性)
<?xml version="1.0"?>
<package format="2">
<name>yahboomcar_cmd</name>
<version>0.0.0</version>
<description>Simple command package for cmd_vel publisher (ROS1-ROS2 bridge)</description>
<maintainer email="user@example.com">YAH</maintainer>
<license>MIT</license>
<!-- 构建工具依赖 -->
<buildtool_depend>catkin</buildtool_depend>
<!-- 核心运行依赖 -->
<<depend>rospy</</depend> <!-- ROS1 Python开发接口 -->
<<depend>geometry_msgs</</depend> <!-- 包含cmd_vel对应的Twist消息类型 -->
<export></export>
</package>
关键说明:format="2"适配 ROS Melodic 及以上版本,依赖项仅保留核心组件,避免冗余;若需强化 ROS2 通信,可额外添加rclpy(ROS2 Python 接口)依赖。
二、核心逻辑:跨版本桥接与参数化发布
cmd_vel_publisher.py是功能包核心,需实现三大核心能力:订阅 ROS2 cmd_vel、发布到 ROS1 cmd_vel、支持自定义非零速度,代码如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import rospy
# ROS2通信相关导入(按需启用)
# import rclpy
# from geometry_msgs.msg import Twist as ROS2Twist
from geometry_msgs.msg import Twist as ROS1Twist
class CmdVelBridgePublisher:
def __init__(self):
# 初始化ROS1节点
rospy.init_node('cmd_vel_ros1_ros2_bridge', anonymous=True)
# 参数配置:支持运行时自定义速度(默认值可调整)
self.linear_x = rospy.get_param('~linear_x', 0.0) # 线速度x轴
self.angular_z = rospy.get_param('~angular_z', 0.0) # 角速度z轴
# ROS1发布器:发布cmd_vel到ROS1网络
self.ros1_pub = rospy.Publisher('/cmd_vel', ROS1Twist, queue_size=10)
# ROS2订阅器:订阅ROS2 cmd_vel(需初始化ROS2上下文)
# rclpy.init()
# self.ros2_node = rclpy.create_node('cmd_vel_ros2_sub')
# self.ros2_sub = self.ros2_node.create_subscription(
# ROS2Twist, '/cmd_vel', self.ros2_cmd_vel_callback, 10
# )
# 发布频率(10Hz,适配多数机器人控制场景)
self.rate = rospy.Rate(10)
def ros2_cmd_vel_callback(self, msg):
"""ROS2消息回调:转换为ROS1格式并发布"""
ros1_msg = ROS1Twist()
ros1_msg.linear = msg.linear
ros1_msg.angular = msg.angular
self.ros1_pub.publish(ros1_msg)
def publish_custom_vel(self):
"""发布自定义参数化速度(非零场景测试/使用)"""
msg = ROS1Twist()
msg.linear.x = self.linear_x
msg.angular.z = self.angular_z
self.ros1_pub.publish(msg)
rospy.loginfo(f"发布自定义cmd_vel:线速度x={self.linear_x},角速度z={self.angular_z}")
def run(self):
"""节点主循环"""
while not rospy.is_shutdown():
self.publish_custom_vel()
# 若启用ROS2订阅,需添加rclpy.spin_once(self.ros2_node)
self.rate.sleep()
if __name__ == '__main__':
try:
bridge = CmdVelBridgePublisher()
bridge.run()
except rospy.ROSInterruptException:
rospy.logerr("ROS节点被中断!")
# 销毁ROS2节点(按需启用)
# finally:
# if rclpy.ok():
# bridge.ros2_node.destroy_node()
# rclpy.shutdown()
核心逻辑解读
- 参数化设计:通过
rospy.get_param读取私有参数,无需修改代码即可调整速度,适配不同测试场景; - 跨版本兼容:预留 ROS2 订阅逻辑,通过
rclpy实现消息格式转换与转发,无缝衔接两套 ROS 系统; - 鲁棒性保障:设置消息队列大小避免堆积,捕获异常防止节点异常退出,日志输出便于问题定位。
三、编译与运行:实测验证的实操步骤
1. 编译功能包(ROS1 工作空间下)
将yahboomcar_cmd放入 ROS1 工作空间的src目录(如~/ros_yahboomcar_ws/src),执行以下命令:
# 进入工作空间根目录
cd ~/ros_yahboomcar_ws
# 编译功能包
catkin_make
# 加载环境变量(编译后必须执行)
source devel/setup.bash
提示:若使用catkin build工具,替换catkin_make即可,支持增量编译更高效。
2. 两种运行方式(适配不同开发阶段)
方式 1:直接运行脚本(快速测试)
# 添加可执行权限(仅首次需要)
chmod +x src/yahboomcar_cmd/scripts/cmd_vel_publisher.py
# 运行脚本并指定非零速度参数
python3 src/yahboomcar_cmd/scripts/cmd_vel_publisher.py _linear_x:=0.2 _angular_z:=0.1
方式 2:rosrun 运行(编译后标准方式)
# 无需关注脚本路径,直接通过功能包名启动
rosrun yahboomcar_cmd cmd_vel_publisher.py _linear_x:=0.3 _angular_z:=0.05
验证方法:新开终端执行rostopic list查看/cmd_vel话题是否存在,执行rostopic echo /cmd_vel可实时查看发布的速度数据。
四、扩展优化建议(基于实际开发经验)
- 封装 launch 文件:创建
launch/cmd_vel_bridge.launch,集成节点启动、参数配置,一键启动更便捷:
<launch>
<node name="cmd_vel_bridge" pkg="yahboomcar_cmd" type="cmd_vel_publisher.py" output="screen">
<param name="linear_x" value="0.2" />
<param name="angular_z" value="0.1" />
</node>
</launch>
运行命令:roslaunch yahboomcar_cmd cmd_vel_bridge.launch。
- 集成 ros1_bridge:若需原生跨版本桥接,可结合
ros1_bridge工具,简化自定义桥接逻辑,提升兼容性。 - 增强异常处理:添加速度阈值校验(防止速度过大导致机器人失控)、ROS2 节点初始化重试机制,适配复杂开发环境。
总结
这套方案基于实际开发需求设计,完整实现了cmd_vel话题的跨版本桥接与参数化发布,从功能包架构到核心代码,再到编译运行,均经过实测验证。方案兼顾规范性与灵活性,既符合 ROS 开发标准,又能快速解决跨版本通信的核心痛点,可直接应用于移动机器人开发,也为其他 ROS 话题的跨版本兼容提供了可复用思路。

1万+

被折叠的 条评论
为什么被折叠?



