三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

ROS1与ROS2核心指令对比手册:从环境配置到调试实战

ROS1与ROS2核心指令对比手册:从环境配置到调试实战

1. 项目概述:为什么你需要一份完整的ROS指令手册

在机器人开发的日常工作中,无论是调试一个导航节点,还是管理一个复杂的多机系统,我们最常打交道的就是终端和那一串串命令。ROS(Robot Operating System)作为一个强大的机器人开发框架,其命令行工具是我们与机器人“对话”的桥梁。然而,ROS1和ROS2在架构和理念上的差异,直接导致了其命令行工具的显著不同。新手常常混淆rosrunros2 run,老手在切换项目时也可能一时想不起ROS2里查看话题的对应命令是什么。这种割裂感极大地影响了开发效率。

因此,一份整合了ROS1与ROS2核心指令的“大全”或“速查手册”,其价值不言而喻。它不仅仅是一个命令列表,更是一张清晰的对比地图,能帮助开发者快速定位在不同ROS版本下完成同一任务所需的工具,理解其背后的设计哲学变迁。本篇文章旨在成为这样一份实用的参考资料,我会结合自己多年在ROS1和ROS2项目中的实战经验,不仅列出命令,更会解释其常用参数、典型使用场景,并分享那些官方文档里不会写的“坑”和技巧。

2. ROS1与ROS2核心指令对比解析

理解指令差异的前提,是理解ROS1与ROS2在核心架构上的不同。ROS1基于一个中心化的Master节点进行通信发现,而ROS2采用了去中心化的DDS(数据分发服务)中间件。这一根本变化,使得两者的命令行工具集在命名和功能上既有继承,也有革新。

2.1 核心概念与指令映射关系

在开始罗列命令前,我们先建立一个宏观的映射关系,这能帮你更好地记忆。

核心概念ROS1 典型指令前缀/工具ROS2 典型指令前缀/工具核心变化说明
启动与运行rosrun,roslaunchros2 run,ros2 launch指令结构从“ros+动词”变为“ros2+动词”,更统一。roslaunch文件格式在ROS2中变为XML+Pytho混合,功能更强大。
节点管理rosnoderos2 nodeROS2的节点信息更丰富,与DDS实体绑定更紧密。
话题通信rostopic,rosmsgros2 topic,ros2 interfaceROS2将消息、服务、动作的接口定义统一归口到interface子命令下管理。
服务通信rosservice,rossrvros2 service,ros2 interface同上,服务类型定义也移至interface
参数管理rosparamros2 paramROS2参数支持动态类型和更丰富的生命周期管理。
包与工作空间rospack,catkinros2 pkg,colcon构建系统从catkin变为ament/colcon,包管理命令随之改变。
数据记录与回放rosbagros2 bagROS2的bag API完全重写,支持更高效的存储和加密。

这个表格揭示了ROS2命令行工具一个重要的设计思路:归一化。在ROS1中,rostopicrosservicerosnode是并列的一级命令。而在ROS2中,它们都成为了ros2这个唯一入口命令的子命令(topic,service,node),结构更加清晰统一。

2.2 环境配置与工作空间指令

任何ROS操作的第一步都是配置正确的环境。这是新手最容易出错的地方之一。

ROS1:

# 方法1:source 全局安装的setup.bash source /opt/ros/noetic/setup.bash # 方法2:source 你自己工作空间的devel/setup.bash source ~/catkin_ws/devel/setup.bash # 检查环境变量是否生效,查看ROS_PACKAGE_PATH echo $ROS_PACKAGE_PATH

ROS2:

# 方法1:source 全局安装的setup.bash source /opt/ros/foxy/setup.bash # 以Foxy为例 # 方法2:source 你自己工作空间的install/local_setup.bash source ~/ros2_ws/install/local_setup.bash # ROS2没有直接的包路径变量,可通过`ros2 pkg prefix`检查 ros2 pkg prefix turtlesim

实操心得:我习惯在~/.bashrc文件中为不同的项目创建别名(alias)。例如,alias sros1='source /opt/ros/noetic/setup.bash && source ~/catkin_ws/devel/setup.bash'alias sros2='source /opt/ros/foxy/setup.bash && source ~/ros2_ws/install/local_setup.bash'。这样只需在终端输入sros1sros2就能快速切换环境,避免冲突。

工作空间构建指令对比:

