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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

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

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

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

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

這是因為ROS沿用了計算機(jī)網(wǎng)絡(luò)中“節(jié)點”的概念。

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

下面來看一下節(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函數(shù)里首先調(diào)用了init()函數(shù)初始化一個節(jié)點,該函數(shù)的定義在init.cpp文件中。

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

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

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

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

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

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

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;
  }
}

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

我們再進(jìn)入node_handle.cpp文件,發(fā)現(xiàn)構(gòu)造函數(shù)NodeHandle::NodeHandle調(diào)用了自己的construct函數(shù)。然后,順藤摸瓜找到construct函數(shù),它里面又調(diào)用了ros::start()函數(shù)。

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

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

完成實例化后馬上又調(diào)用了各自的start()函數(shù),啟動相應(yīng)的動作。

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

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

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

    關(guān)注

    19

    文章

    7174

    瀏覽量

    87152
  • 節(jié)點
    +關(guān)注

    關(guān)注

    0

    文章

    212

    瀏覽量

    24295
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    7389

    瀏覽量

    88211
  • ROS
    ROS
    +關(guān)注

    關(guān)注

    1

    文章

    276

    瀏覽量

    16882
收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    ROS中的序列化實現(xiàn)

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

    ROS是如何設(shè)計的 ROS客戶端庫

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

    ROS中XMLRPC是什么

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

    ROS核心框架介紹

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

    ros的基本概念是什么

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

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

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

    ROS通信接口機(jī)制介紹

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

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

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