谈作用
- .launch文件里已经配置好了启动的规则,roslaunch就像是一个启动工具,能够一次性把多个节点按照我们预先的配置启动起来,减少我们在终端中一条条输入指令的麻烦。
谈调用
roslaunch pkg名 xxx.launch
谈.launch文件内容
<launch> <!--根标签-->
<node> <!--需要启动的node及其参数-->
<include> <!--包含其他launch-->
<machine> <!--指定运行的机器-->
<env-loader> <!--设置环境变量-->
<param> <!--定义参数到参数服务器-->
<rosparam> <!--启动yaml文件参数到参数服务器-->
<arg> <!--定义变量-->
<remap> <!--设定参数映射-->
<group> <!--设定命名空间-->
</launch> <!--根标签-->
注:
- 用好group,remap,arg,可以省很多事
- arg和param作为单独的标签出现,则作用在整个文件;如果出现在node标签下,则作为局部变量作用该节点下。
- 参数名后面跟的是缺省值,给过一次后参数值会从外向里一层层传递下去,就是说可以在已有的launch文件上再封装一层,改变参数值更安全。
实例
<launch>
<!-- these are the arguments you can pass this launch file, for example paused:=true -->
<arg name="paused" default="true"/>
<arg name="use_sim_time" default="true"/>
<arg name="gui" default="true"/>
<arg name="headless" default="false"/>
<arg name="debug" default="false"/>
<!-- We resume the logic in empty_world.launch, changing only the name of the world to be launched -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find pigot_gazebo)/worlds/pigot.world"/>
<arg name="debug" value="$(arg debug)" />
<arg name="gui" value="$(arg gui)" />
<arg name="paused" value="$(arg paused)"/>
<arg name="use_sim_time" value="$(arg use_sim_time)"/>
<arg name="headless" value="$(arg headless)"/>
</include>
<group ns="pigot">
<param name="robot_description"
command="$(find xacro)/xacro.py
$(find pigot_description)/urdf/pigot.xacro"/>
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
args="-urdf -model pigot -param robot_description"/>
<!-- Load joint controller configurations from YAML file to parameter server -->
<rosparam file="$(find pigot_control)/config/pigot_control.yaml" command="load"/>
<!-- load the controllers -->
<node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
output="screen" args="joint_state_controller
joint1_position_controller
joint2_position_controller
joint3_position_controller
joint4_position_controller
joint5_position_controller
joint6_position_controller
joint7_position_controller
joint8_position_controller
joint9_position_controller
joint10_position_controller
joint11_position_controller
joint12_position_controller"/>
<!-- convert joint states to TF transforms for rviz, etc -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
respawn="false" output="screen">
<remap from="/joint_states" to="/pigot/joint_states" />
</node>
<node name="rpy_pub_node" pkg="pigot_control" type="rpy_pub.py" respawn="true"/>
<!--node name="sbc_node" pkg="pigot_control" type="self_balance_control.py" respawn="true"/-->
</group>
<group ns="stewart">
<param name="robot_description"
command="$(find xacro)/xacro.py
$(find stewart_description)/urdf/stewart.xacro"/>
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
args="-urdf -model stewart -param robot_description"/>
<!-- Load joint controller configurations from YAML file to parameter server -->
<rosparam file="$(find stewart_control)/config/stewart_control.yaml" command="load"/>
<!-- load the controllers -->
<node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
output="screen" args="joint_state_controller
joint1_position_controller
joint2_position_controller
joint3_position_controller"/>
<!-- convert joint states to TF transforms for rviz, etc -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
respawn="false" output="screen">
<remap from="/joint_states" to="/stewart/joint_states" />
</node>
<node name="sin_control_node" pkg="stewart_control" type="sin_control.py" respawn="true"/>
</group>
</launch>
1.1谈node标签
- 属性:
-
name:节点运行的名称,也就是用命令rosnode list 所看到的节点列表里的名称。这儿定义的名字优先会覆盖可执行程序(如.cpp或.py里面init()赋予的节点名称)当两者不一样是以name为准。
-
pkg:为src文件夹下的功能包名称。
-
type:节点的可执行文件,对应于功能包下src中的文件名称(去掉后缀)。
注:pkg和type合起来等同于 rosrun doublearm_planning doublearm_trajectory.py
-
output:将节点的标准信息输出到屏幕上,例如如果想看串口发送节点的信息则输出大屏幕上可以直观看到数据的发送内容
-
args =“arg1 arg2 arg3” (可选)
将传递参数到节点。 -
machine =“machine-name” (可选)
在指定机器上启动节点。 -
respawn =“true” (可选)
如果节点退出,则自动重新启动节点。
respawn_delay =“30” (可选,默认为0)
如果respawn为true,请在尝试重新启动之前检测到节点故障后等待respawn_delay秒。 -
required =“true” (可选)如果节点死亡,杀死整个roslaunch。
-
ns =“foo” (可选)
在“foo”命名空间中启动节点。 -
clear_params =“true | false” (可选)
在启动前删除节点的私有命名空间中的所有参数。 -
cwd =“ROS_HOME | node” (可选)
如果为“node”,则节点的工作目录将设置为与节点的可执行文件相同的目录。 -
launch-prefix =“prefix arguments” (可选)
用于预先添加到节点的启动参数的命令/参数。这是一个强大的功能,使您能够启用gdb,valgrind,xterm,漂亮或其他方便的工具。
1.2 谈include标签
- file
file ="$(find pkg-name)/path/filename.xml"
指明我们想要包含进来的文件
- ns
ns="NAME_SPACE"
相对NAME_SPACE命名空间导入文件
谈remap标签
- remap标签是重映射,ROS支持topic的重映射,remap标签里包含一个original-name和一个new-name,及原名称和新名称。
比如现在你拿到一个节点,这个节点订阅了"/chatter"的topic,然而你自己写的节点只能发布到"/demo/chatter"topic,由于这两个topic的消息类型是一致的,你想让这两个节点进行通讯,那么可以在launch文件中这样写:
<remap from="chatter" to="demo/chatter"/>
- 这样就可以直接把/chatter的topic重映射到/demo/chatter,这样子不用修改任何代码,就可以让两个节点进行通讯。
- 如果这个 remap标签写在与 node 元素的同一级,而且在launch 元素内的最顶层。 那么这个重映射将会作用于launch文件中所有的节点。
谈param标签
- param标签的作用相当于命令行中的rosparam set
- 比如现在在参数服务器中添加一个名为joint_param,值为0.1的参数 ,那么可以
<param name="joint_param" type="int" value="0.1"/>
谈rosparam标签
- rosparam标签允许从YAML文件中一次性导入大量参数。
<rosparam command="load" file="$(find pkg-name)/path/name.yaml"/>
谈arg标签
- arg标签用来在launch文件中定义参数,arg和param在ROS里有根本性的区别,就像局部变量和全局变量的区别一样。arg不储存在参数服务器中,不能提供给节点使用,只能在launch文件中使用。param则是储存在参数服务器中,可以被节点使用。
<arg name="demo"/>
- 像上面这样,就简单地声明了一个参数,名叫demo,但是声明不等于定义,我们需要给他赋值,在赋值之后参数才能够发挥作用。
<arg name="demo" value="666"/>
<arg name="demo" default="666"/>
- 注意:区分value与default
- arg还有更加高级,也更加灵活的用法:
$(arg arg_name)
当==$(arg arg_name)==出现在launch文件任意位置时,将会自动替代为所给参数的值。
谈group标签
- group标签可以将若干个节点同时划分进某个工作空间。
<group ns="demo_0">
<node name="demo_0" pkg="demo_0" type="demo_pub_0" output="screen"/>
<node name="demo_0" pkg="demo_0" type="demo_sub_0" output="screen"/>
</group>
- group标签还可以做到对node的批量管理。比如我可以同时终止在同一个group中的节点。