操作ROS1 (Catkin)ROS2 (Colcon)
初始化工作空间mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_init_workspace src
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon init
编译工作空间cd ~/catkin_ws
catkin_make
catkin_make -DCMAKE_BUILD_TYPE=Release
cd ~/ros2_ws
colcon build
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release
编译特定包catkin_make --pkg <package_name>colcon build --packages-select <package_name>
清理构建catkin_make cleanrm -rf build install log(Colcon没有统一clean命令)

注意事项colcon build默认不会创建符号链接到install目录,而是直接拷贝文件。添加--symlink-install参数后,会创建符号链接,这样在源码中修改Python脚本后无需重新build即可生效,对Python开发非常友好,但C++代码修改仍需重新编译。

3. 节点、话题、服务与参数:核心通信指令详解

这是ROS指令中最常用、最核心的部分。我们将通过完成“启动一个小乌龟并控制它”这个经典任务,来串联对比这些指令。

3.1 节点管理:查看系统的参与者

启动 turtlesim 节点:

  • ROS1:rosrun turtlesim turtlesim_node
  • ROS2:ros2 run turtlesim turtlesim_node

查看运行中的节点列表:

  • ROS1:rosnode list
  • ROS2:ros2 node list
    • 一个有用的技巧是,在ROS2中,你可以通过ros2 daemon stopros2 daemon start来重启守护进程,有时可以解决节点发现异常的问题。

获取特定节点的详细信息:

  • ROS1:rosnode info /turtlesim(输出相对简洁)
  • ROS2:ros2 node info /turtlesim(输出非常详细,包括其发布/订阅的所有话题、服务、动作,以及对应的DDS GUID,信息量巨大)

3.2 话题通信:数据流动的管道

启动乌龟节点后,它会自动发布/turtle1/pose话题并订阅/turtle1/cmd_vel话题。

查看活跃话题列表:

  • ROS1:rostopic list
  • ROS2:ros2 topic list
    • ROS2还可以用-t选项显示话题类型:ros2 topic list -t

查看话题上的实时数据:

  • ROS1:rostopic echo /turtle1/pose
  • ROS2:ros2 topic echo /turtle1/pose

查看话题详细信息(类型、带宽等):

  • ROS1:rostopic info /turtle1/cmd_vel结合rostopic hz /turtle1/pose
  • ROS2:ros2 topic info /turtle1/cmd_vel(显示发布者和订阅者数量) 结合ros2 topic bw /turtle1/pose(查看带宽) 和ros2 topic hz /turtle1/pose(查看频率)

向话题发布数据(让乌龟动起来):我们需要一个几何Twist消息。在ROS1和ROS2中,消息结构类似,但命令用法不同。

  • ROS1:
    # 方式1:单次发布 rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist "linear: x: 0.5 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0" # 方式2:持续发布(按Ctrl+C停止) rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 10 -- "linear: {x: 0.2, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}"
  • ROS2:
    # 方式1:单次发布(注意参数格式是数组,且需要指定节点名) ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.5, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}" # 方式2:持续发布 ros2 topic pub --rate 10 /turtle1/cmd_vel geometry_msgs/msg/Twist "linear: {x: 0.2, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"

常见问题与排查技巧:在ROS2中执行ros2 topic pub时,你可能会遇到“No publisher for topic”的警告,但消息似乎仍能发出。这是因为在DDS中,发布者的创建是异步的。如果你需要确保发布者已建立再发送,可以添加-w 1参数等待1个匹配的订阅者(但我们的乌龟节点已经是订阅者了)。更常见的问题是消息格式错误,ROS2对YAML/JSON格式的解析更严格,务必注意花括号和逗号的位置。一个快速验证消息结构的方法是先用ros2 interface show geometry_msgs/msg/Twist查看消息定义。

3.3 服务调用:请求-响应式的交互

乌龟仿真器提供了一个/spawn服务来生成新乌龟。

查看服务列表:

  • ROS1:rosservice list
  • ROS2:ros2 service list

查看服务类型并调用:

  • ROS1:
    rosservice type /spawn # 查看类型,返回 turtlesim/Spawn rossrv show turtlesim/Spawn # 查看服务数据结构 rosservice call /spawn "x: 5.0 y: 5.0 theta: 0.0 name: 'my_turtle'" # 调用服务
  • ROS2:
    ros2 service type /spawn # 查看类型 ros2 interface show turtlesim/srv/Spawn # 查看服务数据结构(注意srv路径) ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.0, y: 5.0, theta: 0.0, name: 'my_turtle'}" # 调用服务

3.4 参数管理:节点的动态配置

乌龟节点有一个背景颜色参数。

列出所有参数:

  • ROS1:rosparam list
  • ROS2:ros2 param list

