ros如何编写launch文件

在ROS中一个节点程序一般只能完成功能单一的任务,但是一个完整的ROS机器人一般由很多个节点程序同
时运行、相互协作才能完成复杂的任务,因此这就要求在启动机器人时就必须要启动很多个节点程序,一般的
ROS机器人由十几个节点程序组成,复杂的几十个都有可能。
这就要求我们必须高效率的启动很多节点,而不是通过rosrun命令来依次启动十几个节点程序,launch文件
就是为解决这个需求而生,launch文件就是一个xml格式的脚本文件,我们把需要启动的节点都写进launch文件

中,这样我们就可以通过roslaunch工具来调用launch文件,执行这个脚本文件就一次性启动所有的节点程序.

1.一般每个机器人都有一个XXXX_bringup(随意取名)的包作为软件启动,里面包含launch文件。

  #catkin_create_pkg robot_bringup

#cd robot_bingup

#mkdir launch

#nano test.launch

<launch>

<node pkg="test" type="test_node" name="test_node" output="screen" />

<node pkg="my_pkg" type="my_pkg_node" name="my_pkg_node" output="screen" />

</launch>


用法:roslaunch package_name xxx.launch

roslaunch robot_bingup test.launch2

• 介绍常用的节点属性
1 节点重生属性(respawn)
当roslaunch开启所有nodes后,roslaunch会监视每个node,记录那些仍然活动的nodes。对于每个node,当

其终止后,我们可以要求roslaunch重启该node,通过使用respawn属性。


必要节点属性(required)

当一个节点被声明为必要节点即 required="true"终止的时候,roslaunch 会终止所有其他活跃节点并退出。比如

在依赖激光雷达的机器人导航中,若激光雷达节点意外退出时,roslaunch将会终止其他节点然后退出。

3 设定节点所需的参数(param)
节点中的一些参数可以直接在launch文件中设定,这样就没有必要修改源码和编译了,每次只要修改一下
launch文件就可以直接修改节点运行的参数。<param>标签定义了在参数服务器上设置的参数,放在<node>标

签中,在这种情况下,参数被当成了私有参数。

<launch>

<node pkg="test" type="test_node" name="test_node" output="screen" />

<node pkg="my_pkg" type="my_pkg_node" name="my_pkg_node" output="screen" >

<param name="name" type="str" value="corvin"/>

<param name="age" type="int" value="20"/>

<param name="handsome" type="bool" value="true"/>

<param name="salary" type="double" value="1234.34"/>

<node>

</launch>

修改my_pkg.cpp

using namespace std;

string my_name="";

int my_age=0;

bool my_handsome=false;

double my_salary=0.0;

ros::param::get("~name",my_name);

ros::param::get("~age",my_age);

ros::param::get("~handsome",my_handsome);

ros::param::get("~salary",my_salary);

ROS_INFO("get param,name:%s,age:%d,ishandsome:%d,salary:%f",my_name.c_str(),my_age,my_handsome,my_salary);

包含另一个launch文件

<include file="$(find third_pkg)/launch/third_pkg.launch"/>


编写launch时的注意事项

1 roslaunch 不提供节点开始的顺序保证。这是特意的:没有办法知道哪个节点完全初始化
了,所以启动代码必须在启动顺序上鲁棒性比较强。这个行为体现了ROS哲学:每一个
节点与其他的节点都应该尽可能的独立、不相关,节点间耦合性尽可能低。
2 在开始任何一个节点前,roslaunch 将会确定 roscore是否已经在运行,如果没有则自动
启动它,因此在使用roslaunch启动节点时不用再提前启动roscore了。
3 大多数 ROS 节点在启动时连接到master节点管理器上,如果没有在launch中配置该节点
respawn属性为true运行中若连接中断,则不会尝试重新连接。因此如果 roscore被终止,
当前运行的其他节点将无法建立新的连接,即使稍后重启 roscore 也无济于事。

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个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文件中的节点会依次启动,完成机器人模拟器的启动和相关节点的启动。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值