作者:ShownSun
公众号:时沿科技
基于VeloView测试自己的激光雷达样机
前言
VeloView软件是Velodyne激光雷达厂商与Paraview合作设计的用于Velodyne产品的开源产品,该软件可以通过github或者Paraview官方网站下载获取。目前Velodyne的产品包括Alpha Prime、Ultra Puck、Puck、Puck LITE、Puck Hi-Res、HDL-32E等系列产品,这些产品应用于不同的应用场景,包括无人机、无人机汽车、农业机械和地面无人系统等。
样例产品
Velodyne不同的产品都是用相同的VeloView软件显示3D场景信息,对于用户来说唯一不同的就是xml文件的不同,只要设计好对应的xml文件即可使用。
如果想要为自己的激光雷达产品应用VeloView来进行一些前期的开发工作,比如测试相关产品的性能、稳定性、成像质量等,那么成熟的VeloView开源软件是一个不错的选择。
例如:有一款雷达使用一个激光发射机、一个激光接收机,扫描方式为矩形扫描64(像素点)x 180(像素点),先俯仰向扫描60个像素点,在方位向往上移动1个像素点,那么可以选择Velodyne的64线激光雷达产品协议进行数据传输。如果自己的雷达俯仰上不是64个像素点,那么只需要将对应像素点距离、强度数据置零即可。
数据格式
关于Velodynw 64线激光雷达数据传输协议之前介绍过,不了解的可翻阅查看。这里只针对上一段的一个激光发射机、一个激光接收机,扫描方式为矩形扫描64(像素点)x 180(像素点),先俯仰向扫描60个像素点,在方位向往上移动1个像素点的雷达进行数据格式的转换,使其适用于Velodynw 64线激光雷达数据传输协议。如果自己的雷达俯仰上不是64个像素点,那么只需要将对应像素点距离、强度数据置零即可。
首先正如之前文章介绍过的,只需要修改xml文件。而且这种一发一收的更加简单,只需要更改每个像素点的俯仰角度即可。如果俯仰角度范围为20°,且都在雷达水平视线之上,那么从下往上角度依次为-10°、-9.69°、-9.37°…共计64个角度。
然后就是传输的数据格式,因为像素矩阵为64(像素点)x 180(像素点),所以upper与lower数据段都设计为32个像素点(关于upper和lower见上一篇文章的Velodyne 64线激光雷达协议)。如果自己的雷达俯仰上不是64个像素点,那么只需要将对应像素点距离、强度数据置零即可。Upper对应上面32个激光器,用0xEEFF表示,lower对应下面32个激光器,用0xDDFF表示。此外,方位角的设置同upper、lower一样在包头中设置。一个UDP数据包传输12个upper和lower像素点数据,详细的数据包字节见下图。
FPGA代码
这里只是使用ZYNQ的ARM端仿真数据进行UDP数据的传输测试,所以并没有将FPGA端处理后的雷达距离、强度数据与ARM端进行通信。需要的话,只要使用AXI4进行连接即可。下图为ZYNQ的信号处理IP核,里面配置了DDR与网口串口等模块。
ARM代码
在ARM端按照数据传输协议设计仿真数据。
static u16 packet_cnt = 0;
static u16 azimuth_cnt = 0;
static u16 azimuth_val = 0;
static u8 distance_cnt = 0;
void packet_data_update(void)
{
u32_t i;
for (i = 0; i < UDP_SEND_BUFSIZE; i++)
send_buf[i] = distance_cnt;
for (i = 0; i < UDP_SEND_BUFSIZE; i=i+100)
{
send_buf[i] = 0xff;
send_buf[i+1] = 0xee;
}
for (i = 600; i < UDP_SEND_BUFSIZE; i=i+100)
{
send_buf[i] = 0xff;
send_buf[i+1] = 0xdd;
}
azimuth_val = packet_cnt + azimuth_cnt * 0x07ff;
for (i = 2; i < UDP_SEND_BUFSIZE; i=i+100)
{
send_buf[i] = 0x22;
send_buf[i+1] = 0x22;
}
send_buf[UDP_SEND_BUFSIZE - 6] = 0x00;
send_buf[UDP_SEND_BUFSIZE - 5] = 0x00;
send_buf[UDP_SEND_BUFSIZE - 4] = 0x00;
send_buf[UDP_SEND_BUFSIZE - 3] = 0x00;
send_buf[UDP_SEND_BUFSIZE - 2] = 0x37;
send_buf[UDP_SEND_BUFSIZE - 1] = 0xa0;
packet_cnt = packet_cnt + 0x000f;
if(packet_cnt >= 0x2327)
{
packet_cnt = 0;
distance_cnt++;
if(distance_cnt >= 255)
{
distance_cnt = 0;
azimuth_cnt++;
if(azimuth_cnt >= 255)
azimuth_cnt = 0;
}
}
}
测试
关于数据的正确性验证可以通过wireshark软件抓取数据包分析即可。网上关于wireshark使用的文章很多,不做赘述。
下面是VeloView实时采集的测试数据,显示了矩形像素图像随着初始方位角度的变化不断变化的过程。