ros launch 文件的编写

无所谓位置
不需要有可执行权限
xml格式
私有参数,在命令行指定的方法:前面加_

mkdir -p turtle_launch_ws/src
catkin_make
cd ~/turtle_launch_ws/src
catkin_create_pkg turtlesim_launch roscpp rospy
cd ~/turtle_launch_ws
cd src/turtlesim_launch
mkdir launch
catkin_make

第一个launch,node标签

<launch>
    <node pkg="turtlesim" type="turtlesim_node" name="turtle1"/>
</launch>

roslaunch -v turtlesim turtlesim_node
输出详细信息
对应的话题是

/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

还有就是name属性给节点指派了名称,它将覆盖任何通过调用 ros::init来赋予节点的名称。在默认状态下,从启动文件启动节点的标准输出被重定向到一个日志文件中,而不是在制台显示。该日志文件的名称是: ~/.ros/log/run_id/node_name-number-stout.log 其中,run_id 是节点管理器(master)启动时生成的一个唯一标示符,使用output时,将输出到屏幕
第二个launch————name

<launch>
    <node pkg="turtlesim" type="turtlesim_node" name="turtle1"/>
    <node pkg="turtlesim" type="turtle_teleop_key" name="turlte1_tele"/>
</launch>

类似用法 rosrun turtlesim turtlesim_node __name:=node-newname
output的使用————output

<launch>
    <node pkg="turtlesim" type="turtlesim_node" name="turtle1"/>
    <node pkg="turtlesim" type="turtle_teleop_key" name="turlte1_tele" output="screen"/>
</launch>

类似用法roslaunch –screen pkg-name launch-file.launch
第三个launch————name只是改了节点名

<launch>
    <node pkg="turtlesim" type="turtlesim_node" name="t1"/>
    <node pkg="turtlesim" type="turtlesim_node" name="t2"/>
</launch>

存在的问题,话题相同

robot@ubuntu:~/Documents/launch$ rosnode list
/rosout
/t1
/t2
robot@ubuntu:~/Documents/launch$ rostopic list
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

第4个launch————respawn

<launch>
    <node pkg="turtlesim" type="turtlesim_node" name="t1" respawn="true"/>
    <node pkg="turtlesim" type="turtlesim_node" name="t2" respawn="true"/>
</launch>

respawn 请关闭一个turtle的窗口!!!!观察!!!“”再生,复位“”
节点属性之必要节点:当一个节点被声明为必要节点即 required=”true”终止的时候,roslaunch 会终止所有其他活跃节点并退出。比如在依赖控制台的机器人遥控导航中,关闭了该远程控制节点所在的窗口,roslaunch将会终止其他节点,然后退出。

respawn_delay=30” (可选, 默认为 0)—–如果重启为真,在尝试重启之前,档检测到节点故障后则等待延时30秒。

required=true”(可选)—如果节点死亡,则杀死整个launch

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

第5个launch————group ns

<launch>
<group ns="NUM1">
    <node pkg="turtlesim" type="turtlesim_node" name="t1" respawn="true"/>
</group>
<group ns="NUM2">
    <node pkg="turtlesim" type="turtlesim_node" name="t2" respawn="true"/>
</group>
</launch>

ns=”namespace”,前提是节点的代码在创建 ros::Publisher 和 ros::Subccriber 对象时使用了像 turtle1/pose 这样的相对名称 (而不是/turtle1/pose 这样的全局名称)。同样,启动文件中的节点名称是相对名称。例如而不能是
node name=”/turtlesim_node” ,可以这么不准确的理解:两只连体小龟,他们做一件事是同时在做,比如让他们以不同的速度前进,他们做不到,若做手术分开,把他俩放在不同的房间(命名空间)他俩真正地独立起来,这样每个小龟可以接受不同的命令去做事,而且互不干扰。动文件默认命名空间是全局命名空间“/”,因此,节点的默认命名空间就解析为/sim1,所以对应的全局名称即/sim1/turtlesim_node。
带来的不同

robot@ubuntu:~/Documents/launch$ rosnode list
/NUM1/t1
/NUM2/t2
/rosout
robot@ubuntu:~/Documents/launch$ rostopic list
/NUM1/turtle1/cmd_vel
/NUM1/turtle1/color_sensor
/NUM1/turtle1/pose
/NUM2/turtle1/cmd_vel
/NUM2/turtle1/color_sensor
/NUM2/turtle1/pose
/rosout
/rosout_agg

