学习链接:
官方文档: https://docs.ros.org/en/humble/Concepts/Basic/About-Actions.html
鱼香ROS2:https://fishros.com/d2lros2/#/
一、ROS2整体概述
机器人设计包含三个部分:
感知:激光雷达、深度相机、IMU、里程计、碰撞感知、建图
决策:路径规划算法、定位算法
控制:轮子驱动
1、ROS与ROS2:
ROS(Robot Operating System):可以安装再已有的操作系统上的软件库和工具集,其设计目的是简化在各种机器人平台上创建的复杂而强大的机器人行为的任务。
ROS2:
-
是基于强类型匿名发布/订阅机制的中间件,该机制允许在不同进程之间传递消息。
匿名:当订阅者获得一段数据时,它通常不知道或不关心最初是哪个发布者发送的(尽管它可以查明是否需要)。这种体系结构的好处是,可以随意更换发布者和订阅者,而不会影响系统的其他部分。
强类型:ROS 消息中每个字段的类型(接口定义)都是类型化的,该类型在不同的级别上强制执行。每个字段的语义都定义良好。没有自动化的机制来确保这一点,但是所有核心 ROS 类型都具有与之相关联的强语义。例如,惯性测量组织的信息包含一个用于测量角速度的三维矢量,并且每个维度都被指定为弧度/秒。其他的解释不应该放在信息中。
-
ROS2系统的核心是 ROS 图。ROS 图指的是 ROS 系统中的节点网络以及它们之间的连接,它们通过这些连接进行通信。
架构对比:
该图出自论文:Exploring the Performance of ROS2,论文在线阅读地址:https://www.researchgate.net/profile/Takuya-Azumi/publication/309128426_Exploring_the_performance_of_ROS2/links/5c908801299bf14e7e84ce61/Exploring-the-performance-of-ROS2.pdf
- os layer:
- ros:只支持Linux
- ros2:支持Linux、Windows、mac、RTOS
- middleware layer:
- ros:基于主从节点,所有节点通过master节点进行通信
- ros2:去掉master节点,所有节点平等且可以1对1、1对n、n对n进行通信,通信使用DDS实现
- application layer:
- Python2到Python3的支持
- 编译系统的改进(catkin到ament)
- C++标准更新到c++11
- 可以使用相同 API 的进程间和进程内通信
ROS2整体架构:
- RCL(ROS Client Library)ROS客户端库,其实就是ROS的一种API,提供了对ROS话题、服务、参数、Action等接口
- Application Layer即我们做ros2开发所在的层
二、基本概念
1、节点-nodes
ROS2中的每个节点都单独负责一个模块化功能。如一个节点负责控制车轮转动、一个负责处理雷达数据等。
节点可以与同一进程中的其他节点、不同进程中的其他节点或不同计算机上的其他节点通信。
节点之间的连接是通过分布式发现过程建立的。
节点间的发现机制:(通过ROS2底层中间件自动进行)
- 当一个节点启动时,它会向网络上其他具有相同ROS域的节点(使用 ROS _ DOMAIN _ ID 环境变量设置)公布它的存在。其他节点用自身的信息响应此广告,以便建立适当的连接进行通信。
- 节点定期公布它们的存在,以便可以与新发现的实体建立连接,即使在最初的发现阶段之后也是如此。
- 节点脱机时向其他节点发出广告。
节点间的通信方式:
- 话题:topics
- 服务:services
- 动作:action
- 参数:parameter
#常用命令
ros2 run <package_name> <executable_name>
ros2 node list
#重新映射允许您将默认节点属性(如节点名称、主题名称、服务名称等)重新分配给自定义值。
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
ros2 node info <node_name>
2、接口-interfaces
ROS2四种通信方式,除参数外,话题、服务和动作都支持自定义接口,对应的接口类型为: 消息(messages)、服务(services)和动作(actions)。
ROS 2使用简化的描述语言,即接口定义语言 (IDL) 来描述这些接口。这种描述使ROS工具可以轻松地以多种目标语言自动的生成接口类型的源文件。
-
msg(消息):
- 位置:ROS包的
msg/
目录下的.msg
文件中描述和定义 - 字段:
- 每个字段由一个类型和一个名称组成,用一个空格分隔,添加默认值可再用一个空格分割,如
int32 my_int 16
; - 字段类型可以是内置类型或者ROS2自己定义的消息描述名称;
- 字段名必须是小写字母和数字字符,用下划线分隔单词。它们必须以字母字符开头,不能以下划线结尾,也不能有两个连续的下划线
- 每个字段由一个类型和一个名称组成,用一个空格分隔,添加默认值可再用一个空格分割,如
- 常量:名称要大写,无法通过程序更改,通过“=”赋值
- 位置:ROS包的
-
srv(服务):
-
ROS包的
srv/
目录下的.srv
文件中描述和定义。 -
组成:由一个请求和一个响应的msg类型组成,以“—”分隔。不能在服务中嵌入其他服务
string str --- string str
-
-
action(动作):
-
.action
文件描述操作。 -
组成:它们由三部分组成: 目标、结果和反馈。
<request_type> <request_fieldname> --- <response_type> <response_fieldname> --- <feedback_type> <feedback_fieldname>
-
3、话题-topics
话题是 ROS 2中非常重要并且最常用的通信方式之一,它充当节点交换消息的总线。
应该用于连续的数据流,如传感器数据,机器人状态等。
基于订阅发布模型,可以实现1对n、n对1、n对n通信,为发布者到订阅者单向通信。
发布服务器和订阅服务器必须发送和接收相同类型的消息才能进行通信。
#常用命令
ros2 topic list
ros2 topic list -t
#查看某个话题发布的数据
ros2 topic echo <topic_name>
ros2 topic info <topic_name>
ros2 interface show <topic_type>
# 发布频率参数 --once/--rate num
ros2 topic pub <topic_name> <msg_type> '<args>'
ros2 topic hz <topic_name>
4、服务-services
相对于主题的发布者-订阅者模型,服务基于请求和响应模型。虽然主题允许节点订阅数据流并获得持续更新,但服务只有在客户端特定调用时才提供数据。
服务即远程过程调用,换句话说,一个节点可以对另一个节点进行远程过程调用,该节点将执行计算并返回结果。
同一服务,可以有多个客户端,但只能有一个服务端发布此服务,服务端和客户端双向通信。
#常用命令
ros2 service list
ros2 service list -t
ros2 service type <service_name>
#查看某种类型的全部服务
ros2 service find <type_name>
ros2 interface show <type_name>
ros2 service call <service_name> <service_type> <arguments>
5、参数-parameters
参数是节点的配置值。可以将参数视为节点设置。节点可以将参数存储为整数、浮点数、布尔值、字符串和列表。在 ROS2中,每个节点维护自己的参数。
#常用指令
ros2 param list
ros2 param get <node_name> <parameter_name>
ros2 param set <node_name> <parameter_name> <value>
os2 param dump <node_name> > 文件名.yaml
ros2 param load <node_name> <parameter_file>
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
6、动作-actions
动作是ROS2中的通信类型之一,用于长时间运行的任务,由三部分组成:目标、反馈和结果。
动作基于话题和服务构造,功能类似于服务,但是可以取消操作,并且除响应服务外,还提供稳定的反馈。
动作使用客户机-服务器模型,类似于发布者-订阅者模型。“ action client”节点向“ action server”节点发送目标,“ action server”节点确认目标并返回反馈流和结果。每个动作只有一个server节点,可以有多个client节点。
- server:是接受远程过程请求并对其执行某些过程的实体。它还负责随着操作的进展发送反馈,并应对取消/抢占请求作出反应。
- client:
#常用命令
ros2 node info <node-name>
ros2 action list
ros2 action list -t
ros2 action info <node-name>
ros2 interface show <node-type>
ros2 action send_goal <action_name> <action_type> <values>