在自动驾驶系统里,车上往往搭载了多颗高清相机、激光雷达和毫米波雷达。你可以把它们想象成一群各自戴着不同品牌手表的“目击证人”。如果这些手表的时间没有被强行对齐,当一辆对向来车高速驶过时,相机记录的画面是“下午3点整”,而雷达记录的点云却可能显示“下午3点零2毫秒”。

当下游的感知算法试图把这些来自不同传感器的“证词”揉在一起进行多传感器融合时,工程灾难就发生了。最直观的痛点就是产生“幽灵障碍物”——由于这看似微不足道的时间差,运动物体在算法推算出的位置与真实物理位置发生了严重偏移。

当你在做联合标定,尝试把激光雷达的三维点云投影到二维图像上时,会发现电线杆和车辆的边缘怎么也重叠不上。特别是在车辆高速行驶时,哪怕仅仅几毫秒的时间误差,都会被瞬间放大成几十厘米的定位误差。

因此,为了实现精准的传感器前融合并降低控制延迟,我们必须在底层构建一套极其严谨的硬件级授时体系,把全车所有传感器的“手表”,强行拨到绝对一致的微秒级精度。


一、时钟源设备和常见协议

惯性导航(GNSS/IMU) 最常见的绝对时间提供者。通过接收卫星信号解算出高精度时间,并下发给其他设备。缺点是严重依赖卫星信号,长期在隧道、地库或厂房内无法使用。

主机:域控或者工控机IPC 在一些低成本或简单的架构中,直接让域控充当时钟源,将自己的系统时间通过网络分发给各个传感器。

TSN 交换机(Time-Sensitive Networking) 顾名思义“时间敏感网络”,它绝不仅是一个扩展网口的中转站。在自动驾驶中,当海量的激光雷达点云和相机画面同时涌入交换机造成网络拥塞时,普通交换机会让授时报文排队,产生巨大且不可控的延迟抖动(Jitter)。 而 TSN 交换机的核心能力在于“时间感知调度”与“硬件时间戳”。它能在硬件底层识别授时报文,并赋予最高优先级(甚至打断其他正在传输的庞大数据帧),确保授时数据在微秒甚至纳秒级的确定性时间内送达。它自带硬件高精度时钟,在无GPS信号时可作为主时钟;也可以接收惯导授时后再分发给传感器,从而把高频对时的脏活累活从域控/IPC上彻底剥离出来。

在深入了解各授时协议之前,先理清几个调试时间同步时最常看的核心参数:

Offset(时间偏差): 从时钟与主时钟之间的绝对时间差。这是对时算法最终要消除的目标值。如果看到 ptp4l 打印的 Offset 稳定在几十纳秒以内,说明同步状态极佳。
Delay(网络传输时延): 同步报文从主时钟发出到从时钟收到所花费的时间。无论是 NTP 还是 PTP,算法机制的核心都在于如何准确测量并补偿这个 Delay。
Jitter(网络抖动): 传输延迟的变化量。如果每次报文的 Delay 都恒定,那很容易补偿;但如果忽快忽慢(Jitter很大),软件就很难算准真正的 Offset。PTP最大的贡献就是干掉了操作系统协议栈带来的巨大 Jitter。
而常见的协议包括:

NTP (Network Time Protocol): 最常见的局域网/互联网授时协议。纯软件实现,精度通常在毫秒级(几毫秒到几十毫秒)。对于自动驾驶中高频的激光雷达和相机来说,精度往往不够用。

PTP (IEEE 1588v2): 精确时间同步协议。通过在网卡硬件层打时间戳,消除了操作系统网络栈带来的延迟抖动。精度能达到微秒甚至纳秒级,是目前主流自动驾驶传感器首选的对时方案。

PTP 的核心对时原理是主从设备之间互发报文,在硬件底层记录下 4 个关键的时间点(t1, t2, t3, t4):

  1. 主发从收: 主时钟发出 Sync 报文(记录发出时间 t1),从时钟收到(记录接收时间 t2)。
  2. 从发主收: 从时钟发出 Delay_Req 请求(记录发出时间 t3),主时钟收到(记录接收时间 t4,并通过 Delay_Resp 报文把 t4 告诉从时钟)。 基于“网络一来一回的耗时是对称的”这一假设,从时钟拿到这 4 个值后,就能算出核心参数:
    单向延迟 (delay) = $\frac{(t_2-t_1)+(t_4-t_3)}{2}$
    时间偏差 (offset) = (t2 - t1) - delay, 算出 offset 后,从时钟直接修调自己的本地时间即可完成对齐。