第六个launch ————remap
当我们要改变话题名字时,比如本包的话题输出,原来话题名字叫”original”,然后转变成“new-name”,重映射说白了就是覆盖!!!

<remap from="original-name" to="new-name"/>
<launch>
    <node pkg="turtlesim" type="turtlesim_node" name="turtle1">
        <remap from="turtle1/pose" to="MMM"/>
    </node>
</launch>
robot@ubuntu:~/Documents/launch$ rostopic list
/MMM
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
robot@ubuntu:~/Documents/launch$ rosnode list 
/rosout
/turtle1

命令行的类似用法是

rosrun turtlesim turtlesim_node turtle1/pose:=MMM turtle1/cmd_vel:=NNN

结果是

robot@ubuntu:~/Documents/launch$ rosnode list 
/rosout
/turtlesim
robot@ubuntu:~/Documents/launch$ rostopic list
/MMM
/NNN
/rosout
/rosout_agg
/turtle1/color_sensor

这里写图片描述

第8个launch————args
启动参数( 运行时的参数):
roslaunch还支持启动参数,有时也简称为参数甚至args。在ROS中parameter和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 都将它替换成参数值。

<launch>
        <arg name="a" default="1" />
        <arg name="b" value="2" />
    <node pkg="beginner_tutorials" name="add_two_ints_server" type="add_two_ints_server"/>
    <node pkg="beginner_tutorials" name="add_two_ints_client" type="add_two_ints_client" args="$(arg a) $(arg b)"/>
</launch>

定义参数a,默认值为0,运行时可以重新赋值;
定义参数b,值为2,运行时不能赋值;

args="$(arg a) $(arg b)"#a,b作为参数传入节点,运行时可以将a重新赋值,不赋值使用默认值1.

运行:
1.(未定义arg时) roslaunch beginner_tutorials add_two.launch a:=4 b:=5
2.(定义arg后) roslaunch beginner_tutorials add_two.launch 或者roslaunch beginner_tutorials add_two.launch a:=4(只给a赋值,b不可,这是default 和value的区别??)
第9个launch————include
这个属性期望我们添加想要包含的文件的完整路径。但是大多数时候,include 元素使用一个 find 命令来搜索一个程序包,代替一个明确的完整路径:

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

roslaunch 命令 将会在程序包(package)的子目录里搜索launch文件。 include 元素必须要指定文件的特定路径,你可以使用 find 来找到这个程序包,但是却不能在这个程序包目录里面自动的找到某个子目录里有launch文件。举例:

这样做是正确的:<include file = "find learning_tutrols"/launch/start_demo.launch" / >

这样做是错误的:<include file = "find learning_tutrols"/start_demo.launch" />

include 元素也支持 ns 属性,可以让这个文件里的内容推送到一个命名空间里面:

<include file=". . . " ns="namespace" />

第10个launch————launch-prefix
8让一个节点在单独的终端窗口中启动:
roslaunch 使所有的节点都共用一个终端,要想节点有自己的终端可以使用

launch-prefix="xterm -e"

这里写图片描述

第7个launch————param
parameter server:http://wiki.ros.org/Parameter%20Server
roslaunch/xml/param:http://wiki.ros.org/roslaunch/XML/param
roslaunch/xml/rosparam:http://wiki.ros.org/roslaunch/XML/rosparam

参数服务器:
参数服务器是一个共享的,多变量的字典,节点可以通过网络API访问(即节点运行时可从服务器上获取或者修改)(全局可见)!!但是其设计本身造成其效率低,常被使用静态非二进制数据作为配置参数。
通过使用XMLRPC 解析,且运行在ros master 内部。

(1)parameter
和ROS使用相同的命名传统,为了避免同名,参数继承了话题和节点作为前缀。符合树状结构。如下所示

/camera/left/name: leftcamera
/camera/left/exposure: 1
/camera/right/name: rightcamera
/camera/right/exposure: 1.1

解析:
/camera/left/name 的值是leftcamera
/camera/left 的值是字典{name:leftcamera ; exposure:1}
/camera 的值是字典

left:{name:leftcamera,exposure:1}
right:{name:rightcamera,exposure:2}

(2) parameter type
32-bit integers
booleans
strings
doubles
iso8601 dates
lists
base64-encoded binary data
加入你想保存如下参数

/gains/P = 10.0
/gains/I = 1.0
/gains/D = 0.1

