本系列文章是与大家分享一下,我在学习ROS过程中所做的笔记,本系列文章主要的学习资料是古月老师(胡春旭老师)的 ROS入门21讲(文章中部分图片来源于ROS入门21讲课件),以及其编著的《ROS机器人开发实践》,当然其中也加入了我自己的理解和其他的相关资料,本系列文章共五篇,本篇文章是本系列第五篇文章。launch启动文件的使用方法、常用可视化工具的使用方法


十四、launch启动文件的使用方法

   1、Launch文件通过XML文件实现多节点的配置和启动,Launch文件可自动启动ROS Master,文件中每一个note都是一个节点,相当于rosrun命令

   2、Launch文件以标签 < launch > 开始,以标签< /launch > 结束

在这里插入图片描述

   3、< node >标签用来启动某个节点,其中的pkg后面跟的参数对应于rosrun后面紧跟的功能包名字,也就是告诉Launch文件我要启动的节点在哪个功能包中,其中的type后面跟的参数就是你要执行或者启动的节点名字,其中的name后面跟的参数可以认为是在节点运行时我们给他起的另外的一个名字,来代替他初始化时的名字,这样当我们同时启动多个相同的节点时,他们实际运行的名字不一样,也就不会发生冲突

   除了这三个属性外,< node >标签中还有其他的属性,比如output用来控制某个节点是否要把日志信息打印到终端中,respawn用来控制节点运行失败后是否要重启,required用来控制某个节点是否一定要启动起来,ns可以给每个节点做个命名空间来避免他们发生冲突,args可以给某些节点来输入一些参数

在这里插入图片描述

   3、< param> 标签用来保存某个参数,name后面跟的是参数名,value后面跟的是参数值 ,通过这个标签可以把一个参数存到参数服务器中 。 < rosparam>标签用来保存多个参数,可以把一个文件中的所有参数都保存到参数服务器中

在这里插入图片描述

   4、< arg>标签,与< param> /< rosparam>不同,arg标签存放的参数仅限于在launch文件中使用,不是存在参数服务器,调用的时候$(arg arg-name),美元符加个括号,括号里面arg 后面跟的是参数名,可以在node标签中将将该值赋给node中的args属性

在这里插入图片描述

   5、重映射标签 < remp> ,主要用来把ros中某些计算图的资源进行重新命名,比如说名为/turtlebot/cmd_vel的话题,我们可以将其重命名为/cmd_vel,也就是重新对资源进行命名的功能,这里要注意重命名后原来的名字就没有了

在这里插入图片描述

   6、< include>标签,就像头文件一样,< include>的标签可以用来包含其他的launch文件

在这里插入图片描述

   7、launch示例1

在这里插入图片描述

   (1)首先我们在工作空间的src文件夹下,新建一个名为learning_launch的功能包,不需要添加依赖,因为launch文件是一个启动文件,基本都是链接其他库里面的功能

         catkin_create_pkg learning_launch

   (2)我们在该功能包下创建一个名为launch的文件夹,然后将写好的名为simple.launch的文件添叫到该文件夹下,该文件的内容如下:

<launch>
    <node pkg="learning_topic" type="person_subscriber" name="talker" output="screen" />
    <node pkg="learning_topic" type="person_publisher" name="listener" output="screen" /> 
</launch>

   该程序中两个node标签分别启动两个节点,第一个节点是learning_topic功能包里面的person_subscriber节点,运行后名为talker,使用output在终端中显示日志信息,第二个节点是learning_topic功能包里面的learning_topic节点,运行后名为listener,使用output在终端中显示日志信息

  (3)在打开该文件后在下方选择MXML后会进行高亮显示,方便我们查看和阅读

在这里插入图片描述

   (4)我们回到工作空间根目录下,对其进行编译(catkin_make),让工作空间知道有个learning_launch党的功能包加进来了,

   (5)接下来就可以运用roslaunch命令来启动launch文件了,后面的跟的第一个参数是功能包名,第二个参数是launch文件名,如下所示,启动learning_launch功能包下的simple.launch文件

       roslaunch learning_launch simple.launch

   8、launch示例2

在这里插入图片描述

   (1)依旧是将我们写好的代码文件放到learning_launch功能包的launch文件夹下,取名为turtlesim_parameter_config.launch,代码如下所示:

<launch>

    <param name="/turtle_number"   value="2"/>

    <node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node">
        <param name="turtle_name1"   value="Tom"/>
        <param name="turtle_name2"   value="Jerry"/>

        <rosparam file="$(find learning_launch)/config/param.yaml" command="load"/>
    </node>

    <node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key" output="screen"/>

</launch>

   (2)< param name=”/turtle_number” value=”2”/> 是用来设置变量的,设置了名为/turtle_number的变量,该变量值为2,将其存到参数服务器中

   (3)< node pkg=”turtlesim” type=”turtlesim_node” name=”turtlesim _node”> 运行turtlesim功能包里面的turtlesim_node节点,运行后的名字依然为turtlesim _node

   (4)接下来的两行语句分别设置了值为Tom的变量turtle_name1和值为Jerry的变量turtle_name2

   (5)< rosparam file=”$(find learning_launch)/config/param.yaml” command=”load”/> 将参数文件param.yaml中的变量保存到参数服务器中,如本条语句中它会查找learning_launch功能包中的config文件夹下的参数文件param.yaml

   这里需要在learning_launch功能包下新建一个名为config的文件夹,并把我们需要的名为param.yaml的文件放在该文件夹下,该文件的内容如下图所示:

在这里插入图片描述

   (6)接下来的语句< node pkg=”turtlesim” type=”turtle_teleop_key” name=”turtle_teleop_key” output=”screen”/> 是用来启动键盘控制节点的,启动turtlesim功能包下的节点turtle_teleop_key,运行后名字依然为turtle_teleop_key,并且将日志信息在终端打印出来

   (7)接下来我们再终端输入以下命令,运行一下示例2所介绍的launch文件,运行后,使用键盘的↑↓←→就可以控制海龟运动了,

        roslaunch learning_launch turtlesim_parameter_config.launch
  在这里插入图片描述

   (8)我们打开一个新的终端输入rosparam list命令就可以查看当前的参数,下图红色框内的参数就是我们通过启动文件turtlesim_parameter_config.launch加载的

在这里插入图片描述

   (9)这里我们发现参数/turtle_number前没有前缀,而上图的红框内的其他参数都有一个前缀/turtlesim_node,这是因为在该launch文件中参数/turtle_number是在节点之外设定的(如下图的红框所示),而其他的是在节点turtlesim_node之内设定的(如下图的蓝框和所示),所以他会在变量前加一个节点名的前缀,在变量C和D前还有个/group的前缀,这是因为在param.yaml文件中C和D参数前加了个命名空间group,这样做可以有效的避免资源冲突

在这里插入图片描述

   9、launch示例3

在这里插入图片描述

   (1)依旧是将我们写好的代码文件放到learning_launch功能包的launch文件夹下,取名为start_tf_demo_c++.launch,代码如下所示:

 <launch>

    <!-- Turtlesim Node-->
    <node pkg="turtlesim" type="turtlesim_node" name="sim"/>
    <node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/>

    <node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle1" name="turtle1_tf_broadcaster" />
    <node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle2" name="turtle2_tf_broadcaster" />

    <node pkg="learning_tf" type="turtle_tf_listener" name="listener" />

  </launch>

   (2)上面运行节点的方法跟之前的示例一样,就不详细展开了,首先先启动了海龟仿真器,再启动了键盘控制节点,接下来启动了两个广播器turtle_tf_broadcaster在这里我们对同一个节点调用了两次,第一次运行后重命名为turtle1_tf_broadcaster,输入参数为/turtle1,第二次运行后重命名为turtle2_tf_broadcaster,输入参数为turtle2,接下来运行了监听器turtle_tf_listener,运行后的名字为listener

   (3)在终端中输入以下命令,来启动本例中的launch文件,启动成功后,使用键盘控制海龟1移动,海龟2就会自动跟随海龟1的运动

       roslaunch learning_launch start_tf_demo_c++.launch
在这里插入图片描述

   10、launch示例4

在这里插入图片描述

   (1)依旧是将我们写好的代码文件放到learning_launch功能包的launch文件夹下,取名为turtlesim_remap.launch,代码如下所示:

<launch>

    <include file="$(find learning_launch)/launch/simple.launch" />

    <node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node">
        <remap from="/turtle1/cmd_vel" to="/cmd_vel"/>
    </node>

</launch>

   (2)< include file=”$(find learning_launch)/launch/simple.launch” /> 启动运行之前介绍的simple.launch文件,它会运行simple.launch文件内的内容(相当于c/c++中的include的作用)

   (3)接下来的一句是启动我们的仿真器节点,同时通过< remap from=”/turtle1 /cmd_vel” to=”/cmd_vel”/> 将原来的话题名/turtle1 /cmd_vel,重命名为/cmd_vel

   (4)通过以下命令来运行本例中的launch文件

        roslaunch learning_launch  turtlesim_remap.launch
在这里插入图片描述

   (5)此时使用rostopic list命令,来查看当前的话题,已经由/turtle1 /cmd_vel变为了/cmd_vel

在这里插入图片描述

   (6)此时,我们使用rostopic pub去发布一个速度指令,海龟就会进行运动(输入rostopic pub /cmd_vel后,双击tab键会自动补齐剩余部分)

在这里插入图片描述

十五、常用可视化工具的使用方法

   1、计算图可视化工具rqt_graph: 可以显示ros里面的计算图资源,椭圆代表节点,箭头代表话题

   首先我们先运行节点管理器,再运行海龟仿真器,再运行键盘控制节点,最后通过rqt_graph命令,来显示计算图,通过这个计算图我们可以很快的了解系统的全貌,依次输入的命令如下所示:

roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtlesim_teleop_key
rqt_graph
  在这里插入图片描述

   如上图所示,其中的/turtlesim是我们启动的仿真器节点,/teleop_turtle 是键盘控制节点,他们之间的话题是/turtle1/cmd_vel

   2、日志输出工具 rqt_console

   首先我们依旧先运行节点管理器,再运行海龟仿真器,再运行键盘控制节点,再运行rqt_console命令,rqt_console可以帮助我们查看日志信息、警告信息、错误信息等,依次输入的命令如下所示:

roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtlesim_teleop_key
rqt_console

   我们用键盘控制海龟碰撞边界,就可以在rqt_console中查看到警告信息了

在这里插入图片描述

   3、数据绘图工具 rqt_plot

   首先我们依旧先运行节点管理器,再运行海龟仿真器,再运行键盘控制节点,再运行rqt_plot命令,rqt_plot可以用来绘制数据曲线,依次输入的命令如下所示:

roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtlesim_teleop_key
rqt_plot

   我们在rqt_plot中输入/它会自动列出可选择的话题,使用键盘上的↑↓键可以来进行选择,按enter键确认,这里我们以海龟的位置信息为例,选择turtle1/pose,确认后,我们用键盘控制海龟移动,就可以在rqt_plot中查看到相关的波形变化了

在这里插入图片描述   在这里插入图片描述

   有时候在拖拽rqt_plot窗口调整大小时会报错rqt_plot停止运行之类的,重新启动rqt_plot就行了,我试了好多遍只出现了一次错误

在这里插入图片描述

   4、图像渲染工具 rqt_image_view

   做图像时经常使用的一个工具,使用rqt_image_view命令,进行启动,启动后默认是空白的,配置后摄像头的图像、深度图、红外图都可以显示出来,目前我手头没有相关实物,就不做介绍了

在这里插入图片描述

   5、综合工具rqt 在菜单栏有很多可以选择的工具,大家可以根据自己的需要配置出适合的界面组合,可以用来充当我们调试用的上位机

在这里插入图片描述

   6、Rviz工具

在这里插入图片描述 在这里插入图片描述

   输入rviz指令可以运行rviz ,打开后界面如下所示,上面橙色框内的是工具栏,左边蓝色框内的是显示列表,中间红色框内的是显示区,模型、图像等都在该区域进行显示,右边黄框内的是视角设置区,可以用来设置中间显示区的视角,下面粉紫色的框内是时间显示区,显示系统时间、ros启动时间等

在这里插入图片描述

   rviz是一个数据显示平台,要显示的数据一定是已经存在的

   7、Gazebo是强大的三维物理仿真平台

在这里插入图片描述   在这里插入图片描述