第 10 章 nodelet(自學二刷筆記)

重要參考:

課程鏈接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ

講義鏈接:Introduction · Autolabor-ROS機器人入門課程《ROS理論與實踐》零基礎教程

10.4 nodelet

ROS通信是基于Node(節點)的,Node使用方便、易于擴展,可以滿足ROS中大多數應用場景,但是也存在一些局限性,由于一個Node啟動之后獨占一根進程,不同Node之間數據交互其實是不同進程之間的數據交互,當傳輸類似于圖片、點云的大容量數據時,會出現延時與阻塞的情況,比如:

現在需要編寫一個相機驅動,在該驅動中有兩個節點實現:其中節點A負責發布原始圖像數據,節點B訂閱原始圖像數據并在圖像上標注人臉。如果節點A與節點B仍按照之前實現,兩個節點分別對應不同的進程,在兩個進程之間傳遞容量可觀圖像數據,可能就會出現延時的情況,那么該如何優化呢?

ROS中給出的解決方案是:Nodelet,通過Nodelet可以將多個節點集成進一個進程。


概念

nodelet軟件包旨在提供在同一進程中運行多個算法(節點)的方式,不同算法之間通過傳遞指向數據的指針來代替了數據本身的傳輸(類似于編程傳值與傳址的區別),從而實現零成本的數據拷貝。

nodelet功能包的核心實現也是插件,是對插件的進一步封裝:

  • 不同算法被封裝進插件類,可以像單獨的節點一樣運行;
  • 在該功能包中提供插件類實現的基類:Nodelet;
  • 并且提供了加載插件類的類加載器:NodeletLoader。
作用

應用于大容量數據傳輸的場景,提高節點間的數據交互效率,避免延時與阻塞。


另請參考:

  • nodelet - ROS Wiki

  • nodelet/Tutorials/Running a nodelet - ROS Wiki

  • common_tutorials/nodelet_tutorial_math at noetic-devel · ros/common_tutorials · GitHub

10.4.1 使用演示

在ROS中內置了nodelet案例,我們先以該案例演示nodelet的基本使用語法,基本流程如下:

  1. 案例簡介;
  2. nodelet基本使用語法;
  3. 內置案例調用。
1.案例簡介

以“ros- [ROS_DISTRO] -desktop-full”命令安裝ROS時,nodelet默認被安裝,如未安裝,請調用如下命令自行安裝:

sudo apt install ros-<<ROS_DISTRO>>-nodelet-tutorial-math

在該案例中,定義了一個Nodelet插件類:Plus,這個節點可以訂閱一個數字,并將訂閱到的數字與參數服務器中的 value 參數相加后再發布。

需求:再同一線程中啟動兩個Plus節點A與B,向A發布一個數字,然后經A處理后,再發布并作為B的輸入,最后打印B的輸出。

2.nodelet 基本使用語法

使用語法如下:

nodelet load pkg/Type manager - Launch a nodelet of type pkg/Type on manager manager
nodelet standalone pkg/Type   - Launch a nodelet of type pkg/Type in a standalone node
nodelet unload name manager   - Unload a nodelet a nodelet by name from manager
nodelet manager               - Launch a nodelet manager node
3.內置案例調用
1.啟動roscore
roscore
2.啟動manager
rosrun nodelet nodelet manager __name:=mymanager

__name:= 用于設置管理器名稱。

3.添加nodelet節點

添加第一個節點:

rosrun nodelet nodelet load nodelet_tutorial_math/Plus mymanager __name:=n1 _value:=100

添加第二個節點:

rosrun nodelet nodelet load nodelet_tutorial_math/Plus mymanager __name:=n2 _value:=-50 /n2/in:=/n1/out

PS: 解釋

rosrun nodelet nodelet load nodelet_tutorial_math/Plus mymanager __name:=n1 _value:=100

  1. rosnode list 查看,nodelet 的節點名稱是: /n1;
  2. rostopic list 查看,訂閱的話題是: /n1/in,發布的話題是: /n1/out;
  3. rosparam list查看,參數名稱是: /n1/value。

rosrun nodelet nodelet standalone nodelet_tutorial_math/Plus mymanager __name:=n2 _value:=-50 /n2/in:=/n1/out

  1. 第二個nodelet 與第一個同理;
  2. 第二個nodelet 訂閱的話題由 /n2/in 重映射為 /n1/out。

