购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第4章
ROS常用工具

ROS不仅为机器人开发提供了分布式通信框架,还提供了大量的实用工具,可以最大化提高开发效率。本章一起来学习ROS中最为常用的一些工具。

4.1 ROS命令行使用方法

ROS中有不少命令行指令,可以灵活地控制或者监测机器人的状态,虽然上手并不容易,但熟悉之后,就会感受到这些命令工具的魅力。

我们把几个最为常用的指令列出来:

     · rostopic
     · rosservice
     · rosnode
     · rosparam
     · rosmsg
     · rossrv

从命令行字符串的结构上来看,我们会发现每个命令的结构是类似的,都是由ros这样一个前缀加后边的一个功能名组成,而这个功能名和我们之前讲解的ROS核心概念会一一对应,比如topic是话题相关的功能,service是服务相关的功能,node是节点相关的功能,下边依次就是参数、话题消息和服务消息的功能了。

接下来学习这些基本命令的操作方法。先在小海龟的仿真示例中操练,按照之前介绍的方法,我们先来启动小海龟仿真器例程,如图4-1所示。

(1)打开终端,输入以下命令,启动ROS Master:

     $ roscore

(2)打开一个新终端,输入以下命令,启动小海龟仿真器:

     $ rosrun turtlesim turtlesim_node

(3)打开一个新终端,输入以下命令,启动海龟控制节点,利用键盘上下左右按键控制小海龟运动:

     $ rosrun turtlesim turtle_teleop_key

图4-1 小海龟仿真器界面

到这里我们就复现了前边小海龟仿真例程,这里面蕴含了ROS很多的核心概念和机制。我们之前已经通过rqt_graph工具查看到了海龟仿真器里面的两个节点:键盘控制节点和海龟仿真器节点,那如何用命令行的方式查看当前所运行的节点呢?其实跟rqt_graph工具是类似的,我们通过命令行依然可以快速查看当前有哪些节点正在运行。

4.1.1 rosnode

打开一个终端,输入以下命令,很快就会输出如图4-2所示的帮助信息,这些帮助信息可以告诉我们怎么使用这些命令。

     $ rosnode

如果想查看当前系统有哪些激活的节点,可以输入以下命令,查看话题列表。

     $ rosnode list

结果如图4-3所示。

图4-2 rosnode

图4-3 rosnode list

其中,/rosout是ROS Master后台会默认运行的一个节点,它会监控所有节点的运行信息,一般不用关注该节点。

到这里为止,大家可能只知道每个节点的名字是什么,但是具体在干什么,有哪些接口可以使用还不清楚。比如想查看/turtlesim仿真器节点到底提供了哪些功能,就可以使用rosnode info命令查看,后面键入需要查看的节点名称,然后回车就可以看到关于这个节点的很多信息,结果如图4-4所示。

     $ rosnode info

图4-4 rosnode info

其中,Publications表示这个节点正在发布哪些话题,Subscriptions表示正在订阅的话题,Services表示这个节点提供的服务。

从上面这样的信息中,可以查看到很多关于节点的内容,如果想终止某个节点,就可以使用以下命令关闭节点。关闭之后,就无法再利用键盘控制小海龟运动。如果想要恢复控制,需要重新启动节点,如图4-5所示。

     $ rosnode kill

图4-5 rosnode kill

4.1.2 rostopic

接下来学习一些话题相关的功能指令,在终端输入以下命令就可以看到话题相关的帮助信息,如图4-6所示。

     $ rostopic

图4-6 rostopic

如果我们想知道海龟或者机器人当前所在的位置,可以通过订阅话题来获取当前海龟运行的位置,输入rostopic echo命令即可将某个消息打印到屏幕上,如图4-7所示。这里利用rostopic echo命令将海龟运行位姿消息打印出来,通过坐标信息让我们了解到小海龟当前所在位置,类似订阅者订阅了turtle1/pose话题,并且把数据打印到当前终端里面,在打印数据中,“---”用来区分上一帧和下一帧的数据,x、y表示当前海龟位置的x、y坐标值,theta表示当前海龟的姿态,linear_velocity和angular_velocity分别表示线速度和角速度。

