1.前言
激光雷达原本主要应用在测绘领域,主要是为了制作区域点云地图测量地质信息,在2009年左右谷歌(waymo)将激光雷达应用在自动驾驶,随后很多公司开启了使用激光雷达作为主传感器的序幕。那时基本用的velodyne机械式激光雷达,大部分用的是16线 ,32线和64线雷达。
最早量产混合固态激光雷达应用在量产车奥迪A8上的是法雷奥的SCALA1 4线激光雷达,开启了乘用车应用激光雷达,但奥迪A8在公共道路因为法规的限制无法开启L3自动驾驶功能,在此之后SCALA 2在奔驰E级别车应用,但车辆较少且影响力较小,其他车型因为价格和激光算法技术成熟度选择研究或者观望。直到2021年小鹏P5车应用大疆Livox激光雷达,开启了乘用车大规模应用激光雷达的序幕,2022年被称为激光雷达“元年",蔚来、理想、上汽飞凡和智己等汽车主机厂开始大规模应用激光雷达在量产乘用车上,并作为主要亮点宣传L2.5以上辅助驾驶系统。
补充一点,微转镜混合固态激光雷达最早由法雷奥开发量产,但发扬光大的是华为96线激光雷达,随后大疆、禾赛、图达通、innoviz陆续开发该技术路线的激光雷达,他们最早开发方案都是MEMS振镜激光雷达。之所以换技术路线主要还是MEMS振镜存在固有缺陷比较明显,比如多处拼接点云不均匀,拼接处分层,以及内参标定较复杂产线工艺要求较高等。
2. 激光雷达点云数据分析和配置
通过前言内容能看出主流应用的激光雷达是混合固态激光雷达包含MEMS振镜,微转镜雷达,还有采集真值数据或者L4级别用的机械式雷达点云数据内容大部分内容接近,不同厂家或者不同型号雷达会有少部分差别,下面结合速腾和禾赛部分产品用户手册和驱动程序里激光点云数据做分析。
2.1 禾赛AT128/P
2.1.1 禾赛AT128/P 数据帧结构
禾赛目前出货量比较大的是AT128/P,AT128P是AT128升级款,AT128目前已停产。激光雷达采用1000BASE-T1车载以太网接口,数据包结构如下:
以太网包头部分数据结构里主要是雷达IP地址,目的IP地址(接收数据的零件,一般为域控制器),雷达和域控制器的端口号。
UDP数据包里主要是端口号、雷达收发配置以及128个通道的点云数据,这里需要强调一下点云数据内容,主要是点云的距离数据和点云角度(以激光雷达光心为中心原点)数据,不是平时经常看到的点云三维坐标XYZ信息,这个信息是算法根据角度和距离信息解算出来的。代码里角度分辨率为0.01°,距离分辨率一般为4mm。
帧尾数据的内容主要是机器状态信息,比如实时温度信息,电机转速,UTC时间戳等,这些信息会用作故障诊断,判断雷达本体硬件是否工作正常。
2.1.2 禾赛AT128/P雷达配置介绍
AT128是可以用网页版进行配置,AT128P是基于autosar架构开发所以取消在线网页,只能用专用软件配置,但配置项都基本一样。下面把重要的配置信息做了标注和解释,其他配置可设置默认不用修改。目的地址IP端口号需要根据雷达直连的是网关还是域控制器做配置。
2.2 速腾M1/P
速腾聚创出货量最大是M1P,2022年之前的硬件版本是M1,M1P对M1光路和收发通道做了改进。M1P的配置是在固件内写好不再展开描述,配置内容和禾赛AT128基本相近,只是没有锁相角功能
速腾雷达的数据分为扫描信息数据(MSOP)和设备信息数据(DIFOP),扫描信息数据主要就是点云数据,设备信息数据包含了机器配置和状态以及诊断信息,通过端口号不同区分这两种数据信息,有助于驱动层拿诊断数据,同时诊断信息也比较丰富,除了雷达问题,电流电压等信息,还有滤光片近处是否有物体遮挡的诊断。
MSOP里包含了125个通道点云数据,包括距离,水平角度,垂直角度,反射率等信息。
DIFOP数据类型较为丰富,有IP网关等配置信息,雷达运行状态,诊断信息,时间戳,设备内参等。
+ ERRCODE_SUCCESS正常状态。`rs_driver`不会通知这个事件。
+ ERRCODE_PCAPEXIT 播放PCAP文件时,`rs_driver`在每次解析到文件结束时,通知调用者。通过选项`RSInputParam.pcap_repeat`,可以指定是否循环播放文件。如果是循环播放,`rs_driver`报告事件ERRCODE_PCAPREPEAT;如果不是,则报告事件ERRCODE_PCAPEXIT。
+ ERRCODE_PCAPREPEAT请参考ERRCODE_PCAPEXIT的说明。+ ERRCODE_MSOPTIMEOUT `rs_driver`持续等待和接收MSOP Packet,如果在`1`秒内没有收到MSOP Packet,`rs_driver`报告事件ERRCODE_MSOPTIMEOUT。
+ ERRCODE_NODIFOPRECV对于机械式雷达,DIFOP Packet中包含垂直角标定参数。如果缺少这些参数,则点云是扁平的。收到MSOP Packet时,会检查这些参数是否可用。如果在`1`秒内不可用,`rs_driver`报告事件ERRCODE_NODIFOPRECV。对于MEMS雷达,标定工作在雷达内部已经完成,DIFOP Packet不是必要的,所以`rs_driver`不会报告这个事件。
+ ERRCODE_WRONGMSOPLEN每一种雷达的MSOP Packet的包长是确定的,且包头开始位置包括若干标志字节。`rs_driver`接收到MSOP Packet后,先检查包长是否匹配,如果不匹配,则报告错误ERRCODE_WRONGMSOPLEN,然后再检查标志字节,如果不匹配,则报告错误ERRCODE_MSOPID。+ ERRCODE_WRONGMSOPID请参考ERRCODE_WRONGMSOPLEN的说明
+ ERRCODE_WRONGMSOPBLKID对于机械式雷达,MSOP Packet中,一组点组成一个`Block`,每个`Block`也有标志字节。`rs_driver`检查`Block`的标志字节是否匹配,如果不匹配,则报告错误.ERRCODE_WRONGMSOPBLKID。
+ ERRCODE_WRONGDIFOPLEN每一种雷达的DIFOP Packet的包长是确定的,且包头的开始位置包括若干标志字节。`rs_driver`接收到DIFOP Packet后,会先检查包长是否匹配,如果不匹配,则报告错误ERRCODE_WRONGDIFOPLEN,然后再检查标志字节,如果不匹配,则报告错误ERRCODE_DIFOPID。+ ERRCODE_WRONGDIFOPID请参考ERRCODE_WRONGDIFOPLEN的说明。+ ERRCODE_ZEROPOINTS`rs_driver`构建好点云后,通过回调函数返还给调用者。返还前,它检查点云是否为空(即一个点都没有),如果为空,则报告错误ERRCODE_ZEROPOINTS。
+ ERRCODE_PKTBUFOVERFLOW`rs_driver`有两个线程:接收线程和处理线程。为了让接收线程尽快接收,防止丢包,两个线程之间有一个MSOP/DIFOP Packet队列,接收线程将Packet放入队列,处理线程从队列中取出Packet。如果处理线程太忙,来不及读出Packet,则这个队列的长度会超过指定的阈值,这时`rs_driver`会清空队列,并报告错误ERRCODE_PKTBUFOVERFLOW。
+ ERRCODE_CLOUDOVERFLOW`rs_driver`从MSOP Packet解析点,并将它们分割成点云帧。对于机械式雷达,按照Block的水平角分帧;对于MEMS雷达,根据Packet的序列号分帧。如果Packet中的数据有问题,不能触发分帧,则`rs_driver`将在当前点云实例中持续累积点,并持续消耗内存。为了避免这个问题,`rs_driver`在收到解析MSOP Packet时,检查当前点云实例中点的数量,如果超过了指定的阈值,则报告错误ERRCODE_CLOUDOVERFLOW。
+ ERRCODE_STARTBEFOREINIT使用`rs_driver`包括三个步骤:创建实例、初始化Init()、和启动Start()。使用者调用Start()之前必须先调用Init(),如果没有遵循这个次序,则`rs_driver`报告错误ERRCODE_STARTBEFOREINIT。+ ERRCODE_PCAPWRONGPATH解析PCAP文件时,`rs_driver`从读取RSInputParam.pcap_path指定的文件路径读取PCAP数据。如果这个文件打开失败,则rs_driver报告错误ERRCODE_PCAPWRONGPATH。
+ ERRCODE_POINTCLOUDNULL`rs_driver`不负责分配点云实例,它通过回调函数从调用者获得空闲的点云实例,填充它,然后通过回调函数返还给调用者。如果从调用者获得的点云实例无效,则`rs_driver`报告错误ERRCODE_POINTCLOUDNULL。