获取、设置参数值:

  • ROS1:
    rosparam get /turtlesim/background_b # 获取蓝色通道值 rosparam set /turtlesim/background_b 100 # 设置蓝色通道值 # 设置后需要调用服务使参数生效(如果节点支持) rosservice call /turtlesim/set_parameters ...
  • ROS2:
    ros2 param get /turtlesim background_b # 获取(注意参数名写法不同) ros2 param set /turtlesim background_b 100 # 设置,ROS2中参数动态生效是核心特性,无需额外调用服务
    ROS2的参数服务是内建且动态的,set命令会立即通知节点,背景色会实时改变,这是ROS2 QoS和节点生命周期管理带来的优势。

将参数导出到文件/从文件加载:

  • ROS1:rosparam dump params.yamlrosparam load params.yaml
  • ROS2:ros2 param dump /turtlesim > turtlesim_params.yaml(针对特定节点) 和ros2 param load /turtlesim turtlesim_params.yaml

4. 启动文件、包管理与信息检索

当系统复杂后,手动启动多个节点变得繁琐,此时需要启动文件(Launch Files)和包管理工具。

4.1 启动文件:一键启动复杂系统

启动文件的语法差异是ROS1和ROS2的一大区别。

ROS1 Launch (XML):

<!-- example_ros1.launch --> <launch> <node pkg="turtlesim" type="turtlesim_node" name="sim"/> <node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/> <param name="background_b" value="100"/> </launch>

运行:roslaunch <package_name> example_ros1.launch

ROS2 Launch (Python + XML):ROS2推荐使用Python编写启动文件,功能更强大。

# example_ros2_launch.py from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package='turtlesim', executable='turtlesim_node', name='sim', parameters=[{'background_b': 100}] ), Node( package='turtlesim', executable='turtle_teleop_key', name='teleop', output='screen' ), ])

运行:ros2 launch <package_name> example_ros2_launch.py

实操心得:ROS2的Python启动文件虽然学习曲线稍陡,但带来了巨大灵活性。你可以方便地使用Python逻辑进行条件启动、参数解析、事件处理等。例如,你可以根据一个命令行参数决定启动哪个地图文件。对于简单的启动配置,ROS2也支持XML格式(<launch>标签),但功能受限。我建议新项目直接学习使用Python launch文件。

4.2 包管理与信息检索

查找、定位包和其中的文件是开发中的高频操作。

查找包:

  • ROS1:rospack find turtlesim
  • ROS2:ros2 pkg prefix turtlesim(返回安装路径) 或ros2 pkg list | grep turtlesim

列出包内所有文件:

  • ROS1:roscd turtlesim(先进入包目录) 然后ls
  • ROS2:ros2 pkg executables turtlesim(列出可执行文件) 或ros2 pkg xml turtlesim(查看包清单文件内容)

检索消息/服务类型:

  • ROS1:rosmsg list | grep Twistrossrv list
  • ROS2:ros2 interface list | grep Twistros2 interface show geometry_msgs/msg/Twist

5. 高级工具与调试技巧

除了基础通信指令,ROS还提供了一系列强大的高级工具用于调试和系统 introspection。

5.1 可视化工具:rqt

rqt是一个基于Qt的GUI框架,集成了多种插件。在ROS1和ROS2中,rqt命令家族是通用的,但部分插件可能因版本而异。

  • 启动综合工具箱:rqt
  • 启动特定插件:rqt_graph(查看节点话题图),rqt_console(查看日志),rqt_plot(绘制数据曲线)
  • rqt主界面中,你可以通过Plugins菜单添加Node GraphTopic MonitorBag等插件,实现图形化监控。

5.2 数据记录与回放:rosbag

rosbag是记录和回放话题数据的利器,用于算法调试和场景复现。

记录指定话题:

  • ROS1:rosbag record -O my_bag.bag /turtle1/pose /turtle1/cmd_vel
  • ROS2:ros2 bag record -o my_bag /turtle1/pose /turtle1/cmd_vel(ROS2 bag以目录形式存储)

查看bag文件信息:

  • ROS1:rosbag info my_bag.bag
  • ROS2:ros2 bag info my_bag

回放bag文件:

  • ROS1:rosbag play my_bag.bag
  • ROS2:ros2 bag play my_bag
    • ROS2的ros2 bag play支持更精细的控制,如--rate控制播放速率,-l循环播放。

注意事项:ROS1和ROS2的bag格式不兼容。ROS2提供了rosbag2转换工具(如rosbag2_transport),但转换过程可能因消息类型差异而复杂。在混合ROS1/ROS2的系统中进行数据记录和回放需要特别小心。

