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的详细安装过程进行说明。
Glidar: 一个基于OpenGL的开源实时3D传感器仿真器的更多相关文章
- 一个基于 Vue3 的开源项目,3个月时间 star 终于破千!
本文主要是对如何做开源项目的一些思考. 前文回顾: <Vue3 来了,Vue3 开源商城项目重构计划正式启动!> <一个基于 Vue 3 + Vant 3 的开源商城项目> 关 ...
- 一个基于DDD的开源项目,各种技术!
基于asp.net mvc + DDD 构架的开源.net cms系统. 运行截图: 特性: 跨平台 支持Windows.Linux.MacOX运行.linux运行案例:http://blog.ops ...
- 一个基于Orchard的开源CRM --coevery简介
Coevery是开源的.NET Web平台项目,力争打造一个开放而鲁棒的CRM系统,采用Orchard架构,并使用AngularJS改善页面体验.作为一个后发优势的CRM 产品,Coevery 具有一 ...
- 新做的一个基于OPENGL的gui库
#include <BGE/All> ,text); button->setName(name); button->setSize(Vector2f(,)); ...
- 基于C/S架构的3D对战网络游戏C++框架_01服务器端与客户端需求分析
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- [转] X-RIME: 基于Hadoop的开源大规模社交网络分析工具
转自http://www.dataguru.cn/forum.php?mod=viewthread&tid=286174 随着互联网的快速发展,涌现出了一大批以Facebook,Twitter ...
- 转: Orz是一个基于Ogre思想的游戏开发架构
Orz是一个基于Ogre思想的游戏开发架构,好的结构可以带来更多的功能.Orz和其他的商业以及非商业游戏开发架构不同.Orz更专著于开发者的感受,简化开发者工作.Orz可以用于集成其他Ogre3D之外 ...
- GPUImage ==> 一个基于GPU图像和视频处理的开源iOS框架
Logo 项目介绍: GPUImage是Brad Larson在github托管的开源项目. GPUImage是一个基于GPU图像和视频处理的开源iOS框架,提供各种各样的图像处理滤镜,并且支持照相机 ...
- 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之 Http 请求客户端
一个技术汪的开源梦 —— 目录 想必大家在项目开发的时候应该都在程序中调用过自己内部的接口或者使用过第三方提供的接口,咱今天不讨论 REST ,最常用的请求应该就是 GET 和 POST 了,那下面开 ...
随机推荐
- 日志记录~log4.net
1. 添加Log4net引用 2. 添加配置文件 Log.config <?xml version="1.0" encoding="utf-8"?> ...
- Ubuntu 14.04安装Skype
Skype 4.3版本在14.04 LTS工作正常.安装步骤: $ sudo apt-get remove skype skype-bin:i386 skype:i386 $ sudo apt-get ...
- QQ自动登录里的一些控件知识
在这个程序里面有个读取计算机指定文件的知识: private void button2_Click(object sender, EventArgs e) { openFileDialog1.Show ...
- CommandType.Text
CommandType.Text代表执行的是SQL语句CommandType.StoreProcedure代表执行的是存储过程CommandType代表要执行的类型 //返回DataTable的SQL ...
- 使用 Sublime 或其他编辑器调试 Tampermonkey 油猴脚本
作者说由于 Chrome 安全限制,没办法调用外部编辑器调试,但提供了一个间接办法,那就是脚本中使用@require file:///引入本地文件的形式,具体的方法是 打开 chrome://exte ...
- Codeforces Round #493 (Div. 2) A. Balloons 贪心水题
由于是输出任意一组解,可以将价值从小到大进行排序,第一个人只选第一个,第二个人选其余的.再比较一下第一个人选的元素和第二个人所选元素和是否相等即可.由于已将所有元素价值从小到大排过序,这样可以保证在有 ...
- PHP下的异步尝试二:初识协程
PHP下的异步尝试系列 如果你还不太了解PHP下的生成器,你可以根据下面目录翻阅 PHP下的异步尝试一:初识生成器 PHP下的异步尝试二:初识协程 PHP下的异步尝试三:协程的PHP版thunkify ...
- 自适应增强(Adaptive Boosting)
简介 AdaBoost,是英文”Adaptive Boosting“(自适应增强)的缩写,是一种迭代提升算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成 ...
- SpringBoot中打包设置,将配置文件打包在外部
一.每次用maven的打包工具打包的时候 总是将配置文件一起打包进jar中!配置文件有点小修改就要重新打包很麻烦!!!!为了解决这一麻烦!找 了很多方法,下面的配置已经实现可用 我的项目目录结构如下 ...
- ZJOI—— 密码机(2003)
ZJOI2003密码机,没找到可以测试的网站,就只过了样例~~ 题目描述 一台密码机按照以下的方式产生密码:首先往机器中输入一系列数,然后取出其中一部分数,将它们异或以后得到一个新数作为密码.现在请你 ...