ROS launch 总结

转自博客:https://www.cnblogs.com/Jessica-jie/p/6961837.html

1 运行Launch文件
2 新建Launch文件
3  在namespace中启动nodes
4   remapping names
5 其他的launch元素

1 运行Launch文件

Launch文件是ROS提供的,可以同时运行多个nodes的文件。Launch文件以一种特殊的XML格式编写,在ROS packages中使用广泛。

(1) 运行launch文件

$ roslaunch package_name launch_file_nameEg: roslaunch vins_estimator euroc.launch 

Tip1: rosrun只能运行一个nodes, roslaunch可以同时运行多个nodes.

Tip2: launch文件可以不被包含于package中。此时,只需指出该launch文件的绝对路径,即可运行。

$ roslaunch completely_path    Eg:$ roslaunch ~/opt/ros/indigo/share/turtlesim/launch/example.launch

Tip3: 为便于执行,每个node最好是相互独立的。

(2)详细显示(request verbosity)

$ roslaunch -v package_name launch_file_name

(3) 结束launch文件

ctrl+c

2 新建launch文件

(1) launch文件一般以.launch后缀作为文件名,放在package的launch文件夹下。最简单的launch文件可以仅包含几个nodes。

(2) Launch文件是XML文件,每个XML文件必须有一个root element。而launch文件的root element由一对launch 标签定义。

<launch>

...

</launch>

Launch文件中的其他elements必须都在这一对tags之间。

(3) launch文件的核心是一系列node elements,每个node element启动一个node。Node element看起来如下:

<node

pkg=”package_name” type=”executable_name” name=”node_name”

/>

Tip1: 最后的“/”是必不可少的。

Tip2: 也可以写成<node pkg=”..” type=”...” name=”...”></node>,如果该node中有其他tags,则必须使用这种形式。

Tip3: 一个node element包含三个必须的属性:pkg, type, name. (pkg和type属性指出ROS应该运行哪个pkg中的哪个node,注意:此处的type是可执行文件的名称,而name则是可以任意给出的,它覆盖了原有文件中ros::init指定的node name).

(5) 使用匿名(anonymous name)    name=”$(anon base_name)”

(6) node 日志文件(log file)

运行roslaunch和用rosrun运行单个节点的区别之一是,默认情况下,roslaunch运行的nodes的标准输出会重定向到log file,不显示在控制台。

该日志文件的位置和名称如下:~/.ros/log/run_id/node_name-number-stdout.log

其中,run_id是master启动后生成的特殊标识符,number是表示nodes数量的整数。如: teleop_key-3-stdout.log.

(7) 输出到控制台

用output属性: output=”screen”;这种方法仅显示一个node。

若显示所有nodes的输出,用--screen命令行。$ roslaunch --screen package_name launch_file_name

如果正在运行的文件没有显示想要对输出,可以查看该node属性集中是否有 output=”screen”.

(8) 要求重生(request respawning)

开启所有nodes后,roslaunch会监视每个node,记录那些仍然活动的nodes。对于每个node,当其终止后,我们可以要求roslaunch重启该node,通过使用respawn属性。  respawn=”true”

(9) 终止nodes

required属性与respawn相反,不能同时对同一个node使用。  required=”true”

终止后,所有其他的nodes都会终止,并退出。这种命令有时很有用。比如,当一个很重要的node失败后,整个会话都会被扔掉,那些加上了respawn属性的nodes也会停止。

(11) 在独立的窗口运行各nodes

我们在各自的termin运行rosrun node_name;但是运行roslaunch时,所有的nodes共用一个相同的terminal,这对于那些需要从控制台输入的nodes很不方便。可以使用launch-prefix属性。

launch-prefix=”command-prefix”    Eg:launch-prefix=”xterm -e”

等价于 xterm -e rosrun turtlesim turtle_teleop_key

xterm 命令表示新建一个terminal; -e参数告诉xterm执行剩下的命令行。

当然,launch-prefix属性不仅仅限于xterm。它可用于调试(通过gdb或valgrind),或用于降低进程的执行顺序(通过nice).

3 在namespace中执行nodes

为node设置默认的namespace的常用方法——被称为“pushing down into a namespace”的进程,用于launch文件,并在其node element中指定ns属性。ns=”namespace”

