【ROS知识】比较ROS1和ROS2在处理launch的不同

 一、说明

        在处理launch过程中,ROS1和ROS2还是有些差别的,因为文件结构不同,不能直接搬用。这里将两者建立过程做一个比对,以提升概念的清晰度。

        在ROS2中,单独的launch文件是一个python文件,因此脱离ros2环境也能启动,问题是,如果launch文件添加到ros2的包内,如何配置,才能正常启动?

二、在ROS1下的Launch的功能开发

        在ROS中,launch文件是一种用于启动ROS节点和参数的XML文件。它可以在一次启动中启动多个节点,设置节点参数和命名空间,创建ROS参数服务器,以及指定各个节点之间的通信。通常,launch文件用于简化ROS应用程序的部署和管理。

一个典型的launch文件包括以下内容:

  1. 标签:定义launch文件的根节点。

  2. 标签:定义一个ROS节点,包括节点名称、节点类型、节点参数等信息。可以在一个launch文件中定义多个节点。

  3. 标签:定义一个ROS参数,可以为节点设置参数,也可以在launch文件级别上设置参数。

  4. 标签:导入其他launch文件,以便在当前文件中启动其他节点和参数。

  5. 标签:定义一个参数,可以在launch文件或被导入的launch文件中使用。

        下面是一个简单的launch文件示例:


  
    
  

        该文件启动一个ROS节点,节点名称为“my_node”,节点类型为“my_node_type”,节点参数中包括一个名为“my_param”的参数,值为“my_value”,存储在ROS参数服务器中。输出将显示在屏幕上。

        要运行上述示例,可以在终端中输入以下命令:

roslaunch my_package my_launch_file.launch

        其中“my_package”是节点所在的ROS包名称,“my_launch_file.launch”是launch文件的名称。

三、在ROS2上如何建立?

        在ROS2上的launch改动很大,请看下面步骤:

3.1 建立命名空间

mkdir -p my_launch_ws/src

cd  my_launch_ws/src

3.2 创建python包

        所建立包的名称:py_launch_pkg

  ros2 pkg create py_launch_pkg --build-type ament_python

         按照惯例,包的所有启动文件都存储在包内的启动目录中。确保在上面创建的包的顶层创建一个启动目录。

        因此:mkdir  my_launch_ws/src/py_launch_pkg/launch

        最后的路径如下:

src/
  py_launch_pkg/
    launch/
    package.xml
    py_launch_pkg/
    resource/
    setup.cfg
    setup.py
    test/

3.3 为colcon build配置路径跟踪

        我们知道,launch放在包路径下面,问题是编译系统如何找到这个路径,colcon依然无法发现launch文件到底在哪里,所以,需要在setup.py配置如下:

import os
from glob import glob
from setuptools import setup

package_name = 'py_launch_pkg'

setup(
    # Other parameters ...
    data_files=[
        # ... Other data files
        # Include all launch files.
        (os.path.join('share', package_name), glob('launch/*launch.[pxy][yma]*'))
    ]
)

        注意:python包有一个setup.py文件,在C++包无此文件。

3.4 创建launch文件有所变化

        在您的启动目录中,创建一个名为 my_script_launch.py​​ 的新启动文件。 _launch.py​​ 是推荐的,但不是必需的,作为 Python 启动文件的文件后缀。但是,启动文件名需要以 launch.py​​ 结尾才能被 ros2 启动识别和自动完成。

        您的启动文件应该定义 generate_launch_description() 函数,该函数返回一个 launch.LaunchDescription() 以供 ros2 启动动词使用。

import launch
import launch_ros.actions

def generate_launch_description():
    return launch.LaunchDescription([
        launch_ros.actions.Node(
            package='demo_nodes_cpp',
            executable='talker',
            name='talker'),
  ])

        注意:这里demo_nodes_cpp是老早就编译过的一个包,因为编译后就自然注册到ROS2内部,因此,这里可以直接引用,而不要管路径在哪里。

3.5 构建并运行启动文件

        转到工作区的顶层,并构建它:

       colcon build

        启动launch文件:

       ros2 launch py_launch_example my_script_launch.py

四、结论

        ros2取消的ROS1下的.launch文件,代之以.py的python文件,从根本上改变了格局,因此,头脑有些乱,从ROS2从头学起:

        ROS1只支持xml格式的.launch文件配置,ROS2在兼容xml的基础上,还支持yaml和python格式,而python格式的launch是我的学习重点,因为相对于另外两种配置方式,使用python更加灵活。python拥有众多的函数库,可以在启动文件中使用;

你可能感兴趣的:(ROS资源和工业机器人,人工智能,自动驾驶)