在这一节里面,我们将介绍ROS服务,参数以及使用rosservice
和rosparam
。
首先,我们需要理解什么是ROS服务,它是节点之间相互通信的另外一种方式,如果你学习了上一节的内容,那么你应该知道节点之间是可以通过基于话题的消息来进行节点之间的通信的。而服务的通信机制是允许节点发送请求和响应请求。服务和基于话题的消息通信的本质区别是:
- 话题的通信机制是:多对多的;
- 服务的通信机制是:一对一的。
现在,让我们开看一下turtlesim
功能包提供了什么服务。
使用rosservice
rosservice
有很多可以用在话题上的命令:
rosservice list print information about active services
rosservice call call the service with the provided args
rosservice type print service type
rosservice find find services by service type
rosservice uri print service ROSRPC uri
首先我们使用rosservice list
命令:
rosservice list
输出结果为:
liuqiang@liuqiang-pc:~$ rosservice list
/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
可以看出,turtlesim
节点提供了9个服务,而rosout
节点提供了2个服务。
接着我们使用rosservice type
命令。
rosservice type
命令的格式如下:
roservice type [service]
例如:
rosservice type /clear
输出结果为:
liuqiang@liuqiang-pc:~$ rosservice type /clear
std_srvs/Empty
可以看出,输出的服务数据类型是空的,表示当它发送请求的时候,没有发送数据,接收响应的时候,也没有接收到数据。
下一步,我们使用rosservice call
命令
该命令的语法格式为:
rosservice call [service]
例如:
rosservice call /clear
输出结果是,我们发现小海龟的运动轨迹被清除了。
现在我们来运行一下这样的一条命令:
rosservice type /spawn | rossrv show
输出的结果为:
liuqiang@liuqiang-pc:~$ rosservice type /spawn | rossrv show
float32 x
float32 y
float32 theta
string name
---
string name
其实这条命令可以分解为rosservice type
和rossrv show
两条命令:
liuqiang@liuqiang-pc:~$ rosservice type /spawn
turtlesim/Spawn
liuqiang@liuqiang-pc:~$ rossrv show turtlesim/Spawn
float32 x
float32 y
float32 theta
string name
---
string name
看到这里,是不是发现很像之前那条查看基于话题的消息的命令?
liuqiang@liuqiang-pc:~$ rostopic type /turtle1/cmd_vel | rosmsg show
geometry_msgs/Vector3 linearfloat64 xfloat64 yfloat64 z
geometry_msgs/Vector3 angularfloat64 xfloat64 yfloat64 z
现在,我们使用/spawn
服务来孵化除一只新的小海龟:
liuqiang@liuqiang-pc:~$ rosservice call /spawn 2 2 0.2 "turtle2"
name: turtle2
输出结果为:
使用rosparam
rosparam
允许你在ROS参数服务器上存储和操纵数据。参数服务可以存储整型、浮点型、布尔型、字典和列表等类型的数据。rosparam
使用YAML标记语言作为语法,在简单的情况下,YAML看起来非常的自然:1是整型,1.0是浮点型,one是字符串,true是布尔型,[1, 2, 3]是元素为整型的列表,{a:b, c:d}是一个字典,rosparam
有很多命令可以用于参数,比如:
rosparam set set parameter
rosparam get get parameter
rosparam load load parameters from file
rosparam dump dump parameters to file
rosparam delete delete parameter
rosparam list list parameter names
首先,我们来看一下有哪些参数存储在参数服务器上?
rosparam list
输出的结果为:
liuqiang@liuqiang-pc:~$ rosparam list
/background_b
/background_g
/background_r
/rosdistro
/roslaunch/uris/host_liuqiang_pc__36444
/rosversion
/run_id
可以看出,turtlesim
节点有3个参数在参数服务器上用于设置窗口的背景色,现在我们使用rosparam set
来改变一个参数的值看一下有什么变化。
rosparam set /background_r 150
上面的命令改变了参数的值,现在我们还需要调用/clear
服务来使更改的参数值生效。
rosservice call /clear
现在的结果是:
我们还可以获取参数服务器上的某个特定参数的参数值:
rosparam get /background_g
输出结果为:
liuqiang@liuqiang-pc:~$ rosparam get /background_g
86
当然了,我们也可以获取参数服务器上的所有参数及其对应的参数值:
rosparam get /
输出的结果为:
liuqiang@liuqiang-pc:~$ rosparam get /
background_b: 255
background_g: 86
background_r: 150
rosdistro: 'indigo'
roslaunch:uris: {host_liuqiang_pc__36444: 'http://liuqiang-pc:36444/'}
rosversion: '1.11.21'
run_id: 32a8e6c2-b25d-11e7-8bbe-30b49e59a135
比如说,我们想要查看自己ros的版本号:
rosparam get /rosdistro
输出结果为:
liuqiang@liuqiang-pc:~$ rosparam get /rosdistro
'indigo'
再比如说,我们还想查看ros的详细版本信息:
rosparam get /rosversion
输出结果为:
liuqiang@liuqiang-pc:~$ rosparam get /rosversion
'1.11.21'
我们还可以将参数服务器上的所有内容转储到自命名的文件中:
rosparam dump params.yaml
params.yaml文件中的内容为:
background_b: 255
background_g: 86
background_r: 150
rosdistro: 'indigo'
roslaunch:uris: {host_liuqiang_pc__36444: 'http://liuqiang-pc:36444/'}
rosversion: '1.11.21'
run_id: 32a8e6c2-b25d-11e7-8bbe-30b49e59a13
当然了,我们还可以将params.yaml文件的内容加载到新的命名空间:
roaparam load params.yaml copy
接着,我们来获取新的命名空间中的参数的值:
rosparam get /copy/background_b
输出结果为:
liuqiang@liuqiang-pc:~$ rosparam get /copy/background_g
86