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

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

3天內不再提示

ROS機器人操作系統的實(shí)現原理(下)

jf_78858299 ? 來(lái)源:古月居 ? 作者:robinvista ? 2023-05-19 17:42 ? 次閱讀

注釋表明Stream是個(gè)基類(lèi),輸入輸出流IStream和OStream都繼承自它。

Stream的成員變量data_是個(gè)指針,指向序列化的字節流開(kāi)始的位置,它的類(lèi)型是uint8_t。

在Ubuntu系統中,uint8_t的定義是typedef unsigned char uint8_t;

所以uint8_t就是一個(gè)字節,可以用size_of()函數檢驗。data_指向的空間就是保存字節流的。

輸出流類(lèi)OStream用來(lái)序列化一個(gè)對象,它引用了serialize函數,如下。

struct OStream : public Stream
{
  static const StreamType stream_type = stream_types::Output;
  OStream(uint8_t* data, uint32_t count) : Stream(data, count) {}
  /* Serialize an item to this output stream*/
  template<typename T>
  ROS_FORCE_INLINE void next(const T& t)
{
    serialize(*this, t);
  }
  template<typename T>
  ROS_FORCE_INLINE OStream& operator<<(const T& t)
  {
    serialize(*this, t);
    return *this;
  }
};

輸入流類(lèi)IStream用來(lái)反序列化一個(gè)字節流,它引用了deserialize函數,如下。

struct ROSCPP_SERIALIZATION_DECL IStream : public Stream
{
  static const StreamType stream_type = stream_types::Input;
  IStream(uint8_t* data, uint32_t count) : Stream(data, count) {}
  /* Deserialize an item from this input stream */
  template<typename T>
  ROS_FORCE_INLINE void next(T& t)
{
    deserialize(*this, t);
  }
  template<typename T>
  ROS_FORCE_INLINE IStream& operator>>(T& t)
  {
    deserialize(*this, t);
    return *this;
  }
};

自然,serialize函數和deserialize函數就是改變數據形式的地方,它們的定義在比較靠前的地方。它們都接收兩個(gè)模板,都是內聯(lián)函數,然后里面沒(méi)什么東西,只是又調用了Serializer類(lèi)的成員函數write和read。所以,serialize和deserialize函數就是個(gè)二道販子。

