我正在做一个带有Myo手镯的项目。手镯使用四元数来跟踪其方向。我想要的是一个指向我前臂方向且没有方向的向量,即我只想要一个代表我的前臂的单位向量。这可能吗,有人知道该怎么做吗?
我已按照Maths - Transforming Vectors with Quaternions`网站上的指示尝试通过P'= QPQ ^ -1执行四元数乘法,但是我没有用。我怀疑这是因为Myo手镯输出的四元数不是一个旋转,而是随着我移动手臂/手镯而不断变化的方向/旋转。
基本上,我从Myo处获得的数据采用[X,Y,Z,W]的形式,并且随着我移动手臂而变化。如果有人可以帮助我一点,我将不胜感激
干杯, // hjalle
答案 0 :(得分:0)
听起来您正在尝试从四元数中获取Euler angles,所以this reference可能是一个更好的起点。 Myo SDK文档中的hello-myo示例(SDK下载here的一部分)使用以下代码:
// 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
通常,您通常想先以四元数格式进行此计算(请参见Gimbal lock),但具体取决于您的应用程序也许欧拉角就可以了。