介绍
LidarView是由Kitware开发的针对激光雷达点云展示、数据分析处理的3D软件,它是一个开源的项目,目前适配的雷达厂商有Velodyne、Ouster、HeSai、速腾聚创等;这个软件的前身是paraview,也是一个开源项目;LidarView通过复用paraview的核心组件来实现获取、解析、处理、渲染、展示3D点云数据,其实它本身的代码量并不多,整个框架有点类似于前后端实现:前端是用python写的,后端是调用C++来完成数据获取、处理、渲染、展示;想要定制开发LidarView软件,首先要解决解析器的问题,根据雷达厂商的点云协议开发对应的解析器,解析器的路径:Plugins\XxxPlugin\Plugin\XxxLidar\XxxPacketInterpreter
虚函数
关键的几个虚函数:
1 | void LoadCalibration(const std::string& filename) override; |
加载原始的标定配置文件,这个文件是LiDAR初始校正文件,跟算法密切相关,默认是用JSON格式的数据文件
1 | void LoadCalibration(const std::string& filename) override; |
包数据预处理,将buffer转化成数据包,获取分帧信息
1 | bool PreProcessPacket(unsigned char const *data, unsigned int dataLength, fpos_t filePosition = fpos_t(), double packetNetworkTime = 0, std::vector<FrameInformation> *frameCatalog = nullptr) override; |
包数据校验(跟点云协议密切相关)
1 | bool IsLidarPacket(unsigned char const * data, unsigned int dataLength) override; |
packet解包,解析成可视化的VTK三位数据
1 | void ProcessPacket(unsigned char const * data, unsigned int dataLength) override; |
自定义解析器名称
1 | std::string GetSensorInformation(bool shortVersion = false) override; |
给新的一帧数据划定缓冲
1 | vtkSmartPointer<vtkPolyData> CreateNewEmptyFrame(vtkIdType numberOfPoints, vtkIdType prereservedNumberOfPoints = 60000) override; |
数据结构
原始点云帧的数据结构分为三个部分:header、blocks、tail
1 |
|
点云3D数据容器:
1 | vtkSmartPointer<vtkPoints> Points; |
流程分析
整个解析器的数据处理流程如下:
- unsigned char const * data
- 自定义packet
- 解析时间戳信息
- 解析分帧信息
- 极坐标数据转化位笛卡尔坐标系数据
- 解析自定义点云数据(laserID、intensity、帧ID等)
- 往vtkPolyData类型里边填充三维坐标信息