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 了,那下面开 ...
随机推荐
- SpringBoot(十) 异步任务,定时任务和邮件任务
异步任务 “异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行:异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的 ...
- Axios 网络请求组件封装 (鉴权、刷新、拦截)
一.前言 注意:本教程需要你对axios有一定的了解,不适用于小白(只能借鉴,希望你能自己动手),注释都写的很清楚.此封装并非完整版,已进行部分删减修改操作,但仍然适用于大部分业务场景,如果不适用于你 ...
- UDP协议总结
我们已经讲解了物理层.连接层和网络层.最开始的连接层协议种类繁多(Ethernet.Wifi.ARP等等).到了网络层,我们只剩下一个IP协议(IPv4和IPv6是替代关系).进入到传输层(trans ...
- Apache2.2伪静态配置
最近由于工作的需要要配置一下Apache的伪静态化,在网上搜了好多都无法完成,所以觉得有必要在这里写一下. 第一步:打开Apache的httpd.conf文件,把LoadModule rewrite_ ...
- zabbix-server端监控MySQL服务
Zabbix 监控MySQL数据库 为server.zabbix,com 添加服务模块 创建MySQL服务图形 Server.zabbix.com 服务器操作 [root@server ~]# cd ...
- 实验楼—Mysql—查找最爱学的课程
转载:https://www.shiyanlou.com/challenges/2651 背景 从上节题目构建的课程数据库中提取每个用户最爱学的课程数据. 右边桌面是实验楼的服务器,服务器中的 MyS ...
- POJ 1743 [USACO5.1] Musical Theme (后缀数组+二分)
洛谷P2743传送门 题目大意:给你一个序列,求其中最长的一对相似等长子串 一对合法的相似子串被定义为: 1.任意一个子串长度都大于等于5 2.不能有重叠部分 3.其中一个子串可以在全部+/-某个值后 ...
- debian 9 安装Virtual Box
1.去官网下载deb包,例如包名: virtualbox-.2_5.2.18-124319_Debian_stretch_amd64.deb 2.安装 .2_5.2.18-124319_Debian_ ...
- ansible 定义主机用户和密码
定义主机组用户和密码 [webservers] ansible[01:04] ansible_ssh_user='root' ansible_ssh_pass='AAbb0101' [root@ftp ...
- 【BZOJ 1305】[CQOI2009]dance跳舞
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 男生和女生每个人都分身成两个节点 即x[1],x[2]和y[1],y[2] 然后如果i和j不相互喜欢 那么add(x[i][2],y ...