launch文件

  机器人系统是很多 node 和 topic 以及parameter, service 等构成的网络(rosgraph),如果要同时启动很多node,一个一个的启动,会比较麻烦。launch文件可以同时启动很多个节点,还可以自动启动ROSMaster节点管理器,而且可以实现每个节点的各种配置参数的设置。
  roslaunch 命令运行时首先会检测系统的 rosmaster 是否运行,如果已经启动,就用现有的 rosmaster;如果没有启动,会先启动 rosmaster

一、启动launch

  • 在ROS工作空间下,加入环境,source devel/setup.bash
1.| $roslaunch pkg_name  xxx.launch
  • 给出launch文件的路径
1.| roslaunch ~/catkin_ws/src/pkg_name/launch/xxx.launch

在启动命令后面,还可以加入某些参数:

  • –screen: 令 ros node 的信息(如果有的话)输出到屏幕上,方便调试
  • arg:=value: 如果 launch 文件中有待赋值的变量,可以赋值
    eg :
1.| roslaunch pkg_name xxx.launch filename:=/pcd/xxx.bag // # launch file 中有参数 “filename” 需要赋值
2.| roslaunch pkg_name xxx.launch filename:='$(find pkg_name)/data/xxx.bag'

二、launch 文件格式

  launch文件是xml格式的,可以在文件头部添加

1.| <?xml version="2.0"?>

launch文件也是通过标签(tag)的方式来组织,常用的tag如下:

1.| <launch>                 <!--根标签-->  
2.| <group>                  <!--设定分组-->
3.| <include>                <!--包含其他launch-->
4.| <arg>                    <!--定义变量-->
5.| <machine>                <!--指定运行的机器-->
6.| <env-loader>             <!--设置环境变量-->
7.| <node>                   <!--需要启动的node及其参数-->
8.| <param>                  <!--定义参数到参数服务器-->
9.| <remap>                  <!--设定 topic 映射-->
10| <rosparam>              <!--加载yaml文件中的参数到参数服务器-->
11| </launch>               <!--根标签-->

三、标签元素说明

–1. group标签

group标签定义命名空间
  这里创建了两个节点分组并以’命名空间(namespace)’标签来区分,其中一个名为turtulesim1,另一个名为turtlesim2。

1.| <group ns="turtlesim1">
2.|     <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
3.| </group>
4.| <group ns="turtlesim2">
5.|		<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
6.| </group>

–2. node标签

  node标签是launch文件的核心部分。启动的每一个节点(node)都要有自己独一无二的名字(name)。如果node(节点)元素有children,就需要显式标签来定义,children比如是:remap 元素或者 param 元素。

1.| <node pkg="package_name" type="executable_file1" name="node_name1">
2.| <node pkg="package_name" type="executable_file2" name="node_name2">
3.| 	<param name="imu_topic" value="imu_data" />
4.| 	<param name="gps_topic" value="">
  • pkg :节点所在的功能包的名字;
  • type :节点生成的可执行文件的名字;
  • name:节点名称,即ros::init(,“node_name”)所设置的名字。

  实际上 中除了 pkg, type, name 之外还可以设置更多参数,如下:

1.|	<launch>
2.|		<node
3.|        pkg=""
4.|        type=""
5.|        name=""  
6.|        respawn="true" 
7.|        required="true"
8.|        launch-prefix="xterm -e"
9.|        output="screen"
10|        ns="some_namespace"
11		   args=""
12|    />
13|</launch>
  • output:默认情况下,launch 启动 node 的信息会存入下面的 log 文件中 ,通过
    output="screen"将信息输出到屏幕上;
1.| /.ros/log/run_id/node_name-number-stdout.log
  • respawn=“true”: 启动完所有请求启动的节点后,roslaunch 监测每一个节点,让它们保持正常的运行状态。当任何其中任何一个node终止时,可以要求 roslaunch 重新启动它。

  • required=“true”:当一个必需的节点终止时,roslaunch会做出响应,终止其他所有的节点并退出它自己。

    注意: 由于 required 属性和 respawn 属性的含义,所以如果你给单个的一个节点同时设置了这2个属性,roslaunch 命令会产生矛盾,所以不要这样设置。
    
  • launch-prefix = “command-prefix”
    相比我们原来对每个节点在单独的终端使用 rosrun 命令启动的做法,roslaunch 则是让所有的节点共享同一个终端。对于只产生简单的日志消息文件而不需要终端(console)输入的节点是容易管理的,而那些依赖终端输入的节点,比如 turtle_teleop_key 节点,它可能要优先的保留在独立的终端上。 launch-prefix=”xterm -e”.这个属性,启动这个 node 元素的 rosrun 命令大致相当于:

 xterm -e rosrun turtlesim turtle_teleop_key. 

xterm 命令会开一个新的终端窗口。 -e 参数告诉 xterm :执行其命令行剩余部分(rosrun turtlesim turtle_teleop_key)。

  • ns = “namespace” :将 node 归入不同的 namespace,即在 node name 前边加 ns 指定的前缀。
  • args:传递参数到节点. arg参数只在launch文件中合法(相当于局部变量),不直接传给节点,所以需要通过node中的args属性进行传递。