gPTP (IEEE 802.1AS) 可以理解为PTP在车载TSN网络里的“定制精简版”。它和PTP最大的差别在于:gPTP只支持二层网络(MAC层转发),不支持IP层路由,并且强制要求网络链路中的每一个交换节点都必须支持该协议(不能有普通交换机混入),从而在车载以太网中保证极致的低时延和确定性。


二、授时系统设计

在实际工程落地上,我们通常面临三种主要的授时架构设计。这三种架构不是非此即彼不能兼容的,比如会GPS给工控机授时,工控机给传感器授时。

方案一:基于惯性导航的绝对授时

这是目前最正统的方案,所有设备最终都和高精度的卫星时间对齐。(至于卫星的时间怎么来的?可以参考 走进自动驾驶传感器(三)——卫星导航系统)

  • 如果惯导支持 PTP/gPTP 协议

最理想情况,稍微高端一些的车载组合导航往往自带网口,并在硬件层支持 PTP。直接在惯导后台开启 PTP Master 模式即可。此时的信号流向是: 卫星->组合导航master->各个传感器和域控

  • 如果惯导不支持 PTP,只输出 PPS+GPRMC

很多传统惯导或 GPS 模块只提供最原始的两根线,串口数据线 + 脉冲线来同步时间。

RS232 串口发 GPRMC 协议: 里面包含字符串形式的当前年月日时分秒的绝对时间。但串口传输有延迟,时间并不精准。
PPS(Pulse Per Second)秒脉冲信号: 每逢整秒发一个极其精准的硬件电平跳变方波电信号,代表这一秒的绝对起点。 GPRMC 告诉你现在是几分几秒,PPS 告诉你这一秒准确的起跑线在哪。

拿到这两根线后,下游设备怎么接?

  • 域控直连方案: 现在的自动驾驶域控通常自带 PPS 接收引脚和 RS232 接口,可以直接接入并在底层驱动中解析,最后由域控通过 PTP 协议分发给其他传感器。
  • 普通工控机/PC方案: 普通电脑主板没有接收 PPS 方波的 GPIO 接口。通常需要设计一块转接板,用单片机接收 PPS 和 GPRMC,对齐后通过 PCIe/网线 喂给工控机,有的相机采集卡也在集成这部分功能。
  • 专业授时盒方案: 嫌自己画板子写底层驱动麻烦,可以直接买现成的硬件授时盒,如星旗 XQ500 等。授时盒吃进 PPS+GPRMC 信号,直接从网口吐出 PTP 协议。

此场景下的信号流向:

  • 工控机接转接板:卫星->惯导master->串口/PPS线->工控机转接板->工控机->传感器
  • 域控直连:卫星->惯导-> 串口/PPS线->域控->传感器
    授时盒方案:卫星->惯导->串口/PPS线->授时盒->传感器和工控机
  • 惯性导航的守时机制:当车辆驶入隧道或地库,卫星信号完全丢失时,整个系统将进入“守时”状态。此时时间的准确性完全依赖主时钟内部的高精度晶振。通常高端的惯性导航内部都自带非常优秀的晶振,能长时间扛住漂移。

方案二:基于域控/IPC的内部授时

在一些低成本或封闭园区场景下,干脆不接外部 GPS,直接利用域控/IPC 内部的时钟芯片作为全车时间的起点。此时的信号流向是: 域控/IPC master->交换机->各个传感器

但是域控或工控机在断开外界基准后,内部时钟极易随温度变化发生严重漂移。如果是普通的工控机主板只有普通石英晶振,可能几分钟就会漂移好几个毫秒;而专门设计的优秀域控,通常会搭载温度补偿晶振TCXO或恒温晶振OCXO,以此保证在无 GPS 时依然能维持几小时的高精度。

方案三:基于 TSN 交换机的局部授时

彻底不依赖 GPS 卫星,不关心绝对真实时间的局部系统,只求系统内所有传感器的时间能严格对齐。此时的信号流向是: TSN交换机 master->各个传感器和域控

