ROS2中, 组件 component概念类似于 nodelet, 会被变异成共享库, 没有main函数实现,
代码:
component 作为 rclcpp::Node的子类, 因为他不是线程控制的, 所以它不应该在构造函数中执行任何长时间运行或阻塞的任务。相反,它可以使用计时器来获得定期通知。此外,它还可以创建发布者、订阅者、服务器和客户机。
编译
点击(此处)折叠或打开
- 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")
使用/调用
发现可用的组件
点击(此处)折叠或打开
-
$ ros2 component types
-
composition
-
composition::Talker
-
composition::Listener
-
composition::Server
- composition::Client
点击(此处)折叠或打开
-
1. 在一个shell 中, 启用组件容器
-
ros2 run rclcpp_components component_container
-
2. 在第二个shell中, 确认容器正常.
-
$ ros2 component list
-
/ComponentManager
-
3. 在第二个shell中
-
$ ros2 component load /ComponentManager composition composition::Talker
-
Loaded component 1 into '/ComponentManager' container node as '/talker'## 返回调用组件的 unique ID , 此时在步骤1 的shell中会显示重复的Talker发布的消息.
-
-
4. 第二个shell中执行
-
$ ros2 component load /ComponentManager composition composition::Listener
-
Loaded component 2 into '/ComponentManager' container node as '/listener'
-
此时在步骤1 的shell中会显示重复的listener收到的消息.
-
-
5. 第二个shell中执行, 列出容器中被调用的组件
-
$ ros2 component list
-
/ComponentManager
-
1 /talker
- 2 /listener
点击(此处)折叠或打开
-
1. shell 1 中执行
-
ros2 run rclcpp_components component_container
-
-
2. shell 2 中执行
-
ros2 component load /ComponentManager composition composition::Server
-
ros2 component load /ComponentManager composition composition::Client
-
- 3. 在 shell 1 中会出现 service 的调用和反馈信息.
组件也可用通过 launch 文件来加载
ros2 launch composition composition_demo.launch.py
卸载组件
点击(此处)折叠或打开
-
$ ros2 component unload /ComponentManager 1 2
-
Unloaded component 1 from '/ComponentManager' container
- Unloaded component 2 from '/ComponentManager' container
点击(此处)折叠或打开
- ros2 run rclcpp_components component_container --ros-args -r __node:=MyContainer -r __ns:=/ns
- ros2 component load /ns/MyContainer composition composition::Listener
-
容器的名称空间重新映射不会影响已加载的组件。
点击(此处)折叠或打开
-
ros2 run rclcpp_components component_container
-
# Remap node name
-
ros2 component load /ComponentManager composition composition::Talker --node-name talker2
-
# Remap namespace
-
ros2 component load /ComponentManager composition composition::Talker --node-namespace /ns
-
# Remap both
- ros2 component load /ComponentManager composition composition::Talker --node-name talker3 --node-namespace /ns2
- $ ros2 component list ## 查看结果, 容器的名称空间重新映射不会影响已加载的组件。
- /ComponentManager
- 1 /talker2
- 2 /ns/talker
- 3 /ns2/talker3