如何解决将 IMU Madgwick 的四元数转换为 Unity3D 中的 x,y,z 位置
我正在尝试实现 this 和 this,但在 Unity3D 中并使用 IMU ICM-20948 9-DOF 传感器:
到目前为止,我能够使用 Madgwick 的算法并通过在空中倾斜传感器来旋转立方体。我现在不确定如何让它像鼠标指针一样移动。我的经验是 - 当我上下移动传感器(有点像遥控器一样向上倾斜)时,似乎工作正常。但是当我左右倾斜时,它不起作用。此外,值从正快速跳到负,这使得对象出现在屏幕的另一侧 - 这是 x 和 y。它起作用的唯一方法是,如果我轻轻地移动它,但它只会保持在一个非常小的范围内。我希望能够将其移动到屏幕上的任何位置。
这是我的代码:
MadgwickAHRS madgwickAHRS = new MadgwickAHRS(1f / 256f,0.1f);
madgwickAHRS.Update(gx,gy,gz,ax,ay,az,mx,my,mz); // called in a separate thread loop
float[] angles = ToEuler(madgwickAHRS.Quaternion);
float horzValue = angles[0] - horzZero;
float vertValue = angles[1] - vertZero;
horzZero = angles[0]; // yaw
vertZero = angles[1]; // roll
void FixedUpdate() {
transform.position = new Vector3(horzValue,vertValue,0);
}
...
float[] ToEuler(float[] q)
{
float yaw = (float)Math.atan2(2.0 * (q[1] * q[2] + q[3] * q[0]),q[3] * q[3] - q[0] * q[0] - q[1] * q[1] + q[2] * q[2]);
float pitch = (float)Math.Asin(-2.0 * (q[0] * q[2] - q[3] * q[1]));
float roll = (float)Math.atan2(2.0 * (q[0] * q[1] + q[3] * q[2]),q[3] * q[3] + q[0] * q[0] - q[1] * q[1] - q[2] * q[2]);
return new float[2] { yaw,roll };
}
尝试对每个角度值也使用此函数,但它使事情变得更糟。
private float Calcdist(float angle,float initAngle)
{
angle = (float)((angle - initAngle) * (180 / Math.PI));
angle = angle < 0 ? angle + 360 : angle;
angle = angle > 180 ? angle - 360 : angle;
float dist = (float)(Math.Round(-offsetdistance * Math.Tan(angle * (Math.PI / 180))));
return dist;
}
还尝试使用修正的四元数(顺便说一下,这对旋转效果很好):
Quaternion objectOrientation = new Quaternion(quaternion.x,quaternion.y,quaternion.z,quaternion.w);
var qEualr = objectOrientation.eulerAngles;
Quaternion correctQuaternion = Quaternion.Euler(qEualr.z,-qEualr.y,qEualr.x);
这里有人可以帮助我吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。