您正在阅读的是旧版本但仍受支持的 ROS 2 文档。 Jazzy.
使用 Python、XML 和 YAML 编写 ROS 2 启动文件
ROS 2 启动文件可以用 Python、XML 和 YAML 编写。本指南介绍了如何使用这些不同的格式来完成相同的任务,并对何时使用每种格式进行了讨论。
启动文件示例
下面是一个用 Python、XML 和 YAML 实现的启动文件。每个启动文件都执行以下操作:
使用默认值设置命令行参数
包含另一个启动文件
在另一个命名空间中包含另一个启动文件
启动节点并设置其命名空间
启动一个节点,设置其名称空间,并在该节点中设置参数(使用参数)
创建一个节点,将信息从一个主题重新映射到另一个主题
# example_launch.py
舶来品 os
从 ament_index_python 舶来品 获取软件包共享目录
从 启动 舶来品 启动说明
从 launch.actions 舶来品 声明启动参数
从 launch.actions 舶来品 群组行动
从 launch.actions 舶来品 包含启动描述
从 launch.launch_description_sources 舶来品 PythonLaunchDescriptionSource
从 launch.substitutions 舶来品 启动配置
从 launch.substitutions 舶来品 文本替换
从 launch_ros.actions 舶来品 节点
从 launch_ros.actions 舶来品 PushRosNamespace
从 launch_xml.launch_description_sources 舶来品 XMLLaunchDescriptionSource
从 launch_yaml.launch_description_sources 舶来品 YAMLLaunchDescriptionSource
捍卫 生成发射描述():
# 可以通过命令行设置参数,也可以使用默认参数
背景_r_启动参数 = 声明启动参数(
"background_r";, 默认值=文本替换(文本="0";)
)
背景_g_launch_arg = 声明启动参数(
"background_g";, 默认值=文本替换(文本="255";)
)
背景_b_启动参数 = 声明启动参数(
"background_b";, 默认值=文本替换(文本="0";)
)
chatter_py_ns_launch_arg = 声明启动参数(
"chatter_py_ns";, 默认值=文本替换(文本="chatter/py/ns";)
)
chatter_xml_ns_launch_arg = 声明启动参数(
"chatter_xml_ns";, 默认值=文本替换(文本="chatter/xml/ns";)
)
chatter_yaml_ns_launch_arg = 声明启动参数(
"chatter_yaml_ns";, 默认值=文本替换(文本="chatter/yaml/ns";)
)
# 加入另一个启动文件
启动包含 = 包含启动描述(
PythonLaunchDescriptionSource(
os.路.加入(
获取软件包共享目录('demo_nodes_cpp'),
'launch/topics/talker_listener_launch.py';))
)
# 在 chatter_py_ns 命名空间中加入 Python 启动文件
启动_py_include_with_namespace。 = 群组行动(
行动=[
# push_ros_namespace 用来设置包含节点的命名空间
PushRosNamespace('chatter_py_ns'),
包含启动描述(
PythonLaunchDescriptionSource(
os.路.加入(
获取软件包共享目录('demo_nodes_cpp'),
'launch/topics/talker_listener_launch.py';))
),
]
)
# 在 chatter_xml_ns 命名空间中加入一个 xml 启动文件
包含名称空间的启动_xml_include_with_namespace = 群组行动(
行动=[
# push_ros_namespace 用来设置包含节点的命名空间
PushRosNamespace('chatter_xml_ns'),
包含启动描述(
XMLLaunchDescriptionSource(
os.路.加入(
获取软件包共享目录('demo_nodes_cpp'),
'launch/topics/talker_listener_launch.xml';))
),
]
)
# 在 chatter_yaml_ns 命名空间中加入 yaml 启动文件
启动_yaml_include_with_namespace。 = 群组行动(
行动=[
# push_ros_namespace 用来设置包含节点的命名空间
PushRosNamespace('chatter_yaml_ns'),
包含启动描述(
YAMLLaunchDescriptionSource(
os.路.加入(
获取软件包共享目录('demo_nodes_cpp'),
'launch/topics/talker_listener_launch.yaml';))
),
]
)
# 在 turtlesim1 命名空间中启动一个 turtlesim_node
海龟模拟节点 = 节点(
包装='turtlesim';,
命名空间='turtlesim1';,
可执行='turtlesim_node',
名字='sim';
)
# 在 turtlesim2 命名空间中启动另一个 turtlesim_node
# 并使用 args 设置参数
有参数的节点 = 节点(
包装='turtlesim';,
命名空间='turtlesim2';,
可执行='turtlesim_node',
名字='sim';,
参数=[{
"background_r";: 启动配置('background_r'),
"background_g";: 启动配置('background_g'),
"background_b";: 启动配置('background_b'),
}]
)
# 执行重新映射,使两只海龟都监听同一命令主题
forward_turtlesim_commands_to_second_turtlesim_node = 节点(
包装='turtlesim';,
可执行='模仿';,
名字='模仿';,
重置=[
('/input/pose';, '/turtlesim1/turtle1/pose';),
('/output/cmd_vel';, '/turtlesim2/turtle1/cmd_vel';),
]
)
返回 启动说明([
背景_r_启动参数,
背景_g_launch_arg,
背景_b_启动参数,
chatter_py_ns_launch_arg,
chatter_xml_ns_launch_arg,
chatter_yaml_ns_launch_arg,
启动包含,
启动_py_include_with_namespace。,
包含名称空间的启动_xml_include_with_namespace,
启动_yaml_include_with_namespace。,
海龟模拟节点,
有参数的节点,
forward_turtlesim_commands_to_second_turtlesim_node,
])
<!-- example_launch.xml -->;
启动>;
<!--可通过命令行设置的参数或将使用默认值-->;
<arg 名称"background_r"; 默认值="0"; />;
<arg 名称"background_g"; 默认值="255"; />;
<arg 名称"background_b"; 默认值="0"; />;
<arg 名称"chatter_py_ns"; 默认值="chatter/py/ns"; />;
<arg 名称"chatter_xml_ns"; 默认值="chatter/xml/ns"; />;
<arg 名称"chatter_yaml_ns"; 默认值="chatter/yaml/ns"; />;
<!-- 包括另一个启动文件 -->;
包括 file="$(find-pkg-share demo_nodes_cpp)/launch/topics/talker_listener_launch.py"; />;
<!-- 在 chatter_py_ns 名称空间中包含 Python 启动文件-->;
组>;
<!-- push_ros_namespace 用于设置包含节点的命名空间 -->;
<push_ros_namespace namespace="$(var chatter_py_ns)"; />;
包括 file="$(find-pkg-share demo_nodes_cpp)/launch/topics/talker_listener_launch.py"; />;
</group>;
<!-- 在 chatter_xml_ns 名称空间中包含一个 xml 启动文件-->;
组>;
<!-- push_ros_namespace 用于设置包含节点的命名空间 -->;
<push_ros_namespace namespace="$(var chatter_xml_ns)"; />;
包括 file="$(find-pkg-share demo_nodes_cpp)/launch/topics/talker_listener_launch.xml"; />;
</group>;
<!-- 在 chatter_yaml_ns 命名空间中包含 yaml 启动文件-->;
组>;
<!-- push_ros_namespace 用于设置包含节点的命名空间 -->;
<push_ros_namespace namespace="$(var chatter_yaml_ns)"; />;
包括 file="$(find-pkg-share demo_nodes_cpp)/launch/topics/talker_listener_launch.yaml"; />;
</group>;
<!-- 在 turtlesim1 命名空间中启动一个 turtlesim_node -->;
节点 pkg="turtlesim"; exec="turtlesim_node"; 名称"sim"; namespace="turtlesim1"; />;
在 turtlesim2 命名空间中启动另一个 turtlesim_node
并使用 args 设置参数 -->;
节点 pkg="turtlesim"; exec="turtlesim_node"; 名称"sim"; namespace="turtlesim2";>;
参数 名称"background_r"; value="$(var background_r)"; />;
参数 名称"background_g"; value="$(var background_g)"; />;
参数 名称"background_b"; value="$(var background_b)"; />;
</node>;
<!--执行重新映射,使两只海龟聆听相同的命令主题-->;
节点 pkg="turtlesim"; exec=模仿; 名称模仿;>;
重新映射 从="/input/pose"; 至="/turtlesim1/turtle1/pose"; />;
重新映射 从="/output/cmd_vel"; 至="/turtlesim2/turtle1/cmd_vel"; />;
</node>;
</launch>;
# example_launch.yaml
启动:
# 可以通过命令行设置参数,也可以使用默认参数
- 雅格:
名字: "background_r";
默认: "0";
- 雅格:
名字: "background_g";
默认: "255";
- 雅格:
名字: "background_b";
默认: "0";
- 雅格:
名字: "chatter_py_ns";
默认: "chatter/py/ns";
- 雅格:
名字: "chatter_xml_ns";
默认: "chatter/xml/ns";
- 雅格:
名字: "chatter_yaml_ns";
默认: "chatter/yaml/ns";
# 加入另一个启动文件
- 包括:
文件: "$(find-pkg-share demo_nodes_cpp)/launch/topics/talker_listener_launch.py";
# 在 chatter_py_ns 命名空间中加入 Python 启动文件
- 组:
- push_ros_namespace:
命名空间: "$(var 喋喋不休_py_ns)";
- 包括:
文件: "$(find-pkg-share demo_nodes_cpp)/launch/topics/talker_listener_launch.py";
# 在 chatter_xml_ns 命名空间中加入一个 xml 启动文件
- 组:
- push_ros_namespace:
命名空间: "$(var 喋喋不休_xml_ns)";
- 包括:
文件: "$(find-pkg-share demo_nodes_cpp)/launch/topics/talker_listener_launch.xml";
# 在 chatter_yaml_ns 命名空间中加入 yaml 启动文件
- 组:
- push_ros_namespace:
命名空间: "$(var 喋喋不休_yaml_ns)";
- 包括:
文件: "$(find-pkg-share demo_nodes_cpp)/launch/topics/talker_listener_launch.aml";
# 在 turtlesim1 命名空间中启动一个 turtlesim_node
- 网站:
包: "turtlesim";
执行: "turtlesim_node";
名字: "sim";
命名空间: "turtlesim1";
# 在 turtlesim2 命名空间中启动另一个 turtlesim_node 并使用 args 设置参数
- 网站:
包: "turtlesim";
执行: "turtlesim_node";
名字: "sim";
命名空间: "turtlesim2";
停止:
-
名字: "background_r";
价值: "$(var background_r)";
-
名字: "background_g";
价值: "$(var background_g)";
-
名字: "background_b";
价值: "$(var 背景_b)";
# 执行重新映射,使两只海龟都监听同一命令主题
- 网站:
包: "turtlesim";
执行: 模仿;
名字: 模仿;
重映射:
-
从: "/input/pose";
至: "/turtlesim1/turtle1/pose";
-
从: "/output/cmd_vel";
至: "/turtlesim2/turtle1/cmd_vel";
从命令行使用启动文件
启动
运行上述任何启动文件时,都可以使用 玫瑰2 启动
.要在本地试用它们,可以创建一个新软件包并使用
ros2 启动 <package_name> <launch_file_name>;
或通过指定启动文件的路径直接运行该文件
ros2 launch <path_to_launch_file>;
设置参数
要设置传递给启动文件的参数,应使用 key:=value
语法。例如,您可以设置 背景_r
方法如下
ros2 launch <package_name> <launch_file_name> background_r:=255
或
ros2 launch <path_to_launch_file> background_r:=255
控制海龟
要测试重映射是否有效,可以在另一个终端运行以下命令来控制海龟:
ros2 run turtlesim turtle_teleop_key --ros-args --remap __ns:=/turtlesim1
Python、XML 或 YAML:我应该使用哪种语言?
备注
ROS 1 中的启动文件是用 XML 编写的,因此对于来自 ROS 1 的用户来说,XML 可能是最熟悉不过的了。 要了解有哪些变化,可以访问 迁移启动文件.
对于大多数应用程序来说,选择哪种 ROS 2 启动格式取决于开发人员的偏好。不过,如果你的启动文件需要有 XML 或 YAML 无法实现的灵活性,你可以使用 Python 来编写启动文件。由于以下两个原因,使用 Python 编写 ROS 2 启动文件更为灵活:
Python 是一种脚本语言,因此您可以在启动文件中使用这种语言及其库。
ros2/launch (一般发射功能)和 ros2/launch_ros (ROS 2 的特定启动功能)是用 Python 编写的,因此您可以访问 XML 和 YAML 可能无法显示的较低级别的启动功能。
尽管如此,用 Python 编写的启动文件可能比 XML 或 YAML 编写的文件更复杂、更冗长。