수학집어 치운지 어언 20년이 넘었는데, 필자가 드론 관련 개발을 하면서
드론에서 받을 수 있는 RAW값을 이용하여 드론이나 짐벌의 헤딩을 처리해야되는 상황이 왔다.
드론에서 4개의 방위(North,South,East,West)에 대한 값을 통해 발생되는 데이터를 확인하고
공식을 찾다보니... 별로 없다. 아니 필자 생각에는 필자가 잘 몰라서 그런거라 생각된다.
어쨋거나, 시간을 줄이기 위해 DJI 포럼에서 문의했고 발송된 결과는 아래와 같다.
물론, 필자는 이 메일을 보기전에 노가다 코딩으로 문제를 이미 해결한 상태라...
혹시 나중에 사용할 수 있을 것 같아 커뮤니티의 내용을 일부 덜어왔다.
잘하면 담에 쓸 일이 생길거 같다... ㅠㅜ 수학시러..
-----------------------------------------------------------------------------------------------------------
How to convert a quaternion into a drone attitude angle | from kyle.cai | 1 year ago Updated
Applicable models: M600 series, A3, N3, M210 series, M210 V2 series
SDK version: OSDK3.7 & OSDK3.8
Telemetry provides a quaternion topic (TOPIC_QUATERNION) but does not provide a way to obtain the attitude angle.
However, the quaternion can be converted into an attitude angle by means of Euler's formula.
The conversion procedure is as follows:
Telemetry::Vector3f toEulerAngle(void* quaternionData)
{
Telemetry::Vector3f ans;
Telemetry::Quaternion* quaternion = (Telemetry::Quaternion*)quaternionData;
double q2sqr = quaternion->q2 * quaternion->q2;
double t0 = - 2.0 * (q2sqr + quaternion->q3 * quaternion->q3) + 1.0;
double t1 = +2.0 * (quaternion->q1 * quaternion->q2 + quaternion->q0 * quaternion->q3);
double t2 = - 2.0 * (quaternion->q1 * quaternion->q3 - quaternion->q0 * quaternion->q2);
double t3 = +2.0 * (quaternion->q2 * quaternion->q3 + quaternion->q0 * quaternion->q1 );
double t4 = -2.0 * (quaternion->q1 * quaternion->q1 + q2sqr) + 1.0;
t2 = (t2 > 1.0) ? 1.0 : t2;
t2 = (t2 < -1.0) ? -1.0 :t2;
ans.x = asin(t2); // Row
ans.y = atan2(t3, t4); // pitch
ans.z = atan2(t1, t0); // Yaw
return ans;
}
이상이다.
최근댓글