可以通过一个字典获取/gains的值
{‘P’:10.0,‘I’:1.0‘D’:0.1}
(3) Privte Paramters
~name 作为私有名称,只有本基点可以使用。
当时用命令行重映射机制时,具体指定节点参数时,隐藏2掉“~”,直接使用一个下划线命令行_作为前缀分配专用参数

rosrun rospy_tutorials talker _param:=1.0

(3)roslaunch/xml/param
param 标签定义一个在parameter server 的参数,其值可以是文本文件,二进制文件,命令。
param 在node 中时,是私有名称。
属性:
name=”namespace/name”
——参数名,其中可加上命名空间。但不应该使用全局名称
value=”value”
——参数值!!如果该属性没有,那么其他binfile textfile command 必须被指定说明。
type=”str|int|double|bool|yaml” (optional)
——参数类型,如果不指定类型,roslaunch 将尝试自动决定类型。
基本规则是
———带小数点是浮点数 或者整形
———true 和false是boolean
———所有其他都是strings
textfile=” (findpkgname)/path/file.txt(optional)binfile= ( f i n d p k g − n a m e ) / p a t h / f i l e . t x t ” ( o p t i o n a l ) — — 改 文 件 的 内 容 被 保 存 作 为 字 符 串 。 b i n f i l e = ” (find pkg-name)/path/file”(optional)
——该文件的内容将被保存作为a base64-encoded XML-RPC binary object
command=” (findpkgname)/exe ( f i n d p k g − n a m e ) / e x e ′ (find pkg-name)/arg.txt’”(optional)
——命令的输出被读取和保存作为字符串。
例子——设置一个参数

<param name="publish_frequency" type="double" value="10.0" />

launch param 和 程序 结合使用的实例

double parking_x;
   double parking_y;
   ros::param::get("~parking_x",parking_x);
   ros::param::get("~parking_y",parking_y);
   ROS_ERROR("parking_x:%.3f",parking_x);
   ROS_ERROR("parking_y:%.3f",parking_y);

launch 文件

<launch>
<node pkg="beginner_tutorials" name="talker" type="talker">
<param name="parking_x" type="double" value="100.0" />
<param name="parking_y" type="double" value="600.0" />
</node>
</launch>

(4)roslaunch/xml/rosparam
操作yaml 文件参数
The rosparam tag enables the use of rosparam YAML files for loading and dumping parameters from the ROS Parameter Server. 也可以用来删除参数。rosparam 在node 标签内时,为私有名称。

delete 和 dump 命令可以运行在load 之前,或者任何参数被上传之前。

load 默认添加 或者覆盖

rosparam 可以指向一个yaml 文件。

属性:
command=”load|dump|delete” (optional ,default=load)
load load parameter from file
dump dump parameter to file
delete delete parameter
load/dump表示装载和卸载yaml文件
file=”$(find pkg-name)/path/foo.yaml”
param=”param-name”
ns=”namespace”
subst_value=”true|false” #允许在yaml 文本中使用代替参数标志
http://wiki.ros.org/rosparam
http://www.cnblogs.com/gary-guo/p/6290420.html
rosparam 传入yaml 参数文件。
color.yaml #这部分可以创建并放在param/ 一些包是放在config /中

background_r:255
background_g:255
background_b:255

dump.yaml

<launch>
    <node pkg="turtlesim" type="turtlesim_node" name="turtle1" output="screen">
        <rosparam command="load" file="$(find turtlesim_launch)/param/color.yaml"/>
    </node>
    <node pkg="turtlesim" type="turtle_teleop_key" name="turlte1_tele" output="screen">
    </node>
</launch>

include 标签

<launch>
<include file="$(find turtlesim_launch)/telop.launch" />
<node pkg="turtlesim" type="turtlesim_node" name="turtleism_node" respawn="true" output="screen" >
<param name="turtle" value="1" />
<rosparam command="dump" file="$(find turtlesim_launch)/color.yaml" />
</node>
<arg name="foo" value="2" />
</launch>

telop.launch

<launch>
<node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key" respawn="false" output="screen" />
</launch>

其他demo reference

<rosparam command="load" file="$(find rosparam)/example.yaml" />//加载文件中的参数
<rosparam command="delete" param="my/param" />//删除参数

<arg name="whitelist" default="[3, 2]"/>
<rosparam param="whitelist" subst_value="True">$(arg whitelist)</rosparam> //替换

<rosparam param="a_list">[1, 2, 3, 4]</rosparam>
<rosparam>
  a: 1
  b: 2