既然可以通过终端命令订阅一个话题,自然也可以通过终端命令来发布话题,可以通过rostopic pub命令发布话题。比如,我们通过rostopic pub来发布一个速度指令cmd_vel话题,其中速度指令包含两个部分,一个是线速度linear,另一个是角速度angular。每个速度里面又分为x、y、z三轴的分量,线速度linear是x、y、z三轴的平移速度,单位是m/s,角速度angular是x、y、z三轴的旋转速度,单位是rad/s,回车发送指令后,海龟即可按照该速度进行运动。

图4-7 rostopic echo

以上修改只发布了一次话题消息,海龟只能按照速度运行一次,如果需要海龟一直按照我们修改的速度运行,就需要加上频率。在这里,增加了一个频率10Hz,此时小海龟就能持续运动,当前终端后台就会以10Hz的频率不断发布0.1m/s沿x轴方向的线速度。

4.1.3 rosservice

接下来,再来学习一些rosservice相关的命令。输入以下命令即可查看相关的子命令帮助信息,如图4-8所示。

     $ rosservice

图4-8 rosservice

海龟仿真器节点里提供一个spawn服务,这个服务可以生成一只新的海龟,我们利用这个服务来请求生成一只新海龟,输入如下命令行,其中x、y表示新生的海龟的x、y轴坐标,theta表示新生的海龟的姿态,name表示新生的海龟的名字,回车发送后,即可在海龟仿真器里生成一只新的海龟,如图4-9所示。

图4-9 rosservice call

如果想查看当前系统有哪些服务,可以用如下命令进行查看,如图4-10所示。

     $ rosservice list

这些服务都是海龟仿真器提供的功能,如果想要关掉第一只海龟,就可以利用rosservice call/kill进行处理,如图4-11所示。

     $ rosservice call/kill"name:'turtle1'"

以上就是在ROS里面最为常用的命令行工具的使用方法,每个命令的功能都很丰富,大家使用时参考帮助信息即可。

图4-10 rosservice list

图4-11 rosservice call/kill

4.1.4 LIMO机器人命令行调试

小海龟毕竟还是一个虚拟机器人,接下来使用LIMO机器人试一试,原理和小海龟完全一致。

先来启动LIMO机器人和键盘控制节点。

①启动机器人底盘。

     $ roslaunch limo_base limo_base.launch

②启动键盘控制。

     $ roslaunch limo_bringup limo_teletop_keyboard.launch

这里使用到了roslaunch命令,类似于rosrun指令可以启动一个节点,为了能够同步启动多个节点,ROS提供了一种脚本文件,叫作launch启动文件。roslaunch就是一键启动多个节点的指令,关于launch文件的讲解,在下一节详细介绍。

机器人启动成功后,如果想知道正在运行的系统中,到底有哪些节点,可以使用rosnode list进行查看,看到反馈的信息如图4-12所示,就像之前的节点图,如机器人底盘节点、键盘控制节点都可以看到。

     $ rosnode list

如果对其中某一个节点的功能很好奇,可以通过rosnode info指令查看,比如使用rosnode info/limo_base_node,就可以看到LIMO底盘节点的基本信息,此时这个节点正在发布imu、odom、tf等话题,同时在订阅cmd_vel等话题,如图4-13所示。

图4-12 rosnode list

图4-13 rosnode info

如果想查看当前系统中有哪些话题,可以使用rostopic list,如图4-14所示。可以看到话题还是不少的,有相机发布的图像数据,也有机器人底盘发布的各种状态信息。

     $ rostopic list

图4-14 rostopic list

