在项目探戈中动态更新坐标

updating coordinate dynamically in project tango

private void setTangoListeners() {
        // Select coordinate frame pairs
        ArrayList<TangoCoordinateFramePair> framePairs = new ArrayList<TangoCoordinateFramePair>();
        framePairs.add(new TangoCoordinateFramePair(
                TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE,
                TangoPoseData.COORDINATE_FRAME_DEVICE));

private void setTangoListeners() {
        // Select coordinate frame pairs
        ArrayList<TangoCoordinateFramePair> framePairs = new ArrayList<TangoCoordinateFramePair>();
        framePairs.add(new TangoCoordinateFramePair(
                TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE,
                TangoPoseData.COORDINATE_FRAME_DEVICE));

        // Add a listener for Tango pose data
        mTango.connectListener(framePairs, new OnTangoUpdateListener() {

            @Override
            public void onPoseAvailable(TangoPoseData pose) {
                // Format Translation and Rotation data
                final String translationMsg = String.format(sTranslationFormat,
                        pose.translation[0], pose.translation[1],
                        pose.translation[2]);
                final String rotationMsg = String.format(sRotationFormat,
                        pose.rotation[0], pose.rotation[1], pose.rotation[2],
                        pose.rotation[3]);

                // Output to LogCat
                String logMsg = translationMsg + " | " + rotationMsg;
                Log.i(TAG, logMsg);

                final double deltaTime = (pose.timestamp - mPreviousTimeStamp)
                        * SECS_TO_MILLISECS;
                mPreviousTimeStamp = pose.timestamp;
                mTimeToNextUpdate -= deltaTime;

                // Throttle updates to the UI based on UPDATE_INTERVAL_MS.
                if (mTimeToNextUpdate < 0.0) {
                    mTimeToNextUpdate = UPDATE_INTERVAL_MS;

                    // Display data in TextViews. This must be done inside a
                    // runOnUiThread call because
                    // it affects the UI, which will cause an error if performed
                    // from the Tango
                    // service thread
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mRotationTextView.setText(rotationMsg);
                            mTranslationTextView.setText(translationMsg);
                        }
                    });
                }
            }

以上代码为我们提供了 3D 中的平移和旋转坐标。当我们移动或改变 tango 平板电脑的方向时,mtango。 setclicklistener 被调用,内部代码 运行 并更新坐标..

我无法理解的是调用 setclicklistener 时坐标是如何更新的?任何人都可以向我解释 onposeavailable() 中代码的工作原理吗?

好吧,setTangoListener() 只被调用一次,但是当这样做时,您实例化了一个侦听器,您覆盖了 onPoseAvailable() 函数,每次侦听器检测到 Tango 有使用 TangoPoseData 对象 (pose) 更新其姿势作为包含最新姿势数据的参数。

因此姿势信息的实际更改是在探戈核心中完成的,您可以通过侦听器中的 pose 参数访问。因此,当您访问平移和旋转时,它已经更新。

所以你是对的,因为姿势在 onPoseAvailable() 函数中永远不会更新,因为它在调用时已经完成。 onPoseAvailable() 中唯一发生的事情是您读取旋转和平移值并将它们放入可以通过第一个 LogCat 显示的字符串中。此后,它会检查自上次更新以来已经过去了多长时间,以及是否到了更新 textView 的时间(如果每次有新姿势可用时都更新它,将很难阅读)。

希望对您有所帮助:)