服务(services)是节点之间通讯的另一种方式。服务允许节点发送请求(request ) 并获得一个响应(response)
使用 rosservice
rosservice 可以很轻松的使用 ROS 客户端/服务器框架提供的服务。rosservice 提供了很多可以在topic 上使用的命令,可以通过下列命令查看:
rosservice -h
rosservice list
输出可用服务的信息,如打开 turtlesim_node:
roscore
rosrun turtlesim turtlesim_node
rosservice list
可以查看到 turtlesim 节点提供的服务:重置(reset), 清除(clear), 再生(spawn), 终止(kill)
等。
- 1.1 rosservice type
输出服务类型 使用方法:
rosservice type [service]
我们来看看 clear 服务的类型:
rosservice type clear
结果显示std_srvs/Empty
,即服务的类型为空(empty),这表明在调用这个服务是不需要参数(比如,请求不需要发送数据,响应也没有数据)。 - 1.2 rosservice call
使用方法:
rosservice call [service] [args]
因为服务类型是空,所以进行无参数调用:
rosservice call clear
正如我们所期待的,服务清除了turtlesim_node
的背景上的轨迹。
对于带参数的服务,比如再生(spawn)服务:
rosservice type spawn| rossrv show
根据结果这个服务可以在给定的位置和角度生成一只新的乌龟。名字参数是可选的,这里我们不设具体的名字,让 turtlesim 自动创建一个。
rosservice call spawn 2 2 0.2 ""
2,使用 rosparam
rosparam 能够存储并操作 ROS 参数服务器(Parameter Server)上的数据。参数服务器能够存储整、型、浮点、布尔、字符串、字典和列表等数据类型。rosparam 使用 YAML 标记语言的语法。
- 2.1
rosparam list
列出参数名,执行此命令
可以看到 turtlesim 节点在参数服务器上有 3 个参数用于设定背景颜色,下列通过 set 参数来改变背景色 - 2.2
rosparam set, rosparam get
用法:rosparam set [param_name]
和rosparam get [param_name]
如使用 rosparam set 修改背景颜色的红色通道:(rgb)
rosparam set background_r 150
上述指令修改了参数的值,现在我们调用清除服务使得修改后的参数生效:
rosservice call clear
再来使用 param get 查看参数服务器上的参数值 —— 获取背景的绿色通道的值:
rosparam get background_g
特别地,如果想显示参数服务器上的所有内容,可以执行下面命令rosparam get parameter_name
例如:rosparam get /background_r
如果想存储这些信息以备今后重新读取。这通过 rosparam 的 dump, load 参数很容易就可以实现。 - 2.3 rosparam dump, rosparam load
使用方法:
rosparam dump [file_name]
rosparam load [file_name] [namespace]
现在我们将所有的参数写入 params.yaml 文件:
rosparam dump params.yaml
甚至可以将 yaml 文件重载入新的命名空间,比如说 copy 空间:
rosparam load params.yaml copy
通过 rosparam get 命令来验证:
rosparam get copy/background_b
使用 rqt_console 和 roslaunch
- 使用 rqt_console 和 rqt_logger_level
rqt_console 属于 ROS 日志框架(logging framework)的一部分,用来显示节点的输出信息。
rqt_logger_level 允许我们修改节点运行时输出信息的日志等级(logger levels )(包括DEBUG、WARN、INFO 和 ERROR)。
现在让我们来看一下 turtlesim 在 rqt_console 中的输出信息,同时在 rqt_logger_level 中修改日志等级。在启动 turtlesim 之前先在另外两个新终端中运行 rqt_console 和 rqt_logger_level:
roscore
rosrun rqt_console rqt_console
rosrun rqt_logger_level rqt_logger_level
会看到弹出的两个窗口 rqt_console , rqt_logger_level。
现在在一个新标签页中启动 turtlesim:
rosrun turtlesim turtlesim_node
因为默认日志等级是 INFO,所以你会看到 turtlesim 启动后输出的所有信息,刷新一下
rqt_logger_level 窗口并选择 Warn 将日志等级修改为 WARN。
现在我们让 turtle 动起来并观察 rqt_console 中的输出:
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 0.0]'
日志等级说明
修改后的日志等级按以下优先顺序排列:
Fatal
Error
Warn
Info
Debug
Fatal 是最高优先级,Debug 是最低优先级。通过设置日志等级你可以获取该等级及其以上优先等级的所有日志消息。比如,这里将日志等级设为 Warn 时,会得到 Warn、Error 和 Fatal 这三个等级的所有日志消息。
现在让我们按 Ctrl-C 退出 turtlesim 节点,接下来我们将使用 roslaunch 来启动多个 turtlesim 节点和一个模仿节点以让一个 turtlesim 节点来模仿另一个 turtlesim 节点。
- 使用 roslaunch
roslaunch 可以用来启动定义在 launch 文件中的多个节点。
用法:
roslaunch [package] [filename.launch]
先切换到 hello_test 程序包目录下:
cd ~/test/devel
source setup.bash # 执行 devel 里的 setup.bash 脚本将这geworkspace 的信息配置到环境里面
roscd hello_test
然后创建一个 launch 文件夹:
mkdir launch
cd launch
- Launch 文件
现在我们来创建一个名为 turtlemimic.launch 的 launch 文件并复制粘贴以下内容到该文件里面:
<launch>
<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>
</launch>
- 使用 roslaunch
现在通过 roslaunch 命令来启动 launch 文件:
roslaunch hello_test turtlemimic.launch
现在将会有两个 turtlesims 被启动,然后我们在一个新标签页中使用 rostopic 命令发送速度设定消息:
rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0,0.0, -1.8]'
会看到两个 turtlesims 会同时开始移动,虽然发布命令只是给turtlesim1 发送了速度设定消息。
也可以通过 rqt_graph 来更好的理解在 launch 文件中所做的事情。运行rqt并在主窗口中选择rqt_graph:
运行rqt_graph
到此,我们算是已经学会了rqt_console和roslaunch命令的使用.