古月居ROS2学习笔记——launch

本文介绍了ROS(RobotOperatingSystem)中的Launch文件,如何通过Python脚本一次性启动多个节点,配置命名空间,资源重映射,以及设置参数。还探讨了如何使用include机制组织复杂的launch文件结构和功能包编译配置。
摘要由CSDN通过智能技术生成

Launch文件

每当我们运行一个ROS节点,都需要打开一个新的终端运行一个命令。机器人系统中节点很多,每次都这样启动好麻烦呀。有没有一种方式可以一次性启动所有节点呢?答案当然是肯定的,那就是Launch启动文件,它是ROS系统中多节点启动与配置的一种脚本。
Launch文件是基于Python描述的
核心目的是启动节点,在命令行中输入的各种参数,在launch文件中也有很多的代码模板,还可以是使用Python原有的编程功能。

$ ros2 run learning_launch simple.launch.py
from launch import LaunchDescription #Launch文件的描述类
from launch_ros.actions import Node #节点启动的描述类

def generate_launch_description():
	return LaunchDescription([
	Node(
		package='learning_topic'
		executable='topic_helloworld_pub'
	),
	Node(
		package='learning_topic'
		executable='topic_helloworld_sub'
	),
	])
'''
# 配置一个节点的启动
# 节点所在的功能包
# 节点的可执行文件
'''

示例

我们想要运行一个Rviz可视化上位机,并且加载某一个配置文件,使用命令行的话,是这样的:

$ ros2 run rviz2 rviz2 -d <PACKAGE-PATH>/rviz/turtle_rviz.rviz

命令后边还得跟一长串配置文件的路径,如果放在launch文件里,启动就优雅很多了:

$ ros2 launch learning_launch rviz.launch.py

代码解析
learning_launch/rviz.launch.py

import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
	rviz_config=os.path.join(
	get_package_share_directory('learning_launch'),
	'rviz',
	'turtle_rviz.rviz'
	)
	return LaunchDescription([
	Node(
		package='rviz2', #节点所在功能包
		executable='rviz2', #可执行文件
		name='rviz2', #对节点重新命名
		arguments=['-d',rviz_config] #加载命令行参数
	)
	])

资源重映射

ROS社区中的资源非常多,当我们使用别人代码的时候,经常会发现通信的话题名称不太符合我们的要求,能否对类似的资源重新命名呢?

为了提高软件的复用性,ROS提供了资源重映射的机制,可以帮助我们解决类似的问题。

举例:启动一个终端,运行如下例程,很快会看到出现了两个小海龟仿真器界面;再打开一个终端,发布如下话题,让海龟1动起来,海龟2也会一起运动:

$ ros2 launch learning_launch remapping.launch.py
$ ros2 topic pub -- 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}}"

learning_launch/remapping.launch.py

from launch import LaunchDescription
from launch_ros.actions import Node

def geneate_launch_description():   # 自动生成launch文件的函数
	return LaunchDesrcription(      # 返回launch文件的描述信息
		Node(                       # 配置一个节点的启动 
			paskage='turtlesim',    # 节点所在的功能包
			namespace='turtlesim1', # 节点所在的命名空间 
			executable='turtlesim_node',   # 节点的可执行文件名
			name='sim'
		),
		Node(
			paskage='turtlesim',
			namespace='turtlesim2',
			executable='turtlesim_node',
			name='sim'
		)
		Node(
			paskage='turtlesim',
			executable='mimic',
			name='mimic'
			remappings=[
				('/input/pose','/turtlesim1/turtle1/pose'),
				('/output/cmd_vel','turtlesim2/turtle1/cmd_vel')
			]
		)
		)
'''
运行此launch文件后,使用ros2 topic list查询服务可知,现在正在运行的话题有:
/turtlesim1/turtle1/cmd_vel
/turtlesim1/turtle1/color_sensor
/turtlesim1/turtle1/pose
/turtlesim2/turtle1/cmd_vel
/turtlesim2/turtle1/color_sensor
/turtlesim2/turtle1/pose
...
前面的1和2就是launch文件里面设置的命名空间!
功能包中的mimic节点的功能就是订阅位置话题,然后转化成速度指令发送出去,因此当控制海龟1运动时,海龟2也运动!
'''

ROS参数设置

$ ros2 launch learning_launch parameters.launch.py

在启动的海龟仿真器中,我们看到背景颜色被改变了,这个颜色参数的设置就是在launch文件中完成的。

