完整的原始碼包:
# 安裝依賴 sudo apt-get install git cmake doxygen graphviz build-essential zlib1g-dev sudo apt-get install libhdf5-dev libprotobuf-dev libprotoc-dev protobuf-compiler sudo apt-get install libcurl4-openssl-dev libqwt-qt5-dev libyaml-cpp-dev # 解壓 tar -xzf dros_ecal_all_no_git.tar.gz # 編譯 # Ubuntu16.04上需要升級cmake,到3.16.0及以上版本 cd dros_ecal_all_no_git mkdir build cmake .. make -j4
下面是完整原始碼下載及安裝步驟:ecal5.12.0
git clone https://github.com/eclipse-ecal/ecal.git cd ecal git checkout v5.12.0 git submodule init # 這一步耗時會有點長,有些可能需要多次嘗試才成功 # 若一直不成功,可以跳過,等cmake報錯時根據報錯的提示手動處理,見下文cmake報錯的處理 git submodule update # 如果出現qtbase5-dev依賴報錯,可以不安裝qtbase5-dev sudo apt-get install git cmake doxygen graphviz build-essential zlib1g-dev qtbase5-dev sudo apt-get install libhdf5-dev libprotobuf-dev libprotoc-dev protobuf-compiler sudo apt-get install libcurl4-openssl-dev libqwt-qt5-dev libyaml-cpp-dev # 進CMakeLists.txt # 63行下增加一行,內容: set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") # 72行, HAS_QT5選項改為OFF # 76行, HAS_FTXUI選項改為OFF, 這個依賴C++17,Ubuntu16.04上編不過 # 115行, ECAL_THIRDPARTY_BUILD_PROTOBUF選項改為ON # Ubuntu16.04上需要升級cmake,到3.16.0及以上版本 # protobuf 切換到3.14.0版本 cd thirdparty/protobuf git checkout v3.14.0 cd ../.. # asio 切換到1.12.1版本 cd thirdparty/asio git checkout asio-1-12-1 cd ../.. mkdir build cd build cmake .. make -j4 # cmake報錯缺少的thirdparty中的模組 # 直接進thirdparty,先刪除對應模組的資料夾,然後從github上手動clone對應的工程程式碼 # demo 測試 # 開啟一個終端 cd ecal/build/bin ./ecal_sample_person_snd # 開啟另一個終端 cd ecal/build/bin ./ecal_sample_person_rec
附:ecal5.12.0 thirdparty各工程原依賴版本
# ecal-5.12.0 thirdparty各工程預設依賴版本 # asio: v1.24.0, commit-147f722 # curl: v7.81.0, commit-801bd51 # finetftp-server: commit-9ff999d # ftxui: v4.0.0, commit-d301fab # googletest: v1.11.0, commit-e2239ee # hdf5: commit-eaebce0 # libssh2: commit-159d4c8 # protobuf: v3.11.4 commit-d0bfd52 # recycle: commit-c542570 # simpleini: v4.19 commit-9b3ed7e # spdlog: v1.11.0 commit-ad0e89c # tclap: v1.2.4 commit-349170a # tcp_pubsub: v1.0.2 commit-f59da78 # termcolor: commit-b3cb0f3 # tinyxml2: v9.0.0 commit-1dee28e # udpcap: commit-07bede4 # yaml-cpp: commit-c73ee34 # zlib: v1.2.11 commit-cacf7f1
自帶工具使用筆記:
工具在dros/thirdparty/ecal/bin/資料夾下
ecal_mon_cli:
# 顯示所有的topic ./ecal_mon_cli -l # 對某個string_msg 釋出訊息 ./ecal_mon_cli -m "msg" -p topic_name # 顯示某個topic的佔用頻寬 ./ecal_mon_cli -b topic_name
# 採集資料,-r duration 表示採集時長為 duration秒,-d rec_dir 指定資料儲存目錄
# 會自動在rec_dir下新建以時間戳開頭的資料夾,儲存資料
./ecal_rec -r duration(sec) -d rec_dir
# 黑名單選項, list格式用逗號分隔, eg: "Topic1,Topic2"
--blacklist <list>
# 白名單選項, list格式用逗號分隔, eg: "Topic1,Topic2"
--whitelist <list>
一些細節點:
-
Subscriber初始化執行緒不安全,多執行緒並行初始化Subscriber會崩潰,貌似和初始化時一些全域性變數有關
-
復現方式:
- 主執行緒中在沒有初始化任何Subscriber的情況下,連續啟動多個子執行緒,每個子執行緒一進入就進行各自的Subscriber初始化,會在第二個子執行緒的Subscriber初始化裡頭掛掉,如下圖
-
-
避免方式:
- 在開啟任何子執行緒之前,先在主執行緒初始化一個Subscriber
- 或者,在第一個子執行緒開啟後sleep數百毫秒
-
protobuf::message 不能迴圈修改和傳送,否則會有記憶體洩漏
- 復現方式:
-
protobuf_publisher pub; lidar_scan_message msg; Loop: add a point to msg; pub.Send(msg);
- 避免方式:
-
protobuf_publisher pub; Loop: lidar_scan_message msg; add points to msg; pub.Send(msg);