概述
驭势科技(UISEE)是中国领先的自动驾驶公司,致力于为全行业、全场景提供 AI 驾驶服务,做赋能出行和物流新生态的 AI 驾驶员。公司成立于 2016 年 2 月,坚持立足本土研发,根植中国市场。总部和研发中心设立在北京,在上海嘉定和浙江嘉善分别设有研发中心、研发试制和应用创新中心。此外,在深圳、广西、成都、武汉等地均设有业务分支机构。
驭势科技自主研发的 U-Drive 智能驾驶平台,拥有业界领先的自动驾驶算法、功能强大的云端智能驾驶大脑和全功能车规级智能驾驶控制器,可以满足多场景、高级别的自动驾驶需求。公司目前在业务上已经形成可规模化部署的 L3-L4 级智能驾驶系统,并于 2019 年率先在机场和厂区实现了“去安全员”无人驾驶常态化运营的重大突破,落地“全场景、真无人、全天候”的自动驾驶技术,并由此迈向大规模商用。
挑战
- 设备连接数量大,吞吐量要求高,单台无人车会以较高频率上传相对较大的数据包,并且对某些数据的可靠性有一定要求;
- 云端服务单位时间内要处理的数量非常大,且对数据到达的顺序有较强的要求。而传统的广播模式对于实现高可用、充分利用资源难度较大;
- 车端数据上报到云端需要做处理、分发和落盘,专门开服务去处理资源开销大,维护成本高;
- 账号密码加证书的鉴权,与第三方对接时对权限粒度要求较细;
- 弱网络下,对数据准达率、数据实时性要求高;
- 云边端协同带来的挑战,边缘端需要接入局域网内的设备。
解决方案
关于设备海量连接,项目最早使用的是 RabbitMQ,在一对多场景下,资源开销较大。在实际使用中出现过宕机问题,导致运维成本提高。使用 EMQX 实测后,资源开销相比 RabbitMQ 明显降低。此外,无人驾驶场景对于设备的上下线时间的准确性有较高要求。而 RabbitMQ 不支持 SYS 通知信息,只能依赖最后一次上报的时间戳和当前时间的差值来判断,准确性、实时性较差。通过 EMQX 则可以订阅 SYS 系统主题,可以很方便准确地获取到这些信息。因此最终采用了 EMQX。
云端服务在订阅车端数据时,最初使用的是传统的广播模式。在做服务高可用时,如果服务为多个节点,则不同的节点会重复订阅相同的数据。因此最初的高可用方案,采用的是主备方案。但是该方案不能实现多个节点同时工作,资源浪费较为严重。后改用基于 EMQX 的共享订阅方式来解决,实现了分片高可用。每台无人车有自己唯一且标准的 client_id,EMQX 根据 client_id 的 Hash 值进行分片,保证一台车的数据只会发送到云端的同一节点上。当云端服务节点数量发生变化时,会自动进行负载均衡,保证所有的推送都会被消费。通过该方式实现的高可用,可以充分利用云端资源,并且拥有良好的动态扩展性。
车辆上报的一些实时的状态信息数据量较大,频率较高,利用 EMQX 规则引擎可以很方便地将数据存储到 InfluxDB 中。
某些场景下会将一些仿真车和实车放到同一环境下进行测试。仿真车上报的位置信息经过协同服务会导致实车无法正常运行,因此需要云端强制车端下线。最终解决方案采用自定义握手协议加调用 EMQX 客户端下线接口实现。下线接口能让连接立马断开,但是客户端还会立马重连,车端实现握手协议,在客户端建立连接时生效。云端通过校验 client_id 中车辆信息是否在云端添加来决定是否通过握手。不通过握手会保持跟 EMQX 的连接,但不会有实际数据上报。
无人车和 EMQX 的连接采用证书加账号密码的方式,以提高数据安全性。账号密码有专门的服务维护,可以动态更新。在跟第三方控车平台对接时,通过 EMQX 实现细粒度的权限管理,客户只能看到部分车辆信息,只能跟部分 Topic 做交互。EMQX 本身具备配置的导入导出功能,使得运维人员在部署时能够很方便地搭建新环境,而不用过于关注复杂的配置文件。
无人车采用的是 4G 网络和云端通信,弱网络场景时有发生。对于 QoS1 的消息,想要在重新上线后,重新收到离线期间错过的消息,可通过在 CONNECT 报文里设置 CleanSession 字段为 false 的方式解决。此时 Broker 会为终端存储设备所有的订阅和没有被确认的消息。对于车端上报的 QoS0 的消息,车端判断持续弱网络情况下,数据上报切换为 CoAP 协议上报,云端使用 EMQX 的 CoAP 插件。在弱网络环境下, UDP 表现相比 TCP 好一些。
前端获取实时数据,直接通过 MQTT 标准库直接订阅 EMQX 服务器即可,相比原始 WebSocket 更简单方便。
AGV 通过 EMQ 提供的超轻量边缘 MQTT 消息服务器 NanoMQ 实现调度系统和设备通信,直接将 NanoMQ 桥接至驭势云端的 EMQX,即可实现双方数据互通。
成果
- 云脑服务整体可用性达 99.995%;
- 基于共享订阅实现的分片高可用,相比自己实现基于 Hash 环的分片,开发难度降低,开发效率提升 25%。数据准达率有了极大提升。项目部署更近灵活简单,能适应多场景;
- 规则引擎的引入,避免部分服务的开发,开发效率提升 5%;
- 弱网络环境下数据准达率提升 20%。