爱折腾-创客智造实验室 - ROS2与launch入门教程
type: channel
link: https://www.ncnynl.com/category/ros2-launch
description: 通过学习ROS2与launch入门教程，了解launch文件作用，创建，整合不同节点等
items: ROS2与launch入门教程-目录
items: ROS2与launch入门教程-创建ROS2的launch(启动)文件
items: ROS2与launch入门教程-使用Launch启动和监控多个节点
items: ROS2与launch入门教程-使用substitutions
items: ROS2与launch入门教程-launch文件中使用事件处理程序
items: ROS2与launch入门教程-使用ROS2 launch文件启动大型项目
items: ROS2与launch入门教程-使用Python、XML 和 YAML格式编写ROS2 launch文件
items: ROS2与launch入门教程-如何迁移ROS1的launch文件到ROS2

ROS2与launch入门教程-目录
type: item
date: 2022-02-24T04:15:00+00:00
description: ROS2与launch入门教程-目录 说明: 介绍如何制作和使用launch文件来启动ros2节点 相关例程文件可以访问gitee仓库 目录: ROS2与launch入门教程-创建ROS2的launch(启动)文件 ROS2与launch入门教程-使用Launch启动和监控多个节点 ROS2与launch入门教程-使用substitutions ROS2与launch入门教程-launch文件中使用事件处理程序 ROS2与launch入门教程-使用ROS2 launch文件启动大型项目 ROS2与launch入门教程-使用Python、XML 和 YAML格式编写ROS2 launch文件 ROS2与launch入门教程-如何迁移ROS1的launch文件到ROS2

ROS2与launch入门教程-创建ROS2的launch(启动)文件
type: item
date: 2022-02-24T04:22:00+00:00
description: ROS2与launch入门教程-创建ROS2的launch(启动)文件 说明： 介绍创建launch文件以运行复杂的ROS2系统 测试环境: ubuntu 20.04 galactic 创建一个launch文件来启动两个小海龟 准备: 更新软件源 sudo apt update 安装turtlesim sudo apt install ros-galactic-turtlesim 安装rqt sudo apt install ~nros-galactic-rqt* 独立launch文件测试: 创建luanch目录 mkdir -p ~/launch_ws 新建launch文件turtlesim_mimic.launch.py cd ~/launch_ws vim turtlesim_mimic.launch.py 内容如下 #引用launch相关包 from launch import LaunchDescription from launch_ros.actions import Node #定义launch描述 def generate_launch_description(): return LaunchDescription([ #调用节点turtlesim_node,生成第一个小海龟 Node( package='turtlesim', namespace='turtlesim1', executable='turtlesim_node', name='sim' ), #调用节点turtlesim_node,生成第二个小海龟 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'), ] ) ]) mimic的/input/pose话题重映射到/turtlesim1/turtle1/pose /output/cmd_vel的话题/turtlesim2/turtle1/cmd_vel 根据海龟1的位置,评估海龟2的速度,并发布给海龟2执行,从而实现海龟2跟随海龟1走同样的路径 启动launch文件 cd ~/launch_ws ros2 launch turtlesim_mimic.launch.py 控制海龟1运行 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 - 效果图：

