veloview读二维雷达数据_Windows下VLP16激光雷达数据解析

最近,实验室有一个对VLP16数据解析的需求,要求在Windows系统下单独把VLP16的数据解析整理出来,作为后期多传感器融合的一个必要基础准备。无奈从ROS转战Windows,网上查了查Windows系统下velodyne激光雷达的驱动,只找到了一个VeloView,很复杂,VeloView依赖winpcap、paraview、qt、python......单独摘出数据解析模块很麻烦。Kitware/VeloView​github.com

本来在Windows下在重新写一个VLP16的驱动就属于重复造轮子,而且还不能保证轮子是圆的。。。所以又转回ROS下,去撸了一遍velodyne驱动的源码,ROS下的驱动源码还是很清楚的,所以决定把ROS下velodyne驱动的数据解析模块抠出来,移植到Windows下,期间还是有些坑要踩的。

一、VLP16原始数据格式

用过VLP16的人应该都清楚它的原始数据格式,雷达的技术文档里有详细的叙述,网上也有很多帖子解释VLP16的数据格式,这里我就不详细的说了,贴出几个我觉得写的还可以的帖子,如果对VLP16数据不熟悉的建议先把介绍看一下。Velodyne VLP-16激光雷达数据格式解析​blog.csdn.net

这里我要强调的是,网上这些帖子是介绍VLP16的pcap格式原始数据的,pcap是一种通用的网络传输文件格式(本人对这方面不是很了解,叙述可能不准确。。。),它不是由驱动接收到的原始数据。例如下面是我用wireshark软件接收到的VLP16数据:

可以看到数据包的端口是2368,长度是1248字节,但这当中由pcap的42字节的数据头,因此,实际的原始数据是1206字节,从图中3框的位置开始,“ff ee”是两字节的数据开始标志。所以,我们要做的就是从网口接收VLP16的原始数据,以packet为单位,解析出一个packet的时间戳、方位角、和384个点坐标。

我的主要参考就是ROS下的velodyne驱动:https://github.com/ros-drivers/velodyne​github.com

二、程序设计

VLP16播发的是UDP数据包,可以通过socket接收,其中包括两种类型:端口为2368的数据包和端口为8308的位置包。我们主要解析数据包即可,因为它包含了点云数据、时间戳、反射率和方位角信息,够用了。如果对VLP16使用PPS + GPRMC 进行了时间同步,则在位置包中还可以解析出经纬度坐标、UTC时间戳、GPS标志等非常有用的信息。

1、socket编程

使用套接字接收原始数据,其主要代码如下:

//创建套接字 SOCKET sock = socket(PF_INET, SOCK_DGRAM, 0);

//服务器地址信息 sockaddr_in servAddr;

memset(&servAddr, 0, sizeof(servAddr)); //每个字节都用0填充 servAddr.sin_family = PF_INET;

servAddr.sin_addr.s_addr = INADDR_ANY;

servAddr

你可能感兴趣的:(veloview读二维雷达数据)