ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

SPAD激光雷达从原理到实战:单光子探测与点云SLAM配置

SPAD激光雷达从原理到实战:单光子探测与点云SLAM配置 做激光雷达点云处理和SLAM的人最近应该有一个明显感受SPAD这个词从学术论文里跑到了工程选型表上。单光子雪崩二极管Single Photon Avalanche DiodeSPAD凭借单光子级别的探测灵敏度正在改变激光雷达的测距上限和适用场景。我花了几个月时间从原理层面重新梳理SPAD再到实际项目里配置基于SPAD的激光雷达中间踩了不少坑也积累了一些可以复用的经验。这篇文章打算把原理到实战配置这条线完整讲一遍适合正在评估SPAD方案的工程师也适合刚接触单光子探测、想搞懂它为什么能测那么远的学生。1. 激光雷达的探测瓶颈与SPAD的登场逻辑1.1 APD方案在远距离与低反射率场景下的力不从心传统激光雷达的接收端大多用PIN光电二极管或APD雪崩光电二极管。APD通过内部高电场让光生载流子发生雪崩倍增把微弱光信号放大几十到几百倍配合跨阻放大器TIA输出电脉冲。这套方案在近距离和中距离场景下非常成熟做无人驾驶、AGV导航、安防监控都没问题。但一旦把工况推到极限APD的短板就很明显它本质上是一个线性放大器信号和噪声会被同步放大。所以当目标距离拉远、反射率又低的时候回波光子数量锐减APD输出信号很容易淹没在接收电路的热噪声和背景光噪声里。就算加大激光峰值功率也会受到人眼安全等级尤其是905nm波段接近视网膜吸收峰值和电源功耗的限制。我自己做过一次实测用905nm的APD方案雷达去测200米外一辆深色车反射率大概只有5%左右结果点云稀疏得几乎没法看。后来换成SPAD方案的原型机同样条件下点云密度提升非常明显。这个对比给我的冲击挺大的也是我认真研究SPAD的起点。1.2 SPAD在激光雷达中的定位不是替代而是补位与扩展很多人误以为SPAD要全面替代APD实际不是这样。SPAD的工作机制决定了它更像一个数字化单光子计数器天生适合弱信号、远距离、低反射率场景而APD在中等距离、高动态范围、连续波相位式测距里仍有成本优势。目前行业里常见的设计是混合架构近距离用APD通道保证点云稠密度和强度信息远距离用SPAD通道做补盲和远距目标捕获。从成本角度看SPAD阵列的工艺已经从早期昂贵的定制流片逐步迁移到标准CMOS工艺上。意法半导体、索尼、佳能、滨松这些厂商都有面向激光雷达的SPAD产品线。CMOS工艺带来的好处是能把SPAD像素、淬灭电路、TDC时间数字转换器甚至直方图处理逻辑集成到同一颗芯片里像素数从单点做到几百乘几百的阵列。这颗芯片再接一片FPGA或SoC做数据整理就可以对外输出点云或者原始直方图数据。所以我的判断是SPAD不是简单替代APD而是把激光雷达的能力边界往外推了一大截。如果你要做长距测绘、低反射率目标检测、或者弱光环境下的感知SPAD路线值得重点关注。2. SPAD单光子探测的核心机制盖革雪崩、淬灭与统计测距2.1 盖革模式一颗光子触发整个雪崩链SPAD的工作模式叫盖革模式Geiger Mode。普通PN结光电二极管工作在反向偏压较低的状态光生载流子不会触发雪崩APD工作在略低于击穿电压的状态让载流子发生受控倍增而SPAD直接工作在击穿电压之上这个超过击穿电压的差额叫过偏压OvervoltageV_OV。在盖革模式下PN结内部电场极强一个光子被吸收产生一个电子空穴对后这个载流子在电场中被加速碰撞电离出更多载流子再加速再碰撞形成链式雪崩效应。整个过程非常快几纳秒内电流就会从纳安级别飙升到毫安级别相当于一个光子被放大成百万倍的电流信号。这个要么不触发、一触发就是大信号的特性让SPAD天然适合数字式探测。但正因为工作在击穿电压之上SPAD无法像APD那样输出与入射光强度成比例的线性信号。它输出的是标准数字脉冲告诉你在这个时间点有一个光子被探测到了。至于光强信息要靠统计一段时间内光子事件的数量来间接估算。2.2 淬灭电路让SPAD活过来盖革雪崩一旦被触发如果没有外部干预电流会一直维持下去SPAD就永远处于导通状态无法继续探测下一个光子。所以必须有一个淬灭机制把雪崩过程掐断让SPAD恢复到待探测状态。淬灭分被动淬灭和主动淬灭两种。被动淬灭最简单在SPAD阳极串联一个几百千欧的淬灭电阻。雪崩电流在电阻上产生压降导致SPAD两端的实际偏压降到击穿电压以下雪崩自然熄灭然后电源通过淬灭电阻重新给SPAD结电容充电恢复待探测状态。这个过程简单可靠但恢复时间较长限制了SPAD的最大计数率。主动淬灭则用比较器和开关晶体管在检测到雪崩后迅速主动拉低偏压再快速恢复死时间可以做到更短适合高重复频率的激光雷达场景。淬灭时间和恢复时间合起来叫死时间Dead Time。在激光雷达里死时间决定了两个连续光子事件之间的最小间隔。如果回波光子到达速率太高就会有一部分光子被漏掉这部分损失叫饱和效应。实际配置时需要在计数率和灵敏度之间权衡死时间越短饱和容忍度越高但功耗和电路复杂度也会上升。2.3 直方图测距单光子探测如何变成精确的距离值单次光子事件的时间戳本身噪声很大不能直接作为测距结果。所以SPAD激光雷达普遍采用时间相关单光子计数TCSPC技术激光器每次发射脉冲时同步启动一个时间窗TDC记录SPAD探测到光子的时间差对同一距离门重复成千上万次测量后把所有光子事件按时间戳累积成直方图峰值对应的横坐标就是回波到达时间。这个思路可以类比成一个精确的秒表统计每次测量都有误差但重复很多次之后真实回波信号会持续出现在同一个时间位置而随机噪声在各个时间位置都均匀分布。所以累积次数越多信噪比越高测距精度也越高。这里有个关键概念叫距离门Range Gate。激光雷达不会无限等待光子回来而是只在一定时间窗口内开启TDC计数。这个窗口对应的就是最大量程。例如你只想测300米以内的目标光来回时间是2微秒那TDC的计时窗口就开到2微秒左右。距离门之外的事件要么被丢弃要么被用于背景光噪声估计。3. 从芯片到系统SPAD激光雷达的硬件架构与链路设计3.1 单点、线阵、面阵不同SPAD阵列形态的取舍SPAD在激光雷达里的阵列形态直接决定了雷达的扫描方式和点云帧率。目前市面上能看到三种主流形态。单点SPAD加机械扫描结构最简单早期远距激光雷达原型机常用用一个SPAD配合双轴振镜或转镜逐点扫描。优点是成本低缺点是帧率上不去点云稀疏。线阵SPAD是当前的一个甜点方案比如1x16或1x64的SPAD线列配合一维转镜可以在一个方向上进行机械扫描另一个方向靠线阵覆盖单位时间的探测效率比单点高一个量级。面阵SPAD则彻底抛弃机械扫描用例如32x32、128x128的SPAD像素阵列配合光学透镜直接获得二维光子计数图再结合激光泛光照明实现Flash式激光雷达。我在测试中发现面阵SPAD看起来最美好但对光学系统要求极高每个像素需要一个对应方向的透镜微元而且大阵列的DCR、串扰、功耗管理都是麻烦事。相比之下线阵SPAD加转镜的方案在工程成熟度上更占优这也是不少厂商愿意先做线阵的原因。3.2 读出电路与时间数字转换器精确到皮秒的计时SPAD像素本身只负责探测光子真正决定测距精度的是时间测量链。激光脉冲发射时刻、SPAD雪崩触发时刻都需要通过TDC量化为数字时间戳。TDC的分辨率直接决定距离分辨率理论上1纳秒时间分辨对应15厘米光程距离分辨要做到厘米级精度TDC分辨率至少得达到几百皮秒甚至几十皮秒。设计TDC时有几种常见架构。简单计数器法用一个高频时钟计数分辨率受限于时钟频率延时链法用多级缓冲单元把时间量程切细能达到亚纳秒分辨率多相位采样法则利用多个不同相位的时钟同时采样在分辨率和功耗之间取得平衡。现代SPAD芯片大多把TDC阵列直接集成在像素阵列下方每像素或每组像素对应一个TDC避免多路复用带来的时间精度损失。实际应用里还会有一个校准问题TDC的每个bin时间槽位宽度并不是完全均匀的。由于工艺偏差不同TDC通道的bin宽度可能相差几个百分点。所以雷达出厂或者上电时需要做码密度测试统计随机光子事件落在一个完整量程内各个bin的数量反过来校正每个bin的实际宽度。这个细节如果你不做后续点云的距离一致性会出问题。3.3 光学链路预算用公式推算出能测多远很多工程师一上来就想把SPAD雷达的测距能力试出来但更靠谱的做法是先做光学链路预算。SPAD雷达的接收光功率可以近似为P_r P_t × η_t × η_r × ρ × (A_r / (π × R²)) × η_atm其中P_t是激光峰值功率η_t是发射光学效率η_r是接收光学效率ρ是目标反射率A_r是接收孔径面积R是目标距离η_atm是大气透过率。对于SPAD接收还需要换算成光子数单位时间内到达SPAD像素表面的光子数N_ph P_r × λ / (h × c)然后用SPAD的光子探测效率PDP相乘得到实际被探测到的光子数。最终测距可靠性取决于信号光子在直方图累积周期内的总计数、环境背景光导致的噪声计数、SPAD暗计数三者的比值。我举个实际算例。假设激光峰值功率50W脉冲宽度5ns重频100kHz发射和接收光学效率各0.8目标反射率0.1接收孔径直径30mm目标距离300m大气透过率0.9。算出来单位脉冲接收光功率大约在纳瓦量级一个脉冲回波内到达的光子数大概是几十个乘以PDP905nm下大约5%到10%最后每个像素每脉冲能探测到几个光子左右。如果不做多次累积这个信号是不够看的。但你把累积次数做到几百次甚至上千次有效计数被累积起来信噪比就会显著改善。链路预算的意义就在于在买硬件之前你就能估算出在某距离上用多少累积次数能拿到可用的点云。4. 实战配置SPAD激光雷达从选型到参数标定的完整路径4.1 选型时看数据手册重点看哪五个参数SPAD器件的数据手册和普通光电二极管很不一样。我建议重点盯五个参数光子探测概率PDP、暗计数率DCR、时间抖动TTS、后脉冲概率、死时间。PDP是SPAD对入射光子的敏感度通常给出随波长变化曲线。你需要在自己雷达使用的激光波长处查值。以905nm为例好的CMOS SPAD的PDP能做到5%到15%之间注意这个值受过偏压影响很大数据手册给你的通常是某个过偏压下的最大值。DCR表示没有光照时SPAD自发触发的速率单位是cps或者Hz。单个像素DCR越低越好比如几十Hz到几百Hz对于面阵还要看DCR的分布是不是均匀。时间抖动TTS决定测距精度。TTS越小直方图峰越尖锐距离分辨率越高。好的SPAD的TTS可以做到100皮秒量级对应距离误差大约1.5厘米。后脉冲概率反映雪崩时被陷阱捕获的载流子被延迟释放、再次触发雪崩的比例它会直接在目标后面产生假回波。死时间前面说过决定了最大可用计数率。4.2 偏压与温度补偿把暗计数率压下去的实操方法SPAD的击穿电压随温度漂移一般在20到80毫伏每摄氏度之间。如果你用一个固定偏压温度升高后过偏压变小PDP下降温度降低后过偏压变大暗计数率飙升。所以SPAD雷达必须有温度补偿机制。常见做法是利用SPAD自身作为温度传感器扫描偏压观察暗计数率突然上升的拐点这个拐点就是当前温度下的击穿电压。然后控制DAC输出偏压始终维持设定过偏压值。我在项目里用了一个简单的闭环热敏电阻贴在SPAD芯片背面查表得到击穿电压温度曲线偏压输出做线性补偿。实测下来在-10℃到60℃范围内暗计数率波动可以控制在两倍以内。还有一个容易忽略的点过偏压并不是越大越好。增大过偏压可以提高PDP但暗计数率、后脉冲概率和功耗都会跟着涨。我通常的做法是扫描过偏压从1V到5V视器件规格而定每0.2V记录一组DCR、PDP、TTS数据画成曲线再选工作点。这个工作点往往不是所有参数的最优值而是信噪比综合最优的一个折中。4.3 多脉冲累积次数与误码率之间的平衡SPAD雷达不像传统APD雷达那样单脉冲就能得到距离值它需要在同一个扫描角上重复发射很多次激光脉冲把光子事件累计成直方图再去搜索峰值。累积次数M越多信号计数按M线性增长噪声计数按sqrt(M)增长所以信噪比与sqrt(M)成正比。也就是说要把信噪比提高10倍累积次数理论上需要增加100倍。这带来一个直接问题累积次数增加意味着帧率下降。一个扫描角度耗时 激光周期 × 累积次数。比如激光重频200kHz累积512次那么每个角度耗时约2.56毫秒。如果一条扫描线有1000个角度点这一线就要2.56秒帧率很感人。所以实际配置时要根据场景需求做取舍远距稀疏模式用大累积次数近距稠密模式用小累积次数甚至可以动态调整。延迟和点云畸变也与此有关。如果累积次数太大雷达在同一位置停留时间过长遇到车辆运动或转弯一帧点云内部的时间跨度会很大直接喂给SLAM就会产生运动畸变。我一般建议车载前向感知场景里单角度累积尽量控制在200次以内后续靠算法滤波来补点云质量测绘场景里可以放宽到1000次以上因为雷达多数安装在缓慢移动的平台。4.4 实测标定流程从原始直方图到点云输出拿到SPAD雷达模块之后第一步不是直接跑建图而是标定。我整理了一个可以照做的流程第一步固定雷达正对一个已知反射率的平面靶标距离用激光测距仪或者钢卷尺量准确。分别在10米、30米、50米、100米等几个距离点采集原始直方图。第二步从采集的直方图里确认目标峰的位置和宽度。目标峰对应的横坐标用时间单位表示换算成距离要乘以光速再除以2同时减去系统固定延迟。第三步计算距离残差。如果所有距离点都存在一个相同偏移量那基本是内部电路延迟需要在软件里做补偿如果偏差随距离变大而变大可能是TDC bin宽度校准没做好要重新做码密度测试。第四步标定反射率响应。用10%、50%、90%反射率的标准靶标在相同距离下采集回波计数拟合反射率与计数之间的响应曲线。这一步之后点云强度数据才有物理意义。第五步生成点云时设定阈值。直方图峰值计数超过某个阈值才判为有效目标低于阈值的视为噪声丢弃。阈值的选取要参考暗计数分布的均值和标准差通常用均值加三倍或五倍标准差。这套流程看着繁琐但直接决定后续点云质量。我曾经跳过第二步直接拿点云去建图结果建出来的地图整体距离偏差了20多厘米排查了很久才发现是系统固定延迟没补偿。5. SPAD点云的特殊脾气噪声分布与SLAM建图算法对接5.1 单光子点云的噪声模型为什么和传统雷达不一样传统APD雷达点云的噪声主要体现在距离抖动上一般是高斯分布噪点散布在真实目标附近离群点不多。SPAD雷达的噪声则有两类明显差异一是暗计数和背景光产生的随机噪点在空间和时间上均匀分布离真实目标很远二是后脉冲噪声呈现目标后面跟随一个假峰的特征。这直接影响下游算法。如果你还是用传统激光雷达的适配参数去做统计滤波比如半径离群点移除可能把远处真值当离群点删掉同时也删不掉均匀分布的暗噪点因为暗噪点有聚集起来的可能。所以在做SLAM之前我建议先给SPAD点云加一道预处理基于强度/计数通道做自适应阈值分割。SPAD雷达如果输出原始光子计数或者峰值计数这个值可以用来判断一个点是不是有效回波。真实目标的峰值计数通常比较高而暗计数虽然分布随机、但单点计数很低用阈值法可以干掉大部分底噪。5.2 对接Cartographer等建图算法时的配置要点热搜词里反复出现的ros2 cartographer 激光雷达建图确实是我日常工作的主战场。用SPAD雷达对接Cartographer有几个配置要点不能忽略。第一帧率和角分辨率必须匹配Cartographer的期望。Cartographer对点云输入的角分辨率和帧率变化比较敏感。SPAD雷达的动态累积次数会导致帧内每个点的等效角分辨率不均匀我建议先通过体素滤波和固定角度插值把点云均匀化再发布给Cartographer。第二距离噪声模型要从Cartographer的激光扫描匹配参数上做调整。在Cartographer的trajectory_builder_2d.lua配置里有min_z、max_z参数控制点云的距离范围SPAD雷达在近距离可能因为强回波饱和导致的死区明显所以要合理设置近端截止值。同时SPAD雷达点云可能含有远距离稀疏真值Cartographer不需要太远的点建议设置max_z把超出局部地图范围的远点切掉避免影响局部扫描匹配的收敛性。第三给雷达数据加上时间戳补偿。SPAD雷达因为内部累积每帧点云的时间跨度比较大暴露在Cartographer里会表现为点云边缘拖影。我在自己做的公共包基础上对SPAD点云按扫描角度做时间插值再送到扫描匹配里线性化误差明显下降。这个步骤在高速运动场景里尤其重要。5.3 运动畸变校正单光子雷达更容易忽视的一环SPAD雷达由于单点累积时间可达毫秒级运动畸变比传统雷达更严重。以AGV小车为例如果车速1m/s雷达以扫描方式逐点累积一个角度扫描间隔内的位移可能只有几毫米但一帧1000个点的扫描周期下来车已经移动了0.5米以上这0.5米的位移如果不补偿建图边缘直接糊。处理思路有两种一个是激光雷达内建IMU融合在输出点云时按位姿插入给每个点重新算坐标SPAD雷达原厂一般会在驱动里做这一步另一个是下游把点云拆成多次扫描与IMU航迹推演结合。用卡尔曼滤波或者因子图把IMU数据与雷达帧内时间戳对齐每个点都对应一个插值位姿再做坐标变换。我在项目中用的是第二种思路实测在1m/s的机器人平台上畸变从25厘米降到3厘米以内基本满足栅格建图要求。6. 我在试用SPAD雷达过程中踩过的坑6.1 暗计数随温度漂移的坑第一次把SPAD雷达跑起来是在夏天室内温度28℃点云表现还行。后来放到室外太阳底下晒了一个小时后点云里多了很多随机噪点甚至有几米的幻影点。一开始我以为是镜头脏了后来才发现是SPAD芯片温度升高导致暗计数率翻了几倍而偏压没有跟着温度做补偿。解决办法就是前文提到的闭环温度补偿。如果条件允许最好在雷达主控里保存一条击穿电压与温度的标定曲线每次上电时快速校准一个点再按曲线做动态补偿。实测下来这个补偿能把噪点数量在温度变化20℃的情况下压到两倍以内不补偿的话可能差一个数量级。6.2 后脉冲导致的距离拖尾还有一个印象深刻的坑用SPAD雷达测一面平整白墙墙后面总跟着一个若隐若现的影子点云距离大概是真值的1.02倍左右。后来确认这不是多路径效应而是后脉冲造成的假回波。SPAD像素在强回波后产生一个概率性的延迟雪崩在直方图上表现为目标峰后面多了一个小次级峰。这个问题的处理有几个层次。硬件上可以通过优化淬灭电压和偏压来降低后脉冲概率算法上可以在峰值搜索时设置最小峰间隔如果两个峰之间的距离小于设定的最小间隔且第二峰计数低于主峰的某个百分比就认为是后脉冲并剔除。6.3 地面点反射率过低导致的丢点在建图测试中我发现SPAD雷达对深色地面和低反射率物体的点云非常稀疏尤其是黑色橡胶跑道路面反射率可能只有2%到4%需要极高的累积次数才够检测。但在低累积模式下地面点成片消失导致Cartographer建图时地面约束变弱地图质量下降。这个问题的实用办法是不要指望单一累积次数满足所有场景。在驱动里把视场分成多个扇区对不同扇区设置不同的累积次数。比如前方远距区域用512次累积下方近地区域用64次累积。这样在保证远距探测的同时近地点的帧率也能跟上建图需求。不同累积次数的点在输出时用不同强度值标记方便下游算法根据权重处理。6.4 多台雷达互相干扰的坑有次同时开了三台SPAD雷达做实验点云里出现了规律的带状假目标间隔距离恰好等于雷达探测距离的一半。原因是多台雷达的激光脉冲重复频率相近A雷达的激光脉冲被B雷达当成自己的回波接收了。在SPAD这种高灵敏度探测体制下跨雷达干扰问题被严重放大。解决思路主要有三种一是给每台雷达分配不同的激光脉冲重复频率让干扰脉冲无法在不同累积次数下形成稳定峰值二是利用编码脉冲序列比如不等间隔伪随机脉冲让干扰在直方图累积中被打散三是在同步接口上给多台雷达做硬件触发对齐错开脉冲发射时刻。最省事的还是第一种操作上记住两个原则多个雷达的重复频率至少错开5%以上且不要存在整数倍关系。我自己后来在项目文档里加了一条硬件规范所有SPAD雷达在布网前必须先做互扰测试开机后查看各雷达直方图如果出现了非本机距离门位置的稳定峰直接调整重频直到干扰峰消失。这套流程虽然朴素但在多机协同里非常顶用。写在最后的一点经验SPAD单光子探测器从实验室走向激光雷达量产最核心的变化不是探测灵敏度本身而是它迫使整个系统从模拟思维转变成统计思维。以前调APD雷达关注的是放大器增益和阈值电压现在调SPAD雷达关心的是累积次数、直方图信噪比、死时间和后脉冲概率。这套新参数体系的调试经验目前业内还在快速积累中很多设计上的取舍没有标准答案只能靠实测和迭代。如果你正准备上手SPAD方案我的建议有两个一是别急着直接替换现有雷达先拿一套带原始直方图输出的测试模块把数据链路吃透二是设计雷达算法时从第一性原理出发自己把链路预算和噪声模型从头推导一遍这样后续遇到任何反常现象都能快速定位方向。从我自己这些日子的使用体验来看SPAD雷达确实难调但它的性能上限也是传统激光雷达方案很难企及的。
返回列表