aunch文件中的node names是relative names。同一个launch文件中,允许不同namespace中出现相同的node names。Roslaunch要求node names必须是base names——不指定任何namespaces的relative names;如果node element中出现node name为global name,则会报错。

4 重映射names(remapping names)

重映射相当于换名,每次重映射需提供一个original name和一个new name。每次node使用它的original name,

ROS client library都会将其替换为remapping name。

创建remapping name两种方法:

1. 对于单个node,在命令行进行remapping(remap对象可以是node,topic等)。

original-name:=new-name

Eg: $ rosrun turtlesim turtlesim_node turtle1/pose:=tim

2. 在launch文件内remap names,使用remap element

<remap from=”original_name” to “new_name”>

如果remap出现在launch文件开头,作为launch文件的子元素,则该remapping将被用于随后所有的nodes。如果remap作为某个node的子元素,则只用于该节点。

Eg:<node pkg=”turtlesim” type=”turtlesim_node” name=”turtle1”>

<remap from =”turtle1/pose” to “tim”>

</node>

注意:在ROS进行remapping之前,remaping的所有name,包括original和new names,都将被解析为global names。所以,remapping之后所有的名字通常都是relative names。

5 其他的launch elements

5.1 including其他文件

为包含其他launch文件,包括这些launch文件的所有nodes和parameters,用include element。

<include file=”path-to-launch-file”>

这种情况下,file属性必须写出该launch文件的全部路径名称,显得很繁琐。因此,常用

<include file=”$(find package_name)/launch_file_name”/>

注意,执行该launch文件时,roslaunch会搜索该package下的所有子目录;因此,必须给出package_name。此外,include也支持ns属性,将它的内容放进指定的namespace。

<include file=”...” ns=”namespace_name”/>

5.2 Launch arguments

为便于launch文件重构,roslaunch支持launch arguments,也成为arguments或者args,类似于局部变量。

注意:尽管argument和parameter有时可互换,但他们在ROS中的意义完全不同。Parameters是ROS系统使用的数值,存在parameter server上,nodes可通过ros::param::get函数编程得到,用户可通过rosparam获取。与之不同,arguments仅在launch文件内部有意义,nodes不能直接获取它们的值。

(1)声明argument

<arg name=”arg_name”>

(2)指定argument的值

Launch文件中的每个argument都必须有指定值。赋值方法有好几种。

第一种,在命令行赋值   $ roslaunch package_name launch_file_name arg-name:=arg_value

第二种,在声明argument时赋值

<arg name=”arg_name” default=”arg_name”/>

<arg name=”arg_name” value=”arg_name”/>

上面两行的区别在于,命令行参数可以覆盖default,但是不能重写value的值。

(3)获取变量值

一旦声明某个argument并赋值后,我们可以通过arg使用该argument.

$(arg arg-name)

如果该行出现,roslaunch将会用给定arg-name的值替换其左边的值。

(4)将argument值传给included launch文件

<include file=”path-to-file”>

<arg name=”arg_name” value=”arg_value”/>

......

</include>

若在launch文件中,launch文件及其包含的launch文件出现出现相同的arguments,则需在launch文件及included launch文件中同时写:

<arg name=”arg_name” value=”$(arg arg_name)”/>

第一个arg_name表示indluded launch文件中的argument,第二个arg_name表示launch文件中的argument.其结果是指定的argument在launch文件及included launch文件中都有相同的值。

5.3 创建groups

Group element可以再大型的launch文件中将指定的nodes组织起来。它有两个用处:

其一,group可以将几个nodes放进同一个namespace

<group ns=”namespace”>

<node pkg=”..” .../>

<node pkg=”..” .../>

......

</group>

注意,如果grouped node已经有它自己的namespace,并且是relative name,那么该node的namespace是其relative name,并以group namespace为后缀。

其二,group可以同时启动或者终止一组nodes。

<group if=”0 or 1”>

......

</group>

如果该属性的值是1,一切正常;如果该属性的值为0,那么group内所有的nodes都不会运行。

同理,除了if,还有unless。

<group unless=”0 or 1”>

......

</group>

注意,这些属性的合法值只有0和1.

另外,group element中只能使用ns,if,unless这三个属性。