ROS2与launch入门教程-使用Launch启动和监控多个节点
type: item
date: 2022-02-24T04:22:00+00:00
description: ROS2与launch入门教程-使用Launch启动和监控多个节点 说明： 介绍使用Launch启动和监控多个节点 launch系统： ROS 2中的launch(启动)系统负责帮助用户描述他们系统的配置，然后按照描述执行它。 系统的配置包括运行什么程序、在哪里运行它们、传递它们的参数以及 ROS 特定的约定，这些约定通过给它们不同的配置，使得在整个系统中重用组件变得容易。 它还负责监视启动的进程的状态，并报告和/或对这些进程的状态变化做出反应。 用 Python 编写的启动文件可以启动和停止不同的节点以及触发和作用于各种事件。 提供这个框架的包是launch_ros，它使用了底层非ROS特定的启动框架。 设计文档详细说明了 ROS 2 launch系统的设计目标（目前并非所有功能都可用）。 步骤： 1.首先要让ROS包知道那里找到launch文件 python包主要修改setup.py 具体内容如 import os from glob import glob from setuptools import setup package_name = 'my_package' setup( # Other parameters ... data_files=[ # ... Other data files # Include all launch files. This is the most important line here! (os.path.join('share', package_name), glob('launch/*launch.py')) ] ) 增加setup的参数data_files内容，指定使用的launch文件格式 C++包修改CMakeLists.txt 具体内容如 # Install launch files. install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}/ ) ament_package()前增加上面代码 2.编写launch文件 launch的文件应该以*launch.py的格式结束，如my_script_launch.py或my_script.launch.py 定义generate_launch_description()，返回launch.LaunchDescription()，以便ros2 launch能调用 代码如： import platform import launch import launch.actions import launch.substitutions import launch_ros.actions env_var_name = 'USER' if platform.system() != 'Windows' else 'USERNAME' def generate_launch_description(): return launch.LaunchDescription([ launch.actions.DeclareLaunchArgument( 'node_prefix', default_value=[launch.substitutions.EnvironmentVariable(env_var_name), '_'], description='Prefix for node names'), launch_ros.actions.Node( package='demo_nodes_cpp', executable='talker', output='screen', name=[launch.substitutions.LaunchConfiguration('node_prefix'), 'talker']), ]) launch文件可以作为独立文件来启动 更常用是使用ros2工具来启动，如 ros2 launch my_package my_script_launch.py 或者作为独立文件启动 ros2 launch my_script_launch.py 更详细的介绍可以查看launch文档和launch的代码 ROS2的python包launch文件测试: 创建工作空间和包 mkdir -p ~/launch_ws/src cd ~/launch_ws/src ros2 pkg create --build-type ament_python test_launch_py 创建luanch目录 mkdir -p ~/launch_ws/src/test_launch_py/launch 拷贝turtlesim_mimic_launch.py cp ~/laun…

ROS2与launch入门教程-使用substitutions
type: item
date: 2022-02-24T04:22:00+00:00
description: ROS2与launch入门教程-使用substitutions 说明： 介绍如何在launch中使用substitutions 背景： launch文件用于启动节点、服务和执行进程。 这组动作可能有参数，这些参数会影响它们的行为。 在描述可重用的启动文件时，可以在参数中使用替换以提供更大的灵活性。 替换是仅在启动描述执行期间评估的变量，可用于获取特定信息，如启动配置、环境变量或评估任意 Python 表达式。 准备 创建名为launch_tutorial的ros2的python包 cd ~/launch_ws/src ros2 pkg create --build-type ament_python launch_tutorial 创建luanch目录 mkdir -p ~/launch_ws/src/launch_tutorial/launch 修改setup.py vim ~/launch_ws/src/launch_tutorial/setup.py 内容修改为 from setuptools import setup import os from glob import glob package_name = 'launch_tutorial' setup( name=package_name, version='0.0.0', packages=[package_name], data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), (os.path.join('share', package_name, 'launch'), glob(os.path.join('launch', '*launch.py'))), ], install_requires=['setuptools'], zip_safe=True, maintainer='ncnynl', maintainer_email='1043931@qq.com', description='TODO: Package description', license='TODO: License declaration', tests_require=['pytest'], entry_points={ 'console_scripts': [ ], }, ) 指定构建launch_tutorial包,并使用symlink的方式 cd ~/launch_ws/ colcon build --symlink-install --packages-select launch_tutorial 加载工作空间 . ~/launch_ws/install/local_setup.bash 父launch文件： 首先，我们将创建一个launch文件，该文件将调用并将参数传递给另一个launch文件。 在 launch_tutorial包的/launch文件夹中创建一个example_main.launch.py文件。 cd ~/launch_ws/src/launch_tutorial/launch vim example_main.launch.py 内容如下 from launch_ros.substitutions import FindPackageShare from launch import LaunchDescription from launch.actions import IncludeLaunchDescription from launch.launch_description_sources import PythonLaunchDescriptionSource from launch.substitutions import PathJoinSubstitution, TextSubstitution def generate_launch_description(): colors = { 'background_r': '200' } return LaunchDescription([ IncludeLaunchDescription( PythonLaunchDescriptionSource([ PathJoinSubstitution([ FindPackageShare('launch_tutorial'), 'launch', 'example_substitutions.launch.py' ]) ]), launch…

ROS2与launch入门教程-launch文件中使用事件处理程序
type: item
date: 2022-02-24T04:23:00+00:00
description: ROS2与launch入门教程-launch文件中使用事件处理程序 说明： 本教程展示了ROS2launch文件中事件处理程序的使用示例 背景： ROS2 中的 Launch 是一个执行和管理用户定义流程的系统。 它负责监控它启动的进程的状态，以及报告和响应这些进程的状态变化。 这些更改称为事件，可以通过向启动系统注册事件处理程序来处理。 可以为特定事件注册事件处理程序，并可用于监视进程的状态。 此外，它们可用于定义一组复杂的规则，可用于动态修改启动文件。 使用事件处理 新建example_event_handlers.launch.py文件 cd ~/launch_ws/src/launch_tutorial/launch vim example_event_handlers.launch.py 内容如下 from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import (DeclareLaunchArgument, EmitEvent, ExecuteProcess, LogInfo, RegisterEventHandler, TimerAction) from launch.conditions import IfCondition from launch.event_handlers import (OnExecutionComplete, OnProcessExit, OnProcessIO, OnProcessStart, OnShutdown) from launch.events import Shutdown from launch.substitutions import (EnvironmentVariable, FindExecutable, LaunchConfiguration, LocalSubstitution, PythonExpression) def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) turtlesim_node = Node( package='turtlesim', namespace=turtlesim_ns, executable='turtlesim_node', name='sim' ) spawn_turtle = ExecuteProcess( cmd=[[ FindExecutable(name='ros2'), ' service call ', turtlesim_ns, '/spawn ', 'turtlesim/srv/Spawn ', '"{x: 2, y: 2, theta: 0.2}"' ]], shell=True ) change_background_r = ExecuteProcess( cmd=FindExecutable(name='ros2'), ' param set ', turtlesim_ns, '/sim background_r ', '120' , shell=True ) change_background_r_conditioned = ExecuteProcess( condition=IfCondition( PythonExpression([ new_background_r, ' == 200', ' and ', use_provided_red ]) ), cmd=[[ FindExecutable(name='ros2'), ' param set…

ROS2与launch入门教程-使用ROS2 launch文件启动大型项目
type: item
date: 2022-02-24T04:23:00+00:00
description: ROS2与launch入门教程-使用ROS2 launch文件启动大型项目 说明: 学习使用ROS 2 launch文件管理大型项目的最佳实践 背景： 本教程描述了为大型项目编写启动文件的一些技巧。 重点是如何构建launch文件，以便在不同情况下尽可能多地重用它们。 此外，它还涵盖了不同 ROS 2 启动工具的使用示例，例如参数、YAML 文件、重新映射、命名空间、默认参数和 RViz 配置。 介绍: 机器人上的大型应用程序通常涉及多个相互连接的节点，每个节点都可以有许多参数。 在海龟模拟器中模拟多只海龟就是一个很好的例子。 海龟模拟由多个海龟节点、world配置以及 TF 广播器和侦听器节点组成。 在所有节点之间，存在大量影响这些节点行为和外观的 ROS 参数。 ROS 2 launch文件允许我们在一个地方启动所有节点并设置相应的参数。 在教程结束时，您将在 launch_tutorial 包中构建 launch_turtlesim.launch.py 启动文件。 这个启动文件会调出不同的节点，负责模拟两个turtlesim模拟，启动TF广播器和监听器，加载参数，启动一个RViz配置。 在本教程中，我们将介绍这个启动文件和使用的所有相关功能。 顶层结构 编写启动文件过程中的目标之一应该是使它们尽可能可重用。 这可以通过将相关节点和配置集群到单独的启动文件中来完成。 之后，可以编写专用于特定配置的顶级启动文件。 这将允许在完全不更改启动文件的情况下在相同的机器人之间移动。 即使是从真正的机器人移动到模拟机器人这样的变化，也只需进行少量更改即可完成。 我们现在将讨论使这成为可能的顶级启动文件结构。 首先，我们将创建一个launch文件，该文件将调用单独的启动文件。 为此，让我们在 launch_tutorial 包的 /launch 文件夹中创建一个 launch_turtlesim.launch.py 文件。 cd ~/launch_ws/src/launch_tutorial/launch vim launch_turtlesim.launch.py 内容如下： 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(): turtlesim_world_1 = IncludeLaunchDescription( PythonLaunchDescriptionSource([os.path.join( get_package_share_directory('launch_tutorial'), 'launch'), '/turtlesim_world_1.launch.py']) ) turtlesim_world_2 = IncludeLaunchDescription( PythonLaunchDescriptionSource([os.path.join( get_package_share_directory('launch_tutorial'), 'launch'), '/turtlesim_world_2.launch.py']) ) broadcaster_listener_nodes = IncludeLaunchDescription( PythonLaunchDescriptionSource([os.path.join( get_package_share_directory('launch_tutorial'), 'launch'), '/broadcaster_listener.launch.py']), launch_arguments={'target_frame': 'carrot1'}.items(), ) mimic_node = IncludeLaunchDescription( PythonLaunchDescriptionSource([os.path.join( get_package_share_directory('launch_tutorial'), 'launch'), '/mimic.launch.py']) ) fixed_frame_node = IncludeLaunchDe…

ROS2与launch入门教程-使用Python、XML 和 YAML格式编写ROS2 launch文件
type: item
date: 2022-02-24T04:23:00+00:00
description: ROS2与launch入门教程-使用Python、XML 和 YAML格式编写ROS2 launch文件 说明： ROS 2 launch文件可以用 Python、XML 和 YAML 编写。 本指南展示了如何使用这些不同的格式来完成相同的任务，并讨论了何时使用每种格式。 launch文件 下面是一个用 Python、XML 和 YAML 实现的启动文件。 每个启动文件执行以下操作： 使用默认值设置命令行参数 包含另一个启动文件 在另一个命名空间中包含另一个启动文件 启动一个节点并设置它的命名空间 启动一个节点，设置其命名空间，并在该节点中设置参数（使用 args） 创建一个节点以将消息从一个主题重新映射到另一个主题 Python版本 # example.launch.py import os from ament_index_python import get_package_share_directory from launch import LaunchDescription from launch.actions import DeclareLaunchArgument from launch.actions import IncludeLaunchDescription from launch.actions import GroupAction from launch.launch_description_sources import PythonLaunchDescriptionSource from launch.substitutions import LaunchConfiguration from launch.substitutions import TextSubstitution from launch_ros.actions import Node from launch_ros.actions import PushRosNamespace def generate_launch_description(): # args that can be set from the command line or a default will be used background_r_launch_arg = DeclareLaunchArgument( "background_r", default_value=TextSubstitution(text="0") ) background_g_launch_arg = DeclareLaunchArgument( "background_g", default_value=TextSubstitution(text="255") ) background_b_launch_arg = DeclareLaunchArgument( "background_b", default_value=TextSubstitution(text="0") ) chatter_ns_launch_arg = DeclareLaunchArgument( "chatter_ns", default_value=TextSubstitution(text="my/chatter/ns") ) # include another launch file launch_include = IncludeLaunchDescription( PythonLaunchDescriptionSource( os.path.join( get_package_share_directory('demo_nodes_cpp'), 'launch/topics/talker_listener.launch.py')) ) # include another launch file in the chatter_ns namespace launch_include_with_namespace = GroupAction( actions=[ # push_ros_namespace to set namespace of included nodes PushRosNamespace(LaunchConfiguration('chatter_ns')), IncludeLaunchDescription( PythonLaunchDescriptionSource( os.path.join( get_package_share_directory('demo_nodes_cpp'), 'launch/topics/talker_listener.launch.py')) ), ] )…

ROS2与launch入门教程-如何迁移ROS1的launch文件到ROS2
type: item
date: 2022-02-24T04:24:00+00:00
description: ROS2与launch入门教程-如何迁移ROS1的launch文件到ROS2 说明： 介绍如何编写 XML 启动文件以便从 ROS 1 轻松迁移。 ###将标签从 ROS 1 迁移到 ROS 2### launch标签 在 ROS 1 中可用。 launch 是任何 ROS 2 启动 XML 文件的根元素。 node标签 在 ROS 1 中可用。 启动一个新节点。 与 ROS 1 的区别： type 属性现在是 exec。 ns 属性现在是命名空间。 以下属性不可用：machine、respawn_delay、clear_params。 示例： <launch> <node pkg="demo_nodes_cpp" exec="talker"/> <node pkg="demo_nodes_cpp" exec="listener"/> </launch> param标签 在 ROS 1 中可用。 用于将参数传递给节点。 ROS 2 中没有全局参数的概念，因此只能嵌套在node标签中使用。 ROS 2 不支持某些属性：type, textfile, binfile, executable, command。 示例1： <launch> <node pkg="demo_nodes_cpp" exec="parameter_event"> </node> </launch> 示例1： <node pkg="my_package" exec="my_executable" name="my_node"> </node> 参数分组 在 ROS 2 中，允许嵌套 param 标签。 例如： <node pkg="my_package" exec="my_executable" name="my_node" ns="/an_absoulute_ns"> </node> 这将创建两个参数： 一个值为 1 的 group1.group2.my_param，由节点 /an_absolute_ns/my_node 托管。 由节点 /an_absolute_ns/my_node 托管的值为 2 的 group1.another_param。 也可以使用完整的参数名称： <node pkg="my_package" exec="my_executable" name="my_node" ns="/an_absoulute_ns"> </node> rosparam标签 在 ROS 1 中可用。 从 yaml 文件加载参数。 它已被 param 标记中的 from 属性替换。 示例： <node pkg="my_package" exec="my_executable" name="my_node" ns="/an_absoulute_ns"> </node> remap标签 在 ROS 1 中可用。 用于将重映射规则传递给节点。 它只能在节点标签中使用。 示例： <launch> <node pkg="demo_nodes_cpp" exec="talker"> <remap from="chatter" to="my_topic"/> </node> <node pkg="demo_nodes_cpp" exec="listener"> <remap from="chatter" to="my_topic"/> </node> </launch> include标签： 在 ROS 1 中可用。 允许包含另一个启动文件。 与 ROS 1 的区别： 在 ROS 1 中可用，包含的内容是有范围的。 在 ROS 2 中，它不是。 Nest 包含在组标签中以限定它们的范围。 不支持 ns 属性。 有关解决方法，请参见 push_ros_namespace 标记的示例。 嵌套在包含标签中的 arg 标签不支持条件（如果或除非）。 不支持嵌套的 env 标签。 可以使用 set_env 和 unset_env 代替。 不支持 clear_params 和 pass_all_args 属性。 arg标签 在 ROS 1 中可用。 arg 用于声明启动参数，或在使用包含标签时传递参数。 与 ROS 1 的区别： 不允许使用 value 属性。 为此使用 let 标签。 doc 现在是描述。 当嵌套在包含标签中时，不允许使用 if 和 unless 属性。 - 示例： <launch> <arg name="topic_name" default="chatter"/> <node pkg="demo_nodes_cpp" exec="talker"> <remap from="chatter" to="$(var topic_name)"/> </node> <nod…