如果想要控制机器人以1m/s的速度向前走,可以像控制小海龟一样,通过rostopic向cmd_vel速度话题发布一个消息数据,很快就可以看到小车按照这个指令开始运动了。

如果想要查看机器人的位置信息,可以通过rostopic echo命令订阅odom话题的具体数据,如图4-15所示。这里可以清晰地看到机器人当前所在的x、y坐标和姿态角度,这个信息就是之前给大家讲解的在里程计中使用积分计算而来的结果。

     $ rostopic echo/odom

图4-15 rostopic echo

ROS中每个命令的功能都有很多,在本书内容里无法一一列举,但是使用方法类似,大家可以在使用过程中结合帮助信息不断地探索和总结。

4.2 launch启动文件

到目前为止,每当运行一个ROS节点或工具时,都需要打开一个新的终端运行一个命令。当系统中的节点数量不断增加时,每个节点启动一个终端的模式会变得非常麻烦。有没有一种方式可以一次性启动所有节点呢?那就是launch启动文件。

launch文件如图4-16所示,它是一个完整的launch File,即launch启动文件,它是ROS系统中同时启动多个节点的一种途径。整个launch文件给大家的第一印象是类似网页开发中的xml文件,如果大家看过某些网页的源码,其实就是类似源码的代码,有很多尖括号包围的内容,还有很多类似代码又并非代码的参数和内容。这种格式的文件主要目的并不像常见的C语言一样用来描述功能的处理过程,而是为了保存和传输数据,严格意义上来说,这是一种标记语言,标记我们需要用到的数据和信息。

图4-16 launch文件

那launch文件中有哪些信息呢?launch文件的主要功能就是为了启动节点,包含描述节点的各种信息。

4.2.1 基本元素

首先来看一个简单的launch文件,对其产生初步的概念。

这是一个简单而完整的launch文件,采用XML的形式进行描述,包含一个根元素<launch>和两个节点元素<node>。

1.<launch>

XML文件必须要包含一个根元素,launch文件中的根元素采用<launch>标签定义,文件中的其他内容都必须包含在这个标签之中。

2.<node>

启动文件的核心是启动ROS节点,采用<node>标签定义,语法如下。

     <node pkg="package-name"type="executable-name"name="node-name"/>

从上边的定义规则可以看出,在启动文件中启动一个节点需要三个属性:pkg、type和name。其中,pkg定义节点所在的功能包名称,type定义节点的可执行文件名称,这两个属性等同于在终端中使用rosrun命令执行节点时的输入参数;name属性用来定义节点运行的名称,将覆盖节点中init()赋予节点的名称。这是三个最常用的属性,在某些情况下,我们还有可能用到以下属性:

· output="screen":将节点的标准输出打印到终端屏幕,默认输出为日志文档;

· respawn="true":复位属性,该节点停止时会自动重启,默认为false;

· required="true":必要节点,当该节点终止时,launch文件中的其他节点也被终止;

· ns="namespace":命名空间,为节点内的相对名称添加命名空间前缀;

· args="arguments":节点需要的输入参数。

4.2.2 参数设置

为了方便设置和修改,launch文件支持参数设置的功能,很像编程语言中的变量声明。关于参数设置的标签元素有两个:<param>和<arg>。一个代表parameter,另一个代表argument。这两个标签元素翻译成中文都是“参数”的意思,但是这两个“参数”的意义是完全不同的。

1.<param>

parameter是ROS系统运行中的参数,存储在参数服务器中。在launch文件中通过<param>元素加载parameter;launch文件执行后,parameter就加载到ROS的参数服务器上了。每个活跃的节点都可以通过ros::param::get()接口来获取parameter的值,用户也可以在终端中通过rosparam命令获得parameter的值。

<param>的使用方法如下。

     <param name="output_frame"value="odom"/>

