如何使用 ARCore 测量距离?

Posted

技术标签:

【中文标题】如何使用 ARCore 测量距离?【英文标题】:How to measure distance using ARCore? 【发布时间】:2018-02-09 10:53:27 【问题描述】:

是否可以计算两个 HitResult `s 之间的距离?

或者我们如何使用 ARCore 计算实际距离(例如米)?

【问题讨论】:

【参考方案1】:

在 Java ARCore 世界中,单位是米(我刚刚意识到我们可能不会记录这一点...... aaaand 看起来不像。糟糕,已提交错误)。通过减去两个Poses 的平移分量可以得到它们之间的距离。您的代码将如下所示:

第一次点击为hitResult:

startAnchor = session.addAnchor(hitResult.getHitPose());

第二次点击hitResult:

Pose startPose = startAnchor.getPose();
Pose endPose = hitResult.getHitPose();

// Clean up the anchor
session.removeAnchors(Collections.singleton(startAnchor));
startAnchor = null;

// Compute the difference vector between the two hit locations.
float dx = startPose.tx() - endPose.tx();
float dy = startPose.ty() - endPose.ty();
float dz = startPose.tz() - endPose.tz();

// Compute the straight-line distance.
float distanceMeters = (float) Math.sqrt(dx*dx + dy*dy + dz*dz);

假设这些命中结果不会发生在同一帧上,创建Anchor 很重要,因为每次调用Session.update() 时都可以重新塑造虚拟世界。通过使用锚点而非仅使用 Pose 来保持该位置,其 Pose 将更新以跟踪这些重塑过程中的物理特征。

【讨论】:

ARCore world units are meters - 太棒了!这对 Unity 也有效吗? 刚刚确认是的,Unity 中的仪表也是如此。虚幻可能是厘米什么的。【参考方案2】:

您可以使用getHitPose() 提取两个HitResult 姿势,然后比较它们的翻译分量(getTranslation())。 翻译定义为

...从目的地的位置向量(通常 world) 坐标系到局部坐标系,表示为 目的地(世界)坐标。

至于这个的物理单位我找不到任何备注。使用经过校准的相机,这在数学上应该是可能的,但我不知道他们是否真的为此提供了 API

【讨论】:

【参考方案3】:

答案是:是的,当然,您绝对可以计算出两个HitResult 之间的距离。 ARCore 以及 ARKit 框架的网格大小为 meters。有时,使用centimetres 会更有用。以下是一些使用 Java 和伟大的旧 Pythagorean theorem 的方法:

import com.google.ar.core.HitResult

MotionEvent tap = queuedSingleTaps.poll();
if (tap != null && camera.getTrackingState() == TrackingState.TRACKING) 
    for (HitResult hit : frame.hitTest(tap)) 
        // Blah-blah-blah...
    


// Here's the principle how you can calculate the distance  
// between two anchors in 3D space using Java:

private double getDistanceMeters(Pose pose0, Pose pose1) 

    float distanceX = pose0.tx() - pose1.tx();
    float distanceY = pose0.ty() - pose1.ty();
    float distanceZ = pose0.tz() - pose1.tz();

    return Math.sqrt(distanceX * distanceX + 
                     distanceY * distanceY + 
                     distanceZ * distanceZ);
 

// Convert Meters into Centimetres

double distanceCm = ((int)(getDistanceMeters(pose0, pose1) * 1000))/10.0f;

// pose0 is the location of first Anchor
// pose1 is the location of second Anchor

或者,您也可以使用以下数学:

Pose pose0 = // first HitResult's Anchor
Pose pose1 = // second HitResult's Anchor

double distanceM = Math.sqrt(Math.pow((pose0.tx() - pose1.tx()), 2) + 
                             Math.pow((pose0.ty() - pose1.ty()), 2) +
                             Math.pow((pose0.tz() - pose1.tz()), 2));

double distanceCm = ((int)(distanceM * 1000))/10.0f;

【讨论】:

你能分享你的完整代码吗?对我有很大帮助 您能否帮我获取对象的height。假设我在某个点放置了一个立方体并缩放该立方体。现在即将到来的最终值是向量。我没有任何将其转换为米的参考。 为什么要乘以 100 (1000/10=100) 来将米转换为厘米?为什么不直接做 distanceInMeters*100? 因为 distanceM 类型转换为 int 但结果除以 float。虽然,你可以按照你喜欢的方式计算它)))这是一个精度问题......

以上是关于如何使用 ARCore 测量距离?的主要内容,如果未能解决你的问题,请参考以下文章

百度地图如何测量距离?

如何使用 Chrome 测量元素之间的像素距离?

如何测量相机与物体之间的距离

您如何使用 jQuery 测量用户向下滚动的距离?

如何使用在线看图打开CAD图纸?并测量图纸距离?

如何测量对角距离点?