完整的源代码包:
# 安装依赖 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);