1.L3 QOS 设计逻辑
L3需要做跨板隔离,当前版本在服务发现的两个阶段都实现了基于分区的隔离机制,分别为PDP分区隔离,EDP分区隔离
Partition QoS Policy
该 QoS 策略允许在由 Domain ID 引入的物理分区内部,再引入一个逻辑分区。 为了让 DataReader 能够看到 DataWriter 所做的变更,不仅 Topic 必须匹配,而且它们至少需要共享一个逻辑分区(参见 PartitionQosPolicy)。
在同一个 Domain ID(物理网络)内,DataWriter(发布者)和 DataReader(订阅者)要想成功匹配并通信,除了常规条件(Topic 名称相同、消息类型兼容、其他 QoS 兼容)外,还必须至少共享一个相同的 Partition 名称。这种隔离手段,性能开销极小(只是字符串比较),却能提供非常强的逻辑隔离保障。
- PDP 阶段(Participant 发现)已经过滤: 如果 Participant 级别的 Partition 不匹配,很多实现甚至不会完成 Participant 的相互发现(因为 PDP 报文已携带 Partition 信息)。 → 这时根本不会进入 EDP 阶段。
- 即使 PDP 阶段通过了,EDP 阶段也会二次拦截 : 在 EDP(端点宣告)阶段,当 DataWriter 宣告自己的 Publication 或 DataReader 宣告 Subscription 时,报文中会携带完整的 Partition 列表。 接收方在处理 EDP 报文时,会先检查 Partition 是否有交集:
- 有交集 → 继续后续 QoS、Topic 等匹配逻辑,可能发送匹配的 EDP 响应报文。
- 无交集 → 直接丢弃该 EDP 报文,不进行后续匹配,也不发送任何响应报文。
结论 : Partition 不匹配时,EDP 报文要么根本不发,要么发了也会被对方立即丢弃,不会建立任何通信关系,也不会浪费网络带宽继续后续匹配流程。
PDP: 进程级别的分区隔离,两个进程间必须有同名的Partition Name,PDP报文才会在两个进程间发送接收匹配,没有同名的分区名,直接不发PDP报文
EDP: DR/DW级别的匹配,需要校验DR与DW之间的分区名是否一致,DW与DR直接必须有同名的Partition Name,DR与DW直接才能完成匹配,进行通信,否则不发EDP报文
代码说明:
代码修改主要在cpp:
修改点:读取逻辑,存储逻辑
2.配置使用方式
以A板进程与B板进程跨板通信为例,B板发A板收,需要按照以下配置
3.最近合入记录
|----|------|------|------|
| MR | 合入内容 | 影响范围 | 注意事项 |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
4.注意点
AB板间的通信不能走组播地址,直接抓包已经看过
5.常见问题 & 排查指南
1.为了手动测试,Python命令和程序,在QOS文件中没有配置隔离,直接可以跨板通信
2.如果在两个进程间通信需要配置,需要查看发送接收进程日志,不能只echo
3.配置QOS后,需要检查程序是不是全都正常启动,通信是否正常
4.需要满足AB完全隔离,则A板程序在A分区通信,B板程序在B分区通信,需要跨板通信的进程在C分区上通信
5.若某个程序,比如AB板都有zdi_ehr这个程序,这两个程序只想各自接收两个程序数据,其他进程的数据不接收,则需要另外开启一个分区通信
6.配置完分区隔离的topic,需要查看topic hz是否翻倍
7.可查看DDS日志分区名是否配置成功
- rviz 通信交接
1.通信排查
板子跟rviz docker需要网络盒子连接,,且互相可以ping通
板子内需要先执行replace.sh脚本
检查rviz笔记本ip,子网掩码是否配置成功
检查rviz docker qos 是否包含板子ip
检查docker内是否有topic ,topic是否有输出
检查板子上程序是否启动成功
检查板子上qos文件是否包含rviz笔记本IP
- rviz界面
rviz界面时间戳是否打印正常
rviz界面是否显示车道线,没有车道线需要先标定