• Hello_Motion_Tracking 任务一:Project Tango采集运动追踪数据


    我们来看一下中的几个基本的例子

    (区域描述、深度感知、运动追踪、视频4个)

     参考:Google Tango初学者教程

     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. 

    >>Google Tango初学者教程

    >>Hello_Depth_Perception 任务二:Project Tango采集深度感知数据

  • 相关阅读:
    python函数应用
    python文件操作
    设计模式大杂烩(24种设计模式的总结以及学习设计模式的几点建议)
    (二十四)解释器模式详解
    (二十三)原型模式详解(clone方法源码的简单剖析)
    (二十二)访问者模式详解(伪动态双分派)
    (二十一)状态模式详解(DOTA版)
    (二十)职责链模式详解(都市异能版)
    (十九)组合模式详解
    (十八)享元模式详解(都市异能版)
  • 原文地址:https://www.cnblogs.com/2008nmj/p/7162000.html
Copyright © 2020-2023  润新知