基本事件
接收 pose 事件
接收纹理更新通知
接收相机帧
接收点云
状态事件
基本事件
Tango 设备之所以具有三种核心功能,完全得益于设备上一组独特的传感器以及传感器收发的数据。与其他的安卓设备一样,这些数据以“事件”的形式进行接收和传递。基本事件包括:
pose 数据,包括位置和旋转;
帧和纹理(frames & textures),来自于相机;
点云(point cloud),通过深度感知生成;
开发者可以通过回调的方式来监听和处理某种事件。
注意:下面的代码使用 C 语言描述,但是方法调用和数据结构跟其他平台或语言类似。
接收 pose 事件
有两种方法可以接收 pose 数据,推荐使用 TangoService_getPoseAtTime(),详情见 Pose。Java类点击这里
接收纹理更新通知
(该方式用于使用 OpenGL 渲染 AR 相机图像。)
在 TangoService_OnTextureAvailable() 方法中使用回调,而且要在 GL 线程中调用 TangoService_updateTextureExternalOes 去刷新纹理。
Java类点击这里
接收相机帧
(该方法并不是用于图像显示的,而是用于获取字节数组形式的像素数据。)
在 TangoService_connectOnFrameAvailable() 中使用回调。
Java类点击这里
接收点云
在 TangoService_connectOnPointCloudAvailable() 中使用回调接口 OnPointCloudAvailable()。
Java类点击这里
状态事件
Java类点击这里
TangoEvent 用来表示重要的传感器的状态事件,比如描述错误状态。要接收 TangoEvent,需要传递一个 OnTangoEvent() 回调接口给 TangoService_connectOnTangoEvent()。每次 Tango 状态改变时都会执行该回调方法。
TangoEvent 结构体定义如下:
typedef struct TangoEvent {
double timestamp;
TangoEventType type;
const char* event_key;
const char* event_value;
} TangoEvent;
timestamp 字段表示状态改变的时刻,and can be compared to timestamps elsewhere in the Tango APIs。
type 字段是 TangoEventType 枚举类型,用于描述触发该事件的传感器:
typedef enum {
TANGO_EVENT_UNKNOWN,
TANGO_EVENT_GENERAL,
TANGO_EVENT_FISHEYE_CAMERA,
TANGO_EVENT_COLOR_CAMERA,
TANGO_EVENT_IMU,
TANGO_EVENT_FEATURE_TRACKING,
} TangoEventType;
event_key 和 event_value 字段描述发生的状态事件,event_key 有如下类型:
Event key 释义
TangoServiceException 服务遇到异常,event_value 中是对应的文本描述
FisheyeOverExposed 鱼眼相机获取的图像曝光过度,图像平均像素值为 event_value
FisheyeUnderExposed 鱼眼相机获取的图像曝光不足,图像平均像素值为 event_value
ColorOverExposed 颜色图像曝光过度,图像平均像素值为 event_value
ColorUnderExposed 颜色图像曝光不足,图像平均像素值为 event_value
TooFewFeaturesTracked 鱼眼图像中被追踪的特征点过少,特征点数量为 event_value
Unknown 未知描述
根据事件描述,你可以引导用户解决问题。比如,出现 ColorUnderExposed 时,很可能是因为用户所处环境光线太暗,以至于 Tango 系统无法正常工作。
关于其他处理这些事件的方法,详见用户体验篇。