Wie misst man die Entfernung mit ARCore?

Lesezeit: 3 Minuten

Wie misst man die Entfernung mit ARCore
Alexey Podolian

Ist es möglich, den Abstand zwischen zwei zu berechnen? HitResult `s ?

Oder wie können wir mit ARCore reale Entfernungen (zB Meter) berechnen?

In Java ARCore sind Welteinheiten Meter (ich habe gerade festgestellt, dass wir dies möglicherweise nicht dokumentieren … aaaund sieht aus wie nein. Hoppla, Fehler abgelegt). Durch Subtraktion der Translationskomponente von zwei Poses Sie können den Abstand zwischen ihnen ermitteln. Dein Code würde ungefähr so ​​aussehen:

Beim ersten Treffer als hitResult:

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

Beim zweiten Treffer als 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);

Angenommen, diese Trefferergebnisse treten nicht im selben Frame auf, wodurch ein Anchor ist wichtig, weil die virtuelle Welt bei jedem Anruf neu gestaltet werden kann Session.update(). Indem Sie diese Position mit einem Anker statt nur einer Pose halten, wird die Pose aktualisiert, um das physische Merkmal über diese Umformungen hinweg zu verfolgen.

  • ARCore world units are meters – Genial! Gilt das auch für Unity?

    – PhilLab

    31. August ’17 um 17:56


  • Habe gerade bestätigt, dass ja, Meter auch in Unity. Unreal könnte cm oder so sein.

    – Ian M

    31. August ’17 um 18:08

Sie können die beiden extrahieren HitResult Posen mit getHitPose() und vergleichen Sie dann ihre Übersetzungskomponente (getTranslation()). Die Übersetzung ist definiert als

…der Positionsvektor vom Zielkoordinatensystem (normalerweise Welt) zum lokalen Koordinatensystem, ausgedrückt in Zielkoordinaten (Weltkoordinaten).

Zur physikalischen Einheit konnte ich keine Bemerkung finden. Mit einer kalibrierten Kamera sollte dies rechnerisch möglich sein, aber ich weiß nicht, ob sie dafür tatsächlich eine API bereitstellen

Wie misst man die Entfernung mit ARCore
Andy Jazz

Die Antwort lautet: Ja, natürlich, Sie können definitiv den Abstand zwischen zwei berechnen HitResult‘S. Die Größe des Rasters für ARCore, sowie für ARKit Rahmen, ist meters. Manchmal ist es nützlicher zu verwenden centimetres. Hier sind ein paar Möglichkeiten, wie Sie es mit Java und großen alten tun können Pythagorean theorem:

Bildbeschreibung hier eingeben

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

Alternativ können Sie die folgende Mathematik verwenden:

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;

  • Können Sie bitte Ihren vollständigen Code teilen? Es würde mir sehr helfen

    – Shubham Agrawal

    15. Okt ’18 um 8:52

  • Können Sie mir bitte helfen, die zu bekommen? height des Objekts. Angenommen, ich habe irgendwann einen Würfel platziert und diesen Würfel skaliert. Nun kommt der Endwert in Vektoren. Ich habe keine Referenz, um das in Meter umzurechnen.

    – Shubham Agrawal

    15. Okt ’18 um 13:05

  • Warum multiplizieren Sie mit 100 (1000/10=100), um Meter in Zentimeter umzurechnen? Warum nicht einfach DistanceInMeters*100?

    – kenyee

    1. November ’18 um 18:43

  • Weil distanceM typisiert wurde zu int aber das Ergebnis wird geteilt durch float. Sie können es jedoch nach Belieben berechnen))) Es ist ein Präzisionsproblem …

    – Andy Jazz

    1. November ’18 um 20:48

.

249250cookie-checkWie misst man die Entfernung mit ARCore?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy