玩转ROS2系列05--编写launch文件启动节点

5 篇文章 4 订阅

玩转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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值