type
status
date
slug
summary
tags
category
icon
password
文章前言:
本文为ROS2 初学篇。
ROS2
ROS 2机器人开发特色
ROS本质上其实就是用于快速搭建机器人的软件库和工具集。
其核心是稳定、安全和实时的通信能力。
通信是由DDS数据分发服务实现的,而我们使用者主要接触的是ROS2客户断层rclcpp和rclpy。
四大核心通信机制
- 话题:基于发布-订阅模式的通信方式,允许节点之间异步交换数据。
- 服务:同步通信方式,客户端发送请求,服务端处理并返回结果。
- 参数:用于机器人参数的设置和读取。
- 动作:支持复杂行为的通信方式,服务端可以反馈处理进度,客户端可以取消请求。
有什么
- 可视化工具
- 丰富的建模与运动学工具
- 强大的开源社区及应用框架
- Gazebo,一个强大的开源仿真工具,可用于模拟机器人行为和环境。
- Navigation 2框架,为移动机器人提供导航功能。
- Moveit 2框架,用于机械臂的运动规划。
ROS 2基础工具
Turtlesim
Turtlesim是一个轻量级的用于学习ROS2的模拟器。
ROS2
ROS2工具是用户管理、检视和与ROS系统交互的方式。用户可以使用它来启动一个节点、设置参数、监听话题等等。
- ros2 run [包名a] [节点名b] 运行包a中的节点b
- ros2 node/topic/service/action list查看级诶但相关的主题、服务、操作等。
- ros2 topic echo /turtle1/cmd_vel查看话题发布的数据
- ros2 topic pub [选项] 话题名 消息类型 消息内容
- ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}”以恒定速率1发送 ——once发送一条退出
- ros2
rqt
rqt是一个用于ROS 2的图形用户界面工具。
- /spawn服务call创建一个新的海龟。
- /set_pen设置画笔
ROS通信方式
话题
ROS 2将复杂系统分解为许多模块化节点。话题是ROS图中的重要组成部分,作为节点交换消息的总线。
话题就像电台广播站:
- 一个主播(发布者)在固定频率上不断播报信息
- 无数听众(订阅者)可以随时调到这个频率收听
- 主播不知道谁在听,听众也不能直接回复主播
- 信息是单向流动的,像河流一样持续不断
核心特点:
- 单向通信:数据只能从发布者流向订阅者
- 一对多:一个发布者可以有多个订阅者
- 异步:发布者和订阅者独立运行,互不等待
- 持续流:数据像水流一样连续传输
- 无确认机制:不知道消息是否被接收
常见使用场景:
- 传感器数据流:激光雷达、摄像头、IMU的实时数据
- 机器人状态发布:位姿、速度、电池状态
- 控制指令流:持续发送速度指令到驱动器
- 监控数据:系统状态、日志信息
- 地图更新:SLAM过程中的实时地图

一个节点可以向任意数量的主题发布数据,并同时订阅任意数量的主题。

主题是数据在节点之间以及系统不同部分之间传递的主要方式之一。
服务
服务是ROS图中节点之间的另一种通信方法。服务基于调用-响应模型,而不是主题的发布-订阅模型。虽然主题允许节点订阅数据流并获得持续更新,但服务仅在客户端特定调用时提供数据。
服务就像客服热线:
- 客户(客户端)拨打热线提出具体问题(请求)
- 客服(服务端)接听电话,处理问题,给出答案(响应)
- 一次通话解决一个具体问题
- 有明确的开始和结束,是双向对话
核心特点
- 双向通信:有请求必有响应
- 一对一:一个请求对应一个服务端处理
- 同步/异步:通常客户端会等待响应
- 离散交互:每次调用独立完成
- 有确认机制:确保请求被处理
常见使用场景
- 计算服务:请求路径规划、坐标变换
- 控制命令:开关设备、切换模式
- 查询信息:获取地图、查询状态
- 触发动作:拍照、保存数据、开始任务
- 参数设置:配置机器人参数


节点可以使用ROS 2中的服务进行通信。与话题不同,话题是一种单向通信模式,其中一个节点发布信息,可以由一个或多个订阅者消费。服务是一种请求/响应模式,其中客户端向提供服务的节点发出请求,服务处理请求并生成响应。
话题与服务对比
特性 | 话题 | 服务 |
通信方向 | 单向广播 | 双向对话 |
连接关系 | 一对多 | 一对一 |
时效性 | 实时流数据 | 按需请求 |
数据流 | 连续不断 | 离散交互 |
典型场景 | 传感器数据 | 计算服务 |
资源消耗 | 持续占用 | 按需占用 |
可靠性 | 可能丢数据 | 确保响应 |
想象一个送餐机器人:
- 话题通信:不断发布自己的位置(让监控系统能看到)、发布摄像头画面
- 服务通信:接收“去A房间送餐”指令、请求“计算最优路径”、查询“电梯当前楼层”
参数
参数是节点的配置值。您可以将参数视为节点设置。节点可以将参数存储为整数、浮点数、布尔值、字符串和列表。
参数存储到YAML文件中
让我们改变
/turtlesim 的背景颜色:
然后你的 turtlesim 窗口的背景颜色会改变:

