Myo браслет;Как перейти от кватерниона к вектору направления предплечья? - PullRequest
0 голосов
/ 23 ноября 2018

Я делаю проект с мио-браслетом.Браслет использует кватернионы для отслеживания его ориентации.То, что я хочу, это вектор, который указывает направление моего предплечья без ориентации, т.е. я хочу только единичный вектор, который представляет мое предплечье.Возможно ли это, и кто-нибудь знает, как это сделать?

Я пытался выполнить умножение кватернионов на P '= QPQ ^ -1, следуя инструкциям на этом сайте Математика - Преобразование векторов с кватернионами `но я не понимаю, как это работает.Я подозреваю, что это потому, что выход кватерниона из браслета Myo - это не одно вращение, а постоянно меняющаяся ориентация / вращение, когда я двигаю руку / браслет.

В основном данные, которые я получаю от Myo,на форме [X, Y, Z, W], и ​​это меняется, когда я двигаю руку.Я был бы очень признателен, если бы кто-нибудь был любезен, чтобы помочь мне немного

Приветствия, // hjalle

1 Ответ

0 голосов
/ 23 ноября 2018

Звучит так, будто вы пытаетесь получить углы Эйлера от кватерниона, поэтому эта ссылка может быть лучшей отправной точкой.Пример hello-myo из документации Myo SDK (часть загрузки SDK здесь ) использует следующий код:

// Calculate Euler angles (roll, pitch, and yaw) from the unit quaternion.
float roll = atan2(2.0f * (quat.w() * quat.x() + quat.y() * quat.z()), 1.0f - 2.0f * (quat.x() * quat.x() + quat.y() * quat.y()));
float pitch = asin(max(-1.0f, min(1.0f, 2.0f * (quat.w() * quat.y() - quat.z() * quat.x()))));
float yaw = atan2(2.0f * (quat.w() * quat.z() + quat.x() * quat.y()), 1.0f - 2.0f * (quat.y() * quat.y() + quat.z() * quat.z()));

Не относится к вышеприведенному и не уверен, будет ли этополезно, но если вы пытаетесь найти руку в реальном мире, вам всегда понадобится известная справочная или начальная ориентация, а затем сравните все следующие измерения с этим.С Myo это обычно делается, когда пользователь кладет руку в известное положение и нажимает кнопку калибровки.Иногда есть более умные способы сделать это, но это зависит от приложения.Получив эталон, вы вычтете его из будущего измерения, чтобы получить реальную ориентацию, по существу: orientationReal = orientationMeasured - orientationReference Обычно вы сначала захотите выполнить этот расчет в формате кватерниона (см. Блокировка карданного подвеса ), но в зависимости отв вашем приложении, может быть, углы Эйлера будут в порядке.

...