跳到正文

首页 · 实习经历

L4 路线下发与车云调度

管理端选车下发路线,经平台服务与车云转发至车端执行,车端回传位置与完成回执驱动任务状态机。主导协议设计与跨仓库联调,并搭建车端模拟服务,在无真车条件下打通全链路。

车云调度 · 港口自动驾驶 2026.07 – 至今 后端 · 主导协议设计与联调
4
跨端联调仓库
2
并行下行报文
0
真车依赖
  • Java
  • Spring Boot
  • Redis
  • MQTT
  • Python

业务背景

要求

运营在管理端选中一条路线和一台车,车端收到后自主行驶完成,全程可追踪、可回放、可取消。

约束

真车协议早于云端任务体系存在,报文里只有路线号与流水号,不含云端任务号。协议不能为了云端方便而改,车端也不一定愿意加解析逻辑。

范围

覆盖管理前端、管理后台服务、车云服务、车端共四个仓库的协议设计与联调,并在没有真车的条件下先把链路跑通。

一次下发的完整时序

注意下行是两条报文 —— 这是整个设计里最需要解释的一步。

14 / 14
管理前端管理后台车云服务MQTT车端选车下发路线权限校验代理转发解析路线号生成当日流水号建任务并取消同车旧任务下行报文 ①(裸报文)下行报文 ②(信封)投递两条vehicle_location状态机 → 行驶中route_complete状态机 → 已完成任务明细与轨迹回放

点播放看完整流程,或直接点任意一条消息,查看报文结构与当时的设计考虑。

任务状态机

一台车同时只应有一个活跃任务;新任务下发会把该车的旧任务置为已取消。

首条位置上报 完成回执 新任务 / 取消 未开始 行驶中 已完成 已取消
未开始
任务已创建并已下发,尚未收到任何带任务号的上报
行驶中
收到首条带任务号的位置上报;此后持续累计轨迹点与里程
已完成
收到完成回执,写入总里程并结束轨迹累计
已取消
同车下发了新任务,或人工取消。下发后一直未响应的任务同样会被新任务替换为此状态

关键设计决策

双报文下行:为不改车端协议而付出的代价

问题

真车协议里只有路线号与流水号,没有云端任务号。车端上报回来时,云端无法把这次上报关联到具体某一次下发 —— 也就无法驱动任务状态机、无法回放轨迹。而这份协议早于云端任务体系存在,改它意味着车端要跟着改并重新验证。

备选方案

  • 改真车协议,加一个任务号字段:最干净,但要车端配合改动与回归
  • 云端用「车辆 + 路线号 + 流水号」反查任务:不改协议,但流水号一旦重复或乱序就会错配
  • 同一主题连发两条:裸报文保证真车能跑,信封报文携带任务号

选择

双报文下行。第一条是真车协议原样,第二条是带任务号与完整路径点的信封。车端只解析第一条也能正常行驶,解析第二条则能在上报中带回任务号,云端拿到精确关联。

代价

下行流量翻倍,且两条报文的顺序一致性必须由发送方保证。更实际的代价是:只要车端不解析第二条,云端就只能退回反查方案 —— 所以这个设计的成立与否,取决于车端是否愿意接。这一点需要对方拍板,不是云端单方面能定的。

下发流水号:从数据库自增改为按车辆与自然日原子递增

问题

车端协议要求流水号形如「日期-序号」,且同一车辆当日不能重复。最初用数据库自增列生成,上线前发现两个必现问题。

备选方案

  • 数据库自增:跨自然日不会归零,序号会一直涨;多实例并发下还要额外加锁才能保证「按车辆」唯一
  • 服务端本地计数:多实例部署直接失效
  • 缓存中按「车辆 + 自然日」为键原子递增:天然按车辆隔离,跨日自动从 1 开始

选择

按「车辆 + 自然日」组合键原子递增,键设三天过期。递增操作本身是原子的,多实例并发无需额外加锁;键里带日期,跨日自然归零。

代价

流水号依赖缓存可用性,缓存丢失会导致当日序号重新从 1 开始。因为键只用于当日内区分下发批次、且带三天冗余过期,重复的实际影响可接受;真正要保证唯一的是任务号,那个在数据库里。

先搭模拟车端,不等真车

问题

真车资源稀缺、调度成本高,且早期几乎每次联调都会因为云端自己的问题失败一次。如果等真车才开始验证,云端的问题会全部堆到有限的现场窗口里暴露。

备选方案

  • 等真车联调:链路真实,但迭代一轮以天计
  • 写单元测试覆盖各环节:快,但覆盖不到跨进程的报文顺序与时序问题
  • 搭一个按协议行为等价的模拟车端:能跑完整闭环,迭代以秒计

选择

实现模拟车端:订阅下行主题、解析信封报文、按 20km/h、1Hz 沿路径点插值行驶,并按真车格式回传位置与完成回执。云端侧的下发、状态机、轨迹落库、前端回放因此可以在没有真车的情况下全部验证。

代价

模拟车端是按协议文档实现的,它验证不了真车对协议的实际理解 —— 恰恰是「车端是否解析第二条报文」这类问题,只有真车才能证伪。所以它降低的是云端自身缺陷的排查成本,不能替代真车联调。

当前进展

这个模块仍在推进中。把进行中的部分写成已交付,面试时一问就穿帮。

已完成

  • 路线数据入库与管理端下发全链路(前端 → 管理后台 → 车云 → MQTT)
  • 按车辆与自然日原子递增的流水号生成
  • 任务状态机、轨迹落库、任务列表与轨迹回放页
  • 模拟车端,以及基于它的完整闭环验证
  • 车端对接文档

进行中 / 待确认

  • 真车侧尚未实际收发过报文,全部验证基于模拟车端
  • 车端是否解析信封报文仍待对方确认;若不解析,云端需退回「车辆 + 路线号 + 流水号」反查方案
  • 里程口径、取消后是否下发、坐标系转换三项待对齐