最初の IMU (S1 と呼ばれる) は肩に配置され、参照として機能します。もう一方 (S2) は腕に配置されます。これらは、絶対基準 (磁北と重力ベクトル) に対する回転のクォータニオンを提供します。簡単なアイデアは、これら 2 つのヨー、ピッチ、ロールの違いを示す必要があるということです (たとえば、理想的な外転/内転の動きにはピッチの寄与のみが必要です)。2 つの間の回転 (conj(q1) * q2) を計算し、次を使用して YPR 角度に変換することで、クォータニオンの使用を開始しました。
# Rotation quaternion q1 = (w,x,y,z)
# unit = sum of squared elements (sqx = x^2, etc.)
yaw = math.atan2(2 * q1[2] * q1[0] - 2 * q1[1] * q1[3], sqx - sqy - sqz + sqw)
pitch = math.asin(2 * (q1[1] * q1[2] + q1[3] * q1[0]) / sqx + sqy + sqz + sqw)
roll = math.atan2(2 * q1[1] * q1[0] - 2 * q1[2] * q1[3], -sqx - sqy + sqz + sqw)
しかし、これは私の場合は機能しません。異なる腕の位置ではピッチとロールが一貫していないためです。たとえば、相対ヨー角が 90 度の場合、ピッチ角とロール角が入れ替わります。たとえば、S2 にピッチ回転を適用すると、ロール回転のように見えます (回転は参照センサー S1 の y 軸上にあるため)。どうすればこれを回避できますか? 単純に両方のクォータニオンを YPR 角度に変換してから、各ペアの差を計算する必要があります (クォータニオン間の差を使用せずに)。逆変換は必要なく、各軸の実際の回転のみが必要なため、「回転」アプローチが正しくない可能性がありますか?