编写可组合节点(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';: 正确}],
        ),
    ]
))

注意事项

如果需要多线程运行,不要将可执行文件设置为 组件容器,将其设置为 组件容器