ROS1 中, nodelet会被编译成 动态库, 被其他的容器进程调用.
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
如何在运行时使用 topic 组件呢
-
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
如何在运行时使用 service 组件呢.
-
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
remapping container容器 name and namespace
-
ros2 run rclcpp_components component_container --ros-args -r __node:=MyContainer -r __ns:=/ns
-
ros2 component load /ns/MyContainer composition composition::Listener
-
容器的名称空间重新映射不会影响已加载的组件。
remapping component组件 name and namespace
-
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
阅读(9791) | 评论(0) | 转发(0) |