ROS系列:六、理解roslaunch在大型项目中的作用

理解roslaunch在大型项目中的作用

roslaunch的作用

在一个大型的机器人项目中,经常涉及到多个node协同工作,并且每个node都有很多可设置的parameter。比如我们的机器人miiboo_nav导航项目,涉及到地图服务节点、定位算法节点、运动控制节点、底盘控制节点、激光雷达数据获取节点等众多节点,和几百个影响着这些node行为模式的parameter。如果全部手动rosrun逐个启动node并传入parameter,工程的复杂程度将难以想象。所以这个时候就需要用roslaunch来解决问题,将需要启动的节点和需要设置的parameter全部写入一个*.launch文件,然后用 roslaunch一次性的启动*.launch文件,这样所有的节点就轻而易举的启动了。 

理解:其是一个独立的模块,用于节点的启动

 

roslaunch的用法

如果 rosrun 是执行一个节点的命令,那么 roslaunch 可以运行多个节点。除此之外,它还是一种在运行节点时可以附带如下各种选项的ROS命令: 修改参数或节点的名称,设置节点的命名空间,设置ROS_ROOT及ROS_PACKAGE_PATH,以及环境变量修改等 选项的ROS命令,等。roslaunch使用“*.launch”文件来设置可执行节点,它基于XML,并提供各个标签的选项。执行命令是“ roslaunch [功能包名称] [roslaunch文件] ”。
 

1、roslaunch的应用

为了解如何使用 roslaunch,下面先重命名之前创建的 topic_publisher topic_subscriber 节点。只改变名字没有意义,所以让我们运行两个独立的发布者和两个独立的订阅者节点来进行各自的消息通信。
 
首先,我们编写一个*.launch文件。 用于roslaunch的文件具有*.launch文件名,您需要在该功能包目录中创建一个launch 目录,并将launch文件放在该目录中。使用以下命令创建一个目录,并创建一个名为union.launch的新文件
 
// 进入文件夹
cd   my_c++/VINS_test/ROS_test/ros_publisher_subscriber/catkin_ws/src/ros_tutorials_topic
 
//roscd ros_tutorials_topic       // ros_tutorials_topic  是上一节发布和接收程序建的包
mkdir launch                                    // 注意launch是 建 在 里面                                            
cd launch
vim union.launch
 
如下编辑union.launch文件的内容。
 <launch>
 <node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher1"/>
 <node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber1"/>
 <node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher2"/>
 <node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber2"/>
</launch>
在<launch>标签中,描述了使用roslaunch命令运行节点所需的标签。<node>描述 了roslaunch运行的节点。选项包括 pkg、type和name。
pkg 功能包的名称(就是我们命名的 ros_tutorials_topic ) ;type 实际运行的节点的名称 (节点名)name 与上述type对应的节点被运行时,起的名称(运行名)。一般情况下使用与type相同的 名称,但可以根据需要,在运行时更改名称。
 
如果创建了roslaunch文件,可以如下运行union.launch。请注意,当用roslaunch 命令运行多个节点时,运行中的节点的输出(info、error等)不会显示在终端屏幕上, 这会使调试变得困难。如果此时添加了--screen 选项,终端上运行的所有节点的输出将显 示在终端屏幕上。

步骤

一、  相关编译

cd  my_c++/VINS_test/ROS_test/ros_publisher_subscriber/catkin_ws    // 移动到catkin目录
catkin_make                                                                                                                              //执行catkin构建

source devel/setup.bash

二、打开一个终端
roscore   
 
二、打开另一个终端
cd  my_c++/VINS_test/ROS_test/ros_publisher_subscriber/catkin_ws 

source devel/setup.bash

roslaunch    ros_tutorials_topic    union.launch --screen

roslaunch  +               包名                   +      *.launch 文件 

 

运行结果会如何? 首先,让我们使用以下命令看看当前正在运行的节点吧。
$ rosnode list
/rosout
/topic_publisher1
/topic_publisher2
/topic_subscriber1
/topic_subscriber2
可以看到,topic_publisher节点已被重命名为topic_publisher1和topic_publisher2,而topic_subscriber节点已被重命名为topic_subscriber1和topic_subscriber2。这四个节点均在运行中。
 
问题在于,我们通过  rqt (图7-10)看到,与“两个发布者节点和两个订阅者节点中的每一个发布者和订阅者都只与一个订阅者和发布者进行单独的通信”的当初的目的不符,两个订阅者都在订阅两个发布者的消息。这是因为我们只是改变了节点的名
字,而没有改变要使用的消息的名字。我们用另一个roslaunch命名空间标记来解决这个问题。

让我们修改之前创建的union.launch文件,如下所示。
$ roscd ros_tutorials_topic/launch
$ gedit union.launch
<launch>
 <group ns="ns1">
 <node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher"/>
 <node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber"/>
 </group>
 <group ns="ns2">
 <node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher"/>
 <node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber"/>
 </group>
</launch>
<group> 是对指定节点进行分组的标签。选项有ns。这是命名空间(name space),是组的名称,属于该组的节点和消息都包含在由ns指定的名称中。

 

再一次,我们来检查rqt_graph节点之间的连接和消息发送/接收状态。这一次,如图 7-11所示,我们可以看到,我们实现了我们最初的目的。

 

 

2. Launch标签

在launch文件中根据XML 13 的编写方式可以实现多种功能。launch中使用的标签如下所示。
<launch> 指roslaunch语句的开始和结束。
<node> 这是对于节点运行的标签。您可以更改功能包、节点名称和执行名称。
<machine> 可以设置运行该节点的PC的名称、address、ros-root和ros-package-path。
<include> 您可以加载属于同一个功能包或不同的功能包的另一个launch,并将其作为一个launch
文件来运行。
<remap> 可以更改节点名称、话题名称等等,在节点中用到的ROS变量的名称。
<env> 设置环境变量,如路径和IP(很少使用)。
<param> 设置参数名称、类型、值等
<rosparam> 可以像rosparam命令一样,查看和修改load、dump和delete等参数信息。
<group> 用于分组正在运行的节点。
<test> 用于测试节点。类似于<node>,但是有可以用于测试的选项。
<arg> 可以在launch文件中定义一个变量,以便在像下面这样运行时更改参数。

 

如下面的例子所示,利用其中的参数设置<param>和launch文件中的变量<arg>,可以在运行launch时从外部修改内部变量,因此甚至可以在运行的同时修改节点内部的参数。这是一个非常有用和广泛使用的方法,因此需要掌握。
<launch> 
 <arg name="update_period" default="10" />
 <param name="timing" value="$(arg update_period)"/>
</launch>
 
$ roslaunch my_package my_package.launch update_period:=30

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

他人是一面镜子,保持谦虚的态度

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值