创建一个ROS Package
这个教程包括使用roscreate-pkg或者catkin去创建一个新的package,以及使用rospack去列出package的依赖。在Indigo中,推荐使用catkin。
catkin package由什么组成
一个package被认为是catkin packages必须满足这些要求:
- a.必须包含一个catkin compliant(编译) package.xml文件(提供关于package的元信息);
-
b.必须包含一个使用catkin的CMakeLists.txt文件。Cat
roscore.pngkin metapackages(元package)必须有一个CMakeLists.txt样本文件;
- c.在一个文件夹中不允许有超过两个的package(这就着意味着没有其他packages共享这个目录)。
这个简单的package可能像这个样子:
my_package/
CMakeLists.txt
package.xml
catkin工作空间中的packages
推荐使用catkin packages的方式是使用catkin工作空间,但是你也可以单独使用catkin建立packages。一般的工作空间看起来像这样:
workspace_folder/ -- WORKSPACE
src/ -- SOURCE SPACE
CMakeLists.txt -- 'Toplevel' CMake file, provided by catkin
package_1/
CMakeLists.txt -- CMakeLists.txt file for package_1
package.xml -- Package manifest for package_1
...
package_n/
CMakeLists.txt -- CMakeLists.txt file for package_n
package.xml -- Package manifest for package_n
创建一个catkin package
这里将会用catkin_create_pkg脚本去创建一个新的catkin package。首先去到你之前创建的工作空间目录,然后用catkin_create_pkg 脚本创建一个做“beginner_tutorials”的新package,它依赖于std_msgs,roscpp和roscpy,命令如下
$ cd ~/catkin_ws/src
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
现在创建了一个 beginner_tutorials文件夹,包含有package.xml 、CMakeLists.txt文件,其中部分填写了由你提供给catkin_create_pkg的信息。
catkin_create_pkg要求你提供一个package的名字和它所需要的依赖。它的用法如下:
$ catkin_create_pkg [package_name] [depend1] [depend2] [depend3]
在catkin/commands/catkin_create_pkg中有对catkin_create_pkg更加高级功能的描叙。
建立一个catkin工作空间并且启用setup文件
现在需要在catkin工作空间编译package。
$ cd ~/catkin_ws
$ catkin_make
执行该命令后会在devel文件夹下生成一个和在/opt/ros/$ROSDISTRO_NAME(ROS版本名这里是/opt/ros/indigo)下相似的结构。
为把工作空间添加到ROS环境变量你需要执行:
$ echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
# 使环境变量设置立即生效
$ source ~/.bashrc
# 使环境变量生效
$ source ~/catkin_ws/devel/setup.bash
# echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
# source ~/.bashrc
package的依赖
第一层依赖
用catkin_create_pkg时,一些package提供了依赖。这些第一层依赖可以通过rospack工具重现。注意,此处使用的命令选项是depends1
,而不是depends
,depends1
是用来输出第一层依赖关系的,而depends
是用来输出所有递归以来关系的。
$ rospack depends1 beginner_tutorials
输出:
roscpp
rospy
std_msgs
message_runtime
列出了运行catkin_create_pkg命令时的一些依赖,这些依赖储存在package.xml文件中。查看package.xml文件的命令如下:
$ roscd beginner_tutorials
$ cat package.xml
输出:
<?xml version="1.0"?>
<package>
<name>beginner_tutorials</name>
<version>0.1.0</version>
<description>The beginner_tutorials package</description>
<maintainer email="skl338@todo.todo">skl338</maintainer>
<license>BSD</license>
<url type="website">http://wiki.ros.org/beginner_tutorials</url>
<author email="jane.doe@example.com">Jane Doe</author>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<run_depend>roscpp</run_depend>
<run_depend>rospy</run_depend>
<run_depend>std_msgs</run_depend>
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
</package>
间接依赖
许多情况下,依赖也有它的依赖。比如:
$ rospack depends1 rospy
输出:
genpy
roscpp
rosgraph
rosgraph_msgs
roslib
std_msgs
rospack可以显示所有递归的嵌套依赖。
$ rospack depends beginner_tutorials
输出:
cpp_common
rostime
roscpp_traits
roscpp_serialization
genmsg
genpy
message_runtime
catkin
gencpp
genlisp
message_generation
rosbuild
rosconsole
std_msgs
rosgraph_msgs
xmlrpcpp
roscpp
rosgraph
rospack
roslib
rospy
编译package
只要所有的package系统依赖都安装好了,就可以编译了。如果你是用apt或者其他package管理器安装的ROS,那就应该已经有所有的依赖了。记得使你的环境设置文件生效:
# source /opt/ros/%YOUR_ROS_DISTRO%/setup.bash
$ source /opt/ros/indigo/setup.bash
使用catkin_make
catkin_make命令行工具对与标准的catkin工作流程来说是一个非常方便的,你可以理解为它把调用cmake和编译结合起来了。
用法:
# In a catkin workspace
$ catkin_make [make_targets] [-DCMAKE_VARIABLES=...]
对于一个不熟悉标准CMake流程的人来说,可以分解为以下几个步骤(但是实际上执行这些命令是没用的,它只是说明CMake是怎样工作的):
# In a CMake project
$ mkdir build
$ cd build
$ cmake ..
$ make
$ make install # (optionally)
这是每个CMake工程的过程,但是它可以在一个工作空间中编译多个catkin工程。在一个工作空间中编译多个catkin packages是这样操作的:
# In a catkin workspace
$ catkin_make
$ catkin_make install # (optionally)
以上代码可以编译在src文件夹中的任何catkin工程,这里参考了:
http://www.ros.org/reps/rep-0128.html
如果你的源代码不在src中,可以用my_src代替编译(如果出错,说明my_src不存在):
# In a catkin workspace
$ catkin_make --source my_src
$ catkin_make install --source my_src # (optionally)
CMake的更多用法参考:
http://wiki.ros.org/catkin/commands/catkin_make。
编译你的package
想要编译你自己的代码的读者请看看之后的C++/Python教程,因为你也许需要修改CMakeList.txt。
经过上一个教程“创建一个ROS Package”,现在你已经有了一个catkin工作空间和一个叫做beginner_tutorials的新的package。进入catkin的工作空间,查看src文件:
$ cd ~/catkin_ws/
$ ls src
输出:
beginner_tutorials/ CMakeLists.txt
在src文件夹中可以看到你在之前用catkin_create_pkg创建的叫做beginner_tutorials的文件,现在我们可以用catkin_make来编译这个package:
$ catkin_make
注意到catkin_make首先显示每个“space”的路径,这些路径在REP128和catkin/workspaces中有描述。值得注意的是,因为这个操作在你的工作空间生成了几个默认的文件夹:build、devel和src。
build文件夹是在编译空间的默认位置,并且是调用cmake和make去配置和编译你的package的地方。devel文件夹是默认的devel空间,是你安装package之前可执行文件和库的所在地。
既然已经编译好ROS package了,让我们讨论一下ROS Node吧!
使用ROS Node
这一节将会介绍ROS图的概念并且会讨论roscoe、rosnode和rosrun命令行工具。
前提
在这个教程中我们会用到turtlesim小型仿真功能包,如果你已经进行了ROS的完整安装,那么你已经有了turtlesim功能包。否则请安装:
# sudo apt-get install ros-<distro>-ros-tutorials
$ sudo apt-get install ros-indigo-ros-tutorials
图概念的概论
Nodes:node是使用ROS去和其它node通信的可执行文件。
Messages:ROS中订阅或者发布给topic的一种数据形式。
Topics:Nodes可以发布messages给一个topic,也可以订阅一个topic去接受它的messages。
Master:为ROS提供名称服务(比如帮助nodes找到彼此)。
rosout:相当于ROS中的stdout/stderr。
roscore:Master+rosout+parameter server(参数服务之后会介绍)。
Nodes
Node不过是ROS package中一个可执行文件。ROS node利用ROS用户库去和其他node进行通信。node也可以向topic发起发布或者订阅,node也可以提供或者使用一个service。
用户库
用户库允许用不同语言编写的node之间进行通信:
- rospy = python client library
- roscpp = c++ client library
roscore
roscore是使用ROS时第一个要使用的工具。
$ roscore
roscore
![rosnode.png](https://img.haomeiwen.com/i273380/2f3088486b50d920.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如果roscore没有初始化,你也许会遇到网络配置问题。查看Network Setup - Single Machine Configuration解决。
如果roscore没有初始化并且说缺少权限,也许是~/.ros文件夹的用户是root,可以用一下命令递归改变文件夹的所有者:
$ sudo chown -R <your_username> ~/.ros
使用rosnode
打开一个新的终端(前面那个roscore不要关闭),你的环境变量会重置,/.bashrc被启用了,如果运行rosnode等命令时有问题时,需要添加一些环境变量setup文件去使这些命令到/.bashrc中,或者手动使它们生效。
rosnode显示了关于正在运行的ros node的信息。rosnode list列出活动的node。
$ rosnode list
可以看到:
/rosout
这告诉我们这里只有一个node在运行。这个node总是在运行因为它会收集和记录node的调试信息。
rosnode info命令可以返回特定node的信息:
$ rosnode info /rosout
rosnode
接下来让我们看看其他的node。我们打算用rosrun去运行另一个node。
使用rosrun
rosrun允许你在一个package中去用package的名字直接运行一个node(不需要知道package的路径)。
用法:
$ rosrun [package_name]
因此我们可以利用rosrun去运行在turtlesim的package中的turtlesim_node。在一个新的终端中运行:
$ rosrun turtlesim turtlesim_node
你会在窗口看到:
rosnode2.pngturtlesim_node
如果我们再去查看节点列表,在一个新终端中运行:
$ rosnode list
将会看到多了一个节点,叫做/turtlesim:
/rosout
/turtlesim
ROS一个强大的特点是可以在命令行重命名。关闭窗口,再用Remapping Argument重新命名node
$ rosrun turtlesim turtlesim_node __name:=my_turtle
再次运行:
$ rosnode list
看到:
/rosout
/my_turtle
如果用Ctrl+C结束进程而不是关闭turtle的窗口那么在rosnode list时还会看到之前关闭的node,可以用rosnode cleanup清理。
再看看新的/my_turtle node,用rosnode ping命令去测试它是否正在运行:
$ rosnode ping my_turtle
输出:
rosnode: node is [/my_turtle]
pinging /my_turtle with a timeout of 3.0s
xmlrpc reply from http://aqy:42235/ time=1.152992ms
xmlrpc reply from http://aqy:42235/ time=1.120090ms
xmlrpc reply from http://aqy:42235/ time=1.700878ms
xmlrpc reply from http://aqy:42235/ time=1.127958ms
回顾
roscore = ros +core:master(提供ros的命名服务)+rosout(stdout/stderr)+ parameter server (参数服务之后会介绍);
rosnode = ros +node ;ros用来获取关于node信息的工具;
rosrun = ros + run;从一个给定的package运行一个node.
既然你已经理解ros node 是怎样工作的了,再来看看ros的topic怎样工作的吧。
使用ROS Topic
这个教程介绍ROS topic和rostopic和rqt_plot命令行工具。
建立
先在一个新的终端中运行roscore:
$ roscore
注意:只能运行一个roscore。
tuetlesim
在新的终端中运行turtlesim:
$ rosrun turtlesim turtlesim_node
turtle键盘遥控
我们需要用一些东西去控制turtle,在新的终端运行:
$ rosrun turtlesim turtle_teleop_key
现在你可以用键盘上的方向键控制小乌龟了(保持键盘输入窗口在焦点),再看看窗口后面发生了什么。
turtle_teleop_key.pngROS Topic
turtlesim_node和turtle_teleop_key node之间用topic交流通信。
turtle_teleop_key在这个topic上发布按键敲击,而turtlesim订阅同样的topic接受按键敲击。让我们用rqt_graph显示现在正在运行的topic和nodes。
如果你是用electric或更早的版本,建议用rxygrah替代。
用rqt_grah
rqt_grah创建了一个动态的图形显示系统上正在进行什么,rqt_grah是rqt package的一部分。这里我们会用到rqt功能包,如果你已经进行了ROS的完整安装,那么你已经有了rqt功能包。否则请安装:
$ sudo apt-get install ros-indigo-rqt
$ sudo apt-get install ros-indigo-rqt-common-plugins
再在新终端输入:
$ rosrun rqt_graph rqt_graph
你将会看到:
rqt_graph.png如果把鼠标放上去将会高亮,node是蓝色或者绿色,topic是红色。正如你所见到的一样,turtlesim_node和the turtle_teleop_key nodes是通过叫做/turtle1/command_velocity的在通信。
rqt_graph2.png介绍rostopic
rostopic工具允许你从rostopic中获得信息。在shell中运行:
$ rostopic -h
可以获得rostopic的命令选项:
rostopic is a command-line tool for printing information about ROS Topics.
Commands:
rostopic bw display bandwidth used by topic
rostopic echo print messages to screen
rostopic find find topics by type
rostopic hz display publishing rate of topic
rostopic info print information about active topic
rostopic list list active topics
rostopic pub publish data to topic
rostopic type print topic type
Type rostopic <command> -h for more detailed usage, e.g. 'rostopic echo -h'
让我们用这些命令去检验一下turtlesim。
使用rostopic echo
用法:
rostopic echo [topic]
允许我们看看turtle_teleop_key node发布的命令速度数据;
对于ROS Hydro和之后的版本,这个数据在发布在/turtle1/cmd_vel topic,在新终端运行:
$ rostopic echo /turtle1/cmd_vel
选择turtle_teleop_key终端,用方向键控制小乌龟,你将会看到
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
让我们再来看看rqt_graph。点击左上角的刷新按钮显示新的node,你将会看到rostopic echo也订阅了turtle1/command_velocity topic。
rqt_graph3.png使用rostopic list
rostopic list会列出现在所有被订阅和发布的topic。看看这个命令需要什么参数,运行:
$ rostopic list -h
Usage: rostopic list [/namespace]
Options:
-h, --help show this help message and exit
-b BAGFILE, --bag=BAGFILE
list topics in .bag file
-v, --verbose list full details about each topic
-p list only publishers
-s list only subscribers
--host group by host name
对于verbose选项:
$ rostopic list -v
显示详细的一列topic信息包括发布的,订阅的和它们的类型。
Published topics:
* /turtle1/color_sensor [turtlesim/Color] 1 publisher
* /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
* /rosout [rosgraph_msgs/Log] 4 publishers
* /rosout_agg [rosgraph_msgs/Log] 1 publisher
* /turtle1/pose [turtlesim/Pose] 1 publisher
Subscribed topics:
* /turtle1/cmd_vel [geometry_msgs/Twist] 2 subscribers
* /rosout [rosgraph_msgs/Log] 1 subscriber
* /statistics [rosgraph_msgs/TopicStatistics] 1 subscriber
ROS Messages
Topic上的通信通过在nodes之间发送message来实现。对于发布者(turtle_teleop_key)和订阅者(turtlesim_node)之间的通信必须使用相同的message类型。这就意味着,topic的类型由发布的message类型决定,发布在topic上的message的类型可以由rostopic type来决定。
使用rostopic type
rostopic type返回任何topic发布的message类型。用法如下:
$ rostopic type [topic]
对于ROS Hydro 和之后的版本:
$ rostopic type /turtle1/cmd_vel
你会得到:
geometry_msgs/Twist
想得到详细信息,运行:
$ rosmsg show geometry_msgs/Twist
输出:
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
既然我们已经知道turtlesim期待什么类型的message了,我们可以发布命令给小乌龟。
继续rostopic
既然我们已经知道ros message了,让我们一起用ros messages吧。
使用rostopic pub
rostopic pub把数据发布到正被广播的topic上。用法如下:
rostopic pub [topic] [msg_type] [args]
对于ROS Hydro和之后的版本:
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
这会给turtle发布一个message告诉它线速度2.0,角速度1.8。
rostopic_pub1.png这个命令十分复杂,所以我们仔细看看它的每个参数。对于ROS Hydro和之后的版本,rostopic pub
这个命令会发送message给给定的topic;-1
这个选项使得rostopic只发布一条message然后退出;/turtle1/cmd_vel
是要发布给它信息的那个topic;geometry_msgs/Twist
是发布topic时的message类型;--
双虚线告诉选项剖析器接下来的参数都不是选择,以免把负号后面的参数当成参数选项。一个geometry_msgs/Twist有两组由三个浮点元素组成得的向量:线性的和角度的。这样的话,'[2.0, 0.0, 0.0]'
就是线性值x=2.0,y=0.0,z=0.0,而'[0.0, 0.0, 1.8]'
就是角度值x=0.0,y=0.0,z=1.8。
你也许注意到小乌龟已经停止了,这是因为小乌龟需要稳定的1HZ的命令流去保持运动。我们可以用rostopic pub -r命令发布一个稳定的命令流。对于ROS Hydro和之后的版本:
$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
这将以1HZ的速度去发布速度命令给速度topic。
rostopic_pub2.png再刷新一下rqt_graph,看到rostopic pub node在和rostopic echo node通信:
rqt_graph4.png当你看到小乌龟在绕圈圈的时候可以在一个新的终端输入rostopic echo命令看看turtlesim发布的数据。
使用rostopic hz
rostopic hz报告数据发布的速度,用法如下:
$ rostopic hz [topic]
来看看turtkesim node以多快的速度发布/turtle1/pose。
$ rostopic hz /turtle1/pose
你会看到:
subscribed to [/turtle1/pose]
average rate: 62.502
min: 0.015s max: 0.017s std dev: 0.00015s window: 59
average rate: 62.499
min: 0.015s max: 0.017s std dev: 0.00019s window: 122
average rate: 62.501
min: 0.015s max: 0.017s std dev: 0.00018s window: 185
average rate: 62.500
min: 0.015s max: 0.017s std dev: 0.00017s window: 247
average rate: 62.500
min: 0.015s max: 0.017s std dev: 0.00017s window: 310
现在我们知道turtlesim大概以60HZ的速度发布数据。也可以用rostopic type和rosmsg获取关于topic进一步的信息。对于ROS Hydro和之后的版本:
$ rostopic type /turtle1/cmd_vel | rosmsg show
现在我们已经用rostopic检验了topic,让我们用其他工具看看turtlesim发布的数据把。
使用rqt_plot
rqt_plot以时间轴的形式显示发布在topic上的数据。这里我们用它去显示发布在/turtle1/pose topic上的数据。首先:
$ rosrun rqt_plot rqt_plot
这时会弹出一个新的窗口,一个文本框出现在左上角,文本框是输入topic的,这里我们输入/turtle1/pose/x会高亮原来不亮的按钮。按下它并且用/turtle1/pose/y重复同样的操作,就会看到x-y位置的图像出现。
rqt_plot1.png点击负号按钮可以隐藏指定的topic。全部隐藏,增加/turtle1/pose/theta,你会看到下面的图像:
rqt_plot2.png这章节就是这些了,Ctrl+C杀死rostopic终端,但是让turtlesim继续运行。
既然你明白ros topic是怎样工作的了,让我们来看看service和parameter是怎样工作的。
学习和使用ROS service和parameter
这一节将介绍ROS service和parameter和命令行工具rosservice和rosparameter。
使用rosservice
ROS Service是nodes之间进行通信的另一种方式。service允许node之间发送请求和接受应答。
rosservice可以轻易的附着在ROS的客户或者服务框上,rosservice可以有许多命令可以在topic上使用,如下所示:
- 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
打印:
/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
这个命令会显示出node可以提供9种服务,其中/rosout/get_loggers和/rosout/set_logger_level是和rosoutnode有关的。
让我们用rosservice type仔细看看这些服务。
rossercie type
如果你想查看某个服务的类型,例如/clear服务,代码如下:
# rosservice type [service]
$ rosservice type clear
你会获得:
std_srvs/Empty
这个服务是空的,这就意味着当调用这个服务时不带任何参数(比如,当发送请求时和接受回应时没有任何的数据)。让我们用rosservice call调用这个服务吧
rosservice call
这里我们不用任何参数调用/clear这个服务,因为这个服务是空的。用法如下:
# rosservice call [service] [args]
$ rosservice call /clear
这个命令清除了小乌龟的行走痕迹。
turtlesim_node.png再看看有参数的service,看看service spawn的信息:
$ rosservice type spawn| rossrv show
输出:
float32 x
float32 y
float32 theta
string name
---
string name
通过这些字段,我们可知道如何来调用这个服务。这个服务将产生另一个小乌龟,它的名字是可选的,我们自己不给它起名字,让turtlesim这个package给它取名字:
$ rosservice call spawn 2 2 0.2 ""
参数的分别是x、y的坐标和角度还有名字。这个服务调用返回新的小乌龟的名字:name: turtle2。
现在应该看起来像这样:
rosservice1.png使用rosparam
rosparam允许你储存和操作在ROS parameter server上的数据,parameter server可以储存整形,浮点型,布尔型,字典型和链表型的数据.rosparam使用YAML审定语言以符合语法。简单的例子:YAML看起来十分自然,1是整形,1.0是浮点型,one是字符串,true是布尔型,[1,2,3]是一列的整形,{a:b,c:d}是字典型,rosparam有许多命令可以运行用在parameters上,如下所示:
- 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
$ rosparam list
我们可以看到turtlesim node的背景颜色有三个参数
/background_b
/background_g
/background_r
/rosdistro
/roslaunch/uris/host_skl338_ubuntu__46285
/rosversion
/run_id
我们用rosparam set改变其中一个参数的值。
rosparam set和rosparam get
用法:
$ rosparam set [param_name]
$ rosparam get [param_name]
改变背景颜色中的红色比例:
$ rosparam set background_r 150
然后调用clear service使这个参数改变生效:
$ rosservice call clear
现在turtlesim看起来像这个样子:
rosservice2.png让我们看看参数服务器上的其他参数的值:
$ rosparam get background_g
可以获得:
86
也可以用rosparam get/ 显示整个参数服务器的内容:
$ rosparam get /
可以获得:
background_b: 255
background_g: 86
background_r: 150
rosdistro: 'indigo
'
roslaunch:
uris: {host_skl338_ubuntu__46285: 'http://skl338-ubuntu:46285/'}
rosversion: '1.11.16
'
run_id: cd81e498-9ccd-11e5-97cc-20474700e173
如果想保存这些数据到文件以便可以在其他时间重载,对于rosparam来说这很容易。
rosparam dump和rosparam load
用法:
$ rosparam dump [file_name] [namespace]
$ rosparam load [file_name] [namespace]
我们把所有参数都写入params.yaml文件:
$ rosparam dump params.yaml
你可以载入这些yaml文件到新的命名空间,比如copy:
$ rosparam load params.yaml copy
$ rosparam get copy/background_b
输出:
255
使用rqt_console和roslaunch
这一节将介绍使用rqt_console和rqt_logger_level来调试以及使用roslaunch一次启动许多node。
前提
需要用到rqt和tuetlesim package,如果没有安装,请执行:
$ sudo apt-get install ros-<distro>-rqt ros-<distro>-rqt-common-plugins ros-<distro>-turtlesim
注意:前面的教程中已经编译过rqt和tuetlesim这两个package了,如果不确定,再安装一次也无妨。
使用rqt_console和rqt_logger_level
rqt_console附着在ROS logging框架上去显示nodes的输出结果。
rqt_logger_level允许我们去改变nodes运行时候的信息显示级别(调试,警告,信息和错误)。
现在让我们看看turtlesim在rqt_console上的输出并且当我们使用turtlesim的时候变化logger级别。
在运行turtlesim之前,在两个新的终端中分别运rqt_consolerqt和rqt_logger_level:
$ rosrun rqt_console rqt_console
$ rosrun rqt_logger_level rqt_logger_level
你会看到两个弹出的窗口:
rqt_console.png rqt_graph.png现在再在新的窗口中运行:
$ rosrun turtlesim turtlesim_node
因为默认的记录器级别是Info所以你会看到turtlesim启动时发布的信息,大概是这个样子:
rqt_console_turtlesimstart.png现在我们把记录器级别改为Warn,在rqt_logger_level窗口中刷新nodes并且选择Warn作为显示选项:
rqt_logger_level_error.png现在把小乌龟遥控到墙边看看在rqt_console上有什么显示:
对于ROS Hydro和之后的版本:
$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 0.0]'
rqt_console_turtlesimerror.png
logger级别的概述
记录级别是按下列的的优先级别区分的:
- Fatal
- Error
- Warn
- Info
- Debug
Fatal的级别最高,Debug的级别最低。通过设置logger级别,你会得到这个优先级别或更高级别的message。比如,通过设置级别为Warn,我们会得到所有的Warn,Error,和Fatal的记录消息。
先Ctrl+C turtlesim,并且用roslaunch去生成更多的turtlesim nodes和一个mimicking node,让一个turtlesim去模仿另一个。
使用roslaunch
roslaunch按照launch文件中的定义去启动node。
用法:
$ roslaunch [package] [filename.launch]
首先进入我们之前创建和编译的beginner_tutorials package:
$ roscd beginner_tutorials
如果roscd说类似于:No such package/stack 'beginner_tutorials' 你需要启动环境变量设置的文件,像你之前在create_a_workspace教程末尾中做的一样。
$ cd ~/catkin_ws
$ source devel/setup.bash
$ roscd beginner_tutorials
创建一个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>
Launch文件的解释
现在我们把xml分解:
<launch>
我们用lauch标签开始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>
我们用一个叫做sim的turtlesim node定义两个命名空间turtlesim1和turtlesim2,这样我们就可以启动两个仿真器而不会有名字冲突了。
<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>
我们通过把topic的输入和输出去重命名为turtlesim1和turtlesim2来定义mimic node(即messages在topic中从turtlesim1输入,从turtlesim2输出),这样重命名会导致turtlesim2模仿turtlesim1。
</launch>
末尾的xml标签也是代表launch文件.
roslaunching
现在我们用roslaunch启动launch文件:
$ roslaunch beginner_tutorials turtlemimic.launch
两个turtlesim会启动,启动一个新的终端中并且发送rostopic命令:
$ rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
你将会看到即使命令只是发布给turtlesim1但是两个小乌龟都开始运动.
mimic.png可以用rqt_graph去更好的理解launch文件做了什么。运行rqt并在主窗口选择rqt_graph:
$ rqt
或者直接运行:
$ rqt_graph
mimiclaunch.png到此,我们算是已经学会了rqt_console和roslaunch命令的使用,接下来我们开始学习使用rosed——ROS中的编辑器。现在你可以按Ctrl-C退出所有turtlesims节点了,因为在下一篇教程中你不会再用到它们。
网友评论