from launch import LaunchDescription                   # launch文件的描述类
from launch.actions import DeclareLaunchArgument       # 声明launch文件内使用的Argument类
from launch.substitutions import LaunchConfiguration, TextSubstitution

from launch_ros.actions import Node                    # 节点启动的描述类


def generate_launch_description():                     # 自动生成launch文件的函数
   background_r_launch_arg = DeclareLaunchArgument(
      'background_r', default_value=TextSubstitution(text='0')     # 创建一个Launch文件内参数(arg)background_r
   )
   background_g_launch_arg = DeclareLaunchArgument(
      'background_g', default_value=TextSubstitution(text='84')    # 创建一个Launch文件内参数(arg)background_g
   )
   background_b_launch_arg = DeclareLaunchArgument(
      'background_b', default_value=TextSubstitution(text='122')   # 创建一个Launch文件内参数(arg)background_b
   )

   return LaunchDescription([                                      # 返回launch文件的描述信息
      background_r_launch_arg,                                     # 调用以上创建的参数(arg)
      background_g_launch_arg,
      background_b_launch_arg,
      Node(                                                        # 配置一个节点的启动
         package='turtlesim',
         executable='turtlesim_node',                              # 节点所在的功能包
         name='sim',                                               # 对节点重新命名
         parameters=[{                                             # ROS参数列表
            'background_r': LaunchConfiguration('background_r'),   # 创建参数background_r
            'background_g': LaunchConfiguration('background_g'),   # 创建参数background_g
            'background_b': LaunchConfiguration('background_b'),   # 创建参数background_b
         }]
      ),
   ])

以上例程我们在launch文件中一个一个的设置参数,略显麻烦,当参数比较多的时候,建议使用参数文件进行加载。
learning_launch/parameters_yaml.launch.py

import os

from ament_index_python.packages import get_package_share_directory  # 查询功能包路径的方法

from launch import LaunchDescription   # launch文件的描述类
from launch_ros.actions import Node    # 节点启动的描述类


def generate_launch_description():     # 自动生成launch文件的函数
   config = os.path.join(              # 找到参数文件的完整路径
      get_package_share_directory('learning_launch'),
      'config',
      'turtlesim.yaml'
      )

   return LaunchDescription([          # 返回launch文件的描述信息
      Node(                            # 配置一个节点的启动
         package='turtlesim',          # 节点所在的功能包
         executable='turtlesim_node',  # 节点的可执行文件名
         namespace='turtlesim2',       # 节点所在的命名空间
         name='sim',                   # 对节点重新命名
         parameters=[config]           # 加载参数文件
      )
   ])

这里的config路径对应的文件内容是:

/turtlesim2/sim:
ros_parameters:
	background_b: 0
	background_g: 0
	background_r: 0

Launch文件包含

在复杂的机器人系统中,launch文件也会有很多,此时我们可以使用类似编程中的include机制,让launch文件互相包含。
learning_launch/namespaces.launch.py

import os

from ament_index_python.packages import get_package_share_directory  # 查询功能包路径的方法

from launch import LaunchDescription                 # launch文件的描述类
from launch.actions import IncludeLaunchDescription  # 节点启动的描述类
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.actions import GroupAction               # launch文件中的执行动作
from launch_ros.actions import PushRosNamespace      # ROS命名空间配置
def generate_launch_description():                   # 自动生成launch文件的函数
   parameter_yaml = IncludeLaunchDescription(        # 包含指定路径下的另外一个launch文件
      PythonLaunchDescriptionSource([os.path.join(
         get_package_share_directory('learning_launch'), 'launch'),
         '/parameters_nonamespace.launch.py'])
      )

   parameter_yaml_with_namespace = GroupAction(      # 对指定launch文件中启动的功能加上命名空间
      actions=[
         PushRosNamespace('turtlesim2'),
         parameter_yaml]
      )

   return LaunchDescription([                        # 返回launch文件的描述信息
      parameter_yaml_with_namespace
   ])

功能包编译配置

