0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ROS節(jié)點是什么 如何誕生的

麥辣雞腿堡 ? 來源:古月居 ? 作者:古月居 ? 2023-09-14 17:35 ? 次閱讀

** 一個節(jié)點的誕生**

在建立連接之前,首先要有節(jié)點。

節(jié)點就是一個獨立的程序,它運行起來后就是一個普通的進程,與計算機中其它的進程并沒有太大區(qū)別。

一個問題是:ROS中為什么把一個獨立的程序稱為“節(jié)點”

這是因為ROS沿用了計算機網絡中“節(jié)點”的概念。

在一個網絡中,例如互聯網,每一個上網的計算機就是一個節(jié)點。前面我們看到的客戶端、服務器這樣的稱呼,也是從計算機網絡中借用的。

下面來看一下節(jié)點是如何誕生的。我們在第一次使用ROS時,一般都會照著官方教程編寫一個talker和一個listener節(jié)點,以熟悉ROS的使用方法。

我們以talker為例,它的部分代碼如下。

#include "ros/ros.h"
int main(int argc, char **argv)
{
  /* You must call one of the versions of ros::init() before using any other part of the ROS system. */
  ros::init(argc, argv, "talker");
  ros::NodeHandle n;

main函數里首先調用了init()函數初始化一個節(jié)點,該函數的定義在init.cpp文件中。

當我們的程序運行到init()函數時,一個節(jié)點就呱呱墜地了。

而且在出生的同時我們還順道給他起好了名字,也就是"talker"。

名字是隨便起的,但是起名是必須的。

我們進入init()函數里看看它做了什么,代碼如下,看上去還是挺復雜的。它初始化了一個叫g_global_queue的數據,它的類型是CallbackQueuePtr。

這是個相當重要的類,叫“回調隊列”,后面還會見到它。init()函數還調用了network、master、this_node、file_log、param這幾個命名空間里的init初始化函數各自實現一些變量的初始化,這些變量都以g開頭,例如g_host、g_uri,用來表明它們是全局變量。

其中,network::init完成節(jié)點主機名、IP地址等的初始化,master::init獲取master的URI、主機號和端口號。

this_node::init定義節(jié)點的命名空間和節(jié)點的名字,沒錯,把我們給節(jié)點起的名字就存儲在這里。file_log::init初始化日志文件的路徑。

void init(const M_string& remappings, const std::string& name, uint32_t options)
{
  if (!g_atexit_registered) {
    g_atexit_registered = true;
    atexit(atexitCallback);
  }
  if (!g_global_queue) {
    g_global_queue.reset(new CallbackQueue);
  }
  if (!g_initialized) {
    g_init_options = options;
    g_ok = true;
    ROSCONSOLE_AUTOINIT;
    // Disable SIGPIPE
#ifndef WIN32
    signal(SIGPIPE, SIG_IGN);
#else
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 0), &wsaData);
#endif
    check_ipv6_environment();
    network::init(remappings);
    master::init(remappings);
    // names:: namespace is initialized by this_node
    this_node::init(name, remappings, options);
    file_log::init(remappings);
    param::init(remappings);
    g_initialized = true;
  }
}

完成初始化以后,就進入下一步ros::NodeHandle n定義句柄。

我們再進入node_handle.cpp文件,發(fā)現構造函數NodeHandle::NodeHandle調用了自己的construct函數。然后,順藤摸瓜找到construct函數,它里面又調用了ros::start()函數。

沒錯,我們又繞回到了init.cpp文件。

ros::start()函數主要實例化了幾個重要的類,如下。

完成實例化后馬上又調用了各自的start()函數,啟動相應的動作。

這些都做完了以后就可以發(fā)布或訂閱消息了。

一個節(jié)點的故事暫時就到這了。

TopicManager::instance()- >start();
ServiceManager::instance()- >start();
ConnectionManager::instance()- >start();
PollManager::instance()- >start();
XMLRPCManager::instance()- >start();
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 計算機
    +關注

    關注

    19

    文章

    7500

    瀏覽量

    88032
  • 節(jié)點
    +關注

    關注

    0

    文章

    219

    瀏覽量

    24441
  • 網絡
    +關注

    關注

    14

    文章

    7570

    瀏覽量

    88833
  • ROS
    ROS
    +關注

    關注

    1

    文章

    278

    瀏覽量

    17019
