在处理launch过程中,ROS1和ROS2还是有些差别的,因为文件结构不同,不能直接搬用。这里将两者建立过程做一个比对,以提升概念的清晰度。
在ROS2中,单独的launch文件是一个python文件,因此脱离ros2环境也能启动,问题是,如果launch文件添加到ros2的包内,如何配置,才能正常启动?
在ROS中,launch文件是一种用于启动ROS节点和参数的XML文件。它可以在一次启动中启动多个节点,设置节点参数和命名空间,创建ROS参数服务器,以及指定各个节点之间的通信。通常,launch文件用于简化ROS应用程序的部署和管理。
一个典型的launch文件包括以下内容:
标签:定义launch文件的根节点。
标签:定义一个ROS节点,包括节点名称、节点类型、节点参数等信息。可以在一个launch文件中定义多个节点。
标签:定义一个ROS参数,可以为节点设置参数,也可以在launch文件级别上设置参数。
标签:导入其他launch文件,以便在当前文件中启动其他节点和参数。
标签:定义一个参数,可以在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上的launch改动很大,请看下面步骤:
mkdir -p my_launch_ws/src
cd my_launch_ws/src
所建立包的名称: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/
我们知道,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++包无此文件。
在您的启动目录中,创建一个名为 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内部,因此,这里可以直接引用,而不要管路径在哪里。
转到工作区的顶层,并构建它:
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拥有众多的函数库,可以在启动文件中使用;