使用
set 命令设置参数只会在当前会话中生效,而不是永久生效。然而,你可以保存你的设置,并在下次启动节点时重新加载。行为
行为是ROS 2中的一种通信类型,用于长时间运行的任务。它们由三个部分组成:目标(goal),反馈(feedback)和结果(result)。
行为是建立在主题(topics)和服务(services)之上的。它们的功能类似于服务,但行为可以被取消。与只返回单个响应的服务不同,行为还提供稳定的反馈。
动作使用客户端-服务器模型,类似于发布者-订阅者模型(在 topics tutorial 中有描述)。一个"动作客户端"节点向一个"动作服务器"节点发送一个目标,服务器节点确认目标并返回一系列反馈和结果流。
动作类似于服务,允许您执行长时间运行的任务,提供定期反馈,并可取消。
一个机器人系统可能会使用动作进行导航。一个动作目标可以告诉机器人前往一个位置。当机器人导航到该位置时,它可以沿途发送更新(即反馈),然后在到达目的地后发送最终结果消息。
特点
- 异步长任务:像后台任务
- 三部分结构:
- 目标(Goal) - 发送任务
- 反馈(Feedback) - 进度更新
- 结果(Result) - 最终成果
- 可监控可取消:随时查看进度或取消
场景:机器人移动控制
其他
日志rqt_console
rqt_console 是一个用于在ROS 2中检查日志消息的图形界面工具。通常,日志消息会显示在终端中。使用 rqt_console,您可以随时间收集这些消息,以更加仔细和有组织的方式查看它们,对它们进行过滤、保存,甚至可以重新加载保存的文件以在不同的时间进行检查。ROS 2的记录器级别按严重程度排序:
- Fatal:消息表明系统将终止以试图保护自身免受损害。
- Error:消息表示存在重要问题,这些问题不一定会损坏系统,但会阻止其正常运行。
- Warn:表示意外活动或非理想结果,可能表示更深层问题,但不会直接影响功能。
- Info:表示事件和状态更新,作为系统正常运行的可视验证。
- Debug:详细描述系统执行的每个步骤。
终端显示格式
[INFO][1723167975.972164925][python_node]:你好!
- 消息类别:[INFO]
- 时间戳:[1723167975.972164925]
- 节点名称:[python_node]
- 消息内容:你好!
修改终端日志显示格式
为了生成供``rqt_console``显示的日志消息,让乌龟撞到墙上。在新的终端中输入``ros2 topic pub``命令(在:doc:`主题教程 <../Understanding-ROS2-Topics/Understanding-ROS2-Topics>`中有详细讨论),如下所示:
ros2 topic pub -r 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0,y: 0.0,z: 0.0}}"由于上述命令以固定速率发布主题,乌龟会持续撞墙。在``rqt_console``中,你会看到相同的消息以``Warn``严重级别一遍又一遍地显示,如下所示:

在你运行``ros2 topic pub``命令的终端中按下``Ctrl+C``,停止乌龟撞墙。
Launch启动节点
在大多数入门教程中,您每次运行新节点都需要打开新的终端。随着您创建更复杂的系统,并同时运行越来越多的节点,打开终端并重新输入配置详细信息变得繁琐。
启动文件允许您同时启动和配置包含 ROS 2 节点的多个可执行文件。
使用
ros2 launch命令运行单个启动文件将一次性启动整个系统 - 所有节点及其配置。打开一个新的终端并运行:
ros2 launch turtlesim multisim.launch.py以下命令将运行下面的 Launch 文件:
注解
上面的启动文件是用Python编写的,但你也可以使用XML和YAML来创建启动文件。你可以在 使用 Python、XML 和 YAML 编写 ROS 2 启动文件 中查看这些不同的ROS 2启动文件格式的比较。
这将运行两个turtlesim节点:

暂时不用担心启动文件的内容。你可以在 ROS 2启动教程 中找到更多关于ROS 2启动的信息。
录制和回放数据
ros2 bag 是一个命令行工具,用于记录系统中发布在主题上的数据。它会累积通过任意数量的主题传递的数据,并将其保存在数据库中。然后,您可以回放这些数据,以重现您的测试和实验结果。记录主题也是分享您的工作并允许他人重新创建的好方法。录制
要记录发布到一个话题上的数据,请使用以下命令语法:
ros2 bag record <topic_name>在对所选择的话题运行此命令之前,请打开一个新的终端并进入之前创建的``bag_files``目录,因为rosbag文件将保存在您运行命令的目录中。
运行以下命令:
ros2 bag record /turtle1/cmd_vel你将在终端中看到以下消息(日期和时间会有所不同):
现在``ros2 bag``正在记录发布在``/turtle1/cmd_vel``话题上的数据。返回到teleop终端并再次移动乌龟。移动的具体方式不重要,但尽量制造一个可识别的模式,以便在稍后回放数据时进行观察。

按下``Ctrl+C``停止记录。
数据将累积在一个新的袋子目录中,目录的命名方式为``rosbag2_year_month_day-hour_minute_second``。该目录将包含一个``metadata.yaml``文件和以记录格式保存的袋子文件。
播放
在重新播放bag文件之前,在运行teleop的终端中输入``Ctrl+C``。然后确保turtlesim窗口可见,这样你就可以看到bag文件的效果。
输入以下命令:
ros2 bag play subset终端将返回以下消息:
[INFO] [rosbag2_storage]: Opened database 'subset'.当您录制时,您的海龟将按照您输入的相同路径移动(尽管不是100%准确;turtlesim对系统时间的微小变化敏感)。

因为“subset”文件记录了“/turtle1/pose”主题,所以“ros2 bag play”命令将保持运行,直到您停止turtlesim,即使您没有移动海龟。
这是因为只要“/turtlesim”节点处于活动状态,它就会定期发布“/turtle1/pose”主题的数据。您可能已经注意到上面的“ros2 bag info”示例结果中,“/turtle1/cmd_vel”主题的“Count”信息只有9次;这是我们在录制过程中按下箭头键的次数。
有关问题,欢迎您在底部评论区留言,一起交流~
- Author:Koreyoshi
- URL:https://tangly1024.com/article/2cac7b13-c6a7-80a0-b513-df1d7604625c
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!






