Skip to content

ROS2

ROS2是一个建立在DDS基础之上的机器人操作系统,对用户端提供rcl cli以及py/cpp接口,中间依靠rmw(ROS Middleware)与具体的DDS实现通信。

ros2

通信方式

ROS2提供topic、service、action三种通信方式。

  1. topic: 是多对多发布/订阅异步通信模式,适用于广播/传递实时数据,适用于相机/传感器数据采集、实时监控等场景。
  2. service: 是请求/响应通信模式,服务端与客户端是1 : n关系,适用于状态查询等需要精确响应的场景,由于一个服务端的原因,不适用于连续性的大量请求调用场景。
  3. action: 是支持长任务运行与需要任务中断的通信模式,适用于导航、机器控制等需要实时反馈与中断控制的任务。

三者对比:

  1. 延迟方面:topic延迟最小,适用于实时性要求高的场景;service模式需要等待服务端返回,延迟比topic大;action结合了service与topic,延迟比service大。
  2. 数据量方面:topic相对于service、action支持更大数据的传输,service与action更倾向于传输控制命令执行、状态查询返回等。
  3. 可靠性方面:三者均提供QoS相关的配置,但由于topic若在大量节点参与时,实时传输相对大数据场景,亦会存在数据丢失的风险。且由于适用场景问题,topic对通信带宽一般要求较高。

py脚本启动节点

listeners.launch.py
from launch import LaunchDescription
import launch_ros.actions

def generate_launch_description():
    nodes = []
    for i in range(1, 51):
        nodes.append(launch_ros.actions.Node(
            name=f"listener{i}", package= 'cpp_pubsub', executable='listener', output='screen'))

    return LaunchDescription(nodes)

使用rcl客户端工具启动名为listener1 ~ listener50的50个listener。

Bash
ros2 launch cpp_pubsub listeners.launch.py