3 most important points

  1. 节点 >> 功能包 >> 工作空间(文件夹)
  2. 通信方式包括:话题,服务,动作,参数;其中动作是高级通信方式
  3. 可以用 Gazebo 进行仿真,RQT 进行检测,RVIZ2 进行数据可视化

5 thoughts

Notes

ROS2 简介

  • ROS2安装
  • ROS 和 ROS2 区别 总得来说,主要是改进了一整个通信系统,使得通信更高效、完备、安全;以及一些对编程语言和所在系统的适应与优化
    • OS 层(系统层)
      • 添加了对 Windows/Mac/RTOS 的支持
    • Middleware 层(中间件层)
      • 去中心化 master
        • ROS 依赖主节点通信,一旦 master 挂掉就会造成整个系统通信崩溃,现实场景中非常危险
      • ? 使用 DDS 通信
        • ROS 中自实现了基于 TCP 的通信,有一堆通信方面的问题
      • @ Client Library
    • 应用层
      • 增加 Python 和 C++的支持版本,且可以使用相同的 API进行进程间/进程内通信

什么是 DDS?

  • DDS,全称 Data Distribution Service (数据分发服务),是一种用于实时系统的数据通信中间件协议和 API 标准。它实现了实时、高效、灵活的数据分发,满足各种分布式实时通信应用需求。
  • DDS 采用发布者/订阅者模式,允许数据源(发布者)将数据发布到特定主题,而感兴趣的数据消费者(订阅者)则订阅这些主题,接收他们感兴趣的数据。
  • DDS 关注数据本身,而不是消息的发送和接收。这意味着,DDS 能够自动处理数据的传输、序列化、发现和 QoS 等底层细节,简化了应用程序开发。
  • DDS 允许用户根据应用需求配置不同的 QoS(服务质量)策略,例如可靠性、实时性、持久性等,以满足不同场景的需求。

Note

RCL(ROS Client Library)ROS 客户端库,是 ROS 的一种 API,提供了对 ROS 话题、服务、参数、Action 等接口

示例

# 终端1
ros2 run demo_nodes_py listener
# 终端2
ros2 run demo_nodes_cpp talker
# 终端-标签页1
ros2 run turtlesim turtlesim_node
# 终端-标签页2
ros2 run turtlesim turtle_teleop_key

ROS2 构建

  • 节点:ROS2 中每一个节点也是只负责一个单独的模块化的功能(比如一个节点负责控制车轮转动,一个节点负责从激光雷达获取数据、一个节点负责处理激光雷达的数据、一个节点负责定位等等)实际是可执行文件
  • ~ 层级:节点 >> 功能包 >> 工作空间 功能包相当于工具箱
  • 通信:
    • 话题 - topics 发布-订阅模式,单向交流,自动接收
    • 服务 - services 最典型的双向交流,Request+Response
    • 动作 - Action
    • 参数 - parameters
  • 实战:

节点通信

Abstract

  • 话题 没有返回,适用于单向或大量的数据传递,如传感器数据、节点间的状态信息等
  • 服务 是双向的,客户端发送请求,服务端响应请求
  • 动作 是高级通信机制,实现异步双向通信,用于需要较长时间的任务,如导航等
  • 参数 是对节点的一种设置,读写可以通过服务实现

话题

  • 订阅发布模型
  • Domain ID
    • 在 DDS 中,不同逻辑网络共享物理网络的主要机制称为 Domain ID(域 ID)
    • 同一域上的 ROS 2 节点可以自由地相互发现并发送消息,而不同域上的 ROS 2 节点则不能
    • 所有 ROS 2 节点默认使用 Domain ID 为 0
    • ! 为了避免在同一网络上运行 ROS 2 的不同计算机组之间互相干扰,应为每组设置不同的 Domain ID
    • 一般选择一个介于 0 和 101 之间的安全的 Domain ID(包括 0 和 101) DDS 使用 Domain ID 用于 UDP 端口, 而不同操作系统使用的 UDP 临时端口不一样; 避开 Linux / macOS / Windows 的临时端口范围后得到安全的端口范围为 0-101
  • 通信方式
    • 基于 TCP/UDP 的网络通信方式
      • TCP(传输控制协议):可靠,面向连接
      • UDP(用户数据报协议):不可靠,无连接 ping 命令就是基于 UDP 的网络通信
  • 通信中间件
    • FastDDS:ROS2 的通信中间件,性能优秀
    • ZeroMQ:超轻量,占用资源少
  • 使用 RCLPY 实现话题
    • publisher:需要设置 timer 用于定时发布,传入 timer_callback 回调函数
    • subscription:需要创建 command_callback 回调函数处理 msg