为什么引入 TSN 而不是直接用域控? 极低成本的方案确实可以直接用域控作主时钟。但在高阶自动驾驶中,当海量的激光雷达点云和多路高清相机画面同时涌入交换机,造成严重网络拥塞时,普通交换机会让 PTP 授时报文在队列中排队,产生巨大且不可控的延迟抖动。因此必须引入 TSN 交换机,利用其底层的时间感知调度机制优先保障授时报文;这样做不仅解决了拥塞抖动问题,还能把高频对时的脏活从域控身上分担出来。

守时与稳定性保障: 作为整个感知网络的“心脏”,车载 TSN 交换机内部通常都会标配车规级的高精度晶振。因此,即使在没有外部 GPS 作为绝对基准的“局部授时”模式下,它也能凭借过硬的硬件素质,长期维持极低的时钟漂移,为全车提供一个非常稳固的相对时间基准。

工控机/域控的软件配置

在域控或者工控机上,我们通常依靠开源工具包 linuxptp 来实现底层时间同步。它主要包含两个极其核心的守护进程:

  1. ptp4l (PTP for Linux),这是负责在以太网上跑 PTP/gPTP 协议的核心程序。负责和外部主时钟互发网络报文,算出偏差,然后只负责把当前网卡的硬件时钟 PHC,Physical Hardware Clock,对准。

  1. phc2sys (PHC to System):ptp4l 把网卡时间对准了,但自动驾驶算法读取的往往是 Linux 的系统时间。phc2sys 的作用顾名思义,就是将网卡的 PTP 硬件时钟PHC同步给 Linux 的系统内核时钟。

工程避坑,虚拟局域网VLAN的划分:在车载以太网中,为了防止数据拥塞,经常会划 VLAN。比如个别激光雷达的“点云数据报文”被配置走某个特定的 VLAN,但是它的“gPTP 对时报文”却不走 VLAN(走默认的 Native 网络),或者走了另一个 VLAN。在配置域控网卡和交换机时,一定要确认数据平面和对时平面的策略是否匹配,否则很容易出现“能收到雷达点云,但永远对不上时”的 Bug。

三、终端传感器

传感器的时间同步通常分为两大流派:

  • 支持硬件授时/触发: 传感器本身有能力接收外界的精确时间(PTP/PPS/Fsync),并在硬件底层为采集到的数据打上精确的时间戳。
  • 不支持授时,只能软同步: 传感器只管疯狂发数据,完全依赖域控或工控机在网卡或驱动层面“收到数据的那一刻”打上系统时间戳。这种方式受网络传输延迟和 CPU 调度的影响极大,极易产生时间抖动。

相机

相机界一直存在一个痛点:早期相机较少原生支持网络授时,通常严重依赖主动硬触发。不过目前一些高端的自动驾驶采集板卡已经集成了串口和 GPIO,能直接吃进 PPS+GPRMC,把授时,触发和相机采集卡做在了一起。

帧同步信号 Fsync,Frame Synchronization,本质上就是一根周期性打方波的物理电平信号线。相机的感光 Sensor 硬件一旦检测到这个方波的上升沿(或下降沿),就会在微秒级内被强制唤醒,开始当前帧的曝光。这正是“硬触发”名字的由来。通常是由域控 MCU 触发,域控内部的 MCU 先通过 PTP 把自己的系统时间对得绝对准,然后通过底层的硬件定时器,严格按照算法要求的帧率(如 30Hz)往 GPIO 引脚上往外打方波。 嫌域控发方波抖动大,可以直接外挂一个专用的硬件授时盒。授时盒吃进 GPS 的 PPS 信号,经过内部 FPGA 极其稳定的分频后,直接输出多路 Fsync 方波给所有相机。

车规相机系统通常由控制器(SoC + 解串器 Deserializer)、摄像头(串行器 Serializer + 传感器)组成。

工作机制是外部的 Fsync 信号输入到控制器后,会经过控制器侧的 Deserializer 透明转发到多路摄像头的 Serializer,从而实现“多路相机在同一微秒同时按下快门”。为了支持 Fsync 透传,解串器和串行器都必须正确配置。这一路 Fsync 信号不仅能给相机用,还可以同时分发给 LiDAR 等其他传感器,实现真正的多传感器物理级绝对同步。由于纯走硬件电平,Fsync 信号的传播延迟基本在微秒级,完全可忽略。

