Tango 点云 demo 代码阅读笔记

来源:互联网 发布:人工智能机器人 编辑:程序博客网 时间:2024/05/05 05:11

  • demo 效果
  • 核心代码
  • Rajawali 类
    • Material
    • Texture
    • Sphere
    • Phong
    • DirectionalLight
    • Grid
    • FrustumAxes
    • Points
    • PointCloud
    • Render
  • 待解决

这两天简单看了下 java_point_cloud_example 工程的代码,作此笔记,以备日后查阅。

源码基于 Eisa 版本。

建了个 QQ 群(群号:524439406),用于交流 tango 技术,欢迎加入:

这里写图片描述

demo 效果

第一张图是由 TangoUX 控制的,是一个铺满全屏的 com.google.atap.tango.ux.TangoUxLayout,相当于普通 app 里面的 loading 界面。

第二张图中的棱锥代表设备,不同颜色的点表示离设备不同距离的点云,红色的最近。

晃动设备,棱锥的角度会随着设备变化。

核心代码

有两个核心点:

  • 既然能在屏幕上用不同的颜色表示不同的坐标,那么 Tango 肯定是获取了点云的坐标和距离信息,然后再映射到屏幕上的坐标系中;
  • 棱锥能随着设备而摆动,说明代码里面肯定有获取设备 Pose 数据的地方,通过 Pose 里面的 orientation 信息来控制棱锥的摆动;

根据上述两个假设,在代码可中可以找到:

// more codefinal double averageDepth = getAveragedDepth(pointCloud.points,                        pointCloud.numPoints);// more codeprivate float getAveragedDepth(FloatBuffer pointCloudBuffer, int numPoints) {        float totalZ = 0;        float averageZ = 0;        if (numPoints != 0) {            int numFloats = 4 * numPoints;            for (int i = 2; i < numFloats; i = i + 4) {                totalZ = totalZ + pointCloudBuffer.get(i);            }            averageZ = totalZ / numPoints;        }        return averageZ;    }

pointCloudBuffer 里面是个四元组,查阅 文档 可以得知,每个四元组都是一个 (x, y, z, c)。

public class TangoPointCloudData implements Parcelable {    public double timestamp;    public int numPoints;    public FloatBuffer points;}

3个核心字段:

  • timestamp,获得4元组的时间戳;
  • numPoints,4元组的数量;
  • points,4元组集合,(x, y, z, c),竖直方向放置设备时,x 为正表示用户的右手方向,y 为正表示屏幕底部方向,z 为正表示摄像头焦距方向且垂直于摄像头平面,近似取 z 为某点距离,c 为置信系数,区间[0, 1],1 表示完全可信;

拿到点云的数据之后,在 PointCloud 类里面做映射计算,将点云坐标映射成不同颜色点的坐标。从而显示在屏幕上。

至于第二个假设,同样看代码:

TangoPoseData lastFramePose = TangoSupport.getPoseAtTime(0,TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE, TangoPoseData.COORDINATE_FRAME_DEVICE, TangoSupport.TANGO_SUPPORT_ENGINE_OPENGL, mDisplayRotation);                        mRenderer.updateCameraPose(lastFramePose);

通过这种方式来获取 Pose 数据,然后更新愣头进行实现角度变化。

上面的点就像一条隔板,把 Tango 相关代码和 Rajawali 代码隔离开来。拿到 Tango 数据之后,更新 3D 虚拟图像的操作就完全交由 Rajawali 来做了,与 Tango 无关了。

Rajawali 类

Material

材质,用来定义 3D 模型的视觉效果,比如光照、颜色、高亮等。

Texture

纹理,3D 模型的表面,比如给球体覆盖一个世界地图。

Sphere

球体。

Phong

一种简单的光照模型。

DirectionalLight

光照

Grid

工程自定义网格类,用于第一人称视角展示网格。

FrustumAxes

工程自定义棱锥类,用于表示设备。

Points

自定义三位点类。

PointCloud

工程自定义类,代表所有的颜色点。Palette:调色板。

Render

Rajawali 工程中继承 RajawaliRenderer,重写 initScene() 和 onRender() 方法。在前者中加入 3D 模型,在后者中加入动画效果。

待解决

Rajawali 里面的 Camera 类代表什么,跟 Tango 设备的 Camera 是什么关系?这是一个 virtual camera?
camera.setPosition() 和 camera.setOrientation() 又是什么作用?

0 0
原创粉丝点击