ROS2 基础概念 服务
- 1. Services
- 2. 服务类型
- 3. 查找服务
- 4. 服务请求
1. Services
服务基于 请求-应答 模型,而不是话题的 发布-订阅 模型
虽然话题允许节点订阅数据流并获得持续更新,但服务 仅在客户端专门调用时提供数据
还是启动海龟及其遥控节点为例:
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
在新终端中运行ros2 service list
命令将返回系统中当前活动的所有服务的列表:
将看到两个节点都有相同的六个服务,名称中都有参数 parameter
/xxx/describe_parameters
/xxx/get_parameter_types
/xxx/get_parameters
/xxx/list_parameters
/xxx/set_parameters
/xxx/set_parameters_atomically
ROS 2中的几乎每个节点都有这些基础设施服务,这些服务是基于这些基础设施建立的
参数的事情后续再做讨论,现在来说一下剩下的几个服务
/clear
/kill
/reset
/spawn
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
2. 服务类型
服务类型有两部分:一部分用于请求,另一部分用于应答
来看看/spawn
服务,在新终端中,输入命令:
ros2 service type /spawn
ros2 interface show turtlesim/srv/Spawn
---
上面是产卵服务的请求,下面是产卵服务的应答
即告诉起始点坐标、姿态和名称(可选),申请一只海龟,然后应答海龟的名字
不过请求和应答也不一定都要有数据,比如/clear
服务
ros2 service type /clear
ros2 interface show std_srvs/srv/Empty
空类型表示服务调用在发出请求时不发送数据,而在接收响应时也不接收数据
人狠话不多,直接执行清除
同样可以加上-t
选项,把服务及其类型都展列出来:
ros2 service list -t
3. 查找服务
如果要查找特定类型的所有服务,可以使用以下命令:
ros2 service find <服务类型>
例如,可以找到所有空类型的服务,如下所示:
ros2 service find std_srvs/srv/Empty
4. 服务请求
可以使用以下方法调用服务:
ros2 service call <服务名称> <服务类型> <请求数据>
例如请求将清除乌龟绘制的所有路径线条
ros2 service call /clear std_srvs/srv/Empty
还有 /spawn
服务
ros2 service call /spawn turtlesim/srv/Spawn "{x: 6, y: 6, theta: 0.2, name: 'turtle2'}"
界面就出现新的海龟,而他的话题是 /turtle2
开头,所以遥控的节点发布的话题也与新海龟无关
谢谢