3 most important points
- 节点 >> 功能包 >> 工作空间(文件夹)
- 通信方式包括:话题,服务,动作,参数;其中动作是高级通信方式
- 可以用 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进行进程间/进程内通信
- OS 层(系统层)
什么是 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_keyROS2 构建
- 节点:ROS2 中每一个节点也是只负责一个单独的模块化的功能(比如一个节点负责控制车轮转动,一个节点负责从激光雷达获取数据、一个节点负责处理激光雷达的数据、一个节点负责定位等等)实际是可执行文件
- ~ 层级:节点 >> 功能包 >> 工作空间 功能包相当于工具箱
- 通信:
- 实战:
节点通信
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 的网络通信
- 基于 TCP/UDP 的网络通信方式
- 通信中间件
- FastDDS:ROS2 的通信中间件,性能优秀
- ZeroMQ:超轻量,占用资源少
- 使用 RCLPY 实现话题
publisher:需要设置timer用于定时发布,传入timer_callback回调函数subscription:需要创建command_callback回调函数处理msg
服务
- 请求响应模型,分为 客户端 和 服务端
- 注意事项
- 同一个服务(名称相同)有且只能有一个节点来提供
- 同一个服务可以被多个客户端调用
- 使用 RCLPY 实现服务
service:需要handle_interface处理request和responseclient:- 需要
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_callbackActionClient:需要goal_response_callback,直接处理服务端返回的response,并摘出result,安排get_result_callback进行处理;feedback_callback则负责处理服务端执行过程中发布的反馈
参数
- 参数是一个节点的设置,读写可以通过服务实现
- 组成
- 键:
string,string[] - 值:
bool,bool[]int64,int64[]float64,float64[]string,string[]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
- 调用
- 使用 ROS2 的 IDL 模块将接口文件转换为 Python 中的头文件
- 创建功能包:
--dependencies rosidl_default_generators
- 自定义接口实践
- 使用自定义接口
常用工具
- Launch
- 用于同时启动和配置多个包含 ROS2 节点的可执行文件
- 使用 Launch 运行节点
- RVIZ2
- 数据可视化工具 注意,是已有数据情况下,不是仿真
- RQT
- GUI 框架,通过插件的方式实现了各种各样的界面工具
- 常用插件
- Introspection / Node Graph:查看节点之间的关系
- Introspection / Process Monitor:查看素有与 ROS2 相关的进程
- Topic / Message Publisher:图形化发布话题数据
- Service / Service Caller:图形化调用服务工具
- Visualization / Image View:查看图像话题数据
- Visualization / MatPlot:话题数据图形化工具,可以用来调 PID
- 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> # 查看数据- ~ Gazebo 注意,Gazebo 不是当前最热门的仿真方法
- 用于模拟真实环境,生产数据
- Gazebo 与 ROS 通过
gazebo_ros_pkgs集成起来,包括:gazebo_dev:开发 Gazebo 插件可以用的 APIgazebo_msgs:定义的 ROS2 和 Gazebo 之间的接口(Topic/Service/Action)Gazebo_ros:提供方便的 C++ 类和函数,可供其他插件使用,例如转换和测试实用程序。它还提供了一些通常有用的插件。Gazebo_plugins:一系列 Gazebo 插件,将传感器和其他功能暴露给 ROS2 例如:gazebo_ros_camera发布 ROS2 图像gazebo_ros_diff_drive通过 ROS2 控制和获取两轮驱动机器人的接口