试用ROS系统

创建一个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.png

    kin 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,而不是dependsdepends1是用来输出第一层依赖关系的,而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](http://upload-images.jianshu.io/upload_images/273380-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.png

turtlesim_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.png
turtle_teleop_key.png

ROS 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
rqt_graph.png

如果把鼠标放上去将会高亮,node是蓝色或者绿色,topic是红色。正如你所见到的一样,turtlesim_node和the turtle_teleop_key nodes是通过叫做/turtle1/command_velocity的在通信。

rqt_graph2.png
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
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
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
rostopic_pub2.png

再刷新一下rqt_graph,看到rostopic pub node在和rostopic echo node通信:

rqt_graph4.png
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
rqt_plot1.png

点击负号按钮可以隐藏指定的topic。全部隐藏,增加/turtle1/pose/theta,你会看到下面的图像:

rqt_plot2.png
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
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
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
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_console.png
rqt_graph.png
rqt_graph.png

现在再在新的窗口中运行:

$ rosrun turtlesim turtlesim_node

因为默认的记录器级别是Info所以你会看到turtlesim启动时发布的信息,大概是这个样子:

rqt_console_turtlesimstart.png
rqt_console_turtlesimstart.png

现在我们把记录器级别改为Warn,在rqt_logger_level窗口中刷新nodes并且选择Warn作为显示选项:

rqt_logger_level_error.png
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
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
mimic.png

可以用rqt_graph去更好的理解launch文件做了什么。运行rqt并在主窗口选择rqt_graph:

$ rqt

或者直接运行:

$ rqt_graph

mimiclaunch.png
mimiclaunch.png

到此,我们算是已经学会了rqt_console和roslaunch命令的使用,接下来我们开始学习使用rosed——ROS中的编辑器。现在你可以按Ctrl-C退出所有turtlesims节点了,因为在下一篇教程中你不会再用到它们。

推荐阅读更多精彩内容