ros launch文件学习笔记

本文深入讲解ROS中的launch文件,从其历史背景、基本语法到高级用法,包括节点启动、参数设置、重映射等,帮助读者掌握ROS系统集成与自动化启动的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

0.何为launch?

launch,中文含义是启动,launch文件顾名思义就是启动文件,要说这launch文件啊,那还得从roslaunch说起。
相传,在程序猿们还没有使用roslaunch之前,需要手动rosrun逐个启动node,遇到大工程的时候,其繁杂程度不可想象,一度民不聊生。直到神实在看不下去了,于是送给程序猿们一份礼物,唤名roslaunch。roslaunch法力无边,只需程序猿们编写一个launch文件,启动大量节点弹指之间。从此一传十,十传百,程序猿们过上了幸福快乐的生活……
(故事纯属虚构,看着玩就行了)
这故事虽假,但roslaunch大法却不虚。roslaunch是一个用于自动启动ros节点的命令行工具,从命令的字面上看还跟rosrun有些相似:

roslaunch PACKAGE_NAME LAUNCH_FILE_NAME
  • 1

只不过roslaunch的操作对象并非节点,而是launch文件。launch文件是描述一组节点及其话题重映射和参数的XML文件。根据规范,这些文件的后缀都是.launch
一个最简单的launch文件可以像下面这样

<launch>
    <node name="demo" pkg="demo_package"
          type="demo_pub" output="screen"/>
    <node name="demo" pkg="demo_package"
          type="demo_sub" output="screen"/>
</launch>

1.launch标签小结

1.0 <launch>

launch标签就像一个有容乃大的括号,规定了一片区域,所有的launch文件都由<launch>开头,由</launch>结尾,所有的描述标签都要写在<launch></launch>之间

<launch>
……
……
……
</launch>

1.1 <node>

node标签可以说是launch文件里最常见的标签了,每个node标签里包括了ROS图中节点的名称属性name、该节点所在的包名pkg以及节点的类型type(其实就是可执行文件的名称,如果是用Python编写的就填写xxx.py,如果是cpp就写编译生成的可执行文件名),在上面的例子中还出现了output这个东西,这个属性在调试阶段很有用,output=“screen”表示了将终端输出转储在当前的控制台上,而不是在日志文件中。

属性属性作用
name="NODE_NAME"为节点指派名称,这将会覆盖掉ros::init()定义的node_name
pkg="PACKAGE_NAME"节点所在的包名
type="FILE_NAME"执行文件的名称如果是用Python编写的就填写xxx.py,如果是cpp就写编译生成的可执行文件名
output="screen"终端输出转储在当前的控制台上,而不是在日志文件中
respawn="true"当roslaunch启动完所有该启动的节点之后,会监测每一个节点,保证它们正常的运行状态。对于任意节点,当它终止时,roslaunch 会将该节点重启
required="true"当被此属性标记的节点终止时,roslaunch会将其他的节点一并终止。注意此属性不可以与respawn="true"一起描述同一个节点
launch-prefix = "command-prefix"我的理解是,相当于在执行启动命令时加上一段命令前缀
ns = "NAME_SPACE"这个属性可以让你在自定义的命名空间里运行节点

1.2<include>

该标签可以导入另一个roslaunch XML文件到当前文件。

属性属性作用
file ="$(find pkg-name)/path/filename.xml"指明我们想要包含进来的文件
ns="NAME_SPACE"相对NAME_SPACE命名空间导入文件

使用起来就像下面这样

<include file="$(find demo)/launch/demo.launch" ns="demo_namespace"/>
  • 1

1.3<remap>

remap标签顾名思义重映射,ROS支持topic的重映射,remap标签里包含一个original-name和一个new-name,及原名称和新名称。
比如现在你拿到一个节点,这个节点订阅了"/chatter"topic,然而你自己写的节点只能发布到"/demo/chatter"topic,由于这两个topic的消息类型是一致的,你想让这两个节点进行通讯,那么可以在launch文件中这样写:

<remap from="chatter" to="demo/chatter"/>
  • 1

这样就可以直接把/chattertopic重映射到/demo/chatter,这样子不用修改任何代码,就可以让两个节点进行通讯。
如果这个 remap标签写在与 node 元素的同一级,而且在launch 元素内的最顶层。 那么这个重映射将会作用于launch文件中所有的节点。

1.4<param>

param标签的作用相当于命令行中的rosparam set
比如现在在参数服务器中添加一个名为demo_param,值为666的参数

<param name="demo_param" type="int" value="666"/>
  • 1

