我们来看一下中的几个基本的例子
(区域描述、深度感知、运动追踪、视频4个)
1. hello_motion_tracking
package com.projecttango.examples.java.hellomotiontracking; import com.google.atap.tangoservice.Tango; //Tango import com.google.atap.tangoservice.Tango.OnTangoUpdateListener; //更新监听 import com.google.atap.tangoservice.TangoConfig; //配置信息 import com.google.atap.tangoservice.TangoCoordinateFramePair; //坐标框架对 import com.google.atap.tangoservice.TangoErrorException; //错误异常 import com.google.atap.tangoservice.TangoEvent; //事件驱动 import com.google.atap.tangoservice.TangoInvalidException; //无效异常 import com.google.atap.tangoservice.TangoOutOfDateException; //过时异常 import com.google.atap.tangoservice.TangoPointCloudData; //点云数据 import com.google.atap.tangoservice.TangoPoseData; //位姿数据 import com.google.atap.tangoservice.TangoXyzIjData; //XyzIj数据 import android.app.Activity; //活动 import android.os.Bundle; import android.util.Log; //日志 import android.widget.Toast; //提醒 import java.util.ArrayList; //数组列 /** * 运动追踪API示例的主活动类。处理与Tango服务的连接,以及Tango位姿数据布局视图的传播。 */ public class HelloMotionTrackingActivity extends Activity { private static final String TAG = HelloMotionTrackingActivity.class.getSimpleName(); //类的示例名字 private Tango mTango; //Tango对象 private TangoConfig mConfig; //Tango配置对象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_motion_tracking); } @Override protected void onResume() { super.onResume(); // 将Tango服务按照一般Android服务初始化。因为我们在onPause中调用mTango.disconnect() // , 这将会断开Tango服务的连接,所以每次调用onResume时我们都应该创建Tango对象。 mTango = new Tango(HelloMotionTrackingActivity.this, new Runnable() { // 传进一个Runnable对象,当Tango准备好时由UI线程调用。该Runnable将会运行在一个新的线程中。 // 当Tango准备好时,我们只有在没有UI线程改变时可以调用Tango函数。 @Override public void run() { synchronized (HelloMotionTrackingActivity.this) { try { mConfig = setupTangoConfig(mTango); mTango.connect(mConfig); startupTango(); } catch (TangoOutOfDateException e) { Log.e(TAG, getString(R.string.exception_out_of_date), e); showsToastAndFinishOnUiThread(R.string.exception_out_of_date); } catch (TangoErrorException e) { Log.e(TAG, getString(R.string.exception_tango_error), e); showsToastAndFinishOnUiThread(R.string.exception_tango_error); } catch (TangoInvalidException e) { Log.e(TAG, getString(R.string.exception_tango_invalid), e); showsToastAndFinishOnUiThread(R.string.exception_tango_invalid); } } } }); } @Override protected void onPause() { super.onPause(); synchronized (this) { try { mTango.disconnect(); //中止断开连接 } catch (TangoErrorException e) { Log.e(TAG, getString(R.string.exception_tango_error), e); } } } /** * 设置tango配置对象。确保mTango对象在调用该方法之前已初始化 */ private TangoConfig setupTangoConfig(Tango tango) { // 创建一个Tango配置对象,并调用HelloMotionTrackingActivity API TangoConfig config = tango.getConfig(TangoConfig.CONFIG_TYPE_DEFAULT); config.putBoolean(TangoConfig.KEY_BOOLEAN_MOTIONTRACKING, true); // 如果遇到无效状态,Tango服务应该自动恢复 config.putBoolean(TangoConfig.KEY_BOOLEAN_AUTORECOVERY, true); return config; } /** * 设置Tango服务的回调监听,然后在Tango连接之后获取其他需要的参数。监听新的位姿数据。 */ private void startupTango() { // 锁定配置信息然后连接到Tango。选择坐标框架对。 final ArrayList<TangoCoordinateFramePair> framePairs = new ArrayList<TangoCoordinateFramePair>(); framePairs.add(new TangoCoordinateFramePair( TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE, TangoPoseData.COORDINATE_FRAME_DEVICE)); // 监听新的Tango数据 mTango.connectListener(framePairs, new OnTangoUpdateListener() { @Override public void onPoseAvailable(final TangoPoseData pose) { logPose(pose); //日志位姿 } @Override public void onXyzIjAvailable(TangoXyzIjData xyzIj) { // We are not using onXyzIjAvailable for this app.该APP不使用onXyzIjAvailable函数 } @Override public void onPointCloudAvailable(TangoPointCloudData pointCloud) { // We are not using onPointCloudAvailable for this app.该APP不使用onPointCloudAvailable函数 } @Override public void onTangoEvent(final TangoEvent event) { // Ignoring TangoEvents.忽略TangoEvents } @Override public void onFrameAvailable(int cameraId) { // We are not using onFrameAvailable for this application.该APP不使用onFrameAvailable函数 } }); } /** * Log the Position and Orientation of the given pose in the Logcat as information. 将给定位姿的位置和方向传到日志(怎么得到的位置和方向)位姿 框架 * * @param pose the pose to log. */ private void logPose(TangoPoseData pose) { StringBuilder stringBuilder = new StringBuilder(); float translation[] = pose.getTranslationAsFloats(); stringBuilder.append("Position: " + translation[0] + ", " + translation[1] + ", " + translation[2]); float orientation[] = pose.getRotationAsFloats(); stringBuilder.append(". Orientation: " + orientation[0] + ", " + orientation[1] + ", " + orientation[2] + ", " + orientation[3]); Log.i(TAG, stringBuilder.toString()); } /** * Display toast on UI thread. * * @param resId The resource id of the string resource to use. Can be formatted text. */ private void showsToastAndFinishOnUiThread(final int resId) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(HelloMotionTrackingActivity.this, getString(resId), Toast.LENGTH_LONG).show(); finish(); } }); } }
将位姿保存下来。更改程序:
。。。
然后
图1 Hello_Motion_Tracking
1.1 创建button按钮
默认button按钮ID为“button”。目的为显示实时数据。log功能坏了。听说win7的缘故。
1.2 创建handler接收处柄
以及
1.3 在log()函数中输入
2. hello_depth_perception深度感知
3.