当前位置:   article > 正文

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

ros2创建lauch

前言

        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:

  1. from launch import LaunchDescription
  2. from launch_ros.actions import Node
  3. def generate_launch_description():
  4. return LaunchDescription([
  5. Node(
  6. package='turtlesim',
  7. namespace='turtlesim1',
  8. executable='turtlesim_node',
  9. name='sim'
  10. ),
  11. Node(
  12. package='turtlesim',
  13. namespace='turtlesim2',
  14. executable='turtlesim_node',
  15. name='sim'
  16. ),
  17. Node(
  18. package='turtlesim',
  19. executable='mimic',
  20. name='mimic',
  21. remappings=[
  22. ('/input/pose', '/turtlesim1/turtle1/pose'),
  23. ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
  24. ]
  25. )
  26. ])

turtlesim_mimic_launch.xml:

  1. <launch>
  2. <node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim1"/>
  3. <node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim2"/>
  4. <node pkg="turtlesim" exec="mimic" name="mimic">
  5. <remap from="/input/pose" to="/turtlesim1/turtle1/pose"/>
  6. <remap from="/output/cmd_vel" to="/turtlesim2/turtle1/cmd_vel"/>
  7. </node>
  8. </launch>

turtlesim_mimic_launch.yaml:

  1. launch:
  2. - node:
  3. pkg: "turtlesim"
  4. exec: "turtlesim_node"
  5. name: "sim"
  6. namespace: "turtlesim1"
  7. - node:
  8. pkg: "turtlesim"
  9. exec: "turtlesim_node"
  10. name: "sim"
  11. namespace: "turtlesim2"
  12. - node:
  13. pkg: "turtlesim"
  14. exec: "mimic"
  15. name: "mimic"
  16. remap:
  17. -
  18. from: "/input/pose"
  19. to: "/turtlesim1/turtle1/pose"
  20. -
  21. from: "/output/cmd_vel"
  22. 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模块:

  1. from launch import LaunchDescription
  2. from launch_ros.actions import Node

launch描述函数:

  1. def generate_launch_description():
  2. return LaunchDescription([
  3. ])

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

  1. Node(
  2. package='turtlesim',
  3. namespace='turtlesim1',
  4. executable='turtlesim_node',
  5. name='sim'
  6. ),
  7. Node(
  8. package='turtlesim',
  9. namespace='turtlesim2',
  10. executable='turtlesim_node',
  11. name='sim'
  12. ),

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

  1. Node(
  2. package='turtlesim',
  3. executable='mimic',
  4. name='mimic',
  5. remappings=[
  6. ('/input/pose', '/turtlesim1/turtle1/pose'),
  7. ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
  8. ]
  9. )

XML

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

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

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

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

YAML

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

  1. - node:
  2. pkg: "turtlesim"
  3. exec: "turtlesim_node"
  4. name: "sim"
  5. namespace: "turtlesim1"
  6. - node:
  7. pkg: "turtlesim"
  8. exec: "turtlesim_node"
  9. name: "sim"
  10. namespace: "turtlesim2"

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

  1. - node:
  2. pkg: "turtlesim"
  3. exec: "mimic"
  4. name: "mimic"
  5. remap:
  6. -
  7. from: "/input/pose"
  8. to: "/turtlesim1/turtle1/pose"
  9. -
  10. from: "/output/cmd_vel"
  11. 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主题。注意:如果没有上面的内容,首先确认节点是否都在运行,其次点击左上角的刷新按钮刷新一下。 

本篇完。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/555416
推荐阅读
相关标签
  

闽ICP备14008679号