// Serialize an object.  Stream here should normally be a ros::serialization::OStream
template<typename T, typename Stream>
inline void serialize(Stream& stream, const T& t)
{
  Serializer

所以,我們來(lái)分析Serializer類(lèi),如下。我們發(fā)現,write和read函數又調用了類(lèi)型里的serialize函數和deserialize函數。

頭別暈,這里的serialize和deserialize函數跟上面的同名函數不是一回事。

注釋中說(shuō):“Specializing the Serializer class is the only thing you need to do to get the ROS serialization system to work with a type”(要想讓ROS的序列化功能適用于其它的某個(gè)類(lèi)型,你唯一需要做的就是特化這個(gè)Serializer類(lèi))。

這就涉及到的另一個(gè)知識點(diǎn)——模板特化(template specialization)。

template<typename T> struct Serializer
{
  // Write an object to the stream.  Normally the stream passed in here will be a ros::serialization::OStream
  template<typename Stream>
  inline static void write(Stream& stream, typename boost::call_traits
{
    t.serialize(stream.getData(), 0);
  }
   // Read an object from the stream.  Normally the stream passed in here will be a ros::serialization::IStream
  template<typename Stream>
  inline static void read(Stream& stream, typename boost::call_traits
{
    t.deserialize(stream.getData());
  }
  // Determine the serialized length of an object.
  inline static uint32_t serializedLength(typename boost::call_traits
{
    return t.serializationLength();
  }
};

接著(zhù)又定義了一個(gè)帶參數的宏函數ROS_CREATE_SIMPLE_SERIALIZER(Type),然后把這個(gè)宏作用到了ROS中的10種基本數據類(lèi)型,分別是:uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double。

說(shuō)明這10種數據類(lèi)型的處理方式都是類(lèi)似的??吹竭@里大家應該明白了,write和read函數都使用了memcpy函數進(jìn)行數據的移動(dòng)。

注意宏定義中的template<>語(yǔ)句,這正是模板特化的標志,關(guān)鍵詞template后面跟一對尖括號。

關(guān)于模板特化可以看這里。

#define ROS_CREATE_SIMPLE_SERIALIZER(Type) \\
  template<> struct Serializer \\
  { \\
    template

對于其它類(lèi)型的數據,例如bool、std::string、std::vector、ros::Time、ros::Duration、boost::array等等,它們各自的處理方式有細微的不同,所以不再用上面的宏函數,而是用模板特化的方式每種單獨定義,這也是為什么serialization.h這個(gè)文件這么冗長(cháng)。

對于int、double這種單個(gè)元素的數據,直接用上面特化的Serializer類(lèi)中的memcpy函數實(shí)現序列化。

對于vector、array這種多個(gè)元素的數據類(lèi)型怎么辦呢?方法是分成幾種情況,對于固定長(cháng)度簡(jiǎn)單類(lèi)型的(fixed-size simple types),還是用各自特化的Serializer類(lèi)中的memcpy函數實(shí)現,沒(méi)啥太大區別。

對于固定但是類(lèi)型不簡(jiǎn)單的(fixed-size non-simple types)或者既不固定也不簡(jiǎn)單的(non-fixed-size, non-simple types)或者固定但是不簡(jiǎn)單的(fixed-size, non-simple types),用for循環(huán)遍歷,一個(gè)元素一個(gè)元素的單獨處理。

那怎么判斷一個(gè)數據是不是固定是不是簡(jiǎn)單呢?這是在roscpp_traits文件夾中的message_traits.h完成的。

其中采用了萃取Type Traits,這是相對高級一點(diǎn)的編程技巧了,筆者也不太懂。

對序列化的介紹暫時(shí)就到這里了,有一些細節還沒(méi)講,等筆者看懂了再補。

2、消息訂閱發(fā)布

2.1ROS的本質(zhì)

如果問(wèn)ROS的本質(zhì)是什么,或者用一句話(huà)概括ROS的核心功能。那么,筆者認為ROS就是個(gè)通信庫,讓不同的程序節點(diǎn)能夠相互對話(huà)。

很多文章和書(shū)籍在介紹ROS是什么的時(shí)候,經(jīng)常使用“ROS是一個(gè)通信框架”這種描述。

但是筆者認為這種描述并不是太合適?!翱蚣堋笔莻€(gè)對初學(xué)者非常不友好的抽象詞匯,用一個(gè)更抽象難懂的概念去解釋一個(gè)本來(lái)就不清楚的概念,對初學(xué)者起不到任何幫助。

而且筆者嚴重懷疑絕大多數作者能對機器人的本質(zhì)或者軟件框架能有什么太深的理解,他們的見(jiàn)解不會(huì )比你我深刻多少。

既然提到本質(zhì),那我們就深入到最基本的問(wèn)題。

在接觸無(wú)窮的細節之前,我們不妨先做一個(gè)哲學(xué)層面的思考。

那就是,為什么ROS要解決通信問(wèn)題?

機器人涉及的東西千千萬(wàn)萬(wàn),機械、電子、軟件、人工智能無(wú)所不包,為什么底層的設計是一套用來(lái)通信的程序而不是別的東西。

到目前為止,我還沒(méi)有看到有人討論過(guò)這個(gè)問(wèn)題。這要回到機器人或者智能的本質(zhì)。

當我們在談?wù)摍C器人的時(shí)候,最首要的問(wèn)題不是硬件設計,而是對信息的處理。一個(gè)機器人需要哪些信息,信息從何而來(lái),如何傳遞,又被誰(shuí)使用,這些才是最重要的問(wèn)題。

人類(lèi)飛不鳥(niǎo),游不過(guò)魚(yú),跑不過(guò)馬,力不如牛,為什么卻自稱(chēng)萬(wàn)物之靈呢。

因為人有大腦,而且人類(lèi)大腦處理的信息更多更復雜。

拋開(kāi)物質(zhì),從信息的角度看,人與動(dòng)物、與機器人存在很多相似的地方。

機器人由許多功能模塊組成,它們之間需要協(xié)作才能形成一個(gè)有用的整體,機器人與機器人之間也需要協(xié)作才能形成一個(gè)有用的系統,要協(xié)作就離不開(kāi)通信。

需要什么樣的信息以及信息從何而來(lái)不是ROS首先關(guān)心的,因為這取決于機器人的應用場(chǎng)景。

因此,ROS首先要解決的是通信的問(wèn)題,即如何建立通信、用什么方式通信、通信的格式是什么等等一系列具體問(wèn)題。

帶著(zhù)這些問(wèn)題,我們看看ROS是如何設計的。

2.2客戶(hù)端庫

實(shí)現通信的代碼在ros_comm包中,如下。

其中clients文件夾一共有127個(gè)文件,看來(lái)是最大的包了。

現在我們來(lái)到了ROS最核心的地帶。

聲明:本文內容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權轉載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習之用,如有內容侵權或者其他違規問(wèn)題,請聯(lián)系本站處理。 舉報投訴
  • 機器人
    +關(guān)注

    關(guān)注

    207

    文章

    27329

    瀏覽量

    202163
  • 操作系統
    +關(guān)注

    關(guān)注

    37

    文章

    6378

    瀏覽量

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

    關(guān)注

    1

    文章

    273

    瀏覽量

    16783
收藏 人收藏

    評論

    相關(guān)推薦

    【IntoRobot Atom試用體驗】解決Atom搭建機器人操作系統問(wèn)題(二)

    根據上一篇文章解決Atom搭建機器人操作系統問(wèn)題(一),在做庫移植的時(shí)候會(huì )遇到以下問(wèn)題。。。。/main.cpp:1:17: fatal error: ros.h: No such file
    發(fā)表于 04-07 22:00

    機器人操作系統淺析

    機器人操作系統淺析
    發(fā)表于 09-28 11:43

    請問(wèn)能分享ROS機器人操作系統的一些資料嗎?

    菜鳥(niǎo)想要學(xué)習ROS機器人操作系統,但是沒(méi)能找到系統的資料,請問(wèn)有哪位大神研究過(guò),可以分享一些資料嗎?跪謝了?。。。。。。。?!
    發(fā)表于 02-19 23:14

    創(chuàng )龍TL5728-EasyEVM-A4開(kāi)發(fā)板如何移植ros機器人操作系統?

    創(chuàng )龍TL5728-EasyEVM-A4開(kāi)發(fā)板如何移植ros機器人操作系統?
    發(fā)表于 01-02 09:32

    ROS 2 Crystal Clemmys版機器人操作系統補充說(shuō)明

    ROS 2 Crystal Clemmys版機器人操作系統補充說(shuō)明
    發(fā)表于 06-10 11:29

    ROS RIKIBOT基礎--使用系列 第一章節】ROS機器人硬件系統 精選資料分享

    主控制器ROS控制器采用樹(shù)莓派4B或者Jetson Nano,運行運行Ubuntu Mate18.04或Ubuntu18.04系統,具體型號有差異。系統安裝有ROS
    發(fā)表于 07-30 06:59

    怎樣將微型ROS移植到機器人的RA MCU中呢

    。兩家公司宣布,用于 RA MCU 的瑞薩電子 EK-RA6M5 評估套件是 micro-ROS 開(kāi)發(fā)框架的官方支持硬件平臺。所述微ROS框架,作為業(yè)界機器人操作系統針對MCU,允許標
    發(fā)表于 02-11 06:19

    ROS機器人開(kāi)發(fā)更便捷,基于RK3568J+Debian系統發(fā)布!

    ROS系統是什么 ROS(Robot Operating System)是一個(gè)適用于機器人的開(kāi)源的元操作系統。它提供了
    發(fā)表于 11-30 16:01

    ROS的含義與機器人操作系統ROS的介紹

    Operating System 的縮寫(xiě),原本是斯坦福大學(xué)的一個(gè)機器人項目,后來(lái)由 WillowGarage 公司發(fā)展,目前由 OSRF(Open Source Robotics Foundation,Inc)公司維護的開(kāi)源項目。 1、首先是一個(gè)操作系統 根據 wiki
    發(fā)表于 09-26 14:08 ?12次下載

    機器人操作系統ROS詳細介紹

    機器人操作系統ROS詳細介紹 ROS機器人 操作系統,RobotOperatingSyste
    發(fā)表于 11-18 18:09 ?2031次閱讀

    ROS機器人操作系統實(shí)現原理解析

    首先用Rate的構造函數實(shí)例化一個(gè)對象loop_rate。調用的構造函數如下??梢?jiàn),構造函數使用輸入完成了對三個(gè)參數的初始化。
    發(fā)表于 01-03 10:56 ?539次閱讀

    ROS機器人操作系統實(shí)現原理(上)

    本文介紹ROS機器人操作系統(Robot Operating System)的實(shí)現原理,從最底層分析ROS代碼是如何
    的頭像 發(fā)表于 05-19 17:41 ?821次閱讀
    <b class='flag-5'>ROS</b><b class='flag-5'>機器人</b><b class='flag-5'>操作系統</b>的<b class='flag-5'>實(shí)現</b>原理(上)

    ROS機器人操作系統

    可能很多初學(xué)者聽(tīng)到機器人操作系統,就被“操作系統”幾個(gè)字嚇住了。其實(shí)簡(jiǎn)單點(diǎn)說(shuō),**ROS就是一個(gè)分布式的通信框架,幫助程序進(jìn)程之間更方便地通信。
    的頭像 發(fā)表于 05-19 17:46 ?1767次閱讀
    <b class='flag-5'>ROS</b><b class='flag-5'>機器人</b><b class='flag-5'>操作系統</b>

    一個(gè)機器人操作系統(ROS)節點(diǎn)系統

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

    ROS機器人操作系統實(shí)現原理

    面對序列化,很多人心中可能會(huì )有很多疑問(wèn)。 首先,為什么要序列化?或者更具體的說(shuō),既然對象的信息本來(lái)就是以字節的形式儲存在內存中,那為什么要多此一舉把一些字節數據轉換成另一種形式的、一維的、連續的字節數據呢?
    的頭像 發(fā)表于 04-27 02:39 ?627次閱讀
    <b class='flag-5'>ROS</b><b class='flag-5'>機器人</b><b class='flag-5'>操作系統</b>的<b class='flag-5'>實(shí)現</b>原理
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看