介绍ROS2节点启动的launch文件

介绍ROS2节点启动的launch文件

当使用ROS 2启动文件(launch文件)时,可以使用Python或C++编写。下面是一个示例,展示如何编写一个使用C++的ROS 2启动文件。

假设我们有一个名为my_node的节点,它是用C++编写的。我们将创建一个名为my_launch.cpp的文件来定义启动文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <rclcpp/rclcpp.hpp>

int main(int argc, char** argv)
{
// 初始化ROS 2节点
rclcpp::init(argc, argv);

// 创建节点实例
auto node = rclcpp::Node::make_shared("my_node");

// 执行你的节点逻辑
// ...

// 运行节点
rclcpp::spin(node);

// 清理ROS 2资源
rclcpp::shutdown();

return 0;
}

上述代码片段演示了一个简单的ROS 2 C++节点。要将其作为一个启动文件运行,我们需要创建一个额外的启动文件(通常使用XML格式)来调用C++节点。

例如,我们可以创建一个名为my_launch.launch.py的Python启动文件,该文件将调用上述C++节点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import launch
import launch.actions
import launch_ros.actions

def generate_launch_description():
return launch.LaunchDescription([
# 启动C++节点
launch_ros.actions.Node(
package='my_package',
executable='my_node',
name='my_node'
),
])

在上述Python启动文件中,我们使用launch_ros.actions.Node类来指定要启动的C++节点的信息。在这个例子中,我们指定了节点的包名(my_package),可执行文件名(my_node),以及节点的名称(my_node)。

使用以上两个文件,你可以通过运行以下命令来启动ROS 2 C++节点:

1
2
ros2 launch my_package my_launch.launch.py


请确保将my_package替换为你的包名,并确保启动文件和C++节点文件位于正确的位置。

启动时加载参数

要在ROS 2启动文件中加载参数,你可以使用launch_ros.actions.Node类的parameters参数。该参数允许你指定要在启动节点时加载的参数。

以下是一个示例,展示如何在C++节点启动时加载参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <rclcpp/rclcpp.hpp>

int main(int argc, char** argv)
{
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("my_node");

// 读取参数值
int my_param;
node->get_parameter("my_param", my_param);

// 执行节点逻辑,使用加载的参数
// ...

rclcpp::spin(node);
rclcpp::shutdown();

return 0;
}


在上述示例中,我们在节点启动时使用node->get_parameter()函数读取了名为my_param的参数值。

接下来,我们将修改启动文件my_launch.launch.py,以便在启动节点时加载参数。我们将使用launch.substitutions.LaunchConfiguration类来获取启动文件中定义的参数值,并将其传递给节点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import launch
import launch.actions
import launch.substitutions
import launch_ros.actions

def generate_launch_description():
return launch.LaunchDescription([
launch_ros.actions.Node(
package='my_package',
executable='my_node',
name='my_node',
# 加载参数
parameters=[{
'my_param': launch.substitutions.LaunchConfiguration('my_param_value')
}]
),
])


在上述示例中,我们将my_param参数设置为launch.substitutions.LaunchConfiguration(‘my_param_value’)。这将获取名为my_param_value的启动文件参数的值,并将其作为my_param参数的值传递给C++节点。

最后,你可以在运行启动文件时传递参数值。例如,使用以下命令启动节点并传递参数值:

1
2
ros2 launch my_package my_launch.launch.py my_param_value:=42


在上述命令中,我们将参数my_param_value设置为42。这个值将被加载到节点的my_param参数中。

参数从yaml文件中加载

如果你希望将参数存储在YAML文件中,并在ROS 2启动文件中加载这些参数,可以使用ros2param工具来实现。

以下是一个示例,演示如何使用YAML文件加载参数:

  1. 创建一个名为params.yaml的YAML文件,例如
    1
    2
    3
    my_param: 42
    another_param: "hello"

  2. 修改启动文件my_launch.launch.py,使用ros2param工具加载YAML文件中的参数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import launch
import launch.actions
import launch_ros.actions
from launch.substitutions import LaunchConfiguration
from launch.actions import DeclareLaunchArgument

def generate_launch_description():
return launch.LaunchDescription([
# 声明参数文件路径
DeclareLaunchArgument(
'params_file',
default_value='params.yaml',
description='Path to the parameter file'
),

# 加载参数
launch.actions.ExecuteProcess(
cmd=['ros2', 'param', 'load', LaunchConfiguration('params_file'), '/my_node'],
output='screen'
),

# 启动节点
launch_ros.actions.Node(
package='my_package',
executable='my_node',
name='my_node'
),
])

在上述示例中,我们首先使用DeclareLaunchArgument声明了一个名为params_file的启动参数,用于指定参数文件的路径。默认情况下,参数文件路径被设置为params.yaml。

然后,我们使用launch.actions.ExecuteProcess来执行ros2 param load命令,将参数从YAML文件加载到节点。LaunchConfiguration(‘params_file’)用于获取启动参数中指定的参数文件路径。

最后,我们使用launch_ros.actions.Node启动C++节点。

现在,你可以在启动时通过命令行参数传递参数文件的路径,如下所示:

1
2
ros2 launch my_package my_launch.launch.py params_file:=/path/to/params.yaml


这样,启动文件将使用指定的参数文件加载参数,并将其传递给节点。

请确保将my_package替换为你的包名,并将/path/to/params.yaml替换为实际的参数文件路径。


介绍ROS2节点启动的launch文件
https://qiangsun89.github.io/2023/06/06/介绍ROS2节点启动的launch文件/
作者
Qiang Sun
发布于
2023年6月6日
许可协议