本帖最后由 dirty 于 2025-2-23 16:04 编辑
本篇将梳理学习ROS2应用开发方法之服务、通信接口、参数、动作、分布式通信、DDS。
一.服务
1.通信模型
发送一个请求,反馈一个应答的形式,这种通信机制在ROS中成为服务,Service。
2.客户端服务端模型
从服务的实现机制上来看,这种你问我答的形式叫做客户端/服务器模型,简称为CS模型,客户端在需要某些数据的时候,针对某个具体的服务,发送请求信息,服务器端收到请求之后,就会进行处理并反馈应答信息。
3.同步通讯
在服务通信中,客户端可以通过接收到的应答信息,判断服务器端的状态,我们也称之为同步通信。
4.一对多通信
服务通信模型中,服务器端唯一,但客户端可以不唯一。
5.服务接口
服务通信的核心还是要传递数据,数据变成了两个部分,一个请求的数据,还有一个反馈的数据,这些数据和话题消息一样,在ROS中也是要标准定义的,话题使用.msg文件定义,服务使用的是.srv文件定义。
6.案例:加法求解器
(1)启动两个终端,并运行如下节点,第一个节点是服务端,等待请求数据并提供求和功能,第二个节点是客户端,发送传入的两个加数并等待求和结果。
- ros2 run learning_service service_adder_server
- ros2 run learning_service service_adder_client 2 3
运行结果
(2)代码
(3)流程总结
客户端流程
●编程接口初始化
●创建节点并初始化
●创建客户端对象
●创建并发送请求数据
●等待服务器端应答数据
●销毁节点并关闭接口
服务端流程
●编程接口初始化
●创建节点并初始化
●创建服务器端对象
●通过回调函数处进行服务
●向客户端反馈应答结果
●销毁节点并关闭接口
二.通信接口
1.接口定义
ROS的通信系统,它的主要目的就是传输数据,那就得让大家高效的建立连接,并且准确包装和解析传输的数据内容,话题、服务等机制也就诞生了,他们传输的数据,都要符合通信接口的标准定义。
2.ROS通信接口
接口可以让程序之间的依赖降低,便于我们使用别人的代码,减少重复造轮子。
ROS有三种常用的通信机制,分别是话题、服务、动作,通过每一种通信种定义的接口,各种节点才能有机的联系到一起。
3.语言无关
为了保证每一个节点可以使用不同语言编程,ROS将这些接口的设计做成了和语言无关的。
●话题通信接口的定义使用的是msg文件,由于是单向传输,只需要描述传输的每一帧数据是什么就行。
●服务通信接口的定义使用的是.srv文件,包含请求和应答两部分定义,通过中间的“---”区分。
●动作是另外一种通信机制,用来描述机器人的一个运动过程,使用.action文件定义,此时接口的定义分成了三个部分,分别是动作的目标、运动的结果、周期反馈。
4.标准接口
在ROS安装路径中的share文件夹中找到,涵盖众多标准定义。
三.动作
动作是一种一种ROS通信机制。目的就是便于对机器人某一完整行为的流程进行管理。
1.通信模型
一个需要执行一段时间的行为,使用动作的通信机制就更为合适,就像装了一个进度条,我们可以随时把控进度,如果运动过程当中,我们还可以随时发送一个取消运动的命令。
客户端/服务器模型
动作和服务类似,使用的也是客户端和服务器模型,客户端发送动作的目标,想让机器人干什么,服务器端执行动作过程, 控制机器人达到运动的目标,同时周期反馈动作执行过程中的状态。
客户端发送一个运动的目标,想让机器人动起来,服务器端收到之后,就开始控制机器人运动,一边运动,一边反馈当前的状态,如果是一个导航动作,这个反馈可能是当前所处的坐标,如果是机械臂抓取,这个反馈可能又是机械臂的实时姿态。当运动执行结束后,服务器再反馈一个动作结束的信息。整个通信过程就此结束。
2.一对多通信
和服务一样,动作通信中的客户端可以有多个,大家都可以发送运动命令,但是服务器端只能有一个,一个机器人,先执行完成一个动作,才能执行下一个动作。
3.同步通信
有反馈,动作也是一种同步通信机制,之前我们也介绍过,动作过程中的数据通信接口,使用.action文件进行定义。
4.由服务和话题合成
上面的动图,动作的三个通信模块,有两个是服务,一个是话题。当客户端发送运动目标时,使用的是服务的请求调用,服务器端也会反馈一个应带,表示收到命令。动作的反馈过程,其实就是一个话题的周期发布,服务器端是发布者,客户端是订阅者。
动作是一种应用层的通信机制,其底层就是基于话题和服务来实现的。
四.参数
参数是ROS机器人系统中的全局字典,可以运行多个节点中共享数据。
1.全局字典
在ROS系统中,参数是以全局字典的形态存在的。字典由名称和数值组成,也叫做键和值,合成键值。
2.可动态监控
在ROS2中,参数的特性非常丰富,比如某一个节点共享了一个参数,其他节点都可以访问,如果某一个节点对参数进行了修改,其他节点也有办法立刻知道,从而获取最新的数值。这在参数的高级编程中,大家都可能会用到。
五.分布式通信
在ROS系统中,机器人功能是由各种节点组成的,这些节点可能位于不同的计算机中,这种结构可以将原本资源消耗较多的任务,分配到不同的平台上,减轻计算压力,这就是分布式通信框架的典型应用之一。
分布式网络搭建包括装系统、安装ROS2、远程桌面网络控制。分布式数据传输确保设备与电脑连在同一个局域网络中,打通两个计算平台的通信能力,包括话题、服务、动作等通信。
分布式网络分组
ROS2提供了一个DOMAIN的机制,就类似分组一样,处于同一个DOMAIN中的计算机才能通信,我们可以在电脑和树莓派端的.bashrc中加入这样一句配置,即可将两者分配到一个小组中。
- export ROS_DOMAIN_ID=<your_domain_id>
六.DDS
ROS2中最为重大的变化--DDS,前面学习的话题、服务、动作,他们底层通信的具体实现过程,都是靠DDS来完成的,它相当于是ROS机器人系统中的神经网络。
1.通信模型
DDS的核心是通信,能够实现通信的模型和软件框架非常多,这里我们列出常用的四种模型:
●点对点模型,许多客户端连接到一个服务端,每次通信时,通信双方必须建立一条连接。当通信节点增多时,连接数也会增多。而且每个客户端都需要知道服务器的具体地址和所提供的服务,一旦服务器地址发生变化,所有客户端都会受到影响。
●Broker模型,针对点对点模型进行了优化,由Broker集中处理所有人的请求,并进一步找到真正能响应该服务的角色。优点:客户端就不用关心服务器的具体地址了。缺点:Broker作为核心,它的处理速度会影响所有节点的效率,当系统规模增长到一定程度,Broker就会成为整个系统的性能瓶颈。如果Broker发生异常,可能导致整个系统都无法正常运转。之前的ROS1系统,使用的就是类似这样的架构。
●广播模型,所有节点都可以在通道上广播消息,并且节点都可以收到消息。这个模型解决了服务器地址的问题,而且通信双方也不用单独建立连接,但是广播通道上的消息太多了,所有节点都必须关心每条消息,其实很多是和自己没有关系的。
●以数据为中心的DDS模型了,这种模型与广播模型有些类似,所有节点都可以在DataBus上发布和订阅消息。但它的先进之处在于,通信中包含了很多并行的通路,每个节点可以只关心自己感兴趣的消息,忽略不感兴趣的消息,有点像是一个旋转火锅,各种好吃的都在这个DataBus传送,我们只需要拿自己想吃的就行,其他的和我们没有关系。
在这几种通信模型中,DDS的优势更加明显。
2.DDS
DDS的全称是Data Distribution Service,也就是数据分发服务,是一套专门为实时系统设计的数据分发/订阅标准.
DDS强调以数据为中心,可以提供丰富的服务质量策略,以保障数据进行实时、高效、灵活地分发,可满足各种分布式实时通信应用需求。
3.DDS在ROS2中的应用
DDS在ROS2系统中的位置至关重要,所有上层建设都建立在DDS之上。在这个ROS2的架构图中,蓝色和红色部分就是DDS。
DDS是一种通信的标准,DDS是一种通信的标准,能够按照DDS标准实现的通信系统很多,这里每一个红色模块,就是某一企业或组织实现的一种DDS系统。
为了实现对多个DDS的兼容,ROS设计了一个Middleware中间件,也就是一个统一的标准,不管我们用那个DDS,保证上层编程使用的函数接口都是一样的。
DDS通讯模型如下
DDS中的基本结构是Domain,Domain将各个应用程序绑定在一起进行通信。DDS中另外一个重要特性就是质量服务策略,QoS。
QoS是一种网络传输策略,应用程序指定所需要的网络传输质量行为,QoS服务实现这种行为要求,尽可能地满足客户对通信质量的需求,可以理解为数据提供者和接收者之间的合约。具体策略如下:
●DEADLINE策略,表示通信数据必须要在每次截止时间内完成一次通信;
●HISTORY策略,表示针对历史数据的一个缓存大小;
●RELIABILITY策略,表示数据通信的模式,配置成BEST_EFFORT,就是尽力传输模式,网络情况不好的时候,也要保证数据流畅,此时可能会导致数据丢失,配置成RELIABLE,就是可信赖模式,可以在通信中尽量保证图像的完整性,我们可以根据应用功能场景选择合适的通信模式;
●DURABILITY策略,可以配置针对晚加入的节点,也保证有一定的历史数据发送过去,可以让新节点快速适应系统。
DDS的加入,让ROS2的通信系统焕然一新,多众多样的通信配置,可以更好的满足不同场景下的机器人应用。
4.案例:DDS编程
(1)代码配置DDS,以Hello World话题通信为例。
执行以下指令运行
- ros2 run learning_qos qos_helloworld_pub
- ros2 run learning_qos qos_helloworld_sub
运行结果如下:
(2)代码解析
发布者代码learning_qos/qos_helloworld_pub.py,订阅者代码learning_qos/qos_helloworld_sub.py
至此,ROS2的应用开发方法基本梳理学习实践了一遍,为后面进一步学习与深入奠定一个好的基础。