ROS中launch文件的编写
ROS中launch文件的编写
launch文件介绍
ROS系统里的组成单位是节点(node),在启动ROS时需要启动所有的node,如果手动一一启动会是一项十分繁琐的事情,因此ROS通过launch文件可以同时启动多个node,而且launch文件会默认启动ROSMaster,不需要使用roscore来启动。
launch文件使用的XML文件格式,不清楚的同学可以戳这里XML文件基本格式。
我的感觉这个格式像C语言中的结构体,如果“结构体”中的变量没有嵌套“结构体”,可以用下面这种形式书写:
<class param1="value1" param2="value2" param3="value3" />
如果“结构体”中的变量有嵌套“结构体”,可以用下面这种形式书写:
<calss><class1><class1_param1="value1" /></class1><class2><class2_param2="value2" /></class2>
</class>
使用launch文件
launch文件不需要编译,启动launch文件之前需要先设置环境变量,在工作空间目录下使用命令行设置。
source devel/setup.bash
启动launch文件有两种启动方式。
#1.利用功能包启动
roslaunch pkg_name launchfile_name.launch
#2.利用绝对路径启动
roslaunch path_to_launchfile
两种启动方式launch文件后面都可以添加参数,常见的参数有:
--screen
:可以将node里的信息输出到屏幕上,生成log日志文件。arg:=value
: launch 文件中有待赋值的变量,可以通过这种方式赋值,例如:
roslaunch pkg_name file_name.launch model:=urdf/myfile.urdf #file_name.launch 中有参数 “model” 需要赋值
roslaunch pkg_name file_name.launch model:='$(find urdf_pkg)/urdf/myfile.urdf' # 用 find 命令提供路径
launch文件的标签
< launch >
launch文件的根标签必须是:
<launch>..........
</launch>
< include >
将一个launch文件嵌入另一个launch文件。具有两种格式:
<!--绝对路径-->
<include file="path_of_launch_file" />
<!--功能包-->
<include file="$(find package_name)/launch_file_name" />
有时,另一个 launch 引入的 node 可能需要统一命名,或者具有类似特征的 node 名字,比如 /vehicle1/gps, /vehicle1/lidar, /vehicle1/imu,即 node 具有统一的前缀,方便查找。这可以通过设置 ns (namespace)属性来实现,命令如下:
<include file="$(find package-name)/launch-file-name " ns="namespace_name" />
< node >
< node >就是launch文件启动节点的指令。其有许多配置参数:
pkg
:node所在的功能包名。type
:node代码生成的可执行文件的名字,(CMakeLists中的add_executable中可以修改)。name
:node的名字,在ros::init()中定义。respawn
:复位功能,node关闭可以重新启动。required
:必要节点,该节点关闭,其他节点也将终止。launch-prefix
:重新开一个窗口执行。output
:输出打印到终端屏幕,生成log日志。args
:节点需要输入的参数。ns
:命名空间,为节点内的相对名称添加命名空间前缀。
<launch><nodepkg="my_pkg"type="my_node"name="my_node" respawn="true" required="true"launch-prefix="xterm -e"args="value"output="screen"ns="some_namespace"/>
</launch>
< remap >
重映射功能,将node中的话题名称进行重映射。这里需要清楚节点是发布者还是订阅者。
<!--节点是发布者将自身的origin_topic映射成new_topic发布出去 -->
<node pkg="my_pkg" type="my_node" name="my_node">
<remap from="origin_topic" to="new_topic" /><!--节点是订阅者订阅first_topic映射成订阅second_topic -->
<node pkg="my_pkg" type="my_node" name="my_node">
<remap from="first_topic" to="second_topic" />
< arg >
相当于launch文件里的局部变量,只在launch文件中生效,可以从命令行输入,或是launch文件中定义,可以替换重复值,三种赋值方法:
<arg name="foo">
:声明一个 arg,但不赋值。稍后可以通过命令行赋值,或者通过 < include > tag 赋值。<arg name="foo" default="1">
:赋默认值。这个值可以被命令行和< include > tag 重写。<arg name="foo" value="1">
: 赋固定值,这个值不可以被改写。
<!--命令行赋值-->
roslaunch pkg_name file_name.launch arg1:=val1 arg2:=val2
<!--在文件中充当一个局部变量-->
<arg name="x" default="true"/>
<param name="use_x" value="$(arg x)"/>
< param >
param是ROS系统运行中的参数,存储在参数服务器中,因此param参数是共享的、全局的,与arg有区别,而且param的参数不仅仅是value,还可以是文件,命令行。
<param name="param_name" type="type1" value="val"/> # type可以省略,系统自动判断
<param name="param_name" textfile="$(find pkg)/path/file"/> # 读取 file 存成 string
<param name="param_name" command="$(find pkg)/exe '$(find pkg)/arg.txt'"/>
实例:
<param name="param" type="yaml" command="cat '$(find pkg)/*.yaml'"/> # command 的结果存在 param 中
param 可以是在 global scope 中,它的 name 就是原本的 name,也可以在某个更小的 scope 中,比如 node,那么它在全局的名字就是 node/param 形式。
<param name="publish_frequency" type="double" value="10.0" /><node name="node1" pkg="pkg1" type="exe1"><param name="param1" value="False"/></node>
如果用 rosparam list
列出server 中的 param,则有:
/publish_frequency
/node1/param1 # 自动加上了 namespace 前缀
注意:虽然 param 名字前加了 namespace,但是依然 global viewable。
< rosparam >
可以对param进行批量操作。
< group >
如果要对多个 node 进行同样的设置,比如都在同一个特定的 namespace,remap 相同的topic 等,可以用 tag。在 group 中可以使用所有常见的 tag 进行设置,例如:
<group ns="wg2"><remap from="chatter" to="talker"/> # 对该 group 中后续所有 node 都有效<node ... /><node ... ><remap from="chatter" to="talker1"/> # 各个 node 中可以重新设置 remap</node>
</group>
本文参考博主链接:
https://www.jianshu.com/p/e55850b87c7d
如有侵权请告知
ROS中launch文件的编写相关推荐
- ROS中launch文件使用笔记
1. 常用标签 <launch> <!--根标签--> <node> <!--需要启动的node及其参数--> <include> < ...
- ros中launch文件使用与虚拟机中使用Livox avia
在home目录创建工作空间,并创建src,将要安装的代码解压放在src中,编译ros项目 ROS入门(四)编译ROS程序包_小鱼儿飞呀飞的博客-CSDN博客_ros包编译 使用launch前要 `so ...
- ROS中yaml文件编写格式
目录 键值对 键值对书写格式 键值对的引用 强制类型转换 字符串 时间与日期 已知偏移时区和当地时间 已知UTC世界时间 数组 普通数组 键值对数组 数组的引用 多维数组 命名空间 命名空间下普通变量 ...
- linux开机启动roscore,树莓派ubuntuMate系统中开机自启动ROS的launch文件
0x00 为何需要开机自启动launch文件 在ROS开发后期阶段由于功能已经趋于稳定,因此就需要系统在一上电启动后就自动把ROS下的各节点程序加载运行,这样就省去了我们还得手动输入roslaunch ...
- 9.使用rosed在ROS中编辑文件
使用rosed在ROS中编辑文件(rawmeat:http://wiki.ros.org/ROS/Tutorials/UsingRosEd) 注意:本教程翻译于2018.9.17,由wiki.ros. ...
- 电力系统励磁涌流有关的问题分析。 可以通过MATLAB中m文件便编写产生励磁涌流
电力系统励磁涌流有关的问题分析. 可以通过MATLAB中m文件便编写产生励磁涌流,也可以通过simulink仿真出励磁涌流. 可以仿真分析影响励磁涌流的因素,以及抑制励磁涌流的措施. 可以研究识别励磁 ...
- ROS学习(4)——launch文件的编写
对于一个复杂的系统,会有十几个.几十个甚至是上百个节点在运行,如果我们每次都是采取"打 开终端.运行 rosrun 指令"来启动应用程序,显得效率非常低.我们需要一个更方便的方式来 ...
- 【RK3399Pro学习笔记】十五、ROS中launch启动文件的使用方法
目录 Launch文件语法 <launch><launch><launch> <node><node><node> 参数设置 & ...
- ROS系统中launch文件无法启动
方法一:LAUNCH文件无法启动,权限问题,开权限. 方法二: source devel/setup.bash
最新文章
- 帝国cms让当前栏目显示不同样式(图文)
- android 制作的精美闹钟
- 帕斯卡三角形杨辉三角
- SHELL test [ 命令用法
- 了解 Windows Azure 存储的可伸缩性、可用性、持久性和计费
- LeetCode题解-23 合并K个排序链表 Hard
- IntelliJ IDEA 文件夹重命名--解决重命名后js文件引用找不到路径报404错误
- SpringBoot集成 Shiro
- 巨头不想再将“命脉”交给微信、支付宝
- 鸿蒙系统和安装包,鸿蒙系统安装包
- 5G China unicom 直放站 网管协议 实时性要求
- mysql 1556_mysqldump: Got error: 1556: You can't use locks with log tables. when doing LOCK TABLES
- 新钛云服冯祯旺:让云管理成为水电一样的基础服务
- iOS绘图详解-多种绘图方式、裁剪、滤镜、移动、CTM
- 公网部署freeswitch1.8.6后,终端注册成功后,在fs_cli控制台执行originate user/1000 echo,呼通1000的SIP终端后,终端讲话没有收到fs的回声解决方法
- 解决webpack : 无法加载文件 C:\Users\XXX\AppData\Roaming\npm\webpack.ps1因为在此系统上禁止运行脚本
- 运维必看,zabbix详细攻略,监控原理、监控流程、部署流程
- 大规模并行处理器编程实战笔记3
- HTML5 定位的使用
- 安卓手机后台Service自动转发短信
热门文章
- 如何采集卫星电视信号并转成网络IP流 (TS over UDP)
- uin-app实现微信直播功能
- matlab矩阵转置函数_akala啦_新浪博客
- Android 悬浮菜单(按钮) BoomMenu(样式大合集)
- 织梦php页面中调用标签,织梦dede:php标签中调用其他普通标签和页面相关变量及全局配...
- html基础标签-1-pre预格式标签
- UTF-8 GBK UTF8 GB2312 之间的区别和关系
- centos搭建内网DNS配合nginx反向代理
- 特斯拉柏林超级工厂又突发火灾;多模态人工智能产业联合体第二次大会召开;奇瑞汽车战略投资AI芯片公司 | 每日大事件...
- 《STM32单片机开发应用教程(HAL库版)—基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第四章4.1 LED显示控制实验