ROS2工具之组件加载

Posted by Mu Wenfeng on 2021-08-28

关于组件

1. 编写组件

ROS2中的组件仅仅被编译成共享库中,没有main函数。组件同时是rclcpp::Node的子类,并且它一样可以创建发布者、订阅者、服务器和客户端。

一旦创建了一个组件,它就必须在索引中注册才能被发现。

1
2
3
4
5
add_library(talker_component SHARED
src/talker_component.cpp)
rclcpp_components_register_nodes(talker_component "composition::Talker")
# To register multiple components in the same shared library, use multiple calls
# rclcpp_components_register_nodes(talker_component "composition::Talker2")

2. 使用组件

常见的三种使用方法:

  • 启动一个container进程,调用container提供的ROS服务load传入的功能包名和库名指定的组件,并在运行的过程中开始执行组件。
  • 创建一个包含了多个node的客户端可执行程序,这些节点会被编译到可执行程序中。这种方式要求每个组件都拥有各自的头文件。
  • 创建launch文件,使用ros2 launch创建一个container进程去加载多个组件。

在单个进程中组合多个节点

1. 前置条件

  • 已经安装了ros2 rolling或者foxy版本

  • 查看工作区中已经注册的可用组件

    1
    ros2 component types composition

    image-20210828174916397

2. 加载组件

  • 使用ROS服务在运行时加载组件

    新开一个终端,输入以下指令启动组件容器container

    1
    ros2 run rclcpp_components component_container

    image-20210828175236424

    新开第二个终端,查看当前所有的组件

    1
    ros2 component list

    image-20210828175811970

    查看/ComponentManager下的所有组件

    1
    ros2 component list /ComponentManager

    image-20210828180150093

    在第二个终端中输入以下命令,加载talker组件

    1
    ros2 component load /ComponentManager composition composition::Talker

    image-20210828180414475

    接着在第二个终端中输入以下命令,加载listener组件

    1
    ros2 component load /ComponentManager composition composition::Listener

    image-20210828180926408

    再次查看container中加载的容器

    1
    ros2 component list

    image-20210828181104868

    或者

    image-20210828181148045

    运行结果

    image-20210828181603404

    同理,可以在运行时加载一对server和client

    1
    ros2 run rclcpp_components component_container
    1
    ros2 component load /ComponentManager composition composition::Server
    1
    ros2 component load /ComponentManager composition composition::Client
  • 使用dlopen在运行时加载组件

    1
    ros2 run composition dlopen_composition `ros2 pkg prefix composition`/lib/libtalker_component.so `ros2 pkg prefix composition`/lib/liblistener_component.so

    image-20210828182829017

    代码实现如下

    image-20210828182952895

  • 使用ROS服务在编译时加载组件

    执行composition功能包中的manual_composition节点

    1
    ros2 run composition manual_composition

    image-20210828182121589

    代码实现如下

    image-20210828182436169

  • 使用launch文件加载组件

    1
    ros2 launch composition composition_demo.launch.py

    image-20210828183136493

    image-20210828183248903