旋转时 Unity 中的四轴飞行器 PID 出现故障
Quadcopter PID in Unity Malfunctioning When Rotated
我正在使用 Unity (5.6.0f3) 制作四轴飞行器模拟器游戏。我的四轴飞行器有四个均匀分布的 "rotors" 连接到带有固定关节的中央 body(和腿)。它通过向转子施加力(rigidbody.AddForce 方法)飞行(目前仅向上)。
我正在使用 PID 控制器来稳定直升机,并且我已经做了足够的调整,当受到外力时它可以很好地稳定...
但是,当我围绕 Y-Axis(偏航)旋转直升机并且直升机的前轴接近 -90 度时,稳定性会崩溃并使直升机急剧向上或向下倾斜(并且对于由于某些原因,如果我在直升机再次稳定后继续沿同一方向应用偏航,它会在上下之间交替,并且每次都发生在相同的-90 度。
我不知道出了什么问题——我使用的 PID 控制器只稳定 Pitch(绕 X 轴旋转)和 Roll(绕 Z 轴旋转),所以改变 Y 旋转不应该影响任何事情。
我只使用 transform.Rotate 方法来旋转直升机(因此与偏航力或其他 PID 控制器无关)。
有没有其他人在使用 PID 控制器时遇到过类似的问题?
当您围绕其中一个轴旋转对象时,有时其他轴会对齐,从而导致奇怪的行为。这叫Gimbal Lock,google它。这就是我们拥有四元数的原因——它们难以阅读并且以神秘的方式工作,但它们永远不会得到 'locked'
[编辑] 抱歉,我正在尝试尽可能具体地回答问题
我想通了...原来我是使用欧拉角进行旋转,但没有先在四元数中使用它们。
所以不用
transform.Rotate(transform.right, totalPitch);
transform.Rotate(transform.forward, -totalRoll);
我修复它的方法是使用
transform.Rotate(Quaternion.Euler(new Vector3(totalPitch, 0, 0)).eulerAngles);
transform.Rotate(Quaternion.Euler(new Vector3(0, 0, -totalRoll)).eulerAngles);
我现在会让这段代码更容易阅读,但这样它实际上可以按照我想要的方式工作。
我事先知道 Gimbal Lock,但我的印象是 Unity 天生就使用四元数处理旋转(使用 Rotate 方法)。
我正在使用 Unity (5.6.0f3) 制作四轴飞行器模拟器游戏。我的四轴飞行器有四个均匀分布的 "rotors" 连接到带有固定关节的中央 body(和腿)。它通过向转子施加力(rigidbody.AddForce 方法)飞行(目前仅向上)。 我正在使用 PID 控制器来稳定直升机,并且我已经做了足够的调整,当受到外力时它可以很好地稳定...
但是,当我围绕 Y-Axis(偏航)旋转直升机并且直升机的前轴接近 -90 度时,稳定性会崩溃并使直升机急剧向上或向下倾斜(并且对于由于某些原因,如果我在直升机再次稳定后继续沿同一方向应用偏航,它会在上下之间交替,并且每次都发生在相同的-90 度。
我不知道出了什么问题——我使用的 PID 控制器只稳定 Pitch(绕 X 轴旋转)和 Roll(绕 Z 轴旋转),所以改变 Y 旋转不应该影响任何事情。
我只使用 transform.Rotate 方法来旋转直升机(因此与偏航力或其他 PID 控制器无关)。
有没有其他人在使用 PID 控制器时遇到过类似的问题?
当您围绕其中一个轴旋转对象时,有时其他轴会对齐,从而导致奇怪的行为。这叫Gimbal Lock,google它。这就是我们拥有四元数的原因——它们难以阅读并且以神秘的方式工作,但它们永远不会得到 'locked'
[编辑] 抱歉,我正在尝试尽可能具体地回答问题
我想通了...原来我是使用欧拉角进行旋转,但没有先在四元数中使用它们。
所以不用
transform.Rotate(transform.right, totalPitch);
transform.Rotate(transform.forward, -totalRoll);
我修复它的方法是使用
transform.Rotate(Quaternion.Euler(new Vector3(totalPitch, 0, 0)).eulerAngles);
transform.Rotate(Quaternion.Euler(new Vector3(0, 0, -totalRoll)).eulerAngles);
我现在会让这段代码更容易阅读,但这样它实际上可以按照我想要的方式工作。
我事先知道 Gimbal Lock,但我的印象是 Unity 天生就使用四元数处理旋转(使用 Rotate 方法)。