欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

3天內不再提示

ROS機器人操作系統(tǒng)的實現(xiàn)原理(下)

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

注釋表明Stream是個基類,輸入輸出流IStream和OStream都繼承自它。

Stream的成員變量data_是個指針,指向序列化的字節(jié)流開始的位置,它的類型是uint8_t。

在Ubuntu系統(tǒng)中,uint8_t的定義是typedef unsigned char uint8_t;

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

輸出流類OStream用來序列化一個對象,它引用了serialize函數(shù),如下。

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

輸入流類IStream用來反序列化一個字節(jié)流,它引用了deserialize函數(shù),如下。

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函數(shù)和deserialize函數(shù)就是改變數(shù)據(jù)形式的地方,它們的定義在比較靠前的地方。它們都接收兩個模板,都是內聯(lián)函數(shù),然后里面沒什么東西,只是又調用了Serializer類的成員函數(shù)write和read。所以,serialize和deserialize函數(shù)就是個二道販子。

// 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

所以,我們來分析Serializer類,如下。我們發(fā)現(xiàn),write和read函數(shù)又調用了類型里的serialize函數(shù)和deserialize函數(shù)。

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

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

這就涉及到的另一個知識點——模板特化(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();
  }
};

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

說明這10種數(shù)據(jù)類型的處理方式都是類似的??吹竭@里大家應該明白了,write和read函數(shù)都使用了memcpy函數(shù)進行數(shù)據(jù)的移動。

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

關于模板特化可以看這里。

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

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

對于int、double這種單個元素的數(shù)據(jù),直接用上面特化的Serializer類中的memcpy函數(shù)實現(xiàn)序列化。

對于vector、array這種多個元素的數(shù)據(jù)類型怎么辦呢?方法是分成幾種情況,對于固定長度簡單類型的(fixed-size simple types),還是用各自特化的Serializer類中的memcpy函數(shù)實現(xiàn),沒啥太大區(qū)別。

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

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

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

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

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

2.1ROS的本質

如果問ROS的本質是什么,或者用一句話概括ROS的核心功能。那么,筆者認為ROS就是個通信庫,讓不同的程序節(jié)點能夠相互對話。

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

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

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

既然提到本質,那我們就深入到最基本的問題。

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

那就是,為什么ROS要解決通信問題?

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

到目前為止,我還沒有看到有人討論過這個問題。這要回到機器人或者智能的本質。

當我們在談論機器人的時候,最首要的問題不是硬件設計,而是對信息的處理。一個機器人需要哪些信息,信息從何而來,如何傳遞,又被誰使用,這些才是最重要的問題。

人類飛不鳥,游不過魚,跑不過馬,力不如牛,為什么卻自稱萬物之靈呢。

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

拋開物質,從信息的角度看,人與動物、與機器人存在很多相似的地方。

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

需要什么樣的信息以及信息從何而來不是ROS首先關心的,因為這取決于機器人的應用場景。

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

帶著這些問題,我們看看ROS是如何設計的。

2.2客戶端庫

實現(xiàn)通信的代碼在ros_comm包中,如下。

其中clients文件夾一共有127個文件,看來是最大的包了。

現(xiàn)在我們來到了ROS最核心的地帶。

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

    關注

    211

    文章

    28687

    瀏覽量

    208629
  • 操作系統(tǒng)

    關注

    37

    文章

    6899

    瀏覽量

    123800
  • ROS
    ROS
    +關注

    關注

    1

    文章

    280

    瀏覽量

    17122
收藏 人收藏

    評論

    相關推薦

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

    本帖最后由 Tronlong創(chuàng)龍科技 于 2024-7-19 17:18 編輯 ROS系統(tǒng)是什么 ROS(Robot Operating System)是一個適用于機器人的開源的
    發(fā)表于 07-09 11:38

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

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

    機器人操作系統(tǒng)淺析

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

    請問能分享ROS機器人操作系統(tǒng)的一些資料嗎?

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

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

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

    ROS 2 Crystal Clemmys版機器人操作系統(tǒng)補充說明

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

    ROS RIKIBOT基礎--使用系列 第一章節(jié)】ROS機器人硬件系統(tǒng) 精選資料分享

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

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

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

    ROS是什么?機器人操作系統(tǒng)ROS的介紹

    ROS 是 Robot Operating System 的縮寫,原本是斯坦福大學的一個機器人項目,后 來由 WillowGarage 公司發(fā)展,目前由 OSRF(Open Source
    發(fā)表于 09-13 17:23 ?14次下載
    <b class='flag-5'>ROS</b>是什么?<b class='flag-5'>機器人</b><b class='flag-5'>操作系統(tǒng)</b><b class='flag-5'>ROS</b>的介紹

    ROS的含義與機器人操作系統(tǒng)ROS的介紹

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

    機器人操作系統(tǒng)ROS)是一種用于機器人開發(fā)的元操作系統(tǒng)

    拋開它的名字,ROS并不是一個真正的操作系統(tǒng)。相反,它是一個框架和服務的集合,這些框架和服務提供了類似操作系統(tǒng)的功能,運行在由機器人硬件支撐的異構計算機集群之上。
    的頭像 發(fā)表于 10-12 16:53 ?7179次閱讀

    機器人操作系統(tǒng)ROS詳細介紹

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

    ROS機器人操作系統(tǒng)實現(xiàn)原理(上)

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

    ROS機器人操作系統(tǒng)

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

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

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