#################################### ##FILL ME IN #################################### ## links to any required tutorials ## note.0= [[cn/ROS/Tutorials/UnderstandingTopics|理解ROS话题]] ## descriptive title for the tutorial ## title = 理解ROS服务和参数 ## multi-line description to be displayed in search ## description = 本教程介绍了ROS服务和参数的知识,以及命令行工具[[rosservice]]和[[rosparam]]的使用方法。 ## the next tutorial description ## next = ## links to next tutorial ## next.0.link = [[cn/ROS/Tutorials/UsingRqtconsoleRoslaunch|使用rqt_console和roslaunch]] ## next.1.link = ## what level user is this tutorial for ## level= BeginnerCategory #################################### <> <> 本教程假设上一教程启动的`turtlesim_node`仍在运行,现在我们来看看turtlesim提供了什么服务: == ROS服务 == [[Services|服务(Services)]]是节点之间通讯的另一种方式。服务允许节点发送一个'''请求(request)'''并获得一个'''响应(response)'''。 == 使用rosservice == `rosservice`可以很容易地通过服务附加到ROS客户端/服务器框架上。`rosservice`有许多可用于服务的命令,如下所示: 用法: {{{ rosservice list 输出活跃服务的信息 rosservice call 用给定的参数调用服务 rosservice type 输出服务的类型 rosservice find 按服务的类型查找服务 rosservice uri 输出服务的ROSRPC uri }}} === rosservice list === {{{ $ rosservice list }}} `list`命令显示turtlesim节点提供了9个服务:`reset`, `clear`, `spawn`, `kill`, `turtle1/set_pen`, `/turtle1/teleport_absolute`, `/turtle1/teleport_relative`, `turtlesim/get_loggers`, `turtlesim/set_logger_level`。同时还有两个与`rosout`节点有关的服务:`/rosout/get_loggers`和`/rosout/set_logger_level`。 {{{ /clear /kill /reset /rosout/get_loggers /rosout/set_logger_level /spawn /teleop_turtle/get_loggers /teleop_turtle/set_logger_level /turtle1/set_pen /turtle1/teleport_absolute /turtle1/teleport_relative /turtlesim/get_loggers /turtlesim/set_logger_level }}} 我们使用`rosservice type`命令进一步查看`clear(清除)`服务: === rosservice type === 用法: {{{ rosservice type [service] }}} 来看看clear服务的类型: {{{ $ rosservice type /clear }}} {{{ std_srvs/Empty }}} 服务的类型为`empty`(空),这表明调用这个服务时不需要参数(即,它在发出'''请求'''时不发送数据,在接收'''响应'''时也不接收数据)。下面我们使用`rosservice call`命令调用此服务: === rosservice call === 用法: {{{ rosservice call [service] [args] }}} 因为服务的类型为empty,所以进行无参数调用: {{{ $ rosservice call /clear }}} 跟想象的一样,它清除了`turtlesim_node`背景上的轨迹。 {{attachment:ROS/Tutorials/UnderstandingServicesParams/turtlesim.png}} 再让我们看看服务具有参数的情况。查看`spawn(产卵)`服务的信息: {{{ $ rosservice type /spawn | rossrv show }}} {{{ float32 x float32 y float32 theta string name --- string name }}} 这个服务能让我们可以在给定的位置和角度生成一只新的乌龟。`name`字段是可选的,这里我们不设具体的名字,让turtlesim自动创建一个。 {{{ $ rosservice call /spawn 2 2 0.2 "" }}} 该调用返回了新产生的乌龟的名字: {{{ name: turtle2 }}} 现在我们的turtlesim应该看起来像这样: {{attachment:ROS/Tutorials/UnderstandingServicesParams/turtle(service).png}} == 使用rosparam == `rosparam`能让我们在ROS[[Parameter Server|参数服务器(Parameter Server)]]上存储和操作数据。参数服务器能够存储整型(integer)、浮点(float)、布尔(boolean)、字典(dictionaries)和列表(list)等数据类型。rosparam使用YAML标记语言的语法。一般而言,YAML的表述很自然:`1`是整型,`1.0`是浮点型,`one`是字符串,`true`是布尔型,`[1, 2, 3]`是整型组成的列表,`{a: b, c: d}`是字典。`rosparam`有很多命令可以用来操作参数,如下所示: 用法: {{{ rosparam set 设置参数 rosparam get 获取参数 rosparam load 从文件中加载参数 rosparam dump 向文件中转储参数 rosparam delete 删除参数 rosparam list 列出参数名 }}} 我们来看看现在参数服务器上都有哪些参数: === rosparam list === {{{ $ rosparam list }}} 可以看到turtlesim节点在参数服务器上有3个参数用于设定背景颜色: {{{ /rosdistro /roslaunch/uris/host_nxt__43407 /rosversion /run_id /turtlesim/background_b /turtlesim/background_g /turtlesim/background_r }}} 让我们使用`rosparam set`来试着改变一个参数值: === rosparam set和rosparam get === 用法: {{{ rosparam set [param_name] rosparam get [param_name] }}} 现在我们修改背景颜色的红色通道值: {{{ $ rosparam set /turtlesim/background_r 150 }}} 上述指令修改了参数的值,现在我们需要调用clear服务使得参数的修改能生效: {{{ $ rosservice call /clear }}} 现在我们的turtlesim看起来应该像这样: {{attachment:ROS/Tutorials/UnderstandingServicesParams/turtle(param).png}} 然后我们来查看参数服务器上其他参数的值。获取背景的绿色通道的值: {{{ $ rosparam get /turtlesim/background_g }}} {{{ 86 }}} 也可以用`rosparam get /`来显示参数服务器上的所有内容: {{{ $ rosparam get / }}} {{{ rosdistro: 'noetic ' roslaunch: uris: host_nxt__43407: http://nxt:43407/ rosversion: '1.15.5 ' run_id: 7ef687d8-9ab7-11ea-b692-fcaa1494dbf9 turtlesim: background_b: 255 background_g: 86 background_r: 69 }}} 你可能希望将其存储在一个文件中,以便下次可以重新加载它。这通过`rosparam`很容易就可以实现: === rosparam dump和rosparam load === 用法: {{{ rosparam dump [file_name] [namespace] rosparam load [file_name] [namespace] }}} 在这里,我们将所有的参数写入`params.yaml`文件: {{{ $ rosparam dump params.yaml }}} 你甚至可以将yaml文件重载入新的命名空间,例如`copy_turtle`: {{{ $ rosparam load params.yaml copy_turtle $ rosparam get /copy_turtle/turtlesim/background_b }}} {{{ 255 }}} 至此,我们已经了解了ROS服务和参数的工作原理。接下来,我们一同试试[[cn/ROS/Tutorials/UsingRqtconsoleRoslaunch|使用rqt_console和roslaunch]]。 ## AUTOGENERATED DO NOT DELETE ## TutorialCategory ## ROSTutorialCategory ## TutorialTurtlesim