</rosparam>
<launch>
   <!-- send table urdf to param server -->
   <param name="table_description" command="$(find      xacro)/xacro.py $(find gazebo_worlds)/objects/table.urdf.xacro" />

   <!-- push table_description to factory and spawn robot in      gazebo -->
   <node name="spawn_table" pkg="gazebo" type="spawn_model"      args="-urdf -param table_description -z 0.01 -model table_model"      respawn="false" output="screen" />
 </launch>
 <launch>
   <node name="fake_localizaton" type="fake_localization"      pkg="fake_localization">
     <rosparam>
       odom_frame_id: odom_combined
       base_frame_id: base_footprint
     </rosparam>
   </node>
 </launch>

xacro launch 文件rbx1_test_turtlebot_with_head.launch

<launch>
  <!-- Load the URDF/Xacro model of our robot -->
  <param name="robot_description" command="$(find xacro)/xacro.py '$(find rbx1_description)/urdf/turtlebot_with_head.xacro'" />

  <!-- Provide simulated control of the robot joint angles -->
  <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher">
     <param name="/use_gui" value="True"/>
     <param name="rate" value="20"/>
  </node>

  <!-- Publish the robot state -->
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher">
    <param name="publish_frequency" value="20.0"/>
  </node>

  <!-- Publish a static transform between the robot base and the world frame -->
  <node pkg="tf" type="static_transform_publisher" name="world_base_broadcaster" args="0 0 0.0325 0 0 0 /world /base_link 100" />

  <!-- We need a static transforms for the wheels -->
  <node pkg="tf" type="static_transform_publisher" name="odom_left_wheel_broadcaster" args="0 0.13 0.015 0 0 0 /base_link /left_wheel_link 100" />
  <node pkg="tf" type="static_transform_publisher" name="odom_right_wheel_broadcaster" args="0 -0.13 0.015 0 0 0 /base_link /right_wheel_link 100" />

</launch>

roslaunch 与环境变量 的交互 env optenv

#1 设置环境变量
export limao=1
#env  确认

使用env 标签在launch————取得环境变量的值来赋值

<launch>
    <param name="wo" value="$(env limao)"/>
</launch>

使用optenv标签在launch————分环境变量有没有在之前设置

<launch>
    <param name="wo" value="$(optenv limao)"/>
</launch>

此时,/wo 值为1,因为环境变量 设置过

<launch>
    <param name="wo" value="$(optenv limao2 100)"/>
</launch>

此时,/wo 值为100,因为环境变量没有设置,取第三个为默认值。

  • 条件判断 if unless
    if=value (optional)
    ———————-If value evaluates to true, include tag and its contents. 真则执行
    unless=value (optional)
    ———————Unless value evaluates to true (which means if value evaluates to false), include tag and its contents. 除了真之外(那就是假),则执行
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要创建一个ROSlaunch文件,你可以按照以下步骤进行操作: 1. 首先,在你的ROS工作空间中找到你想要创建launch文件的功能包。可以使用命令`cd <workspace>/src/<package_name>`进入该功能包的目录。 2. 在功能包的目录下创建一个名为`launch`的文件夹。你可以使用命令`mkdir launch`来创建。 3. 进入`launch`文件夹,使用文本编辑器创建一个新的launch文件。你可以使用命令`touch <launch_file_name>.launch`来创建一个空的launch文件。 4. 打开这个新创建的launch文件,并按照你的需求编写launch文件的内容。你可以参考ROSlaunch文件语法和示例来编写你的launch文件。在launch文件中,你可以指定要启动的节点、节点的参数配置以及节点之间的关系等。 5. 保存并关闭launch文件。 6. 现在,你可以使用`ros2 launch`命令来启动你的launch文件。使用命令`ros2 launch <package_name> <launch_file_name>`,将会启动整个系统,包括所有在launch文件中指定的节点和它们的配置。 总结起来,要创建一个ROSlaunch文件,你需要在功能包中创建一个名为`launch`的文件夹,并在其中创建一个launch文件。然后,按照你的需求编写launch文件的内容,并使用`ros2 launch`命令来启动该launch文件。 #### 引用[.reference_title] - *1* *3* [ROS2入门教程—创建一个launch文件](https://blog.csdn.net/qq_29923461/article/details/120404577)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [ROS学习(4)——launch文件编写](https://blog.csdn.net/bulletstart/article/details/130794565)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值