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的详细安装过程进行说明。

Glidar: 一个基于OpenGL的开源实时3D传感器仿真器的更多相关文章

  1. 一个基于 Vue3 的开源项目,3个月时间 star 终于破千!

    本文主要是对如何做开源项目的一些思考. 前文回顾: <Vue3 来了,Vue3 开源商城项目重构计划正式启动!> <一个基于 Vue 3 + Vant 3 的开源商城项目> 关 ...

  2. 一个基于DDD的开源项目,各种技术!

    基于asp.net mvc + DDD 构架的开源.net cms系统. 运行截图: 特性: 跨平台 支持Windows.Linux.MacOX运行.linux运行案例:http://blog.ops ...

  3. 一个基于Orchard的开源CRM --coevery简介

    Coevery是开源的.NET Web平台项目,力争打造一个开放而鲁棒的CRM系统,采用Orchard架构,并使用AngularJS改善页面体验.作为一个后发优势的CRM 产品,Coevery 具有一 ...

  4. 新做的一个基于OPENGL的gui库

    #include <BGE/All> ,text);     button->setName(name);     button->setSize(Vector2f(,)); ...

  5. 基于C/S架构的3D对战网络游戏C++框架 _01服务器端与客户端需求分析

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  6. [转] X-RIME: 基于Hadoop的开源大规模社交网络分析工具

    转自http://www.dataguru.cn/forum.php?mod=viewthread&tid=286174 随着互联网的快速发展,涌现出了一大批以Facebook,Twitter ...

  7. 转: Orz是一个基于Ogre思想的游戏开发架构

    Orz是一个基于Ogre思想的游戏开发架构,好的结构可以带来更多的功能.Orz和其他的商业以及非商业游戏开发架构不同.Orz更专著于开发者的感受,简化开发者工作.Orz可以用于集成其他Ogre3D之外 ...

  8. GPUImage ==> 一个基于GPU图像和视频处理的开源iOS框架

    Logo 项目介绍: GPUImage是Brad Larson在github托管的开源项目. GPUImage是一个基于GPU图像和视频处理的开源iOS框架,提供各种各样的图像处理滤镜,并且支持照相机 ...

  9. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之 Http 请求客户端

    一个技术汪的开源梦 —— 目录 想必大家在项目开发的时候应该都在程序中调用过自己内部的接口或者使用过第三方提供的接口,咱今天不讨论 REST ,最常用的请求应该就是 GET 和 POST 了,那下面开 ...

随机推荐

  1. Cacti部署之配置防火墙

    因为SNMP协议通信会使用udp 的161端口和tcp的199端口,因此需要在防火墙上将其开启 开启入站端口   保存数据或者重启服务   测试SNMP工具连接是否可获取信息     注意:要能使用s ...

  2. 页面加载通过javascript来修改控件属性

    function changeFormElementStatus(tagNames) {            var tagNameArr = tagNames.split("," ...

  3. java的-D命令行参数 mvn -D参数

    java的-D命令行参数 我们会用mvn启动一个应用,如下的命令行: MAVEN_OPTS="-XX:PermSize=256m -XX:MaxPermSize=512m" mvn ...

  4. Win7下安装Flash低版本

    我把HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia\FlashPlayer\SafeVersions中高于要装的版本的项目都删了,还是不行. 看了这个帖子后发现,原来64 ...

  5. iOS开发-测量APP启动耗时

    冷启动 冷启动就是App被kill掉以后一切从头开始启动的过程. 热启动 当用户按下home键的时候,iOS的App并不会马上被kill掉,还会继续存活若干时间.理想情况下,用户点击App的图标再次回 ...

  6. Java通过UUID随机生成36位、32位唯一识别码(唯一字符串)

    import java.util.UUID; /** * 通过UUID随机生成36位.32位唯一识别码(唯一字符串) * @author [J.H] * */ public class Test { ...

  7. WIN10 java环境变量问题之 配置的JDK1.8版本却是1.7

    问题前沿,在开发项目中,发布的项目出现了内存溢出问题,我挨个把代码看了一遍,并不能准确定位到那个地方能出现内存溢出问题,后来想到使用压力测试,较可能出现内存溢出的接口进行一番测试. 我就安装了一个ap ...

  8. -java转json hibernate懒加载造成的无限递归问题

    1.在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系. JoinColumn(name="pid") 2. 在保存数据时,总是先保存的 ...

  9. 紫书 例题8-2 UVa 11605(构造法)

    这道题方法非常的巧妙, 两层的n*n, 第一层第I行全是第I个国家, 第二层的第j列全是第j个国家.这样能符合题目的条件.比如说第1个国家, 在第一层的第一行全是A, 然后在第二层的第一行就有ABCD ...

  10. STM32 关于头文件路径没添加错误问题(cannot open source input file "spi.h": No such file or directory)

    error:  #5: cannot open source input file "spi.h": No such file or directory 1.出现这种问题,首先要确 ...