1.5<rosparam>

rosparam标签允许从YAML文件中一次性导入大量参数。
使用起来就像这样:

<rosparam command="load" file="$(find pkg-name)/path/name.yaml"/>
  • 1

1.6<arg>

arg标签用来在launch文件中定义参数,arg和param在ROS里有根本性的区别,就像局部变量和全局变量的区别一样。arg不储存在参数服务器中,不能提供给节点使用,只能在launch文件中使用。param则是储存在参数服务器中,可以被节点使用。

<arg name="demo"/>
  • 1

像上面这样,就简单地声明了一个参数,名叫demo,但是声明不等于定义,我们需要给他赋值,在赋值之后参数才能够发挥作用。

<arg name="demo" value="666"/>
<arg name="demo" default="666"/>
  • 1
  • 2

以上是两种简单的赋值方法,两者的区别是使用后者赋值的参数可以在命令行中像下面这样被修改,前者则不行。

roslaunch demo demo.launch demo:=6666
  • 1

arg还有更加高级,也更加灵活的用法:
$(arg arg_name)
$(arg arg_name)出现在launch文件任意位置时,将会自动替代为所给参数的值。

1.7<group>

group标签可以将若干个节点同时划分进某个工作空间。

<group ns="demo_1">
    <node name="demo_1" pkg="demo_1" type="demo_pub_1" output="screen"/>
    <node name="demo_1" pkg="demo_1" type="demo_sub_1" output="screen"/>
</group>
<group ns="demo_2">
    <node name="demo_2" pkg="demo_2" type="demo_pub_2" output="screen"/>
    <node name="demo_2" pkg="demo_2" type="demo_sub_2" output="screen"/>
</group>

group标签还可以做到对node的批量管理。比如我可以同时终止在同一个group中的节点。

<group if="1-or-0">
……
……
……
</group>

<group unless="1-or-0">
……
……
……
</group>
  • 第一种情况,当if属性的值为0的时候将会忽略掉<group></group>之间的标签。
    第二种恰好相反,当if属性的值为1的时候将会忽略掉<group></group>之间的标签。
    但是我们通常不会直接用1或0来定义if标签。因为这样不够灵活。
    通常会搭配$(arg arg_name)来使用。
    demo.launch文件
<launch>
    <include file="include.launch">
        <arg name="demo_arg" value="1"/>
    </include>
</launch>

include.launch文件

<launch>
    <arg name="demo_arg"/>
    <group if="$(demo_arg)">
        <node name="demo" pkg="demo" type="demo_pub" output="screen"/>
        <node name="demo" pkg="demo" type="demo_sub" output="screen"/>
    </group>
</launch>

--------------------- 本文来自 沐棋 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/weixin_41995979/article/details/81784987?utm_source=copy

### 关于 ROS 和 USB 的相关内容 在 ROS2 中,`usb_cam` 节点提供了一种便捷的方式与 USB 摄像头进行交互并获取图像数据[^1]。为了成功使用该功能模块,需先完成 `usb_cam` 包的安装过程。具体操作可以通过官方文档或者社区资源找到详细的指导说明。 当涉及到硬件设备如摄像头时,除了软件包本身外,还需要考虑实际环境中的兼容性和驱动支持情况。如果目标平台为嵌入式系统(例如树莓派),则应特别注意其对特定型号USB摄像头的支持程度[^2]。 另外,在构建复杂的机器人应用项目时,通常会结合其他工具库来增强系统的功能性。比如 OpenCV 可被集成到 ROS 系统里用于高级视觉处理任务。通过编写自定义 launch 文件加载必要的参数设置,并配合 rqt_image_view 工具查看结果,可有效验证整个工作流是否正常运作[^4]。 对于初学者而言,理解基本概念同样重要。例如了解命名空间的作用有助于更好地管理大型程序结构;而掌握如何创建及调试简单的服务/客户端模式,则为进一步探索复杂主题打下了坚实的基础[^3]。 以下是基于以上描述整理出来的几个关键知识点: ```python import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge, CvBridgeError def image_callback(msg): try: bridge = CvBridge() cv_image = bridge.imgmsg_to_cv2(msg, "bgr8") # 进一步处理cv_image... except CvBridgeError as e: print(e) if __name__ == '__main__': rospy.init_node('image_listener', anonymous=True) rospy.Subscriber("/usb_cam/image_raw", Image, image_callback) rospy.spin() ``` 此代码片段展示了如何订阅来自 `/usb_cam/image_raw` 主题的消息并将它们转换成适合 OpenCV 处理的形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值