本节主要介绍在调试时使用的rqt_console和rqt_logger_level,以及一次性打开多个节点的工具roslaunch。
使用rqt_console和rqt_logger_level
- rqt_console:主要显示节点的输出信息。
- rqt_logger_level:用于设置输出信息的重要性等级。
还是利用turtlesim例程,看一下其不同等级的输出。在打开turtlesim之前,首先要运行roscore,然后在两个不同的终端中输入以下命令:
rosrun rqt_console rqt_console
- 1
rosrun rqt_logger_level rqt_logger_level
- 1
可以看到如下弹出的窗口
然后在一个新的终端中输入以下命令打开turtlesim
rosrun turtlesim turtlesim_node
- 1
然后发现rqt_console窗口中就有了一个生成的信息
现在可以更改rqt_logger_level中的信息等级,更改为warn,则只会显示warn、error和fatal类的信息。通过rostopic pub
命令向小海龟发送命令让其撞墙,产生警告信息:
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0,0.0,0.0]' '[0.0,0.0,0.0]'
- 1
然后在rqt_console窗口中就会显示撞墙的警告信息:
roslaunch
roslaunch一次性打开在一个launch文件中定义的所有节点。
roslaunch基本语法
roslaunch [package] [launch.file] [args]
roslaunch <launch-file-paths...> [args]
- 1
- 2
虽然说launch file放在哪里都可以,只要在运行的时候指明其位置即可。但是一般来说,都会在软件包目录下创建一个文件夹launch,以用来存放所创建的launch文件。
指明launch file文件位置的方式有两种:
第一种是直接指明launch file的绝对路径位置
第二种是指明软件包名称和放在软件包目录中的launch file,这种情况下roslaunch会在软件包目录中寻找和指定文件匹配的launch file
roslaunch beginner-tutorials turtlemimic.launch
roslaunch ~/ros-tutorial/src/beginner-tutorials/turtlemimic.launch
WARNING: Package name "beginner-tutorials" does not follow the naming conventions. It should start with a lower case letter and only contain lower case letters, digits and underscores.
... logging to /home/mountzf/.ros/log/9f76d9e2-6b34-11e6-a83d-000c29521e21/roslaunch-ubuntu-4381.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.
started roslaunch server http://ubuntu:44397/
SUMMARY
========
PARAMETERS
* /rosdistro: indigo
* /rosversion: 1.11.20
NODES
/
mimic (turtlesim/mimic)
/turtlesim1/
sim (turtlesim/turtlesim_node)
/turtlesim2/
sim (turtlesim/turtlesim_node)
ROS_MASTER_URI=http://localhost:11311
core service [/rosout] found
WARNING: Package name "beginner-tutorials" does not follow the naming conventions. It should start with a lower case letter and only contain lower case letters, digits and underscores.
process[turtlesim1/sim-1]: started with pid [4399]
process[turtlesim2/sim-2]: started with pid [4400]
process[mimic-3]: started with pid [4401]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2,0,0]' '[0,0,1.8]'
- 1
其中turtlemimic.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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
也可使使用rqt_graph画出节点之间的关系图,更加清楚了解后roslaunch做了些什么。
mimic是一个起模仿作用的节点,实现将turtlesim1的数据信息传送给turtlesim2。
一个node element包含三个必须的属性:pkg, type, name.
pkg和type属性指出ROS应该运行哪个pkg中的哪个node,注意:此处的type是可执行文件的名称,而name则是可以任意给出的,它覆盖了原有文件中ros::init指定的node name。
在独立的窗口运行各nodes
我们在各自的termin运行rosrun node_name;但是运行roslaunch时,所有的nodes共用一个相同的terminal,这对于那些需要从控制台输入的nodes很不方便。可以使用launch-prefix属性。
launch-prefix=”command-prefix”
Eg:launch-prefix=”xterm -e”
等价于 xterm -e rosrun turtlesim turtle_teleop_key
- 1
- 2
- 3
xterm 命令表示新建一个terminal; -e参数告诉xterm执行剩下的命令行。
当然,launch-prefix属性不仅仅限于xterm。它可用于调试(通过gdb或valgrind),或用于降低进程的执行顺序(通过nice).
重映射names(remapping names)
除了解析relative names和private names,ROS也支持重映射,用于修改nodes当前使用的名称。
重映射相当于换名,每次重映射需提供一个original name和一个new name。每次node使用它的original name, ROS client library都会将其替换为remapping name。
创建remapping name两种方法:
单个node
对于单个node,在命令行进行remapping(remap对象可以是node,topic等)。
original-name:=new-name
Eg: $ rosrun turtlesim turtlesim_node turtle1/pose:=tim
在launch文件中
在launch文件内remap names,使用remap element
<remap from=”original_name” to “new_name”>
- 1
如果remap出现在launch文件开头,作为launch文件的子元素,则该remapping将被用于随后所有的nodes。如果remap作为某个node的子元素,则只用于该节点。
Eg:<node pkg=”turtlesim” type=”turtlesim_node” name=”turtle1”>
<remap from =”turtle1/pose” to “tim”>
</node>
- 1
- 2
- 3
注意:在ROS进行remapping之前,remaping的所有name,包括original和new names,都将被解析为global names。所以,remapping之后所有的名字通常都是relative names。
总结
- rqt_console:主要显示节点的输出信息。
- rqt_logger_level:用于设置输出信息的重要性等级。
- roslaunch:一次性打开在一个launch文件中定义的所有节点。
祝枫
2016年8月26日于哈尔滨