1. Services

服务基于 请求-应答 模型,而不是话题的 发布-订阅 模型
虽然话题允许节点订阅数据流并获得持续更新,但服务 仅在客户端专门调用时提供数据

指令 功能
ros2 service call /service type args 根据命令行参数调用服务
ros2 service type /service 显示服务的消息类型
ros2 service find message_type 按照类型查找服务
ros2 service list 列出当前活动的服务

2. 服务

还是启动海龟及其遥控节点为例:

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


3. 服务类型

服务类型有两部分:一部分用于请求,另一部分用于应答

来看看/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
    


    4. 查找服务

    如果要查找特定类型的所有服务,可以使用以下命令:

    ros2 service find <服务类型>
    

    例如,可以找到所有空类型的服务,如下所示:

    ros2 service find std_srvs/srv/Empty
    


    5. 服务请求

    可以使用以下方法调用服务:

    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 开头,所以遥控的节点发布的话题也与新海龟无关


    谢谢