前言Lilikili:在尝试做Lidar方面的研究的时候,发现对于可视化大家的脑洞还不是很够,所以提供一些思路让大家蛤一下。
数据集
本次使用的数据集是KITTI 3D object detection条目下面的data_object_velodyne.zip,里面存储了二进制存储的Lidar数据。数据大小压缩后是26.7GB,包含7481个frame。对应的Camera数据是data_object_image_3.zip。Label什么的这次涉及不到,想要的自己找去
下载方式:因为内容存在了aws的s3里面,国内下不下来。建议使用迅雷等下载工具。
代码以及工具包
代码请移步Github:https://github.com/LGNRoy/KITTI_3D_Visulation
工具包:numpy, mayavi, matplotlib, pyside
同理,pip install的时候如果轮子下不来,建议直接去pip官网上用下载工具下载对应的轮子
基本的可视化数据集编号000001,Lidar可视化展示
这部分的代码参考了CSDN:https://blog.csdn.net/weixin_39999955/article/details/83819196
对Lidar的3D展示使用了mayavi.mlab这个工具包,效果十分强大。提供了UI,支持拖动来进行自由旋转,但是不支持平移。
颜色支持自定义。本文使用了距离(点(x, y, z)到坐标原点的直线距离)作为颜色值,使用了默认的彩虹色系,色系也可以在UI中进行切换。颜色值除了距离以外,也可以设置为高度或者反射率。
脑洞部分(开蛤)
首先来说,思路:Lidar数据是稀疏数据,按(x, y, z)点存储在笛卡尔坐标系。
但是实际上Lidar的工作原理是激光从左到右旋转,每个角度从上到下扫描。
所以依此来思考,应该会有很多点在相同角度(换句话说应该能看到很多的"竖线"),同理高度也可能会这样。
参考下两张图,可以发现,对于墙这个物体,是存在明显的竖线和横线。
那么能否能把稀疏的Lidar数据转化为二维图像数据,并解决稀疏的问题?
比如,把角度和高度离散化作为像素的位置,用距离作为灰度来绘制一张灰度图。数据集编号000000,红圈内是Lidar探测到的一面墙
透过Lidar扫描到的墙,来看墙外面的东西
展示步骤:先计用xy计算角度a,用z来代表高度h,再通过xyz计算出深度d。
对角度进行筛选、对高度进行筛选
用plt.scatter进行展示
展示效果:数据集编号000001,横纵坐标分别为角度和高度,颜色代表深度
效果差强人意。希望得到的是方方正正的一张图,每个点都按照横竖完美的对齐排列好,但是并没有。
在后续的数据分析中发现:因为lidar的光点的误差,没有看到竖线,但是点是正态分布在线上和左右,通过一些方法应该能还原出线。
横线这边,图里虽然有明显的线,但是是曲线,这代表高度不适合作为纵轴。采用yz计算出来的角度应该会更合适一点。
总的来说,嗯,挺失败的。
你们想蛤就蛤吧