当前位置:   article > 正文

自动驾驶通信中间件-冰羚iceoryx

自动驾驶通信中间件-冰羚iceoryx

1.中间件概念
是负责各类应用软件模块之间的通信以及对系统资源的调度, 可以大大降低应用层软件的开发难度,
使研发工程师可以完全把注意力集中到功能算法的开发上。
2.IPC中间件引入背景
自动驾驶的发展带动了系统内部不同进程、线程之间巨量的数据交换,目前这样的通信量能达到 GB/s 以上。汽车中使用的通用通信范例是发布/订阅,最典型的一种支持IPC的中间件解决方案是在传递消息时通过中间件来回拷贝数据。
由此而产生的后果是系统将在中间件堆栈内部产生多个数据副本,对数据的有效负载序列化,这将在无形中极大的消耗系统的资源。

冰羚iceoryx通过“零拷贝,共享内存”数据传输,减少资源浪费。将共享内存技术与发布/订阅架构(publish/subscribe architecture),
服务发现机制(service discovery),现代C ++(modern C++)以及无锁算法(lock-free algorithms)相结合。
通过添加避免复制的应用程序接口(API),实现了真正的零拷贝 - 即实现了数据从“发布者”到“订阅者”的端到端传输方法,
其过程中无需创建任何数据副本。
3.工作原理
1)通过iceoryx API,“发布者”将信息直接写入到事先由「中间件」预订好的内存块(memory chunk)中。
2)当数据传递完成后,“订阅者”将收到指向这些内存块的参照指针(reference),并同时可以管理自己可配置容量的信息队列。
3)每个“订阅者”拥有唯一的且属于自己的视角,可以查看哪些数据仍在处理状态中,以及哪些数据可以被丢弃。
4)「中间件」iceoryx在“幕后”则对内存块进行引用计数(reference counting),当其发现被引用的次数变为零时就会释放内存块。
技术细节:
中间件iceoryx有一个非常重要特性:由于“发布者”跟“订阅者”是独立运行的,因此“发布者”可以在“订阅者”仍在读取数据的同时
再次进行数据的写入操作而不受影响。如果先前的内存块仍然被占用,则只需为“发布者”重新分配一个新的内存块即可。

如果“订阅者”以轮询模式(polling)运行,并且内存块在排队等待被”订阅者“再次检测时,系统则可以启用无锁队列(lock-free queue),
在被称为“安全溢出(safely overflowing)”的过程中回收较旧的内存块。
无锁队列能够使“订阅者”更高效的使用内存,并最大限度的在队列里储存最新的消息数据,无论连续轮询之间的时间间隔有多长。
这对高频的“发布者”和仅对最新的数据信息感兴趣的“订阅者”是非常有帮助的。
iceoryx API在支持轮询访问(polling)的同时,也支持事件驱动回调(event-driven callback)。

由于数据消息的有效负载未被序列化,所以数据的“发布者”和“订阅者”必须具有相同的内存布局(memory layout),对于特定处理器上的IPC,
我们可以通过使用相同的编译器设置来确保这一点。
而共享内存也可以分为具有不同访问权限和可配置内存池的段。这里我们需要了解使用共享内存的两个限制:一个是它只支持固定长度的消息,
另一个是不能使用virtual members以防止member function被派生类重新定义。
被传输的数据消息中不能包含任何指向进程中内部虚拟内存空间的“指针”,此限制也适用于基于堆的数据结构。
4.核心概念RouDi、Runtime、Publisher、Subscriber、Topic
RouDi:iceoryx 的守护进程,不同的应用需要与它进行连接才能正常通信。运行iceoryx程序前,一定要先启动守护进程 iox-roudi
Runtime:每个需要在 iceoryx 框架下运行的应用,都需要初始化它的 runtime。
Publisher:数据发送器,需要绑定 topic 使用。一个 Publisher 创建时需要指定 Topic,用来指定要发送的数据。
Subscriber:数据接收器,需要绑定 topic 使用。
Topic:Topic 是数据载体,Publisher 发送一个 Topic,Subscriber 能够接收绑定的 Topic 而不需要关注 Topic 来自何处,Publisher 与 Subscriber 要正常通信就需要绑定同一个 Topic。
信息轮询与信号触发:如果需要实时获取 Topic 信息,则可以不断调用 subscriber 方法,但这样势必会增加计算资源造成算力浪费。
(1)iceoryx 提供 2 种方式提升了数据获取效率:WaitSet 采用 react 设计模式开发,绑定对应的 subscribers,如果数据来了就触发通知
(2)Listenner 能够直接触发用户定制的 callback,起到数据来临时的回调作用

参考文档:
https://zhuanlan.zhihu.com/p/500113506
https://zhuanlan.zhihu.com/p/409899990

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/705973
推荐阅读
相关标签
  

闽ICP备14008679号