Рассчитайте разницу в азимутальных углах между двумя позами - PullRequest
1 голос
/ 19 сентября 2019

У меня есть 2 Pose, представляющие 2 положения камеры, и я хочу получить разницу между их азимутальными углами.
Старшая поза извлекается из набора привязок с более старой позой камеры., так что я не должен получать ошибки от обновлений понимания мира ARCore.
Более новая поза извлечена из текущего кадра.

Я пытался использовать эту формулу из wikipedia :

psi = atan2(
    2*(qw*qz + qx*qy),
    1-2*(qy*qy + qz*qz)
)

Затем я вывожу старый угол из более нового, но безуспешно: когда я перемещаю телефон, чтобы изменить только угол наклона, результат, который я получаю, также меняется.

Я думаю,это не сработало, потому что предполагается, что + Z - вертикальная ось, тогда как + Y - вертикальная ось в ARCore.Поэтому я повернул оси в формуле так, чтобы вертикальная ось была Y:

psi = atan2(
    2*(qw*qy + qz*qx),
    1-2*(qx*qx + qy*qy)
)

Это все еще не работает, результат все еще меняется, когда я изменяю только высоту тона.По-видимому, это неправильное преобразование.

Как вычислить разницу в азимутальном угле между двумя позами камеры?

Это может быть действительно вопрос для Математического обмена стека,но я не уверен, неправильно ли я понимаю ARCore или математику, так что вот оно.

1 Ответ

1 голос
/ 19 сентября 2019

Используйте следующий подход для расчета азимута, который всегда измеряется в двух измерениях:

public float getAzimuth(PointF aim) {

    float angle = Math.toDegrees(Math.atan2(aim.x - x, aim.y - y));

    // the range of ± 90.0° must be corrected...

    if(angle < 0.0) {
        angle += 360.0;
    }
    return angle;
}

... следующий подход для расчета расстояния:

float distance = Math.sqrt((x2 – x1) / 2.0 + 
                           (y2 – y1) / 2.0 + 
                           (z2 – z1) / 2.0); 

... иследующий подход для расчета погружения:

float plunge = Math.asin((z2 – z1) / distance)
...