-
eCAL (enhanced Communication Abstraction Layer)
-
由 Continental 开源的消息中间件,目前由 Eclipse 管理
-
数据传输方式
- 本地通信: 共享内存
- 网络通信: UDP / TCP (大数据量)
-
通信方式
- Topic: publish-subscribe
- Service: server-client
-
相比 ROS 没有中间代理商,无需master节点
-
支持多种数据序列化方法
-
google protobuf, CapnProto, Flatbuffer, ...
-
**序列化:**把对象转化为可传输的字节序列过程称为序列化。
**反序列化:**把字节序列还原为对象的过程称为反序列化。
-
最终的目的是为了对象可以跨平台存储,和进行网络传输
-
特性 \ 类型 | json | protobuf |
---|---|---|
数据结构支持 | 简单结构 | 复杂结构 |
灵活程度 | 灵活使用 | 通过消息文件约束 |
数据保存方式 | 文本 | 二进制 |
数据保存大小 | 大 | 小 |
编解码效率 | 慢 | 快 |
语言支持程度 | 覆盖主流语言 | 覆盖主流语言 |
-
目前根据 aiforce::core 的 ECAL 5.9.5 版本进行安装
- Ubuntu 18.04 x86_64 与 ARM64
- ECAL 5.9.5
- Protobuf 3.0.2
- Ubuntu 20.04 x86_64
- ECAL 5.9.5
- Protobuf 3.6.1
- Ubuntu 18.04 x86_64 与 ARM64
-
Install Protobuf
# install protobuf dependencies sudo apt-get install autoconf automake libtool curl make g++ unzip # download protobuf 3.0.2 source code from github # download gmock using autogen.sh, this step needs proxy, otherwise the zip file will be uncomplete ./autogen.sh # build #./configure --prefix=/usr # for custom path ./configure # /usr/local make -j8 make check # no need sudo make install sudo ldconfig
-
Install ecal
# install 5.11 sudo add-apt-repository ppa:ecal/ecal-5.9 sudo apt-get update sudo apt-get install ecal
-
Topic 传输
-
ecal_sample_person_snd/rec
# 发送节点: 发送person信息 ecal_sample_person_snd # 接受节点: 接受person信息 ecal_sample_person_rec
-
同一发布节点开启多次, 会在同一topic下发布不同节点的内容
-
同一接受节点开启多次, 也会接受同一topic下不同内容
-
-
Service 传输
-
ecal_sample_math_server/client
# server: 负责接受数学计算的请求和提供数学计算 ecal_sample_math_server # client: 负责发出数学计算的请求和接受结果 ecal_sample_math_client
-
同一server节点开启多次, 都会接受到对应service topic的请求
-
同一client开启多次, 也会与同一名字的server连接
-
-
eCAL Monitor
-
显示节点,消息,进程,服务等信息
- bug:不同service 相同method名称,只能显示一个
# start ecal monitor ecal_mon_gui
-
-
eCAL Recorder
-
数据通过HDF5格式进行记录
-
# start eCAL Recorder ecal_rec_gui
-
-
eCAL Player
-
回放录制的数据
-
# start eCAL player ecal_play_gui # 配合 ecal_mon_gui 查看数据
-
-
eCAL Sys
-
开启、关闭、监控节点
-
# start ecal_sys_gui ecal_sys_gui # 可以一次性开启多个节点 # 可以保存配置文件,类似ROS的launch文件
-
简单的Protobuf消息编译例子。
- 本例程演示了如何通过ecal实现简单的pub/sub功能
- 本例程演示了如何通过ecal传输protobuf消息
- 这个demo同时测试了5.9.5版本的ECAL subscriber callback 是单线程的,在callback中的耗时操作会影响主线程或其他callback。
- 本例程演示了如何通过ecal构建简单的service功能
-
server 特性
- 同一个节点可以有多个server
- 同一个server可以有多个method
- 同一个server同一时间只能被调用一次,后续的调用在当前调用未完成时会被阻塞
- 不同server同一时间可以被同时调用
-
client 特性
-
Call
- 直接调用,会阻塞后续操作,直到当前调用完成
-
CallAsync
- 异步调用,需要绑定callback,单次调用不会阻塞,多次调用仍然需要等待前一次调用结束
-
-
- 本例程演示了如何通过 protobuf 的 RPC 机制实现 ECAL service
- 本例程演示了如何通过 protobuf 的 RPC 机制实现 ECAL service
- 本例程演示了如何通过 eCAL 发布 binary 数据
-
该demo包括了一个USB相机数据发布程序和一个 ecal_mon_gui 插件, 用以显示相机图像
-
原始项目地址: ecal-caemra-samples
- ecal_camera_snd
- 主要是通过QT相关组件获取图像数据并转换为protobuf数据
- camera_receiver_mon_plugin
- ecal_mon_gui 插件, 通过qt插件显示订阅的图像
- ecal_camera_snd
-
安装方法
# install dependencies sudo apt install ecal \ qtmultimedia5-dev \ libqt5multimedia5-plugins \ qtwayland5 \ protobuf-compiler \ libprotoc-dev \ libhdf5-dev \ cmake # build&install mkdir build cd build # prefix install path set to /usr due to ecal install path is /usr cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr make -j8 sudo make install
-
使用方法
# 启动相机数据发布程序 # ecal_camera_snd [topicName] [cameraName] [OPTIONAL_resolutionWidth] [OPTIONAL_resolutionHeight] [OPTIONAL_maxFps] ecal_camera_snd usbcam /dev/video0 1280 720 30 # 启动 ecal_mon_gui, 点击 topic 即可显示图像 ecal_mon_gui