ROS 2边学边练(27)-- 创建一个launch文件

前言

        ROS 2中的启动系统负责帮助用户描述其系统的配置,然后按描述执行。系统的配置包括运行什么程序,在哪里运行,传递什么参数,以及ROS特定的约定,这些约定通过为每个组件提供不同的配置,使其易于在整个系统中重用组件。它还负责监测启动过程的状态,并报告和/或对这些过程的状态变化作出反应。

        用Python、XML或YAML编写的启动文件可以启动和停止不同的节点,也可以触发和处理各种事件。请参阅将Python、XML和YAML用于ROS 2启动文件,以了解不同格式的描述。提供该框架的包是launch_ros,它使用非ros特定的启动框架作为基础。

        设计文档详细说明了ROS 2 launch系统的设计目标(目前并非所有功能都可用)。

动动手

        我们还是拿小海龟来说事。

编写launch文件

        创建一个launch文件夹,我们可以用python/xml/yaml这几种方式写就,如turtlesim_mimic_launch.py:

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='turtlesim',
            namespace='turtlesim1',
            executable='turtlesim_node',
            name='sim'
        ),
        Node(
            package='turtlesim',
            namespace='turtlesim2',
            executable='turtlesim_node',
            name='sim'
        ),
        Node(
            package='turtlesim',
            executable='mimic',
            name='mimic',
            remappings=[
                ('/input/pose', '/turtlesim1/turtle1/pose'),
                ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
            ]
        )
    ])

turtlesim_mimic_launch.xml:

<launch>
  <node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim1"/>
  <node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim2"/>
  <node pkg="turtlesim" exec="mimic" name="mimic">
    <remap from="/input/pose" to="/turtlesim1/turtle1/pose"/>
    <remap from="/output/cmd_vel" to="/turtlesim2/turtle1/cmd_vel"/>
  </node>
</launch>

turtlesim_mimic_launch.yaml:

launch:

- node:
    pkg: "turtlesim"
    exec: "turtlesim_node"
    name: "sim"
    namespace: "turtlesim1"

- node:
    pkg: "turtlesim"
    exec: "turtlesim_node"
    name: "sim"
    namespace: "turtlesim2"

- node:
    pkg: "turtlesim"
    exec: "mimic"
    name: "mimic"
    remap:
    -
        from: "/input/pose"
        to: "/turtlesim1/turtle1/pose"
    -
        from: "/output/cmd_vel"
        to: "/turtlesim2/turtle1/cmd_vel"

代码分析

        上面的所有启动文件都是从turtlesim包启动一个由三个节点组成的系统。该系统的目标是启动两个海龟仿真窗口,让一只海龟模仿另一只海龟的动作。

        当启动两个turtlesim节点时,它们之间唯一的区别是名称空间值。唯一的命名空间允许系统启动两个节点,而不会出现节点名称或主题名称冲突。该系统中的两只乌龟都会接收同一主题的命令,并在同一主题上发布姿势。通过独特的名称空间,可以区分针对不同海龟的消息。

        最后一个节点也来自turtlesim包,但有一个不同的可执行文件:mimic。此节点以重新映射的形式添加了配置详细信息。mimic的/input/spose主题被重新映射到/turtlesim1/turtle1/pose,而它的/output/cmd_vel主题被映射到/turnlesim2/turtle1/cmd_vel。这意味着mimic将订阅/turtlesim1/sim的姿势主题,并将其重新发布给/turtlesim2/sim的速度命令主题进行订阅。换句话说,turtlesim2将模仿turtlesim1的动作。

python

导入相关python模块:

from launch import LaunchDescription
from launch_ros.actions import Node

launch描述函数:

def generate_launch_description():
   return LaunchDescription([

   ])

两个海龟节点的启动相关描述:

Node(
    package='turtlesim',
    namespace='turtlesim1',
    executable='turtlesim_node',
    name='sim'
),
Node(
    package='turtlesim',
    namespace='turtlesim2',
    executable='turtlesim_node',
    name='sim'
),

mimic节点的启动相关描述,其中重映射了主题:

Node(
    package='turtlesim',
    executable='mimic',
    name='mimic',
    remappings=[
      ('/input/pose', '/turtlesim1/turtle1/pose'),
      ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
    ]
)

XML

两个海龟节点的启动说明:

<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim1"/>
<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim2"/>

mimic节点的启动说明(重映射):

<node pkg="turtlesim" exec="mimic" name="mimic">
  <remap from="/input/pose" to="/turtlesim1/turtle1/pose"/>
  <remap from="/output/cmd_vel" to="/turtlesim2/turtle1/cmd_vel"/>
</node>

YAML

两个海龟节点的启动说明:

- node:
    pkg: "turtlesim"
    exec: "turtlesim_node"
    name: "sim"
    namespace: "turtlesim1"

- node:
    pkg: "turtlesim"
    exec: "turtlesim_node"
    name: "sim"
    namespace: "turtlesim2"

mimic节点启动说明(重映射):

- node:
    pkg: "turtlesim"
    exec: "mimic"
    name: "mimic"
    remap:
    -
        from: "/input/pose"
        to: "/turtlesim1/turtle1/pose"
    -
        from: "/output/cmd_vel"
        to: "/turtlesim2/turtle1/cmd_vel"

执行launch文件

        三种格式的launch文件都可以用ros2 launch <launch_file>命令执行,我们进入launch文件夹,执行:

$ros2 launch turtlesim_mimic_launch.py

        需要注意的是,如果是功能包路径里面的launch文件,我们则需要按ros2 launch <package_name> <launch_file>命令执行。另外还有一点,我们最好在功能包的package.xml里面增加<exec_depend>对launch支持的依赖项,这样就能确保功能包在构建完成之后可以支持launch运行:

<exec_depend>ros2launch</exec_depend>

        我们来看看终端返回什么信息:

        我们再来手动发布主题让小海龟动起来,看看另外一只是否也跟着跑:

$ros2 topic pub -r 1 /turtlesim1/turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: -1.8}}"

然也。

rqt_graph查看系统节点拓扑

        另起一个终端,执行下面命令看看通过launch文件启动的系统各节点之间的关系:

$rqt_graph

        从上图可以看到,一个隐藏的节点(运行的ros2 topic pub命令)正在将数据发布到左侧的/turtlesim1/turtle1/cmd_vel主题,/turtlesim1/sim节点订阅了该主题。而mimic订阅了/turtlesim1/sim的姿势主题,并发布到/turtlesim2/sim的cmd_vel主题。注意:如果没有上面的内容,首先确认节点是否都在运行,其次点击左上角的刷新按钮刷新一下。 

本篇完。

创建一个ROSlaunch文件,你可以按照以下步骤进行操作: 1. 首先,在你的ROS工作空间中找到你想要创建launch文件的功能包。可以使用命令`cd <workspace>/src/<package_name>`进入该功能包的目录。 2. 在功能包的目录下创建一个名为`launch`的文件夹。你可以使用命令`mkdir launch`来创建。 3. 进入`launch`文件夹,使用文本编辑器创建一个新的launch文件。你可以使用命令`touch <launch_file_name>.launch`来创建一个空的launch文件。 4. 打开这个新创建launch文件,并按照你的需求编写launch文件的内容。你可以参考ROSlaunch文件语法和示例来编写你的launch文件。在launch文件中,你可以指定要启动的节点、节点的参数配置以及节点之间的关系等。 5. 保存并关闭launch文件。 6. 现在,你可以使用`ros2 launch`命令来启动你的launch文件。使用命令`ros2 launch <package_name> <launch_file_name>`,将会启动整个系统,包括所有在launch文件中指定的节点和它们的配置。 总结起来,要创建一个ROSlaunch文件,你需要在功能包中创建一个名为`launch`的文件夹,并在其中创建一个launch文件。然后,按照你的需求编写launch文件的内容,并使用`ros2 launch`命令来启动该launch文件。 #### 引用[.reference_title] - *1* *3* [ROS2入门教程—创建一个launch文件](https://blog.csdn.net/qq_29923461/article/details/120404577)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [ROS学习(4)——launch文件的编写](https://blog.csdn.net/bulletstart/article/details/130794565)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值