ROS2--Composition

哈哈哈hh發表於2021-11-12

阿里雲官方映象站: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。

因為我們目前將程式佈局作為執行時的決策,我們可以選擇:

  1. 在多程式中執行多個節點,優點是程式之間是隔離的,然後簡化單個節點之間的除錯難度;
  2. 在單程式中執行多個節點,優點是開銷較低,程式內的節點通訊更加高效。

此外,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為使用者提供了很多使用方法,其中較為常見的三種是:

  1. 先啟動一個通用的容器程式,之後使用容器程式提供的 load_nodeservice向程式中動態載入節點。 load_nodeservice會透過命令列引數讀取package name,library name,之後在這個容器程式中執行這個可執行檔案。這個service可以透過命令列呼叫,也可以透過程式設計的方式呼叫。
  2. 建立一個定製化的可執行檔案,這個檔案中包含了多個節點,這些節點可以在編譯期確定下來,這個方法需要每個Component都有一個hpp檔案;
  3. 建立一個launch,使用 ros2 launch命令建立一個容器程式,並在其中執行多個元件。



原文連結:https://www.cnblogs.com/LuoboLiam/p/14603008.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70003733/viewspace-2841929/,如需轉載,請註明出處,否則將追究法律責任。