【ROS学习】launch文件的使用

我们都知道在使用ROS时,启动一个节点我们可以使用rosrun启动一个节点!但是如果要启动多个节点呢?是不是得一个个都得启动!是不是感觉特别麻烦和累赘!don't worry!ROS已经帮我们考虑好了!那就是launch 文件,我们可以在launch文件编写多个node节点,然后只需启动launch文件,就可以实现一键启动!

目录

一、launch文件快速使用

二、launch文件一些配置

1、launch根标签设置

2、launch的node标签

3、launch文件的include标签(常用)

4、launch文件的remap标签(实用)

5、launch文件的param标签

6、launch文件的rosparam

①导入参数

②导出参数

③删除参数(用的少)

7、launch文件的group标签

8、launch文件的arg标签 


一、launch文件快速使用

我们以turtlesim为例进行编写launch文件!

我们如果要启动一个turtle节点,如下:

rosrun turtlesim turtlesim_node 

启动键盘节点,如下:

rosrun turtlesim turtle_teleop_key

需要两步!而launch文件如下:

<launch>
    <!-- 启动显示界面节点 -->
    <node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen"/>
    <!-- 启动键盘控制节点 -->
    <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen"/>
</launch>

node pkg:功能包名

type:节点名

name:自定义名称

output:输出到屏幕

运行只需:

roslaunch launch_learning start_turtle.launch 

launch_learning:功能包名     

start_turtle.launch:launch文件名           

 注:启动launch文件就不需要启动roscore了!

二、launch文件一些配置

1、launch根标签设置

当我们的launch文件已经弃用或者过时,可以添加备注,让其他使用者知道弃用情况!

<launch deprecated = "该launch文件已经过时,建议不使用">
    <!-- 启动显示界面节点 -->
    <node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen"/>
    <!-- 启动键盘控制节点 -->
    <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen"/>
</launch>

在launch根标签加入 deprecated="该launch文件已经过时,建议不使用"

 2、launch的node标签

①属性

  • pkg:功能包名(常用)
  • type:node节点名(常用)
  • name:自定义节点名(常用)
  • args:参数(将参数传递给节点)
  • respawn:如果节点退出,是否自动重启(true/false)<这个在后续的激光雷达启动时十分有用,若异常断开,可以自动重连>(实用)
  • respawn_delay="N"(若respawn为true,那么延迟N秒后启动节点)

  •  required:(true/false)若为true,如果该节点退出,将结束整个roslaunch

  •  ns="xxx" 添加命名空间namespace(目的是防止重名)

 

3、launch文件的include标签(常用)

我们都知道,不可能把所以launch代码都放在一块,显得十分臃肿,因此可以采用include标签进行代码复用!

  • file="$(find 功能包名)/xxx/xxx.launch"
<launch>
    <include file="$(find launch_learning)/launch/start_turtle.launch" />   
</launch>

4、launch文件的remap标签(实用)

我们可以看到下图,启动turtle节点和turtle的键盘控制节点,然后启动键盘控制节点,我们发现新启动的键盘控制节点并不能控制小乌龟,原因在于话题名称不对应,一个是/cmd_vel 另一个是/turtle1/cmd_vel ,如果想要新启动的键盘控制节点控制小乌龟移动,那就可以采用remap进行话题重命名!

<launch>
    <!-- 启动显示界面节点 -->
    <node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" >
        <remap from="/turtle1/cmd_vel" to="/cmd_vel" />
    </node>
    <!-- 启动键盘控制节点 -->
    <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen"/>
</launch>

 5、launch文件的param标签

  • <param name ="xxx" type="xx" value="xx" />
<launch>
    <param name="param_A" type="int" value="10"/>
    <!-- 启动显示界面节点 -->
    <node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" >
        <param name="param_B" type="double" value="3.1415"/>
    </node>
    <!-- 启动键盘控制节点 -->
    <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen"/>
</launch>

param放置的外置的区别是后者添加了命名空间

 

 6、launch文件的rosparam

<rosparam>标签可以从yaml文件中导入参数,或者将参数导出到yaml文件

①导入参数

有点像param标签,但是区别在于rosparam可以导入yaml文件一次性导入参数!

<launch>
    <rosparam command="load" file="$(find launch_learning)/launch/params.yaml" />
    <!-- 启动显示界面节点 -->
    <node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" >
        <rosparam command="load" file="$(find launch_learning)/launch/params.yaml" />
    </node>
    <!-- 启动键盘控制节点 -->
    <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen"/>
</launch>

 

②导出参数

<rosparam command="dump" file="$(find launch_learning)/launch/params_out.yaml" />

 ③删除参数(用的少)

<rosparam command="delete" param="bg_B" />

7、launch文件的group标签

我们都知道如果启动两个相同的节点,后一个节点会把前一个节点干掉!但如何两个都启动呢!那就需要使用group这个标签了!

<launch>
    <group ns="first">
         <!-- 启动显示界面节点 -->
        <node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" />
        <!-- 启动键盘控制节点 -->
         <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen"/>
    </group>

    <group ns="second">
         <!-- 启动显示界面节点 -->
        <node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" />
        <!-- 启动键盘控制节点 -->
         <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen"/>
    </group>
</launch>

我们可以发现启动了两个小乌龟界面,话题也更新了两个不一样的命名空间的话题!这样就可以两个相同的节点同时启动了!

 8、launch文件的arg标签 

<launch>
    <arg name="car_length" default="0.55" />
    <arg name="car_width" default="0.6" />
    <arg name="car_height" default="0.3" />

    <param name="A" value="$(arg car_length)"/>
    <param name="B" value="$(arg car_width)"/>
    <param name="C" value="$(arg car_height)"/>
</launch>

如果在启动launch文件没有设置参数的话,就默认使用default的参数值

 也可以在启动launch文件时设置参数,如下:

roslaunch launch_learning arg.launch car_length:=0.9 car_width:=0.1 car_height:=0.99

 

  • 10
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是一个ROS中的launch文件示例,用于启动一个简单的机器人模拟器(使用Gazebo仿真),并启动相应的ROS节点: ``` <launch> <!-- 启动Gazebo仿真器 --> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="$(find my_robot)/worlds/my_world.world"/> <arg name="paused" value="false"/> <arg name="use_sim_time" value="true"/> <arg name="gui" value="true"/> <arg name="headless" value="false"/> <arg name="debug" value="false"/> </include> <!-- 启动机器人控制节点 --> <node name="robot_control" pkg="my_robot" type="robot_control_node.py" output="screen"> <param name="robot_name" value="my_robot"/> <param name="control_rate" value="10"/> </node> <!-- 启动传感器数据处理节点 --> <node name="sensor_processing" pkg="my_robot" type="sensor_processing_node.py" output="screen"> <param name="robot_name" value="my_robot"/> </node> </launch> ``` 上述launch文件中包含了三个节点: 1. Gazebo仿真器:使用Gazebo仿真器启动机器人模拟器,并设置仿真世界和一些参数。 2. 机器人控制节点:启动一个ROS节点,用于控制机器人的运动。 3. 传感器数据处理节点:启动一个ROS节点,用于处理机器人传感器的数据。 其中,节点的名称、包名、类型、参数等信息都需要根据实际情况进行修改。在终端中运行launch文件时,可以使用以下命令: ``` $ roslaunch my_robot my_robot.launch ``` 此时,launch文件中的节点会依次启动,完成机器人模拟器的启动和相关节点的启动。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值