launch启动文件的使用方法 (基于古月居)

创建功能包

$ cd ~/catkin_ws/src

$ catkin_create_pkg learning_launch (不需要依赖)

$ cd learning_launch

$ mkdir launch   (创建一个文件夹,方便资源管理)

然后再launch文件夹下创建文本,编写代码

$ touch 文本名 例如: $ touch simple.launch

launch语法1:

<launch>  launch文件中的根元素采用<launch>标签定义

<node> : 启动节点

<node pkg = "package-name" type = "executable=name" name = "node-name"  output =   "log|screen|both" />  

  • pkg:节点所在的功能包名称
  • type:节点的可执行文件名称
  • name:节点运行时的名称

output:

  • log:这是系统的默认设置。当选择此设置时,节点的输出信息会被重定向到 ROS 的日志文件中。这些日志文件通常存放在 ~/.ros/log 目录下。如果你希望避免终端被大量的输出信息占据,那么这个设置会很实用。
  • screen:若将 output 属性设为 screen,节点的输出信息就会直接显示在启动该节点的终端上。这一设置适合用于调试阶段,方便你实时查看节点的输出情况。
  • both:当设置为 both 时,节点的输出信息会同时被发送到终端和日志文件中。这样一来,你既能在终端看到实时的输出,又能在后续通过日志文件进行详细分析。

simple.launch代码:(写代码的时候可以修改文本显示语法----点击文本右下角的 “纯文本” ,搜索 “xml”  或者 点击文本右上角的三个横向 ---> "查看" ---> "高亮模式")

<launch>
     <node pkg = "learning_topic" type = "person_subscriber" name="taker" output = "screen" />
     <node pkg = "learning_topic" type ="person_publisher" name = "listener" output = "screen" />
</launch>

运行该代码:

$ roslaunch learning_launch simple.launch

分析:

type的内容为learning_topic功能包下CMakeListstxt下的可执行文件

name的内容是在节点运行时会覆盖默认节点名,节点的默认名称通常由代码中的ros::init()指定

launch语法2:参数设置

<param> :设置ROS系统运行中的参数,存储在参数服务器中

<param name = "output_frame" value = "odom" />

  • name: 参数名
  • value: 参数值

<rosparam> : 加载参数文件中的多个参数:

<rosparam file = "params.yaml" command = "load" ns = "params" />

  • file :指定要加载的 YAML 文件路径,格式可以是绝对路径,或使用 ROS 包相对路径(如 $(find package_name)/path/to/file.yaml
  • command :指定对参数执行的操作类型   

  • 可选值:

    • load(默认):从 YAML 文件加载参数到参数服务器。
    • dump:将参数服务器中的参数导出到指定文件(需配合 file)。
    • delete:删除指定命名空间下的所有参数(需配合 ns)。
  • ns:指定参数加载的目标命名空间,YAML 文件中的所有参数将被加载到该命名空间下。

注意:若省略 command,默认为 load

<arg> : launch文件内部的局部变量,仅限于launch文件使用

<arg name = "arg-name"  default = "arg-value" />

  • name : 参数名
  • value : 参数值

调用:

<param name = "foo" value = "$(arg arg-name)" />

<node name = "node" pkg = "package"  type = "type" args = "$(arg arg-name)" />

创建yaml文件

$ cd ~/catkin_src/learning_launch

$ mkdir config

$ cd config/

$ touch param.yaml

内容如下:

# A: 123之间的空格不能省略

A: 123
B: "Hello"


# 命令空间
group:  
 c: 450
 D: "Hello"

turtlesim_parameter_config.launch文件代码:

<launch>
     <param name = "/turtle_number" value = "2" />
     
     <node pkg = "turtlesim" type = "turtlesim_node" name = "turtlesim_node">
          <param name = "turtle_name1"  value = "Tom" />
          <param name = "turtle_name2"  value = "Jerry" />
          
          <rosparam file = "$(find learning_launch)/config/param.yaml" command = "load" />
     </node>
     
     <node pkg = "turtlesim" type = "turtle_teleop_key" name = "turtle_teleop_key" output = "screen" />
</launch>

运行代码:

$ roslaunch learning_launch turtlesim_parameter_config.launch

分析:

turle_name1和turtle_name2前面都有一个 turtlesim_node ,这是因为设置该参数的时候缩在 turtlesim_node 下面

这些参数都与我们turtlesim_parameter_config.launch文件内容一一对应

    start_tf_demo_c++.launch文件代码:(实现海龟跟随)

    <launch>
        
         <!-- Turtlesim Node-->
         <node pkg = "turtlesim" type = "turtlesim_node" name = "sim"/>
         <node pkg="turtlesim" type="turtle_teleop_key" name ="teleop" output = "screen"/>
         
         <node pkg = "learning_tf" type="turtle_tf_broadcaster" args="/turtle1" name="turtle1_tf_broadcaster" />
         <node pkg = "learning_tf" type="turtle_tf_broadcaster" args="/turtle2" name="turtle2_tf_broadcaster" />
         
         <node pkg = "learning_tf" type="turtle_tf_listener" name="listener" />
         
    </launch>     

    运行代码:

    $ roslaunch learning_launch start_tf_demo_c++.launch

    launch 语法3

    <remap> : 重映射ROS计算图资源的命名

    <remap from = "/turtlebot/cmd_vel" to = "/cmd_vel"

    • form : 原命名
    • to : 映射之后的命名

    <include> : 包含其他launch文件,类似C语言文件的头文件包含

    <include file = "$(dirname)/other.launch" />

    • file : 包含其他launch文件路径

    turtlesim_remap.launch文件代码

    <launch>
    
    	<include file = "$(find learning_launch)/launch/simple.launch" />
    
        
       #启动turtlesim包中的turtlesim_node节点,并且把该节点默认的/turtle1/cmd_vel话题重新映射为/cmd_vel
    	<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node">
    	    <remap from ="/turtle1/cmd_vel" to="/cmd_vel"/>
    	</node>
    
    </launch>

    运行代码:

    $ roslaunch learning_launch turtlesim_remap.launch

    simple.launch文件和海归仿真器同时运行

    查看话题列表

    $ rostopic list

    节点默认的/turtle1/cmd_vel话题重新映射变为/cmd_vel,其他节点就能通过/cmd_vel话题来控制turtlesim里的海龟运动,例如:

    $ rostopic pub /cmd_vel (双击Tab键补全)

    海龟会按照设置的指令运动 (只动一小会)

    更多标签可参考:http://wiki.ros.org/roslaunch/XML

    ### 创建 ROS2 Launch 启动文件的指南 创建一个 launch 文件的主要目的是为了简化多个节点的同时启动过程,减少手动操作的工作量。以下是关于如何创建一个典型的 ROS2 Python 和 XML 格式的 launch 文件的具体说明。 #### 1. **Python 编写的 Launch 文件** 在 ROS2 中,推荐使用 Python 来编写 launch 文件,因为其语法更加灵活且易于扩展。以下是一个简单的例子: ```python from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): talker_node = Node( package='demo_nodes_cpp', executable='talker', name='custom_talker', output='screen' ) listener_node = Node( package='demo_nodes_cpp', executable='listener', name='custom_listener', output='screen' ) return LaunchDescription([ talker_node, listener_node ]) ``` 此脚本定义了两个节点:一个是发布者 (`talker`) 另一个是订阅者 (`listener`)。这两个节点都来自 `demo_nodes_cpp` 软件包[^1]。当执行这个 launch 文件时,将会自动启动这两个节点,并将它们的日志输出显示到屏幕上[^2]。 #### 2. **XML 编写的 Launch 文件** 对于那些更习惯传统配置方式的人来说,也可以采用 XML 形式来写 launch 文件。这里提供了一个类似的示例: ```xml <launch> <node pkg="demo_nodes_cpp" exec="talker" name="custom_talker" output="screen"/> <node pkg="demo_nodes_cpp" exec="listener" name="custom_listener" output="screen"/> </launch> ``` 这种格式同样实现了上面提到的功能——即启动 `talker` 和 `listener` 两个节点[^5]。 #### 3. **包含其他 Launch 文件** 如果你有一个项目需要多次重复某些相同的设置,你可以通过 `<include>` 或相应的 Python 方法引入其他的 launch 文件。例如,在 Python 中这样实现: ```python import os from ament_index_python.packages import get_package_share_directory from launch import LaunchDescription from launch.actions import IncludeLaunchDescription from launch.launch_description_sources import PythonLaunchDescriptionSource def generate_launch_description(): demo_nodes_dir = os.path.join(get_package_share_directory('demo_nodes_cpp')) include_demo_launch = IncludeLaunchDescription( PythonLaunchDescriptionSource(os.path.join(demo_nodes_dir, 'launch', 'other_launch_file.py')) ) return LaunchDescription([ include_demo_launch, ]) ``` 在这个例子中,我们将另一个 launch 文件的内容嵌套到了当前的 launch 文件里[^4]。 --- #### 注意事项: - 确保所有使用的软件包已经正确定义并且被编译。 - 正确指定路径和命名空间以便于管理和调试。 - 当涉及到复杂的系统集成时,合理规划各个模块之间的依赖关系是非常重要的。 --- ###
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值