ROS2--Composition
阿里雲官方映象站:ROS2源
https://developer.aliyun.com/mirror/?utm_content=g_1000303593
ROS1 - Node vs. Nodelets #
在ROS1中可以編寫node或者nodelet,ROS1中的節點被編譯為可執行檔案,ROS1中的nodelet被編譯為shared lib,然後在執行時由容器程式載入。
我們可以簡單的理解nodelet是一組統一管理的nodes。
ROS2 - Unified API #
ROS2 中,我們推薦的程式碼編寫方式類似於nodelet-在ROS2中成為Component,這樣來說涉及的程式碼修改更少,因為可以比較順利的把ROS1中的概念移植到ROS2中,在ROS2中將兩種API(Node、Nodelet)整合為一種API。
因為我們目前將程式佈局作為執行時的決策,我們可以選擇:
- 在多程式中執行多個節點,優點是程式之間是隔離的,然後簡化單個節點之間的除錯難度;
- 在單程式中執行多個節點,優點是開銷較低,程式內的節點通訊更加高效。
此外,ros2 launch系統可以透過launch來執行這些操作。
編寫 Component #
因為Component內建於shared lib中,因為
Component沒有主函式,可以參考demos中Component中Talker的程式碼,Component通常是
rclcpp::Node
的子類,由於Component不受執行緒的控制,因此我們不應在建構函式中執行長時間執行或者阻塞的任務。此外,可以使用定時器來獲取定期的通知。此外,也可以建立Publisher和Subscriber,Server和Client。
Component類使用
rclcpp_components
中的宏來註冊自己,這是一個非常重要的特性。當這個Component的靜態庫載入到正在執行的程式時,使程式可以發現該Component,並將其視作一個入口點。
此外,一旦建立了Component,就需要在索引中註冊該元件,使得其他工具可以發現這個Component。
CMakeList.txt的例子:
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")
如果想在package中將這個component匯出為shared lib,並且在其他的package連結時使用這個package裡面的component就需要在CMakeList.txt中新增程式碼。
注意:為了component_container可以發現期望的component,需要從提供相應元件的workspace中從shell啟動或者執行component。
Using Components #
composition package為使用者提供了很多使用方法,其中較為常見的三種是:
- 先啟動一個通用的容器程式,之後使用容器程式提供的
load_node
service向程式中動態載入節點。load_node
service會透過命令列引數讀取package name,library name,之後在這個容器程式中執行這個可執行檔案。這個service可以透過命令列呼叫,也可以透過程式設計的方式呼叫。 - 建立一個定製化的可執行檔案,這個檔案中包含了多個節點,這些節點可以在編譯期確定下來,這個方法需要每個Component都有一個hpp檔案;
- 建立一個launch,使用
ros2 launch
命令建立一個容器程式,並在其中執行多個元件。
原文連結:https://www.cnblogs.com/LuoboLiam/p/14603008.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70003733/viewspace-2841929/,如需轉載,請註明出處,否則將追究法律責任。