ros中的launch文件使用方法

先附上一片整理的比较好的文章:https://blog.csdn.net/weixin_45868890/article/details/123615432

一. 功能

1.launch file 可以使ros同时启动多个节点,并且实现每个节点的各种配置,为多个节点操作提供便利。
2. roslaunch 工具是ros中python实现的程序启动工具,通过读取launch文件中的参数配置、属性配置等来启动一系列节点;
很多ROS包或源码包中都有launch文件,一般为该程序包能够运行起来的基本demo配置,运行下面指令自动补全会提示该包现有的launch文件:
$roslaunch package_name file.launch
launch文件的位置并不是很重要,如果放在任意一个位置,可以运行下面指令:
$roslaunch path-to-where/file.launch
3. lannch机制不保证节点的启动顺序,虽然launch文件是顺序分析,但节点初始化的时间长度不一,启动时间不一

二. 标签

    ☺< node> 启动一个节点
    ☺ < param> 设置参数服务器的参数,是ros系统运行中的参数,存储在参数服务器中.每一个活跃的节点都可以通过ros::param::get()这个接口来获取参数;但是当我们参数很多的时候一个一个加载起来很麻烦的时候,这时候提供了一个更加高效的参数加载方式.:<param name=“参数名” value=“值” />
  ☺ < remap> 重映射,即在launch文件中重新命名,from:被映射名称 ; to:目标名称;
  ☺ < machine> 声明启动要使用的机器
  ☺ < include> 包含的launch文件,包含其他文件,包含文件中定义的参数、变量、节点都会按深度优先遍历依次执行生效
  ☺ < group> 共享一个命名空间或者映射的元素组
  ☺  < rosparam>: dump/load、delete parameters from/to  Parameter Server,常用来加载程序的参数配置文件到参数服务器,然后程序从参数服务器取得参数值;可以将一个yaml格式文件中的参数全部加载到ros参数服务器中.需要设置command属性为"load"

\rosparam< file="$(find 文件名) 路径 " command=“load” ns=“命名空间” />
☺ < args> 声明参数
☺< arg> 参数声明,arg_1 通过命令行传递,arg_2 传递到included.launch, arg_3 默认值可以被重写覆盖,agr_4不能被重写;类似于launch文件内部的局部变量,仅仅限于launch文件使用,便于launch文件重构.

三. node的属性

    ☺ pkg 节点包
     ☺ type节点类型,必须要有对应的可执行文件
     ☺ name节点名称
      ☺args 传递到节点的参数
      ☺respawn="true" 启动完所有请求启动的节点之后,roslaunch 监测每一个节点,让它们保持正常的运行状态。对于每一个节点,当它终止时,我们可以要求 roslaunch 重新启动它,如果节点退出自动重启 default:false
     ☺ output="screen" 标准输出/标准错误输出重定向屏幕,log重定向log文件,default:log
      ☺required:"true" 如果节点退出,杀死全部launch进程
     ☺ launch-prefix = “command-prefix”,roslaunch 命令 的一个潜在的缺点:相比我们原来对每个节点在单独的终端使用 rosrun 命令启动的做法,roslaunch 则是让所有的节点共享同一个终端。 那些只需要生产简单的日志消息文件而不需要终端(console)输入的节点是容易管理的,而那些依赖终端输入的节点,比如 turtle_teleop_key 节点,它可能要优先的保留在独立的终端上。在例子launch文件中,我们给 teleoperation 节点使用了这个属性:launch-prefix=”xterm -e”.因为这个属性,启动这个 node 元素的 rosrun 命令大致相当于:xterm -e rosrun turtlesim turtle_teleop_key。xterm 命令会开一个新的终端窗口。 -e 参数告诉 xterm :执行其命令行剩余部分(rosrun turtlesim turtle_teleop_key)。

四。例子

1.如:
<launch>
 < node name="you_define_node_name" pkg="package_name" type="exe_name" />
 </launch>

作用:启动上面的launch文件就会启动package_name包下的exe_name执行文件,you_define_node_name自定义的node_name
2.

 <launch>
    < !-- comment注释  -->
<!-- top-level arg must be set from  command line:roslaunch file.launch arg_1:=value -->
<arg name="arg_1" />
<param name="param_1" value="$(arg arg_1)"/>
<!-- this is the include launch file content:
    <launch>
      <!-- declare arg to be passed in -->
      <arg name="arg_2" /> 

      <!-- read value of arg -->
      <param name="param_2" value="$(arg arg_2)"/>
    </launch>
-->
<include file="$(find pkg_name)/path-to/included.launch" ns="namespace">   
    <!-- pass value from high level to included.launch -->
    <arg name="arg_2"  value="value" />
</include>
<arg name="arg_4"  value="value" />

<node pkg="pkg_name" type="exe_name" name="node_name1" args="arg1 arg2 arg3" respawn="true" output="screen">  
    <param name="name4" command="$(find pkg_name)/path-to/exe '$(find pkg_name)/path-to/arg.txt'"/>
    <rosparam command="load" file="$(find pkg_name)/example.yaml"/>

    <param name="frame_id" value="$(arg frame_id)"/>
</node>   
<node pkg="pkg_name" type="exe_name" name="node_name2" args="arg1 arg2 arg3" respawn="true" output="screen">  
  
    <param name="name1" type="double" value="10.0"/>
   
    <remap from="base_link" to="$(arg arg_1)"/>

    <rosparam command="load" file="$(find pkg_name)/example.yaml"/>

    <param name="frame_id" value="$(arg frame_id)"/>
</node> 
<node pkg="pkg2_name" type="exe_name" name="node_name3" args="arg1 arg2 arg3" respawn="true" output="screen">  
    <param name="name4" command="$(find pkg_name)/path-to/exe '$(find pkg_name)/path-to/arg.txt'"/>
</node>    
<group if="$(arg use_rviz)">
  <node pkg="rviz" type="rviz" name="rviz" 
        args="-d $(find pkg_name)/launch/VLP16_2D.rviz"/>
</group>
```

作用:上面的launch文件首先声明了一些参数,之后include另一个launch文件,included.launch文件中的节点会按深度优先执行配置和启动;
之后该launch文件启动3个节点,前两个节点来自同一个包的同一个可执行文件,节点命名不能相同,每个节点可以进行自己的参数配置;
之后该launch文件启动rviz节点,参数传递 rviz的配置文件,不同配置用于显示不同的信息
可以作为一组标签的容器,从而使该组有独立的名称空间
所以标签可使用 if/unless属性,如果条件成立则包含标签。

五。 书写格式

1.注解格式 <!– 注解内容–>

六。补充文献

更多补充

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值