运行launch文件后,output_frame这个parameter的值就设置为odom,并且加载到ROS参数服务器上。但是在很多复杂的系统中,参数的数量很多,如果这样一个一个地设置会非常麻烦,ROS也为我们提供了另外一种参数加载方式——<rosparam>。

     <rosparam file="$(find 2dnav_pr2)/config/costmap_common_params.yaml"command=
     "load"ns="local_costmap"/>

<rosparam>可以帮助我们将一个yaml格式文件中的参数全部加载到ROS参数服务器中,需要设置command属性为“load”,还可以选择设置命名空间为“ns”。

2.<arg>

argument是另外一个概念,类似于launch文件内部的局部变量,仅限于launch文件使用,便于launch文件的重构,和ROS节点内部的实现没有关系。

设置argument使用<arg>标签元素,语法如下。

     <arg name="arg-name"default="arg-value"/>

launch文件中需要使用到argument时,可以使用如下方式调用。

     <param name="foo"value="$(arg arg-name)"/>
     <node name="node"pkg="package"type="type"args="$(arg arg-name)"/>

4.2.3 重映射机制

ROS的设计目标是提高代码的复用率,ROS社区中的很多功能包都可以拿来直接使用,而不需要关注功能包的内部实现。那么问题就来了,别人的功能包接口不一定和我们的系统兼容。

ROS提供一种重映射的机制,简单来说就是取别名,类似于C++中的别名机制,我们不需要修改别人功能包的接口,只需要将接口名称重映射一下,取个别名,则系统就认识了(接口的数据类型必须相同)。launch文件中的<remap>标签可以实现这个重映射的功能。

比如turtlebot的键盘控制节点,发布的速度控制指令话题可能是/turtlebot/cmd_vel,但是我们的机器人订阅的速度控制话题是/cmd_vel,这个时候使用<remap>就可以轻松解决问题。将/turtlebot/cmd_vel重映射为/cmd_vel,机器人就可以接收到速度控制指令了。

     <remap from="/turtlebot/cmd_vel"to="/cmd_vel"/>

4.2.4 嵌套复用

在复杂的系统当中,launch文件往往有很多,这些launch文件之间也会存在依赖关系。如果需要直接复用一个已有launch文件中的内容,可以使用<include>标签,包含其他launch文件。这和C语言中的include是一样的。

     <include file="$(dirname)/other.launch"/>

launch文件在ROS框架中非常实用和灵活,它类似于一种高级编程语言,可以帮助大家管理启动系统时的方方面面。在使用ROS的过程中,很多情况下并不需要编写大量代码,仅需要使用已有的功能包编辑launch文件,就可以完成机器人的很多功能。

本节仅介绍了launch文件中最为常用的一些标签元素,还有更多高级的标签元素可以访问wiki网站学习。

4.2.5 LIMO机器人的launch文件

以LIMO机器人启动时运行的文件limo_start.launch为例,一起分析都启动了哪些功能,代码如下。

进入launch文件后,使用了argument标签,定义了三个launch文件中使用的参数。第一个是端口号,设置机器人控制器和驱动板之间通信的串口设备号;第二个是机器人运动模态是否使用麦克纳姆轮的配置,默认是不使用,假设把机器人切换到全向运动模态,需要修改参数为true;第三个是机器人底盘驱动是否发布odom里程计TF变换的设置。

紧接着启动了另外一个名为limo_base的launch文件,同时将三个argument参数传入,主要功能是启动底盘驱动节点,让控制器连接上驱动板,使小车的运动功能依次启动起来。

再往下同样是一个include标签,包含了名为X2L的launch文件,这个launch文件是LIMO上激光雷达的官方驱动,用来启动激光雷达的驱动节点。

