服务通信和参数通信
机器人中,除了需要话题通信(单向的数据传递),有时还需要双向,比如一个节点向另一个节点发送图片请求识别,另一个节点识别完成后将结果返回给请求节点。服务通信就是针对这一场景的解决方案。
在前面我们完成了小说阅读播放器项目,那里的代码设置的是中文,如果我们要加其他语言,就要修改源代码。每个节点有多个参数需要调整,怎么解决?——参数通信
关系:参数通信时基于服务通信实现的。
在ROS2 DDS中,只有话题通信(订阅发布),服务通信由两个话题构成,参数通信由多个服务话题构成,而动作通信则是由话题加服务构成的。
(动作不过多介绍)
4.1 服务通信介绍
以海龟为例
Ros2 service list -t
查看服务列表
每一行代表一个服务,前面是服务名称,后面[]是服务接口类型,与话题基本一样,不同点在于接口,服务的接口分为请求和响应接口!
以生成海龟服务spawn为例
$ ros2 interface show turtlesim/srv/Spawn
—
float32 x
float32 y
float32 theta
string name # Optional. A unique name will be created and returned if this is empty
—
string name
前四个是request请求接口定义,包括位置朝向名字;最下面的是响应接口,返回的是一个新生成的海龟名字。
调用这个接口:
$ ros2 service call /spawn turtlesim/srv/Spawn “{x: 1, y: 1, theta: 0.0}”
—
waiting for service to become available…
requester: making request: turtlesim.srv.Spawn_Request(x=1.0, y=1.0, theta=0.0, name=”)
response:
turtlesim.srv.Spawn_Response(name=’turtle2′)
还可以用rqt可视化工具来调用服务
在plugins services services caller 选项中选择spawn服务修改参数即可添加
最后如图所示:

4.2 参数通信介绍
从上面的list我们可以看到有Parameter结尾的,这些就是和参数相关的服务!
用ros2 param list我们可以看到有8个,后面5个是自动生成的参数,我们调一下第三个为例
ros2 param describe /turtlesim background_r
$ ros2 param get /turtlesim background_r
Integer value is: 69
$ ros2 param set /turtlesim background_r 255
Set parameter successful

当系统需要多个节点或较多参数需要配置则需要使用文件来配置。首先将某个节点的配置到处yaml,用下面这段代码将海龟模拟器的参数导出到文件里。
$ ros2 param dump /turtlesim > turtlesim_param.yaml
$ cat turtlesim_param.yaml
/turtlesim:
ros__parameters:
background_b: 255
background_g: 86
background_r: 255
qos_overrides:
/parameter_events:
publisher:
depth: 1000
durability: volatile
history: keep_last
reliability: reliable
use_sim_time: false
运行节点指定参数文件,实现参数自动配置
$ ros2 run turtlesim turtlesim_node –ros-args –params-file turtlesim_param.yaml
Rqt configuration -> DynamicReconfigure也可以操作调参!