代码改变世界

ROS launch文件

2022-04-05 15:38  jym蒟蒻  阅读(127)  评论(0编辑  收藏  举报

 

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模拟器,而不会产生命名冲突。