我有一个IMU(惯性测量单位),我以它自己的局部坐标系(图中的LT)表示的四元数方向接收它的方向。我想将此方向转换为在全局坐标系中表示的方向。我发现了一种方法,可以通过在两个不同位置使用来自IMU的重力矢量,在此示例中,将IMU固定在大腿上,并使用重力矢量直立(Gstand)和就座(Gsit)。然后将它们用于创建全局坐标系。现在,本地四元数可以全局表示。
我想使用此方向来设置对象在Unity中的方向。换句话说,我希望能够在任何给定的世界起始方向上模仿IMU的方向。
这是Unity中的代码(我知道它并不整洁,但现在我只希望它能工作)。当IMU处于“站立位置”时,我按s,然后将imu放下并按l。我回到站姿,按空格开始。
// Update is called once per frame
void Update() {
//calibrate standing position
if (Input.GetKeyDown(KeyCode.S))
{
Zvector = -gravity; //gravity Vector3 from IMU
gravitystand = gravity;
}
//calibrate lying position and create Q to global;
if (Input.GetKeyDown(KeyCode.L))
{
gravitylying = gravity;
Yvector = Vector3.Cross(gravitystand, gravitylying).normalized;
Xvector = Vector3.Cross(Zvector, Xvector);
Qglobal = Quaternion.LookRotation(-Xvector, Zvector);
}
//set starting position
if (Input.GetKeyDown(KeyCode.Space))
{
Qstart1 = Qimu1; //Qimu1 Quaternion in local from IMU
}
//Get orientation relative to starting position
Qrelative1 = Qstart1 * Quaternion.Inverse(Qimu1);
//Get orientation in global and use to rotate object
Quaternion Qdef1 = Qglobal * Qrelative1;
transform.rotation = Qdef1;
它没有按我预期的那样工作。根据初始起始位置,轴会反转甚至有时会改变。也许与Quaternion.LookRotation有关?我尝试在此函数中更改向量(向前,向上),但到目前为止没有结果。还是我在这里做错了什么?