听起来您正在尝试从四元数中获取欧拉角,因此此参考可能是一个更好的起点。Myo SDK 文档中的 hello-myo 示例(在此处下载 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
你通常希望首先以四元数格式进行计算(参见Gimbal lock),但根据你的应用程序,欧拉角可能没问题.