無人駕駛筆記系列(四):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
推薦用官網的安裝包安裝,源碼安裝比較複雜,需要你安裝很多依賴。
安裝包解壓後,查看下文件結構:
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
我們稀裏糊塗的跑了官方例子,具體是怎麼運行的,還是完全不明白。
原理解析
未完待續