一定不要忘记,编写完aunch文件后要在setup.py里面的data_files里面添加这些文件的路径,否则在编译的过程中系统不会把这些文件拷贝到安装空间里面去(install)。

    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'))),
        (os.path.join('share', package_name, 'config'), glob(os.path.join('config', '*.*'))),
        (os.path.join('share', package_name, 'rviz'), glob(os.path.join('rviz', '*.*'))),
    ],
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 古月 ROS2 课件是一套关于ROS2框架的教育教学材料。ROS(Robot Operating System)是一个开放源代码的机器人操作系统,用于实现机器人软件开发的一种框架。ROS2是ROS的下一代版本,具有更强大的功能和更高的性能。 古月ROS2课件主要包括以下内容: 1. ROS2概述:介绍ROS2的起源、发展和应用领域,让学习者了解ROS2的基本概念和优势。 2. ROS2架构:详细介绍ROS2的架构和组件,包括节点(Node)、话题(Topic)、服务(Service)、行为(Action)等,帮助学习者理解ROS2的基本工作原理。 3. ROS2通信:讲解ROS2中的通信机制,包括发布/订阅模型、服务调用等,让学习者掌握ROS2消息传递的方法。 4. ROS2工具:介绍ROS2常用工具的使用方法,如rqt、rviz等,帮助学习者进行ROS2程序的开发和调试。 5. ROS2开发:引导学习者使用ROS2进行实际开发,包括创建ROS2包、编写节点、发布和订阅消息、调用服务等,让学习者具备实际应用ROS2的能力。 通过学习古月ROS2课件,学习者可以系统地学习ROS2的理论知识和实践技能,掌握ROS2的基本概念、架构和通信机制,能够使用ROS2进行机器人软件开发和相关研究。这对于想要从事机器人领域的学生、工程师以及科研人员来说,是一份非常有价值的教材。 ### 回答2: 古月 ROS2课件是一个针对ROS2使用的教学资料。ROS(机器人操作系统)是一种用于开发机器人软件的开源框架。而ROS2是ROS的第二代版本,相较于ROS1有许多改进和优化。 古月ROS2课件内容丰富,从入门到进阶,涵盖了ROS2的各个方面。首先,课件会介绍ROS2的概念和优势。相比ROS1,ROS2在分布式计算、实时性、可靠性和安全性等方面有所提升,这些优势将被详细讲解和说明。 其次,课件会介绍ROS2的基本操作和常用工具。学习者将了解如何创建ROS2的工作空间,如何使用ROS2的包管理工具来安装和管理软件包,以及如何编译和运行ROS2程序。此外,课件还会介绍ROS2中常用的调试工具和可视化工具,帮助学习者更好地理解和调试他们自己的ROS2应用程序。 然后,课件会详细介绍ROS2的通信机制和节点之间的交互。学习者将了解ROS2中的发布/订阅模式和客户端/服务器模式,并学习如何通过ROS2的通信机制来实现节点之间的数据传输和服务调用。 最后,课件还会涵盖一些高级主题,如ROS2的参数服务器、消息定义、时间同步和ROS2与其他框架的集成等。这些主题将帮助学习者更全面地了解ROS2的功能和扩展性,为他们在实际的机器人项目中应用ROS2提供更多的思路和指导。 总的来说,古月ROS2课件是一个系统全面的教学资料,适用于对ROS2感兴趣的初学者和有一定ROS1基础的开发者。通过学习该课件,学习者将掌握ROS2的基本概念和操作技能,能够使用ROS2开发和运行自己的机器人应用程序。 ### 回答3: 古月ros2课件是一套关于使用ROS2进行软件开发的教学资料。ROS2(Robot Operating System 2)是一个开放源代码的机器人操作系统,它提供了一套工具和库,用于帮助开发者构建和控制机器人系统。 这套课件旨在为学习ROS2的人员提供详细的指导和教学材料。它包括了ROS2的基础知识、安装和配置ROS2环境的步骤,以及ROS2使用的常见工具和一些示例项目的介绍。 课件首先介绍了ROS2的概念和架构,使学习者对ROS2的整体框架有一个清晰的理解。然后,课件详细讲解了如何在不同的操作系统上安装和配置ROS2,包括Linux和Windows。 接着,课件介绍了ROS2中常用的一些工具,例如ROS2包管理工具(colcon),ROS2消息通信库(rclcpp),ROS2消息调试工具(rqt)等。它们是开发ROS2应用程序所必需的工具,通过学习它们的使用方法,学习者可以更好地理解和应用ROS2的功能。 此外,课件还包含了一些基于ROS2的示例项目,如机器人导航、目标检测和路径规划等。这些示例项目帮助学习者将所学知识应用到实际的机器人开发中,提升他们的实践能力。 总的来说,古月ROS2课件是一份全面而易于理解的ROS2教学资料,对于想要学习和应用ROS2的开发者来说,它将提供很大的帮助和指导。无论是初学者还是有一定ROS经验的开发者,都可以通过这份课件快速入门和深入了解ROS2的开发。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值