ros2 launch 用法以及一些基础功能函数的示例

launch

##前言

ros2 launch文件中最主要的概念是action,ros2 launch把每一个要执行的节点,文件,脚本,功能等全部抽象成action,用统一的接口来控制其启动,最主要的结构是:

def generate_launch_description():
    return LaunchDescription([
        action_1,
        action_2,
        ...
        action_n
    ])

要启动的节点或其他launch文件全部都传入LaunchDescription()函数中,该函数中接受一个或多launch.actionslaunch_ros.actions类型的对象,以下列举一下常用的action:

launch_ros.actions.Node
	· 此函数功能是启动一个ros2节点;
launch_ros.actions.PushRosNamespace
	· 此函数功能是给一个节点或组设置命名空间;
launch.actions.IncludeLaunchDescription
	· 此函数功能是直接引用另一个launch文件;
launch.actions.SetLaunchConfiguration
	· 此函数功能是在launch文件内声明一个参数,并给定参数值;
launch.actions.SetEnvironmentVariable
	· 此函数功能是声明一个环境变量并给定环境变量的值;
launch.actions.AppendEnvironmentVariable
	· 此函数将对一个环境变量追加一个值,如果不存在则创建;
launch.actions.DeclareLaunchArgument
	· 此函数功能是声明一个启动描述参数,该参数具有名称、默认值和文档;
launch.actions.TimerAction
	· 此函数功能是在一段时间后执行一个或多个action;
launch.actions.GroupAction
	· 此函数功能是将action分组,同组内的action可以统一设定参数方便集中管理;
launch.actions.ExecuteProcess
	· 此函数功能是根据输入执行一个进程或脚本;
launch.actions.EmitEvent
	· 此函数功能是发出一个事件,触发以注册的事件函数被调用;
launch.actions.RegisterEventHandler
	· 此函数功能是注册一个事件;
launch.actions.UnregisterEventHandler
	· 此函数功能是删除一个注册过的事件;

启动一个节点的launch示例

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='ros2_test',
            executable='ros2_test_publisher_node',
            name='ros2_test_publisher_node',
            output='screen'
        )
    ])

或者:

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    action_1 = Node(
    			package='ros2_test',
            	 executable='ros2_test_publisher_node',
            	 name='ros2_test_publisher_node',
            	 output='screen'
               )
    return LaunchDescription([
        action_1
    ])

launch文件名为test.launch.py,调用launch文件启动节点:

ros2 launch ros2_test test.launch.py

launch文件中添加节点的namespace

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='ros2_test',
            executable='ros2_test_publisher_node',
            name='ros2_test_publisher_node',
            output='screen',
            namespace='my_ros2_test'
        )
    ])

设置了namespace后,此节点的话题前会加上namespace的前缀,例如原来的话题名称’/test’,设置后变为’/my_ros2_test/test’

注意,有以下情况namespace无效:

节点本来就已经有了namespace了,后续会介绍将节点分组,整组节点可以设置统一的namespace,此时如果有个节点已经设置过namespace,则在此设置不会生效;
定义发布节点的时候,topic名字的前面加上了符号/;

launch文件中的话题名称映射

话题映射的字段是remappings,语法示例如下:

remappings=[
	('src1', 'dest1'),
	('src2', 'dest2'),
	...
]

如果需要话题名称映射的话要将该字段加入到节点的函数内,假如节点内有个test1话题要映射到test2,示例如下:

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='ros2_test',
            executable='ros2_test_publisher_node',
            name='ros2_test_publisher_node',
            output="screen",
            remappings=[("test1", "test2")]
        )
    ])

launch文件中向节点内传入命令行参数

参数字段是arguments,语法示例如下:

arguments=['arg1', 'arg2', ...]

如果需要向ros2_test_publisher_node节点中传入命令行参数,示例如下:

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='ros2_test',
            executable='ros2_test_publisher_node',
            name='ros2_test_publisher_node',
            output="screen",
            arguments=['arg1', 'arg2']
        )
    ])

传入的参数可以从节点启动时main函数中的argc参数获取到参数个数,argv参数获取到参数内容,详情参考c++的命令行参数获取;

launch文件中向节点内传入rosparam

字段是parameter,语法示例如下:

parameters=[
	{'port': '/dev/ttyUsb0'},
	...
]

如果需要在launch文件中发布某个节点空间下的parameter,示例如下:

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='ros2_test',
            executable='ros2_test_publisher_node',
            name='ros2_test_publisher_node',
            output="screen",
            parameter=[{'port': '/dev/ttyUSB0'}]
        )
    ])

如果需要参数的值可以从外部调用launch文件时灵活更改,则可以使用变量的形式作为参数的值,在文件中给定默认值,若外部给定则以外部给定的值为准,若外部不给则以默认值为准:

port_va

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值