5.3 系统监控与性能分析

查看系统计算图:

  • ROS1:rqt_graph是最佳选择。命令行可用rosrun rqt_graph rqt_graph
  • ROS2:同样使用rqt_graphros2 run rqt_graph rqt_graph。ROS2的图更能反映DDS的发现关系。

动态配置参数(ROS2特色):除了ros2 param set,还可以使用rqt_reconfigure(ROS1) 或ros2 run rqt_reconfigure rqt_reconfigure(ROS2) 进行图形化动态参数调整,这对算法调参非常方便。

查看节点计算耗时(ROS2):使用ros2 run composition api_composition等工具,或结合ros2 topic hz/bw以及系统监控工具(如htop,top)来综合判断节点性能。

6. 常见问题排查与指令速查表

在实际开发中,80%的时间可能花在20%的问题排查上。这里汇总一些典型问题及其对应的排查指令。

6.1 节点无法发现/通信失败

这是最常见的问题,尤其在分布式或多机环境下。

排查步骤:

  1. 检查环境与网络(ROS1 & ROS2通用)

    • ROS_MASTER_URI/ROS_DOMAIN_ID:确保所有机器的ROS_MASTER_URI(ROS1)或ROS_DOMAIN_ID(ROS2)设置一致。ROS2默认域ID为0,不同域ID的节点无法通信。
    • 多播与防火墙:确保网络支持多播(ROS1发现机制)或DDS所需的端口(ROS2)未被防火墙阻挡。对于ROS2,可以尝试设置环境变量export ROS_LOCALHOST_ONLY=1先进行本地回环测试。
  2. 使用核心指令排查

    • ROS1:在一台机器上运行roscore。在另一台机器上,rostopic listrosnode list应该能看到信息。如果看不到,检查ROS_MASTER_URI是否指向了运行roscore的机器IP。
    • ROS2:在所有机器上运行ros2 daemon status检查守护进程。使用ros2 topic listros2 node list查看。如果节点列表为空但节点确实在运行,尝试重启守护进程:ros2 daemon stop && ros2 daemon start

6.2 话题数据未收到/发送失败

  1. 检查发布者与订阅者是否存在

    • ROS1:rostopic info /your_topic查看PublishersSubscribers
    • ROS2:ros2 topic info /your_topic --verbose查看详细信息。
  2. 检查话题类型是否匹配

    • ROS1:rostopic type /your_topic对比发布和订阅代码中的消息类型。
    • ROS2:ros2 topic type /your_topic。ROS2对类型匹配要求更严格,即使是同名的.msg文件,如果来自不同的包(如custom_msgs/msg/Pointvsgeometry_msgs/msg/Point),也被视为不同类型,无法通信。这是ROS2强类型系统的一个特点,也是常见坑点。
  3. 使用echopub手动测试

    • 先用rostopic echoros2 topic echo确认话题上是否有数据。
    • 再用rostopic pubros2 topic pub手动发布一条标准消息,看订阅端是否能收到。这是一个非常有效的隔离测试方法。

6.3 指令速查表

最后,附上一张最常用指令的快速对照表,可以打印出来贴在工位旁。

任务描述ROS1 指令ROS2 指令关键差异点
运行节点rosrun <pkg> <node>ros2 run <pkg> <node>基本一致
启动文件roslaunch <pkg> <file>.launchros2 launch <pkg> <file>.launch.py文件格式与扩展名
列出节点rosnode listros2 node list基本一致
列出话题rostopic listros2 topic list基本一致
查看消息rostopic echo /topicros2 topic echo /topic基本一致
发布消息rostopic pub /topic type argsros2 topic pub /topic type args消息参数格式(YAML/JSON)
查看服务rosservice listros2 service list基本一致
调用服务rosservice call /service argsros2 service call /service type args需指定服务类型
列出参数rosparam listros2 param list基本一致
设置参数rosparam set+ 可能需服务调用ros2 param set(动态生效)ROS2参数动态更新
查找包rospack find <pkg>ros2 pkg prefix <pkg>
编译工作空间catkin_makecolcon build构建系统不同
数据记录rosbag recordros2 bag record存储格式(文件 vs 目录)

掌握这些指令,并理解其背后的原理,就能在ROS1和ROS2的海洋中自如航行。记住,最好的学习方式是在实践中反复使用。当你遇到问题时,首先尝试用这些命令行工具去观察、诊断你的系统状态,这远比盲目修改代码要高效得多。

← 返回列表