收藏 人收藏

    評論

    相關推薦

    ROS讓機器人開發(fā)更便捷,基于RK3568J+Debian系統(tǒng)發(fā)布!

    SD啟動卡插至評估板Micro SD卡槽。亦可通過SD升級卡或USB固化方式將系統(tǒng)固化至eMMC。 基于Python語言的通信演示 案例功能:基于Python語言,啟動ROS節(jié)點發(fā)布與訂閱消息,實現
    發(fā)表于 07-09 11:38

    在STM32上運行ROS節(jié)點——rosserial&stm32開發(fā)及調試方法 精選資料推薦

    rosserial+stm32開發(fā)及調試方法基本原理Ref: http://wiki.ros.org/rosserial簡言之,rosserial提供一種嵌入式節(jié)點和運行在主控PC上
    發(fā)表于 08-24 06:19

    Autolabor ROS驅動模塊的節(jié)點有何功能

    Autolabor ROS驅動模塊包含哪些?Autolabor ROS驅動模塊的節(jié)點有何功能?
    發(fā)表于 09-23 08:08

    搭建ARM+ROS的硬件載體之ROS的移植及測試方法

    roscore來啟動運行ros節(jié)點必要的ROS Master和ROS parameter,運行情況如下所示。原作者:武漢萬象奧科
    發(fā)表于 03-09 13:55

    ROS讓機器人開發(fā)更便捷,基于RK3568J+Debian系統(tǒng)發(fā)布!

    。 基于Python語言的通信演示案例功能:基于Python語言,啟動ROS節(jié)點發(fā)布與訂閱消息,實現訂閱消息節(jié)點與發(fā)布消息節(jié)點之間的實時通信。請將評估板上電啟動,執(zhí)行如下命令,配置評估
    發(fā)表于 11-30 16:01

    區(qū)塊鏈超級節(jié)點誕生與現狀分析

    超級節(jié)點,即在采用DPOS共識機制的公鏈中,經過持幣用戶投票選舉產生、享受,并負責打包與生產區(qū)塊的少數記賬節(jié)點。這個概念在18年年初迅速在區(qū)塊鏈行業(yè)走紅,乃至于成為許多新興公鏈的標配,但實際上它所代表的DPOS共識機制已經誕生
    發(fā)表于 02-14 13:33 ?1193次閱讀

    一個機器人操作系統(tǒng)(ROS)節(jié)點系統(tǒng)

    電子發(fā)燒友網站提供《一個機器人操作系統(tǒng)(ROS)節(jié)點系統(tǒng).zip》資料免費下載
    發(fā)表于 07-06 10:49 ?1次下載
    一個機器人操作系統(tǒng)(<b class='flag-5'>ROS</b>)<b class='flag-5'>節(jié)點</b>系統(tǒng)

    ROS中的序列化實現

    不是很多。 為什么ROS不使用現成的序列化工具或者庫呢?可能ROS誕生的時候(2007年),有些序列化庫可能還不存在(protobuf誕生于2008年),更有可能是
    的頭像 發(fā)表于 09-14 17:26 ?916次閱讀

    ROS是如何設計的 ROS客戶端庫

    實現通信的代碼在ros_comm包中,如下。 其中clients文件夾一共有127個文件,看來是最大的包了。 現在我們來到了ROS最核心的地帶。 客戶端這個名詞出現的有些突然,一個機器人操作系統(tǒng)里
    的頭像 發(fā)表于 09-14 17:29 ?870次閱讀
    <b class='flag-5'>ROS</b>是如何設計的 <b class='flag-5'>ROS</b>客戶端庫

    ROS中XMLRPC是什么

    XMLRPC是什么? 關于ROS節(jié)點建立連接的技術細節(jié),官方文檔說的非常簡單,在這里ROS Technical Overview。沒有基礎的同學看這個介紹必然還是不懂。 在ROS中,
    的頭像 發(fā)表于 09-14 17:40 ?994次閱讀

    ROS核心框架介紹

    ROS核心框架 對于第一個問題,我也沒仔細研究過源碼,核心代碼基本由python和C++組成,運用了xmlrpc機制,每個運行的節(jié)點可以理解成一個進程。進程間通訊有些是共享內存的方式(比如
    的頭像 發(fā)表于 11-21 18:07 ?998次閱讀
    <b class='flag-5'>ROS</b>核心框架介紹

    ros的基本概念是什么

    基本概念: ROS是一個用于在不同進程間匿名的發(fā)布、訂閱、傳遞信息的中間件。 ROS2系統(tǒng)的核心部分是ROS網絡(ROS Graph)。 ROS
    的頭像 發(fā)表于 11-27 11:21 ?1818次閱讀

    利用 NVIDIA Isaac Transport for ROS 提升自定義 ROS 圖形性能

    NVIDIA Isaac Transport for ROS(NITROS) 是隨 ROS 2 Humble 加入的兩項硬件加速功能——類型適配和類型協(xié)商。 類型適配 使 ROS 節(jié)點
    的頭像 發(fā)表于 11-30 19:35 ?638次閱讀
    利用 NVIDIA Isaac Transport for <b class='flag-5'>ROS</b> 提升自定義 <b class='flag-5'>ROS</b> 圖形性能

    ROS通信接口機制介紹

    每一種通信種定義的接口,各種節(jié)點才能有機的聯系到一起。 語言無關 為了保證每一個節(jié)點可以使用不同語言編程,ROS將這些接口的設計做成了和語言無關的。 比如這里看到的int32表示32位的整型數,int64表示64位的整型數,bo
    的頭像 發(fā)表于 12-01 15:03 ?853次閱讀
    <b class='flag-5'>ROS</b>通信接口機制介紹

    移動機器人與ROS操作系統(tǒng)原理與應用

    ROS1不同的是,ROS2誕生的目的就是為了讓更多機器人使用,所以在設計上更加符合技術的發(fā)展方向,也運用了很多最近的技術框架。
    發(fā)表于 01-02 12:28 ?594次閱讀
    移動機器人與<b class='flag-5'>ROS</b>操作系統(tǒng)原理與應用