玩转ROS2系列:
玩转ROS2系列01–Ubuntu下ROS 2 版本选择和安装
玩转ROS2系列02–创建一个工作空间并编译功能包
玩转ROS2系列03–创建并运行一个你自己的功能包
玩转ROS2系列04–在功能包中实现一个订阅节点和发布节点
玩转ROS2系列05–编写launch文件启动节点
在上一篇博客中,我们自己编写了一个消息发布节点和一个订阅节点并且可以正常启动了,着一篇我们试着编写一个laucnh文件,通过launch方式来启动节点。
主要参考官网内容:
Creating a launch file
Launching/monitoring multiple nodes with Launch
Step1
进入到功能包的文件夹,并创建一个launch文件用于存放launch文件
cd ros2_example_ws/src/my_package/
mkdir launch/
Step2
编写launch文件
vim publisher.launch.py
文件内容如下
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='my_package',
node_namespace='',
node_executable='talker',
node_name='talker_launch',
output='screen',
),
])
Step 3
尝试启动launch文件
ros2 launch publisher.launch.py
在另一个终端中通过run的方式启动订阅节点
ros2 run my_package listener
启动完成后,订阅节点可以正常收到话题,这里有一个问题,就是通过launch启动发布节点,终端中先是不会输出节点打印的信息,如下图
运行一段时间后,会一次性输出所有因输出的信息,如下图,然后又不输出信息,问题原因不详,也不确定是不是我遇到的个例。
Step 4
上面我们启动launch是直接执行.py文件,这样就有一个问题,执行时必须要指定py文件的绝对路径,这样显然是很不方便的,接下来我们继续操作,修改setup.py文件
vim ../setup.py
在文件开头加入两行import,data_files方括号内增加launch文件的路径,修改完成如下
import os
from glob import glob
from setuptools import setup
package_name = 'my_package'
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']),
# Include all launch files. This is the most important line here!
(os.path.join('share', package_name), glob('launch/*.launch.py'))
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='ubuntu',
maintainer_email='ubuntu@todo.todo',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'my_node = my_package.my_node:main',
'talker = my_package.publisher_member_function:main',
'listener = my_package.subscriber_member_function:main',
],
},
)
Step 5
修改完成后保存退出,编译功能包
cd ~/ros2_example_ws/
colcon build --packages-select my_package
接下来就可以通过指定功能包名来launch了
ros2 launch my_package publisher.launch.py
在我个人看来,ROS2中的launch和ROS1中的差别还是蛮大的,首先是ROS2中的launch文件是一个python文件,然后对于命名空间和节点重命名的支持更加友好,相信这一点也是为为了ROS2的愿景中更好的支持多机器人系统在做准备吧;使用python来实现launch,应该也可以解决ROS1中launch文件中节点的启动顺序无法保证的问题吧。
ROS1和ROS2中launch文件的区别和迁移,可以参考这篇文章
Migrating launch files from ROS 1 to ROS 2