–3. remap标签

  在launch文件中重新命名,使用 remap 元素。经常作为 node tag 的子 tag 出现,可以用来修改 topic。简单地说, remap 的作用就是方便同一个 node 文件被应用到不同的环境中,用 remap 从外部修改一下 topic 即可,不需要改变源文件。

1.| <node pkg="package_name" type="executable_file" name="node_name">
2.| 	<remap from="original-name" to="new-name" />
3.| </node>

–4. include标签

  标签的作用是将另外一个 launch 文件添加到本 launch 文件中,类似 launch 文件的嵌套。

  1. file属性
1.| <include file="path-to-launch-file" /> 

上边的文件路径可以给具体路径,但是一般来说为了程序的可移植性,最好借助 find 命令给出文件路径:

1.| <include file="$(find package-name)/launch/xxx.launch" />

上述命令中,$(find package-name) 等于相应 package 的路径。这样即使换了其他机子,只要安装了同样的 package,就可以找到对应的路径。
2. ns 属性
  有时,另一个 launch 引入的 node 可能需要统一命名,或者具有类似特征的 node 名字,比如 /vehicle/gps, /vehicle/imu, /vehicle/lidar,即 node 具有统一的前缀,方便查找。这可以通过设置 ns (namespace)属性来实现,命令如下:

1.| <include file="$(find package-name)/launch/xxx.launch " ns="vehicle" />

–5 arg 标签

  在launch文件中,要声明一个参数的存在,我们使用arg元素,通过arg 可以使参数重复使用,也便于多处同时修改。arg 在launch文件中相当于一个局部变量。

  • 声明里面只有一个 name ,像是只在程序中定义了一个 int 类型的变量,但并没有使用一样。(至少还需要给 arg 元素分配 default 属性或 value 属性)
1.| <arg name="use_imu"/>  //只声明,但不赋值
  • default属性
1.| <arg name="imu_topic" default="imu_data"/> //赋默认值
  • value属性
1.| <arg name="imu_topic" default="imu_data"/> //赋固定值
  • 从 command-line 赋值
1.| roslaunch package_name xxx.launch  arg1:=1  arg2:=5
note:命令行可以覆盖default的值,但是不能覆盖 value的值。

5.1 变量替换

  在 launch 文件中常用的变量替换形式有两个:$(find **) 和 $(arg **)

  • $ (find package_name): 例如$(find cartographer_ros)/urdf/vv6.urdf ,强烈推荐这种基于 package 的路径设置。
1.| <node name="cartographer_node" pkg="cartographer_ros"
2.|       type="cartographer_node" args="
3.|       -configuration_directory $(find cartographer_ros)/configuration_files
4.|       -configuration_basename myrobot.lua" output="screen">
5.|      
6.|    <remap from="points2" to="/rslidar_points" /> 
7.|    <remap from="/imu" to="/imu_data" />
8.|  </node>
  • $(arg arg_name): 将此处替换成 arg 指定的 arg value.
1.|	<arg name="imu_topic" default="/imu_raw" />
2.|
3.| <node pkg="package_name" type="executable_file" name="node_name">
4.|		<param name="imu_topic" value="$(arg imu_topic)"/>
5.| </node>

5.2 argument的继承

  argument不能传递给 include 元素里包含的子launch文件使用,因为这个 argument 就像是一个局部变量,它不能被包含的launch文件 所 “继承” 。可以 在 include 元素中插入 arg 元素作为 include 元素的子类(children):

1.| <include file="path-to-launch-file">
2.| 	<arg name="arg-name" value="arg-value"/>
3.| . . .
4.| </include> 

–6 param标签

与 arg 不同,param 是共享的,并且它的取值不仅限于 value,还可以是文件,甚至是一行命令。

<param name="param_name" type="type1" value="val"/>   //type可以省略,系统自动判断
<param name="param_name" textfile="$(find pkg)/xxx/file"/> //读取 file 存成string
<param name="param_name" command="$(find pkg)/exe '$(find pkg)/arg.txt'"/>
<param name="param" type="yaml" command="cat '$(find pkg)/xxx.yaml'"/>
  • 定义全局参数
1.| <param name="Baudrate" type="int" value="230400" />
  • 定义节点下的参数
1.| <node pkg="package_name" type="executable_file" name="node_name">
2.| 	<param name="imu_topic" value="imu_data" />
3.| </node>

–7. rosparam标签

  param只能对单个 param 操作,而且只有三种:value, textfile, command 形式,返回的是单个 param 的内容。而rosparam则可以批量操作,还包括一些对参数设置的命令,如 dump, delete 等.

  • 从yaml文件加载一批参数
1.| <rosparam command="load" file="$(find package_name)/yaml/xxx.yaml" />
  • delete: 删除某个 param
1.| <rosparam command="delete" param="_use_imu" />
  • 类似 param 的赋值操作
<rosparam param="param_data">[1,2,3,4]</rosparam>

或者:

<rosparam>
imu: 1
gps: 2
</rosparam>

–8.启动Rviz

<node pkg="rviz" type="rviz" name="mapping_rviz" required="false" args="-d $(find lidar_localization)/rviz/mapping.rviz"/>
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值