接下来是三个node标签启动三个节点,都是静态坐标系TF的发布。第一个节点发布LIMO机器人中相机和底盘之间的位姿关系,后边的参数分别是x、y、z三个轴的平移数据和三个轴的旋转数据,接下来是两个坐标系的名字,还有发布频率。这段参数的含义就是,以机器人底盘中心点作为参考系,雷达安装的位置在x为0.105,z为0.1的位置,相对并没有旋转,这个数据会以每秒10次的频率在TF树中更新。第二个节点发布imu模块和底盘之间的位姿关系,参数均为0,表示imu就安装在机器人底盘的中心。第三个节点发布激光雷达和底盘之间的位姿关系,后边的参数同理。

通过LIMO机器人的启动文件,我们不仅可以了解launch文件配置多节点启动的过程,还可以看到在一款典型机器人中,需要具备和启动哪些必要的功能。

4.3 可视化工具

ROS提供了多种可视化工具,可以满足可视化显示、三维仿真等开发需求。

4.3.1 Rviz

Rviz的主要功能是数据可视化显示,比如机器人摄像头拍到的图像,机器人的三维模型结构,机器人所处环境的地图信息,机器人在导航过程中规划的各种路径等。

Rviz的核心框架是基于Qt可视化工具打造的一个开放式平台,出厂自带很多机器人常用的可视化显示插件,只要我们按照ROS中的消息发布对应的话题,就可以看到可视化的效果。如果对显示的效果不满意,或者想添加某些新的显示项,也可以在Rviz这个平台中开发更多的可视化效果,方便打造自己满意的上位机。

接下来我们一起启动Rviz。打开第一个终端,启动roscore,然后再启动一个终端,输入如下命令启动Rviz,Rviz启动成功后如图4-17所示。

     $ rosrun rviz rviz

Rviz是ROS里面常用的可视化上位机,分为如下区域。

0:3D视图区,用于可视化显示数据,目前没有任何数据,所以显示黑色。

1:工具栏,提供视角控制、目标设置、发布地点等工具。

图4-17 Rviz

2:显示项列表,用于显示当前选择的显示插件,可以配置每个插件的属性。

3:视角设置区,可以选择多种观测视角。

4:时间显示区,显示当前的系统时间和ROS时间。

这里我们演示一下显示图像数据的流程,其他显示项操作方法类似。Rviz是来做数据可视化显示的,一定要有数据,如果没有数据就是巧妇难为无米之炊。

现在要显示一个图像,就需要先把相机跑起来,发布图像数据。首先,安装一个相机的驱动,在ROS里面针对相机这样USB的设备有标准驱动,可以直接安装。打开终端,输入如下命令行进行安装。

     $ sudo apt install ros-noetic-usb-cam

如果大家使用的是虚拟机,需要把外部相机设备连接到虚拟机里才能进行使用。

接下来运行安装好的USB相机驱动发布图像话题,打开终端,输入如下命令启动。这个launch文件会启动两个节点,一个用来驱动相机,另一个用来显示图像数据。

     $ roslaunch usb_cam usb_cam-test.launch

启动完成后,大家可以看到一个弹窗,如图4-18所示。这个弹窗是由ROS驱动提供的,接下来要把这个图像在Rviz里面显示,可以先把这个弹窗最小化。

图4-18 相机图像

如果需要在Rviz里面显示某个内容,单击显示项列表区里面的Add按键进行添加,在这里需要显示image,则在显示的列表中选择image,如图4-19所示。

图4-19 添加image显示

选择完毕后,可以在左边看到一个新增的窗口,此时还没有订阅图像话题,我们选择显示项列表中出现的image,选择image topic,再选择当前发布的图像话题image_raw,选择完成后就可以看到当前图像信息了,如图4-20所示。

图4-20 添加image话题

4.3.2 rqt

Rviz是一个可视化平台,如果不想显示或者配置很多东西,也可以使用ROS中的Qt工具箱——rqt,这里介绍工具箱中常用的四种工具。

这四种常用工具都需要执行命令来启动,首先启动终端,为了后续方便显示,我们还是先把小海龟例程运行起来,仿真器如图4-21所示。

     $ roscore
     $ rosrun turtlesim turtlesim_node
     $ rosrun turtlesim turtle_teleop_key

