ros中的launch文件写法

参考文章:

https://www.cnblogs.com/qixianyu/p/6579798.html

http://www.mamicode.com/info-detail-1748174.html

https://blog.csdn.net/datase/article/details/80909907

<node pkg=”package-name” type=”executable-name” name=”node-name”/>

package-name是什么?

ROS中的软件以包的形式组织。软件包可能包含ROS 节点。

软件包很容易用手工制作,或者使用像catkin_create_pkg这样的工具制作。一个ROS包就是一个从ROS_PACKAGE_PATH(见ROS环境变量)中下载的一个目录,其中包含一个package.xml文件。

ROS包往往遵循一个共同的结构。以下是这个包的一些目录和文件:

                 include / package_name

                 msg /

                 src / package_name /:源文件

                 srv /:包含Service(srv)类型的文件夹

                 scripts /:可执行脚本

                 CMakeLists.txt:CMake构建文件

                 package.xml

                CHANGELOG.rst

源文件在src下,而节点是在src目录下中的某个可执行文件中定义的。type后面赋值的是自己写的节点.cpp程序通过编译生产的可执行文件的名字,你最初编译.cpp程序的时候要在CMakeLists.txt添加cpp程序编译的设置,这个可执行文件的名字在CMakeLists.txt中就可以找到,而name则是可以任意给出的,它覆盖了原有可执行文件中ros::init指定的node name。,并将拥有这个节点名的包的名字赋值给Package-name.

args =“arg1 arg2 arg3”

有时候也可以这么用:args =“$(find baz_pkg)/resources/map.pgm”/>,$是取值的意思

machine =“machine-name” (可选)                     作用:在指定机器上启动节点。

respawn =“true” (可选)                                         作用:如果节点退出,则自动重新启动节点。

respawn_delay =“30” (可选,默认为0)ROS indigo中的新功能     作用:如果respawn为true,请在尝试重新启动之前检测到节点故障后等待respawn_delay秒。

required =“true” (可选)                           作用:如果节点死亡,杀死整个roslaunch。

ns =“foo” (可选)                                       作用:在“foo”命名空间中启动节点。

这里将引入ros节点,命名空间

命名空间

我们在安装软件时,两个软件文件夹中可能都有readme.txt,我们可以通过/来限定命名空间

/home/user1/readme.txt 
/home/user2/readme.txt

其中的命名空间就是/home/user1

这可以在ros中写为

rosrun turtlesim turtlesim_node __ns:=/home/user1

注意是两个"_"组成的"__",则用rostopic list输出的节点为

/home/user1/turtlesim

clear_params =“true | false” (可选)       作用:在启动前删除节点的私有命名空间中的所有参数。

output =“log | screen” (可选)

  • 如果'screen',stdout / stderr从节点将被发送到屏幕。如果是“log”,stdout / stderr输出将被发送到$ ROS_HOME/ log中的日志文件,stderr将继续发送到屏幕。默认值为“log”。

cwd =“ROS_HOME | node” (可选)

  • 如果为“node”,则节点的工作目录将设置为与节点的可执行文件相同的目录。在C Turtle中,默认值为“ROS_HOME”。在Box Turtle(ROS 1.0.x)中,默认值是'ros-root'。使用'ros-root'在C Turtle中已被弃用。

launch-prefix =“prefix arguments” (可选)

  • 用于预先添加到节点的启动参数的命令/参数。

<include file=”$(find package-name)/launch-file-name”>

如果想在启动文件中包含其他启动文件的内容( 包括所有的节点和参数),可以使用包含(include)元素<include file=”$(find package-name)/launch-file-name”>由于直接输入路径信息很繁琐且容易出错,大多数包含元素都使用查找(find)命令搜索功能包的位置来替代直接输入路径。

<arg name=”arg-name” default=”arg-value”/>

roslaunch还支持启动参数,有时也简称为参数甚至args。在ROS中prarmeter和argument 是不同的,虽然翻译一样。parameter是运行中的ROS系统使用的数值,存储在参数服务器(parameter server)中,每个活跃的节点都可以通过 ros::param::get 函数来获取parameter的值,用户也可以通过rosparam来获得parameter的值而argument只在启动文件内才有意义他们的值是不能被节点直接获取的。