優化:也可以將上述實現集成進launch文件:

<launch><!-- 設置nodelet管理器 --><node pkg="nodelet" type="nodelet" name="mymanager" args="manager" output="screen" /><!-- 啟動節點1,名稱為 n1, 參數 /n1/value 為100 --><node pkg="nodelet" type="nodelet" name="n1" args="load nodelet_tutorial_math/Plus mymanager" output="screen" ><param name="value" value="100" /></node><!-- 啟動節點2,名稱為 n2, 參數 /n2/value 為-50 --><node pkg="nodelet" type="nodelet" name="n2" args="load nodelet_tutorial_math/Plus mymanager" output="screen" ><param name="value" value="-50" /><remap from="/n2/in" to="/n1/out" /></node></launch>
4.執行

向節點n1發布消息:

rostopic pub -r 10 /n1/in std_msgs/Float64 "data: 10.0"

打印節點n2發布的消息:

rostopic echo /n2/out

最終輸出結果應該是:60。

10.4.2 nodelet實現

nodelet本質也是插件,實現流程與插件實現流程類似,并且更為簡單,不需要自定義接口,也不需要使用類加載器加載插件類。

需求:參考 nodelet 案例,編寫 nodelet 插件類,可以訂閱輸入數據,設置參數,發布訂閱數據與參數相加的結果。

流程:

  1. 準備;

  2. 創建插件類并注冊插件;

  3. 構建插件庫;

  4. 使插件可用于ROS工具鏈;

  5. 執行。

1.準備

新建功能包,導入依賴:?roscpp、nodelet;

