ROS launch文件
- 1.arg标签
- 2.group标签
- 3.param标签
- 4.ns标签
<!--指明了一个 xml 的版本><?xml version="1.0"?><launch><!-- support multi robot --><arg name="robot_name" default=""/> <!-- support multi robot --><!-- robot frame --><arg name="base_frame" default="base_footprint" /> <arg name="odom_frame" default="odom" /><arg name="imu_frame" default="imu" /> <!-- pub topic --><arg name="odom_topic" default="odom" /><!-- do NOT use '/' in topic name--><arg name="imu_topic" default="imu" /><arg name="battery_topic" default="battery" /><!-- sub topic --><arg name="cmd_vel_topic" default="cmd_vel" /> <!-- do NOT use '/' in topic name--><arg name="ackermann_cmd_topic" default="ackermann_cmd" /><!-- config param --><arg name="pub_imu" default="False" /><arg name="sub_ackermann" default="False" /><arg name="pub_sonar" default="False" /><!-- base control node --><!--ros namespace name can NOT be empty,so need evaluate use multi robot or not--><group if="$(eval robot_name == '')"><node name="base_control" pkg="base_control" type="base_control.py" output="screen"><param name="baudrate" value="115200"/> <param name="port" value='/dev/move_base'/><param name="base_id" value="$(arg base_frame)"/> <!-- base_link name --><param name="odom_id" value="$(arg odom_frame)"/> <!-- odom link name --><param name="imu_id" value="$(arg imu_frame)"/> <!-- imu link name --><param name="sub_ackermann" value="$(arg sub_ackermann)"/> <!-- sub ackermann topic or not --></node></group>--><group unless="$(eval robot_name == '')"><group ns="$(arg robot_name)"><node name="base_control" pkg="base_control" type="base_control.py" output="screen"><param name="baudrate" value="115200"/> <param name="port" value='/dev/move_base'/><param name="base_id" value="$(arg robot_name)/$(arg base_frame)"/> <!-- base_link name --><param name="odom_id" value="$(arg robot_name)/$(arg odom_frame)"/> <!-- odom link name --><param name="imu_id" value="$(arg robot_name)/$(arg imu_frame)"/> <!-- imu link name --><param name="sub_ackermann" value="$(arg sub_ackermann)"/> <!-- sub ackermann topic or not --></node></group></group></launch>
1.arg标签
这里面arg标签用来在 launch 文件中声明参数。
default的内容则是对参数赋值。如无参数传入则使用 launch 文件中定义的值。
也可在启动launch文件时传入参数的值。
传入 pub_imu 的值为 true
roslaunch base_control base_control.launch pub_imu:=ture
2.group标签
group标签会将group里的内容划分成一个组。
里面用到了一个if unless语句,如下。意思是如果robot_name为空,执行第一个group的内容;否则执行第二个。
<group if="$(eval robot_name == '')"><group unless="$(eval robot_name == '')">
下面这个代码:节点的名称name、该节点所在的包名pkg,节点的可执行文件type、输出方式output,“screen”表示输出在当前终端屏幕。
<node name="base_control" pkg="base_control" type="base_control.py" output="screen">
3.param标签
下面这个代码:param标签也是用来声明参数。
param声明的变量是节点所接收的,用来设置传入节点的参数,arg的参数是launch文件所接收的。
参数的值是通过value直接传入的。
可以传入固定值,如下。
<param name="baudrate" value="115200"/>
可以传入参数,如下。下面这个value值是arg标签声明的参数base_frame
<param name="base_id" value="$(arg base_frame)"/> <!-- base_link name -->
<param name="odom_id" value="$(arg odom_frame)"/> <!-- odom link name -->
4.ns标签
第二个group里面还有group标签,对应ns。
<group unless="$(eval robot_name == '')"><group ns="$(arg robot_name)">
以imu_id话题为例,传入robot_name为abc,查看话题列表显示的就是abc/imu_id,这样可防止话题名重名。
下面是之前写的一个例子https://blog.csdn.net/qq_40828914/article/details/120977892
<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
,两个分组中都有相同的名为sim
的turtlesim节点。这样可以让我们同时启动两个turtlesim模拟器,而不会产生命名冲突。