编写可组合节点(C++)
起始地点
假设您有一个定期 rclcpp::Node
您希望在与其他节点相同的进程中运行的可执行文件,以提高通信效率。
我们将从一个直接继承自 节点
也定义了一个 main 方法。
命名空间 马驹
{
类 VincentDriver : 公 rclcpp::节点
{
// ...
};
}
int 主要(int 参数, 烧焦 * 参数[])
{
rclcpp::启动(参数, 参数);
rclcpp::后旋(标准::共享<;马驹::VincentDriver>;());
rclcpp::关闭();
返回 0;
}
这通常会在 Cmake 中编译为可执行文件。
# ...
添加可执行(vincent_driver src/vincent_driver.cpp)
# ...
安装(目标 vincent_driver
目的地 lib/${项目名称}
)
代码更新
添加软件包依赖
您的 package.xml 应依赖于 rclcpp_components
, a la
<依赖>;rclcpp_components依赖</depend>;
或者,您也可以单独添加一个 build_depend/exec_depend
.
类别定义
对类定义的唯一修改是确保 类的构造函数 需要 节点选项
争论。
VincentDriver(缢 rclcpp::节点选项 及样品; 选项) : 节点("vincent_driver";, 选项)
{
// ...
}
不再使用主要方法
用一个 插件库
-式的宏调用。
#include <rclcpp_components/register_node_macro.hpp>;
rclcpp_components_register_node(马驹::VincentDriver)
注意事项
如果您要替换的主方法包含一个 多线程执行器
请务必注意并确保您的容器节点是多线程的。请参见以下部分。
CMake 改动
首先,添加 rclcpp_components
作为 CMakeLists.txt 中的依赖项:
查找软件包(rclcpp_components 要求)
其次,我们将替换我们的 添加可执行
用 add_library
新的目标名称。
add_library(vincent_driver_component src/vincent_driver.cpp)
第三,将其他使用旧目标机的构建命令替换为使用新目标机的构建命令。 ament_target_dependencies(vincent_driver ...)
成为 ament_target_dependencies(vincent_driver_component) ...)
第四,添加一条新命令来声明你的组件。
rclcpp_components_register_node(
vincent_driver_component
插件 "palomino::VincentDriver";
可执行 vincent_driver
)
第五步,也是最后一步,修改 CMake 中对旧目标运行的任何安装命令,改为安装库版本。例如,不要将任一目标安装到 lib/${PROJECT_NAME}
.替换为图书馆安装。
输出目标(export_vincent_driver_component)
安装(目标 vincent_driver_component
出口 export_vincent_driver_component
存档 目的地 lib
图书馆 目的地 lib
运行时间 目的地 箱柜
)
运行节点
参见 构图教程 深入了解节点的组成。简单来说,如果在 Python 启动文件中包含以下内容、
从 launch_ros.actions 舶来品 节点
# ..
ld.add_action(节点(
包装='palomino';,
可执行='vincent_driver',
# ..
))
你可以用
从 launch_ros.actions 舶来品 可组合节点容器
从 launch_ros.descriptions 舶来品 可组合节点
# ..
ld.add_action(可组合节点容器(
名字='a_buncha_nodes',
命名空间='',
包装='rclcpp_components';,
可执行='component_container';,
可组合节点描述=[
可组合节点(
包装='palomino';,
插头='palomino::VincentDriver';,
名字='vincent_driver',
# ..
额外参数=[{'use_intra_process_comms';: 正确}],
),
]
))
注意事项
如果需要多线程运行,不要将可执行文件设置为 组件容器
,将其设置为 组件容器