無人駕駛筆記系列(四):Fast-RTPS初體驗

無人駕駛筆記系列(四):Fast-RTPS初體驗

背景介紹

ROS1在節點啓動前,必須通過roscore啓動一個master節點,通過master管理節點之間的通信。這樣master節點如果出現問題,其他節點之間的通信也會出現問題。同時,通訊的實時性也不是很好。因此,ROS2和apollo框架都用上了DDS通訊。

關於什麼是DDS,英文全稱(Data Distribution Service for Real-Time Systems)我也不在此囉嗦了,推薦讀下這篇博客。
DDS簡要介紹

總結下特點:

  • DDS採用發佈/訂閱體系架構,強調以數據爲中心
  • DDS使應用在需要進行數據訪問的時候提供一個虛擬的全局數據池概念,事實上並沒有一個存儲所有數據的全局設備。每個應用僅在本地存儲它需要的數據,當整個網絡內的任何應用需要他們時,提供給對應應用。所有的數據分發工作全部都由DDS代勞了。
  • 網絡中的數據對象用主題做標識,分佈式節點在全局數據空間中發佈或訂閱感興趣的主題信息。各個節點在邏輯上無主從關係,點與點之間都是對等關係,通信方式可以是點對點,點對多,多對多,在Qos策略的控制下建立連接,自動發現和配置網絡參數

當然DDS之前一種協議,具體實現有好多版本,如:

  • RTI公司的DDS方案:美國海上戰爭中心(NSWC)高性能分佈式計算系統(HiPer-D),美軍都在用,應該很牛吧。
  • OpenDDS:OpenDDS是使用C++語言針對OMG數據分發服務(DDS)的一種開源實現。由OCI公司設計和維護,http://www.opendds.org 官網。儘管本身OpenDDS採用C++語言實現,但也提供JAVA和JMS的開發接口,這意味着JAVA程序開發也可以使用OpenDDS。
  • eProsima Fast RTPS:Fast RTPS是eProsima公司對RTPS標準的一個實現。那RTPS是什麼東東?RTPS是DDS標準中的一個子集。英文名字是Real Time Publish Subscribe,是DDS標準中的通訊協議部分。

安裝eProsima Fast RTPS

eProsima Fast RTPS的github主頁

推薦用官網的安裝包安裝,源碼安裝比較複雜,需要你安裝很多依賴。

安裝包解壓後,查看下文件結構:

xx:~/fastrtps$ ls
doc  install.sh  java  README.txt  src  uninstall.sh

xx:~/fastrtps$ cd src
xx:~/fastrtps/src$ ls
fastcdr  fastrtps  fastrtpsgen  foonathan_memory

可以看到,其實文件還是包含了依賴包的源碼,這樣保證我們安裝不會出問題。

一行命令,即可完成安裝

sudo bash install.sh

成功安裝後,查看下安裝目錄

#include文件目錄
/usr/local/include/fastrtps
#庫文件目錄
/usr/local/lib/libfastrtps.so
#cmake文件目錄
/usr/local/share/fastrtps/cmake/fastrtps-targets.cmake

跑個實例試試看

你可以在github主要上把源碼拉取下來。
在源碼中,可以看到有個helloworld實例

cd Fast-RTPS/examples/C++/HelloWorldExample

編譯

mkdir build && cd build
cmake ..
make

編譯後,要在兩個窗口運行。
先運行發佈者

./HelloWorldExample publisher

打印結果如下:

Starting 
Publisher running 10 samples.
Publisher matched
# 在subscriber啓動後打印
Message: HelloWorld with index: 1 SENT
Message: HelloWorld with index: 2 SENT
Message: HelloWorld with index: 3 SENT
Message: HelloWorld with index: 4 SENT
Message: HelloWorld with index: 5 SENT
Message: HelloWorld with index: 6 SENT
Message: HelloWorld with index: 7 SENT
Message: HelloWorld with index: 8 SENT
Message: HelloWorld with index: 9 SENT
Message: HelloWorld with index: 10 SENT

啓動訂閱者

./HelloWorldExample subscriber

打印結果如下:

Starting 
Subscriber running. Please press enter to stop the Subscriber
Subscriber matched
Message HelloWorld 1 RECEIVED
Message HelloWorld 2 RECEIVED
Message HelloWorld 3 RECEIVED
Message HelloWorld 4 RECEIVED
Message HelloWorld 5 RECEIVED
Message HelloWorld 6 RECEIVED
Message HelloWorld 7 RECEIVED
Message HelloWorld 8 RECEIVED
Message HelloWorld 9 RECEIVED
Message HelloWorld 10 RECEIVED
Subscriber unmatched

我們稀裏糊塗的跑了官方例子,具體是怎麼運行的,還是完全不明白。

原理解析

未完待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章