ROS2学习之通信概述

ROS2里面的通信方式分为四种:话题通信,服务通信,动作通信以及参数服务。其中动作通信和参数服务是基于话题通信和服务通信的。

1. 话题通信(Topic Communication)

特点

  • 单向数据传输:发布方发布数据,订阅方订阅数据。
  • 多对多模型:一个发布者可以同时有多个订阅者,或者一个订阅者可以从多个发布者接收数据。
  • 典型用例:适用于信息更新频繁、实时性要求较高的场景,如传感器数据传输。

例子:机器人传感器数据传输

场景:一个移动机器人需要实时获取其环境信息(例如激光雷达扫描数据),以进行地图构建或避障。

  • 发布者:激光雷达节点将扫描数据发布到某个话题 laser_scan
  • 订阅者:导航模块订阅 laser_scan,用于对数据进行实时处理并进行路径规划。

流程图

1
2
3
4
5
激光雷达节点(发布者)

话题:/laser_scan

导航模块(订阅者)

2. 服务通信(Service Communication)

特点

  • 请求-响应模式:客户端发送请求数据,服务端响应结果。
  • 阻塞式通信:客户端在请求响应完成之前无法继续执行其他任务。
  • 典型用例:适用于短时间完成的任务或简单的请求,例如查询系统状态、执行简单指令的操作。

例子:机器人机械臂的抓取

场景:机械臂需要移动到特定位置抓取物体,当用户发送抓取请求时,抓取操作立即执行并返回是否成功。

  • 客户端:用户界面会发送一个抓取目标位置的请求。
  • 服务端:抓取模块执行抓取操作,并返回抓取是否成功的结果,例如 { success: true, message: "Object grabbed successfully." }

流程图

1
2
3
4
5
6
用户界面(客户端)
→ 请求:目标位置

服务端:抓取模块

响应:抓取成功/失败

3. 动作通信(Action Communication)

特点

  • 异步通信:任务执行过程支持定期反馈,同时返回最终执行结果。
  • 连续反馈:客户端能够实时获知执行进度,支持中断任务。
  • 典型用例:适用于耗时任务的执行,例如机器人导航到目标点、机械臂搬运任务等。

例子:机器人导航

关于 action 通信,以导航场景为例子:机器人导航到某个目标点,此过程需要一个节点 A 发布目标信息,然后一个节点 B 接收到请求并控制移动,最终响应目标达成状态信息。这看起来好像是服务通信实现,因为需求中要 A 发送目标,B 执行并返回结果,这是一个典型的基于请求响应的应答模式,不过,如果只是使用基本的服务通信实现,存在一个问题:导航是一个过程,是耗时操作,如果使用服务通信,那么只有在导航结束时,才会产生响应结果,而在导航过程中,节点 A 是不会获取到任何反馈的,从而可能出现程序”假死”的现象,(程序假死 是指程序在运行过程中看似卡住、不响应用户输入或无法继续执行,但实际上程序并未真正崩溃或停止,而是因为某些原因导致其进入了一种“停滞”状态。这种状态下,程序可能仍在后台运行未完成的任务,或者等待某些条件满足以继续执行,但对外部表现为“无响应”。) 过程的不可控意味着不良的用户体验,以及逻辑处理的缺陷(比如:导航中止的需求无法实现)。更合理的方案应该是:导航过程中,可以连续反馈当前机器人状态信息,当导航终止时,再返回最终的执行结果


4. 参数服务(Parameter Server)

特点

  • 共享通信模型:服务端维护共享参数数据,客户端可以查询和修改这些参数。
  • 中心化管理:所有的参数信息可以集中存储和管理,便于节点之间的动态数据共享。
  • 典型用例:适用于频繁需要调整的全局配置参数或机器人状态信息,例如控制器的增益、传感器的标定值等。

例子:机器人导航中更新运行速度

场景:用户调整机器人导航中的运行速度,并动态修改导航参数,让机器人行驶更快或更慢。

  • 参数服务存储:存储当前导航的线性速度和角速度,以便所有相关模块能访问。
  • 客户端操作:用户可以访问这些参数(查询或修改),导航模块会读取新的速度参数并更新运动控制。(有点类似于写后端的时候的get、set方法)

参数服务中的数据示例

1
2
3
# ROS Parameter Server 示例数据
/navigation/max_linear_velocity: 1.0 # 最大线速度 (m/s)
/navigation/max_angular_velocity: 0.5 # 最大角速度 (rad/s)

操作流程

  1. 用户通过客户端修改导航速度:
    1
    $ rosparam set /navigation/max_linear_velocity 1.5  # 动态调整速度为 1.5m/s
  2. 导航模块会实时读取参数 /navigation/max_linear_velocity 并更新速度:
    1
    2
    3
    # 导航模块读取速度参数
    max_linear_velocity = rospy.get_param('/navigation/max_linear_velocity', 1.0)
    control_robot_speed(max_linear_velocity)

流程图

1
2
3
4
5
用户界面(速度控制参数修改)
↕ 参数读写操作
参数服务器:/navigation/max_linear_velocity

导航模块:动态读取参数,更新控制逻辑

总结

通信方式 特点 示例场景
话题通信 单向多对多,实时传输信息 激光雷达数据传输
服务通信 请求-响应模式,适合短时任务 请求机械臂抓取物体
动作通信 带有反馈的请求-响应模式,适合耗时任务 导航到目标点
参数服务 中心化的参数共享与管理,适用于动态参数调整 动态调整机器人速度