图4-21 小海龟仿真器

接下来,启动第一个工具——rqt_graph,如图4-22所示。该工具可以显示当前ROS环境的节点关系,之前也讲过该工具,在这里就不过多介绍。

     $ rqt_graph

图4-22 计算图可视化工具——rqt_graph

rqt_console是一个日志显示工具,可以看到当前系统里面的日志信息,比如用键盘控制小海龟运动,该日志工具里面就会显示一些预警信息,如图4-23所示。我们可以清楚地看到每个日志的序号、内容、级别、节点、话题、时间、位置等,方便后续调试机器人的各种功能、查看调试过程中出现的问题等,也可以通过下方搜索栏搜索需要的关键内容,加速调试效率。

图4-23 日志显示工具——rqt_console

     $ rqt_console

rqt_plot是一个数据绘图工具,比如我们可以把小海龟的pose数据绘制出来,在Topic里面选择pose,单击“+”号进行绘制,利用键盘控制海龟动起来,就可以看到变化的数据图形,如图4-24所示。

     $ rqt_plot

图4-24 数据绘图工具——rqt_plot

rqt_image_view用来显示某一个图像话题的数据,如图4-25所示。这里我们需要运行相机驱动,然后再选择相应的话题,就会显示当前系统正在发布的图像数据。

     $ rqt_image_view

图4-25 图像渲染工具——rqt_image_view

4.3.3 Gazebo

以上这些基于Qt的工具都是用来做数据可视化的。如果我们没有数据,甚至没有实物机器人,怎么办呢?这时就需要仿真软件了。

ROS中最为常用的三维物理仿真软件是Gazebo,能准确高效地仿真在复杂的室内外环境下的机器人群体。与游戏引擎类似,Gazebo能对一整套传感器进行高度逼真的物理仿真,为程序和用户提供交互接口,其典型应用场景包括测试机器人算法、机器人的设计、现实情景下的回溯测试。

一句话说明Gazebo的功能:Gazebo能帮我们创造机器人。比如我们开发火星车,那就可以在Gazebo软件中模拟一个火星表面的环境;如果我们做无人机,续航和限飞都导致我们没有办法频繁地使用实物做实验,此时不妨使用Gazebo软件先做仿真,等算法开发得差不多了,再部署到实物上来运行,如图4-26所示。

图4-26 Gazebo仿真界面

打开终端,输入如下命令行,就可以启动Gazebo。

     $ gazebo

Gazebo的界面如图4-27所示。中间区域是一个三维仿真界面,未来机器人和周边场景都会在中间显示,左边区域显示当前有哪些仿真模型。上面的工具栏可以调整仿真模型的视角和大小,此外也提供一些基本的三维物体,比如正方体、球体、圆柱体,也可以设置光线位置。除此之外,我们也可以添加一些机器人模型和环境仿真模型,这就需要在ROS里面创建机器人URDF仿真模型或者是Gazebo的SDF模型。

图4-27 Gazebo界面

模型的加载需要连接国外网站,为了保证模型顺利加载,可以提前将模型文件下载并放置到本地路径~/.gazebo/models下。

4.4 本章小结

本章我们一起学习了ROS中的命令行工具,通过这些基础命令,可以发布机器人的运动指令,或者订阅机器人的各项状态。了解了ROS中的launch启动文件,通过各种标签的运用,可以一次性启动多个ROS节点,并完成配置;还学习了ROS中常用的可视化工具rqt、Rviz和Gazebo,无论是想图像化显示各种数据,还是创建一个虚拟仿真环境,这些工具都可以帮我们快速解决问题。 ZTyZ10XtcxD8c8DiGq4MVUATydSiKTHFHRHswWx0HhQL1tvzF0ZU0CVOfsXmJPe3

点击中间区域
呼出菜单
上一章
目录
下一章
×