ROS launch 总结的更多相关文章

  1. ROS launch总结

    1 运行Launch文件2 新建Launch文件3  在namespace中启动nodes 4   remapping names 5 其他的launch元素 1 运行Launch文件 Launch文 ...

  2. ROS launch 文件的编写

    ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file).事实上,在ROS功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系统都可 ...

  3. ROS,launch学习

    想象一下,如果一个ros工程里包含几十个节点,我们在命令行窗口一个个的开启它们,是一件多么耗时间,多么没有意义的浪费. launch功能可以解决这一问题,启动launch文件时ROS中非常重要的,有用 ...

  4. ROS launch启动文件的理解与编写

    博客参考:https://blog.csdn.net/weixin_41995979/article/details/81784987 和 https://www.cnblogs.com/zjiaxi ...

  5. linux bash shell run ros launch file and multi_node

    #!/bin/bash #source /opt/ros/melodic/setup.bash #source /home/pi/catkin_ws/devel/setup.bash #ROS_PAC ...

  6. ROS Learning-032 (提高篇-010 Launch)Launch 深入研究 --- (启动文件编程)ROS 的 XML语法简介

    ROS 提高篇 之 Launch 深入研究 - 01 - 启动文件的编程 - ROS 的 XML语法简介 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubu ...

  7. Gazebo機器人仿真學習探索筆記(七)连接ROS

    中文稍后补充,先上官方原版教程.ROS Kinetic 搭配 Gazebo 7 附件----官方教程 Tutorial: ROS integration overview As of Gazebo 1 ...

  8. ROS大型工程学习(二) 怎么阅读大型工程

    基本思路是由点到面,由浅到深. 1.首先从launch文件入手. 文件中会看到比如: <node ns="> <rosparam command="load&qu ...

  9. ROS之face recongination(cbo_peopel_detection)

    一准备 Ros的cbo_people_detection网站http://wiki.ros.org/cob_people_detection 某网站来自Amir:http://edu.gaitech. ...

随机推荐

  1. dede织梦如何去除网站底部的版权信息

    dede织梦如何删除版权powered by?在织梦中,特别是在仿站之中,经常会在首页的底部出现powered by,这是dedecms织梦系统底部自带的官方链接power by等字样,很多新用户想去 ...

  2. vue实现一个评论列表

    <!DOCTYPE html> <html> <head> <title>简易评论列表</title> <meta charset=& ...

  3. 攻防世界(Ctf-Web 新手练习区 Writeup)

    平台地址:adworld.xctf.org.cn 在打着暑假工赚零花钱之余,我将这些题利用空余时间刷了一遍,感觉内心还是比较满足的! 题目:view_source 这道题没啥好说的,在url的前面加上 ...

  4. 在SAP除了使用Cordova生产移动应用外,还有这种方式

    本文和Jerry过去的文章不太一样,算不上Jerry的知识分享,只是记录一下Jerry用React-Native把应用安装到Android手机上遇到的一些问题,方便以后查看. Jerry的同事Leo用 ...

  5. 阿里面试官总结40 个 Java 多线程问题

    前言 这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位 ...

  6. Shodan全世界在线设备搜索引擎

    reproduction from https://danielmiessler.com/study/shodan/ What is Shodan? Shodan is a search engine ...

  7. TCP的三次握手和四次挥手与路由器(三层)转发原理

    传输层是国际标准化组织提出的开放系统互连(OSI)参考模型中的第四层.该层协议为网络端点主机上的进程之间提供了可靠.有效的报文传送服务.其功能紧密地依赖于网络层的虚拟电路或数据报服务.传输层定义了主机 ...

  8. 助教培训第四次作业——熟练掌握GitHub及Git的使用方法

    助教培训第四次作业——熟练掌握GitHub及Git的使用方法 1.Git 命令的理解和使用 常用的Git命令可以查看官方文档,官方文档的网址:https://git-scm.com/docs .虽然是 ...

  9. java 从上至下打印二叉树

    从上往下打印二叉树题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, ...

  10. python中函数的定义、返回值以及参数的简要介绍

    一. 1.函数 定义:def关键字开头,空格之后接函数名称和圆括号(),后面紧跟‘:”. 函数是对功能的封装 语法: def 函数名(形参列表): 函数体(代码块,return) 调用: 函数名(实参 ...