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图中的重要组成部分,作为节点交换消息的总线。

话题就像电台广播站

  • 一个主播(发布者)在固定频率上不断播报信息
  • 无数听众(订阅者)可以随时调到这个频率收听
  • 主播不知道谁在听,听众也不能直接回复主播
  • 信息是单向流动的,像河流一样持续不断

核心特点:

  • 单向通信:数据只能从发布者流向订阅者
  • 一对多:一个发布者可以有多个订阅者
  • 异步:发布者和订阅者独立运行,互不等待
  • 持续流:数据像水流一样连续传输
  • 无确认机制:不知道消息是否被接收

常见使用场景:

  1. 传感器数据流:激光雷达、摄像头、IMU的实时数据
  1. 机器人状态发布:位姿、速度、电池状态
  1. 控制指令流:持续发送速度指令到驱动器
  1. 监控数据:系统状态、日志信息
  1. 地图更新:SLAM过程中的实时地图
notion image
一个节点可以向任意数量的主题发布数据,并同时订阅任意数量的主题。
notion image
主题是数据在节点之间以及系统不同部分之间传递的主要方式之一。
 

服务


服务是ROS图中节点之间的另一种通信方法。服务基于调用-响应模型,而不是主题的发布-订阅模型。虽然主题允许节点订阅数据流并获得持续更新,但服务仅在客户端特定调用时提供数据

服务就像客服热线

  • 客户(客户端)拨打热线提出具体问题(请求)
  • 客服(服务端)接听电话,处理问题,给出答案(响应)
  • 一次通话解决一个具体问题
  • 有明确的开始和结束,是双向对话

核心特点

  • 双向通信:有请求必有响应
  • 一对一:一个请求对应一个服务端处理
  • 同步/异步:通常客户端会等待响应
  • 离散交互:每次调用独立完成
  • 有确认机制:确保请求被处理

常见使用场景

  1. 计算服务:请求路径规划、坐标变换
  1. 控制命令:开关设备、切换模式
  1. 查询信息:获取地图、查询状态
  1. 触发动作:拍照、保存数据、开始任务
  1. 参数设置:配置机器人参数
notion image
notion image
节点可以使用ROS 2中的服务进行通信。与话题不同,话题是一种单向通信模式,其中一个节点发布信息,可以由一个或多个订阅者消费。服务是一种请求/响应模式,其中客户端向提供服务的节点发出请求,服务处理请求并生成响应。
 

话题与服务对比


特性
话题
服务
通信方向
单向广播
双向对话
连接关系
一对多
一对一
时效性
实时流数据
按需请求
数据流
连续不断
离散交互
典型场景
传感器数据
计算服务
资源消耗
持续占用
按需占用
可靠性
可能丢数据
确保响应
想象一个送餐机器人:
  • 话题通信:不断发布自己的位置(让监控系统能看到)、发布摄像头画面
  • 服务通信:接收“去A房间送餐”指令、请求“计算最优路径”、查询“电梯当前楼层”
 

参数


参数是节点的配置值。您可以将参数视为节点设置。节点可以将参数存储为整数、浮点数、布尔值、字符串和列表。
参数存储到YAML文件中
让我们改变 /turtlesim 的背景颜色:
notion image
然后你的 turtlesim 窗口的背景颜色会改变:
../../../_images/set.png
使用 set 命令设置参数只会在当前会话中生效,而不是永久生效。然而,你可以保存你的设置,并在下次启动节点时重新加载。
 

行为


行为是ROS 2中的一种通信类型,用于长时间运行的任务。它们由三个部分组成:目标(goal),反馈(feedback)和结果(result)。
行为是建立在主题(topics)和服务(services)之上的。它们的功能类似于服务,但行为可以被取消。与只返回单个响应的服务不同,行为还提供稳定的反馈。
动作使用客户端-服务器模型,类似于发布者-订阅者模型(在 topics tutorial 中有描述)。一个"动作客户端"节点向一个"动作服务器"节点发送一个目标,服务器节点确认目标并返回一系列反馈和结果流。
动作类似于服务,允许您执行长时间运行的任务,提供定期反馈,并可取消。
一个机器人系统可能会使用动作进行导航。一个动作目标可以告诉机器人前往一个位置。当机器人导航到该位置时,它可以沿途发送更新(即反馈),然后在到达目的地后发送最终结果消息。

特点

  • 异步长任务:像后台任务
  • 三部分结构
      1. 目标(Goal) - 发送任务
      1. 反馈(Feedback) - 进度更新
      1. 结果(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``严重级别一遍又一遍地显示,如下所示:
../../../_images/warn.png
在你运行``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节点:
../../../_images/turtlesim_multisim.png
暂时不用担心启动文件的内容。你可以在 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终端并再次移动乌龟。移动的具体方式不重要,但尽量制造一个可识别的模式,以便在稍后回放数据时进行观察。
../../../_images/record.png
按下``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对系统时间的微小变化敏感)。
../../../_images/playback.png
因为“subset”文件记录了“/turtle1/pose”主题,所以“ros2 bag play”命令将保持运行,直到您停止turtlesim,即使您没有移动海龟。
这是因为只要“/turtlesim”节点处于活动状态,它就会定期发布“/turtle1/pose”主题的数据。您可能已经注意到上面的“ros2 bag info”示例结果中,“/turtle1/cmd_vel”主题的“Count”信息只有9次;这是我们在录制过程中按下箭头键的次数。
 
 
💡
有关问题,欢迎您在底部评论区留言,一起交流~
OpenGauss 数据库环境配置linux输入法设置
Loading...