2.創建插件類并注冊插件
#include "nodelet/nodelet.h"
#include "pluginlib/class_list_macros.h"
#include "ros/ros.h"
#include "std_msgs/Float64.h"namespace nodelet_demo_ns {
class MyPlus: public nodelet::Nodelet {public:MyPlus(){value = 0.0;}void onInit(){//獲取 NodeHandleros::NodeHandle& nh = getPrivateNodeHandle();//從參數服務器獲取參數nh.getParam("value",value);//創建發布與訂閱對象pub = nh.advertise<std_msgs::Float64>("out",100);sub = nh.subscribe<std_msgs::Float64>("in",100,&MyPlus::doCb,this);}//回調函數void doCb(const std_msgs::Float64::ConstPtr& p){double num = p->data;//數據處理double result = num + value;std_msgs::Float64 r;r.data = result;//發布pub.publish(r);}private:ros::Publisher pub;ros::Subscriber sub;double value;};
}
PLUGINLIB_EXPORT_CLASS(nodelet_demo_ns::MyPlus,nodelet::Nodelet)
3.構建插件庫

CMakeLists.txt配置如下:

...
add_library(mynodeletlibsrc/myplus.cpp
)
...
target_link_libraries(mynodeletlib${catkin_LIBRARIES}
)

編譯后,會在??工作空間/devel/lib/?生成文件:libmynodeletlib.so。

4.使插件可用于ROS工具鏈
4.1配置xml

新建 xml 文件,名稱自定義(比如:my_plus.xml),內容如下:

<library path="lib/libmynodeletlib"><class name="demo04_nodelet/MyPlus" type="nodelet_demo_ns::MyPlus" base_class_type="nodelet::Nodelet" ><description>hello</description></class>
</library>
4.2導出插件
<export><!-- Other tools can request additional information be placed here --><nodelet plugin="${prefix}/my_plus.xml" />
</export>
5.執行

可以通過launch文件執行nodelet,示例內容如下:

<launch><node pkg="nodelet" type="nodelet" name="my" args="manager" output="screen" /><node pkg="nodelet" type="nodelet" name="p1" args="load demo04_nodelet/MyPlus my" output="screen"><param name="value" value="100" /><remap from="/p1/out" to="con" /></node><node pkg="nodelet" type="nodelet" name="p2" args="load demo04_nodelet/MyPlus my" output="screen"><param name="value" value="-50" /><remap from="/p2/in" to="con" /></node></launch>

運行launch文件,可以參考上一節方式向 p1發布數據,并訂閱p2輸出的數據,最終運行結果也與上一節類似。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23031.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23031.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23031.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SBOM是如何幫助醫療器械制造商提高產品透明度的?

SBOM&#xff08;軟件物料清單&#xff09;通過以下方式幫助醫療器械制造商提高產品透明度&#xff1a; 1. 詳細記錄軟件組成 SBOM詳細列出了醫療器械所使用的所有軟件組件、版本、作者、許可證信息等。這使得制造商能夠清晰地了解產品的軟件組成&#xff0c;包括每個組件的來…

基于springboot實現民族婚紗預定系統項目【項目源碼+論文說明】

基于springboot實現民族婚紗預定系統的設計演示 摘要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本民族婚紗預定系統就是在這樣的大環境下誕生&#xff0c;其可…

【Emgu CV教程】10.15、FillPoly()不規則形狀填充顏色

文章目錄 一、概念二、填充不規則圖形1.原始素材2.代碼3.運行結果 二、最大輪廓填充顏色1.原始素材2.代碼3.運行結果 一、概念 圖像的連通域是指圖像中具有相同像素值并且位置相鄰的像素組成的區域&#xff0c;連通域分析是指在圖像中尋找出彼此互相獨立的連通域并將其標記出來…

【最新鴻蒙應用開發】——Want信息載體

信息傳遞載體Want 1、概述 上一章節我們學習了UIAbility組件 【最新鴻蒙應用開發】——一篇搞懂什么是UIAbility-CSDN博客 &#xff0c;其中組件間的交互傳遞信息的媒介就是Want&#xff0c;本章節我們來更加深入學習Want的相關知識。 Want是一種對象&#xff0c;用于在應用組…

2. JavaScript 語法和數據類型

1. 基礎 JavaScript不區分大小寫 2. 注釋 // 單行注釋/* 這是一個更長的&#xff0c;多行注釋 *//* 然而&#xff0c;你不能&#xff0c;/* 嵌套注釋 */ 語法錯誤 */3. 聲明 var 聲明一個變量&#xff0c;可選初始化一個值。 let 聲明一個塊作用域的局部變量&#xff0c;可…

ORM(對象關系映射)概念詳解

一、技術難點 ORM&#xff0c;即對象關系映射&#xff08;Object-Relational Mapping&#xff09;&#xff0c;它的技術難點主要體現在如何將面向對象編程中的類和對象高效地映射到關系型數據庫中的表和記錄。具體來說&#xff0c;有以下幾個方面的技術挑戰&#xff1a; 數據類…

計算機畢業設計項目、管理系統、可視化大屏、大數據分析、協同過濾、推薦系統、SSM、SpringBoot、Spring、Mybatis、小程序項目編號1-500

大家好&#xff0c;我是DeBug&#xff0c;很高興你能來閱讀&#xff01;作為一名熱愛編程的程序員&#xff0c;我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里&#xff0c;我將會結合實際項目經驗&#xff0c;分享編程技巧、最佳實踐以及解決問題的方法。無論你是…

桌面型激光雕刻機的發展前景及TMC應用優勢

一、行業現狀 近兩年來&#xff0c;激光雕刻行業正處于快速發展階段。隨著人們生活水平的提高&#xff0c;對個性化、定制化產品的需求日益增加&#xff0c;激光雕刻以其獨特的創意和精美的效果&#xff0c;滿足了消費者對個性化產品的追求。同時&#xff0c;隨著科技的不斷進…

OCP 安裝 OceanBase集群(企業版3.2.4.1)

創建集群 登錄OCP界面 1.點擊左側工具欄中的集群 2.進入集群頁面后 點擊 右上角的創建集群 集群設置 進入 創建集群 頁面&#xff0c;進行 目標集群 配置 集群種類 根據 生產環境 選擇 分布式 或者 單機集中式&#xff0c;第一次安裝 集群類型 選擇 主集群。 注意&#xf…

計算機網絡到底是指什么?

計算機網絡是信息技術領域中最為核心和復雜的一部分&#xff0c;它涵蓋了眾多的技術原理和應用。下面&#xff0c;我們將從技術層面深入探討計算機網絡的相關內容。 一、計算機網絡的分層模型 計算機網絡的分層模型是網絡通信的基石&#xff0c;它將網絡通信過程劃分為不同的層…

怎么解決企業生產計劃排程的幾大難點?

生產計劃排程&#xff0c;作為企業管理中的核心環節&#xff0c;其復雜性和動態性一直困擾著眾多企業。然而&#xff0c;通過科學的策略和技術手段&#xff0c;這些難點并非不可攻克。 生產環境的動態變化&#xff0c;如臨時訂單改變、緊急插單的需求、產品流程變化等&#xff…

Linux中網絡配置項目筆記

1.NetworkManager安裝 (或者安裝network.service&#xff0c;不要一起裝防止網絡沖突) 有網絡的狀態下yum install 下載無網絡的狀態下使用預先下載rpm包 rpm -ivh systemctl start NetworkManager #啟動 systemctl stop NetworkManager #停止 systemctl restart NetworkMana…

各大AI模型訓練成本大比拼

像OpenAI的ChatGPT、谷歌的Gemini Ultra這樣的高級AI模型&#xff0c;訓練它們通常需要數百萬美元的費用&#xff0c;且該成本還在迅速上升。隨著計算需求的增加&#xff0c;訓練它們所需的計算能力的費用也在飆升。為此&#xff0c;AI公司正在重新考慮如何訓練這些生成式AI系統…

描述Servlet監聽器的類型和用途

Servlet監聽器是Servlet規范中定義的一種特殊的類&#xff0c;用于監聽Web應用程序中特定事件的發生。它們按照監聽的對象和事件類型&#xff0c;可以劃分為多種類型&#xff0c;每種類型都有其特定的用途。 監聽器的類型 按照監聽對象劃分 應用程序環境對象&#xff08;Serv…

華為OD刷題C卷 - 每日刷題 12(數組連續和,求最多可以派出多少支團隊)

1、&#xff08;數組連續和&#xff09;&#xff1a; 這段代碼是解決“數組連續和”的問題。它提供了一個Java類Main&#xff0c;其中包含main方法和getResult方法&#xff0c;用于計算給定數組中有多少個連續區間的和大于等于給定值x。 main方法首先讀取數組的長度n和閾值x&…

【Javascript修煉篇】如何對JSON格式進行轉換

這將是我們幾乎日常都會用到的一個超實用函數。 根據數據的多樣性與結構&#xff0c;API 的響應可能會返回極其復雜的 JSON 對象。有時候&#xff0c;僅僅從整個 JSON 中抓取一個字段可能就不太夠用了。我們可能需要提取多個字段來展示在網頁上。每次手動遍歷這樣的復雜 JSON …

兩站圖片滑動對比效果實現(VUE3)

像這種圖片滑動對比的效果&#xff0c;網上還不少見吧&#xff0c;但是網上卻不好找到完整現成的實現代碼&#xff0c;我找到幾個地方有類似的代碼&#xff0c;但是都不好直接移植到代碼里&#xff0c;因為很多都是使用原生htmlcssjs實現&#xff0c;太復雜了。反而不好應用到v…

Qt for Android 之 OpenCV編譯(Windows下編譯)

簡介 前兩天剛好更新了4.10, 這里以4.10作為示例進行編譯&#xff0c; Qt版本是Qt6.6.2。 準備OpenCV的Android庫 一. 使用官方編譯好的庫 1. 下載OpenCV android SDK opencv-4.10.0-android-sdk.zip 2. 解壓縮 官方提供的包含了多個架構的opencv android庫 二. 自行編譯…

十三、【源碼】ResultMap解析

源碼地址&#xff1a;https://github.com/mybatis/mybatis-3/ 倉庫地址&#xff1a;https://gitcode.net/qq_42665745/mybatis/-/tree/13-resultMap ResultMap解析 分為兩部分&#xff1a;解析和使用 1.解析 解析XML的時候單獨解析所有的resultMap標簽&#xff0c;封裝成Re…

MySQL 核心模塊揭秘 | 19 期 | 鎖模塊里有什么?什么樣?

InnoDB 中管理表鎖和行鎖的鎖模塊&#xff0c;也就是傳說中的鎖子系統&#xff0c;在內存里是什么樣的&#xff1f; 作者&#xff1a;操盛春&#xff0c;愛可生技術專家&#xff0c;公眾號『一樹一溪』作者&#xff0c;專注于研究 MySQL 和 OceanBase 源碼。 愛可生開源社區出品…