一张图像的产生其实经历了漫长的链路:

触发信号到达 -> 曝光开始 -> 曝光结束 -> ISP传输开始 -> ISP传输结束 -> 系统接收到数据

那算法到底用哪个时间? 如果用“系统接收到数据”的时间,中间已经隔了十几毫秒的传输和曝光延迟了!因此,算法端通常强制要求底层驱动推算出曝光中间时刻(或者曝光开始时刻)来作为这张图片的绝对“传感器时间”。因为相机的曝光时长(Exposure Time)是随环境光动态变化的,用中间时刻最能代表车辆在那一瞬间的真实位置。

激光雷达

相比相机,激光雷达的授时接口通常更丰富。

  • 主流方案: 目前市面上的固态/半固态激光雷达,几乎全部首选接入以太网或者车载以太网跑 PTP/gPTP。
  • 老式方案: 直接吃 PPS + GPRMC。这在以前的机械式多线雷达时代非常常见(雷达适配器上会专门带一根接 GPS 模块的线)。

关于雷达的时间戳: 相机的全局快门是一瞬间完成的,但激光雷达是一束光一束光扫出来的,类似相机Rolling Shutter的果冻效应。扫完一整圈组成一帧数据需要较长的时间,比如 10Hz 就是 100ms。
工程上通常需要开启雷达的同步角(Sync Angle)设置,强制雷达在转到某个特定角度,比如正前方时作为一帧的绝对起点。以此来保证雷达输出帧率的绝对稳定,并方便和相机的 Fsync 频率强绑定。

雷达点云的一帧生命周期: 触发信号 -> 扫描开始 -> 持续发包(每个UDP包含多个点) -> 扫描结束 -> 驱动组装完成一帧 在处理激光雷达数据时,必须极其严谨地区分以下几个时间戳概念:

  1. 触发时间戳: 雷达底层收到 PPS 或 PTP 同步时刻的瞬间。通常不会使用。
  2. 点时间戳(Point Timestamp): 雷达硬件会给每一个激光点附带一个内部时间偏移量。在做运动去畸变(Motion Deskew)时,算法必须依赖这精确到微秒的逐点绝对时间,把每一个点“拉扯”回自车在那个瞬间的真实位姿。
  3. UDP包的时间戳;雷达扫描时会把接收器一次收到的多个发射器返回的多个点,组成一个UDP包,打上一个时间戳。
  4. 帧时间戳(Frame Timestamp): 驱动把几百个 UDP 包拼成一整帧点云后,赋予这一帧的总时间。你可以把它强行打在和相机触发一致的时间点上,方便后续做前融合。
  5. 系统接收时间: 域控网卡收到数据包的系统时间(受网络波动影响大,仅作监控用,绝不能喂给算法)。

毫米波雷达

由于传统毫米波雷达的数据量较小,通常采用 CAN/CAN-FD 网络进行传输。

CAN 报文里的时间戳,有的是基于 AUTOSAR 规范(StbM 模块)的全局时间同步协议。它的原理本质上就是 CAN 总线上的“微缩版 PTP”。有的是系统接收打戳, 雷达自身不管绝对时间,只发一个相对计数值(或者根本不带时间)。全靠域控底层的 CAN 驱动在收到该报文的硬件中断瞬间打上当前的系统时间。这种方式受 CAN 总线仲裁排队延迟的影响极大,误差通常在几毫秒甚至几十毫秒跳动。

随着 4D 成像毫米波雷达的数据量剧增,越来越多的雷达也开始改用车载以太网接口,并在对时协议上全面向 gPTP 靠拢。


时间同步,表面上看只是自动驾驶系统里一个不起眼的底层基础设施,但它却构成了整个感知与融合网络信任的基石。也是我们工程师调试时常会去分析的因素。从天上的卫星信号,到车内的核心枢纽,最后精准落实到每个传感器引脚上那一次次微秒级的方波跳动与激光雷达点云每个点的时间戳。这条冗长的链路中,任何一环出现毫秒级的误差,都会在高速行驶的物理世界中,瞬间被放大成几十厘米甚至足以致命的控制误差。