Glidar: 一个基于OpenGL的开源实时3D传感器仿真器
1 简介
这篇博文将介绍一个简单易用的3D传感器仿真器,可以用来模拟Lidars,立体视觉,基于时间飞行技术的ToF相机和微软的Kinect实时产生3D点云数据。Glidar仿真器并不是针对特定的某一类3D传感器,它几乎可以用来替代目前任何一种市面上的深度传感器。通过导入的目标的三维模型,实时地产生目标的3D点云数据,并可以将生成的点云数据保存,可视化,或者发布的一个传输控制协议TCP的套接字。如果有对于复杂动力学场景的需求,还可以通过TCP连接实现物理仿真。
Fig.1 Glidar 生成点云效果
Glidar仿真器是基于C++开发的,并利用了PC中的图形渲染管线实时地产生目标模型所对应的点云数据。GL Shading Language的使用保证了点云输出的速度,几乎可以作为任务点云处理算法提供输入数据。图1展示了使用Glidar产生的模拟点云的具体效果图,Glidar使用绿色和蓝色通道来储存深度信息,通过对目标模型可视化表面采样后输出模型点云。
2 实现原理
Glidar仿真器的设计中舍去了颜色信息,使用红色通道保存图像强度信息,绿色和蓝色通道保存深度信息,其中深度z的方向默认沿着相机视轴的方向。出于MacBook Air上图像架构的标准深度缓存不能轻易用于自定义的原因,放弃了使用深度缓存来保存深度信息。使用颜色缓存来存储深度信息可以直接指定精度的分布。Glidar对OpenGL中标准的管线进行了两处关键改进:1)关闭反锯齿功能,因为反锯齿功能会改变存储在绿色和蓝色通道内的深度信息;2)开启了双缓冲区(在粗略的模拟一个扫描型雷达的时候,该功能也许可以被关闭)。
2.1 可编程的渲染管线
基本的绘制对象如点,直线和多边形都可以用一系列的顶点进行定义,但是图形硬件必须提供逐像素的输出。渲染被划分成多个通道进行,最不常用的操作(如最原始的分组)被先执行。逐个原始分组的输出被顶点着色器并行处理。顶点着色器输出再被组装成基本单元以便栅格化。最终顶点着色器的输出被插值到使用逐个像素基的片段着色器,在片段着色器里,完成每个像素的颜色,纹理和深度信息的计算。值得注意的是GPU并行地计算每个顶点,然后并行地计算每个片段。
2.2 片段着色器
一个标准的片段着色器计算每个像素的颜色和透明度。这样的片段着色器将对每个片段输出四个值:R,G,B,alpha所对应的归一化的强度值. 作为对比,Glidar里的片段着色器仅仅输出红色通道值,利用绿色和蓝色通道提供深度z信息(即向量 投影到瞄准线方向的长度),alpha值目前没有分配相关值。
片段i对应的衰减可以使用标准的OpenGL光照模型计算:
其中,为片段-传感器距离,和分别对应光源的常量,线性,和二次方衰减系数。
片段i的红色强度
是衰减和颜色ci的积,其中
上式中为被采样片段的表面法向量,和分别表示扩散,环境,镜面反射颜色信息。材料的反射度用s表示,OpenGL里面允许的s 的取值范围为[0, 128].
Glidar将深度信息分为两部分存储在绿色和蓝色通道里:
其中,距离比Di定义为
上式中f 和n分别表示近远平面。
2.3 改善深度信息精度的策略
在一个标准的OpenGL着色器里,距离相机越近,对应的精度越高。这个机制对于2D渲染和生成点云数据非常有用。提升深度信息的举措主要分为两个方面:
1)使用绿色和蓝色通道存储深度信息;2)调整近平面和远平面使得目标尽可能地填充整个视野。
3 安装测试
目前Glidar已经在Ubuntu Linux 系统和Mac OSX上完成了测试,需要图形显卡支持GLSL1.2或更高版本。下篇博客将会对Glidar的详细安装过程进行说明。