2.5 参数服务
场景
在机器人系统中不同的功能模块可能会使用到一些相同的数据,比如:
导航实现时,会进行路径规划,路径规划主要包含, 全局路径规划和本地路径规划,所谓全局路径规划就是设计一个从出发点到目标点的大致路径,而本地路径规划,则是根据车辆当前路况生成实时的行进路径。两种路径规划实现,都会使用到车辆的尺寸数据——长度、宽度、高度等。那么这些通用数据在程序中应该如何存储、调用呢?
上述场景中,就可以使用参数服务实现,在一个节点下保存车辆尺寸数据,其他节点可以访问该节点并操作这些数据。
概念
参数服务是以共享的方式实现不同节点之间数据交互的一种通信模式。保存参数的节点称之为参数服务端,调用参数的节点称之为参数客户端。参数客户端与参数服务端的交互是基于请求响应的,且参数通信的实现本质上对服务通信的进一步封装。
作用
参数服务保存的数据类似于编程中“全局变量”的概念,可以在不同的节点之间共享数据。
2.5.1 案例以及案例分析
1.案例需求
需求:在参数服务端设置一些参数,参数客户端访问服务端并操作这些参数。

2.案例分析
在上述案例中,需要关注的要素有三个:
参数客户端;
参数服务端;
参数。
3.流程简介
案例实现前需要先了解ROS2中参数的相关API,无论是客户端还是服务端都会使用到参数,而参数服务案例实现主要步骤如下:
编写参数服务端实现;
编写参数客户端实现;
编辑配置文件;
编译;
执行。
案例我们会采用C++和Python分别实现,二者都遵循上述实现流程。
4.准备工作
终端下进入工作空间的src目录,调用如下两条命令分别创建C++功能包和Python功能包。
ros2 pkg create cpp04_param --build-type ament_cmake --dependencies rclcpp
ros2 pkg create py04_param --build-type ament_python --dependencies rclpy
2.5.2 参数数据类型
在ROS2中,参数由键、值和描述符三部分组成,其中键是字符串类型,值可以是bool、int64、float64、string、byte[]、bool[]、int64[]、float64[]、string[]中的任一类型,描述符默认情况下为空,但是可以设置参数描述、参数数据类型、取值范围或其他约束等信息。
为了方便操作,参数被封装为了相关类,其中C++客户端对应的类是rclcpp::Parameter
,Python客户端对应的类是rclpy.Parameter
。借助于相关API,我们可以实现参数对象创建以及参数属性解析等操作。以下代码提供了参数相关API基本使用的示例。