<arg name=”arg-name” default=”arg-value”/>与 <arg name=”arg-name” value=”arg-value”/>两者的唯一区别在于命令行参数(roslaunch xx yy.launch dd:=t)可以覆盖默认值default,但是不能覆盖参数值 value。用$(arg arg-name)在每个该替换出现的地方,roslaunch 都将它替换成参数值。

args属性 
传递参数到节点. 个人理解,arg参数只在launch文件中合法(相当于局部变量),不直接传给节点,所以需 要通过node中的args属性进行传递. (这句话引用自https://blog.csdn.net/qq_33444963/article/details/77893881来)

<arg name="arg-name" default="arg-value" /> 
<arg name="arg-name" value="arg-value" /> 

这两种语法的唯一不同是:命令行可以覆盖default的值,但是不能覆盖 value 。在例子launch文件 中,use_sim3 节点的 default 值为 0,所以它可以通过命令行改变值,就像下面这样: 
$ roslaunch agitr triplesim.launch use_sim3:=1 
如果我们修改了这个例子launch文件:使用value替换default。那么上面这个命令执行的时候会出 现错误,因为使用 value属性 配置的argument的值是不允许改变的。(这句话引用自https://blog.csdn.net/qq_33444963/article/details/77893881

拓展:参数服务器

机器人工作时,我们有需要对机器人的参数(如传感器参数、算法的参数)进行设置。

有些参数(如机器人的轮廓、传感器的高度)在机器人启动时就设定好就行了;

有些参数则需要动态改变(特别是在调试的时候)。

ROS提供了参数服务器来满足这一需求。我们可以将参数设置在参数服务器,在需要用到参数的时候再从参数服务器中获取。

四 元素

您可以在<node>标记中使用以下XML 标签:

  • <env>   作用:为节点设置环境变量

  • <remap>    作用:为此节点重新设置映射参数

          拓展:重映射是基于替换的思想,每个重映射包含一个原始名称和一个新名称。每当节点使用重映射中的原始名称时,ROS客户端库就会将它默默地替换成其对应的新名称。例如,运行一个 turtlesime 的实例, 如果想要把海龟的姿态数据发布到话题/tim 而不是/turtle1/pose,就可以使用如下命
令:rosrun turtlesim turtlesim_node turtle1/pose:=tim 通过启动文件的方式,只需在启动文件内使用重映射(remap)元素即可:<remap from=”turtle1/pose”to ”tim”/>

<rosparam>

           举例:<rosparam command="load" file="$(find learning)/cfg/kinect.yaml" />

<param>

          <param>标签可用于直接设置参数,也可以从文件中读取

          <rosparam>标签用于从yaml文件中读取并设置参数

           举例:

           <param name="param-name" value="param-value" />              

rosparam与param的区别

rosparam可操作多个参数,以及yaml文件参数,param一次性只能指定一个参数,且是标准类型的参数。

下面创建一个文件yaml:

命名为color.yaml文件,

在里面输入

background_r:0

background_g:0

background_b:0(这句话引用自https://www.cnblogs.com/marty86/p/7825314.html

argument与parameter的区别:

尽 管 在 计 算 机 领 域 术 语 中 很 多 情 况 下 prarmeter 和argument 都是可以互换的,但是在 ROS 中,二者的含义是非常不同的(译者注:在中文中一般都称为参数,更没有明显的区分,因此后面还是使用它们的英文原文说明问题)。parameter 是运行中的 ROS 系统使用的数值,存储在参数服务器(parameter server)中,每个活跃的节点都可以通过 ros::param::get 函数来获取 parameter 的值,用户也可以通过 rosparam 来获得 parameter的值。而 argument 只在启动文件内才有意义;他们的值是不能被节点直接获取的。(引用自https://blog.csdn.net/wilylcyu/article/details/60136585) 

 group标签定义命名空间.

<group ns="turtlesim1">
      <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
        </group>
<group ns="turtlesim2">
      <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
        </group>
在这里我们创建了两个节点分组并以’命名空间(namespace)’标签来区分,其中一个名为turtulesim1,另一个名为turtlesim2,两个组里面都使用相同的turtlesim节点并命名为’sim’。 这样可以让我们同时启动两个turtlesim模拟器而不会产生命名冲突。(当然如果直接用不同的命名也是可以的,比如一个叫sim_1,一个叫sim_2,这样也可以同时多次启动同一节点). (参考自https://blog.csdn.net/qq_33444963/article/details/77893881) 


 

猜你喜欢

转载自blog.csdn.net/lisfaf/article/details/85322981
今日推荐