服务

  • 请求响应模型,分为 客户端服务端
  • 注意事项
    • 同一个服务(名称相同)有且只能有一个节点来提供
    • 同一个服务可以被多个客户端调用
  • 使用 RCLPY 实现服务
    • service:需要 handle_interface 处理 requestresponse
    • client
      • 需要 result_callback_ 处理 result_future
      • 创建 send_request 完成连接服务器、设置并发送 request、等待 response 等步骤 self.client_.call_async(request).add_done_callback(self.result_callback_)

动作

  • 动作由 3 个服务 + 2 个话题组成,分别是:
    • 目标传递服务
    • 结果传递服务
    • 取消执行服务
    • 反馈话题
    • 状态话题
  • 相关指令:
ros2 action list       # 获取 action 列表
ros2 action list -t    # 获取 action 列表并查看其类型
ros2 action info <action_name>
  • 使用 RCLPY 实现动作
    • ActionServer:当采用 ServerGoalHandle 只需要一个 execute_callback
    • ActionClient:需要 goal_response_callback,直接处理服务端返回的 response,并摘出 result,安排 get_result_callback 进行处理;feedback_callback 则负责处理服务端执行过程中发布的反馈

参数

  • 参数是一个节点的设置,读写可以通过服务实现
  • 组成
    • 键:stringstring[]
    • 值:
      • boolbool[]
      • int64int64[]
      • float64float64[]
      • stringstring[]
      • byte[],字节数组,这个可以用来表示图片,点云数据等信息
  • 相关指令:
# 查看所有节点的参数列表
ros2 param list
 
# 查看一个参数的信息
ros2 param describe <node_name> <param_name>
 
# 获取参数的值
ros2 param get /turtlesim background_b
 
# 设置参数的值
ros2 param set <node_name> <parameter_name> <value>
 
# 把某个节点的所有参数存为 ./node_name.yaml
ros2 param dump <node_name>
 
# 恢复某个节点的参数值
ros2 param load <node_name> <file_name>
  • 运行时直接使用某参数
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>

接口

  • 接口是一种规范,将来自不同厂家的不同数据转换成统一的数据类型使用——就像 TypeC
  • 话题的接口是 ROS2 自带的 std_msgs,服务的接口是 example_interfaces
  • ROS2 定义了很多机器人常用接口,比如传感器类的消息包 sensor_msgs
  • & 常用命令:
    • ros2 interface list:查看当前所有接口列表
    • ros2 interface package <package_name>:查看某一个接口包下所有的接口
    • ros2 interface show <interface_name>:查看某个接口的详细内容
  • 文件类型
    • 话题接口:xxx.msg
    • 服务接口:xxx.srv
    • 动作接口:xxx.action
  • 数据类型
# 基础数据类型
bool
byte
char
float32,float64
int8,uint8
int16,uint16
int32,uint32
int64,uint64
string

# 可以是数组
int32[]

# 或者在已有接口类型上进行包含
sensor_msgs/Image

常用工具

  1. Launch
  2. RVIZ2
    • 数据可视化工具 注意,是已有数据情况下,不是仿真
  3. RQT
    • GUI 框架,通过插件的方式实现了各种各样的界面工具
    • 常用插件
      • Introspection / Node Graph:查看节点之间的关系
      • Introspection / Process Monitor:查看素有与 ROS2 相关的进程
      • Topic / Message Publisher:图形化发布话题数据
      • Service / Service Caller:图形化调用服务工具
      • Visualization / Image View:查看图像话题数据
      • Visualization / MatPlot:话题数据图形化工具,可以用来调 PID
  4. ROSBAG2
    • 用于记录话题的数据
    • 可以将话题数据存储为文件,后续无需启动节点,直接可以将 bag 文件里的话题数据发布出来 可以用来进行测试和实验,或者分享用于验证算法
ros2 bag record <topic-name1> <topic-name2>  # 记录
ros2 bag record -a                           # 记录所有话题
ros2 bag record -o <file-name> <topic-name>  # 自定义输出文件的名字
 
ros2 bag info <bag-file>  # 查看录制出话题的信息
 
ros2 bag play xxx.db3      # 播放话题数据
ros2 topic echo <chatter>  # 查看数据
  1. ~ Gazebo 注意,Gazebo 不是当前最热门的仿真方法
    • 用于模拟真实环境,生产数据
    • Gazebo 与 ROS 通过 gazebo_ros_pkgs 集成起来,包括:
      • gazebo_dev:开发 Gazebo 插件可以用的 API
      • gazebo_msgs:定义的 ROS2 和 Gazebo 之间的接口(Topic/Service/Action)
      • Gazebo_ros:提供方便的 C++ 类和函数,可供其他插件使用,例如转换和测试实用程序。它还提供了一些通常有用的插件。
      • Gazebo_plugins:一系列 Gazebo 插件,将传感器和其他功能暴露给 ROS2 例如:
        1. gazebo_ros_camera 发布 ROS2 图像
        2. gazebo_ros_diff_drive 通过 ROS2 控制和获取两轮驱动机器人的接口

Reference