我正在用Unity (5.6.0f3)做一个四轴飞行器模拟器游戏。我的四轴飞行器有四个均匀分布的“转子”,连接到一个有固定关节的中心体(和腿)。它通过对转子施加力(rigidbody.AddForce方法)来飞行(目前仅向上)。我正在使用PID控制器来稳定直升机,我已经做了足够的调整,使它在受到外力时稳定得很好……
然而,当我绕着Y轴(偏航)旋转直升机,直升机的前轴接近-90度时,稳定器就会崩溃,并戏剧性地上下倾斜(由于某种原因,如果我在直升机再次稳定后继续在同一方向上偏航,它就会在上下交替,每次都是在-90度)。
我不知道出了什么问题--我使用的PID控制器只稳定俯仰(围绕X轴旋转)和滚动(围绕Z轴旋转),所以更改Y旋转应该不会影响任何东西。
我只是使用transform.Rotate方法来旋转直升机(因此与力或偏航的另一个PID控制器无关)。
其他人在使用PID控制器时遇到过类似的问题吗?
发布于 2017-07-08 16:34:48
当您围绕其中一个轴旋转对象时,有时其他轴会对齐,导致奇怪的行为。这就是所谓的万向锁,谷歌它。这就是我们使用四元数的原因--它们很难阅读,并且以神秘的方式工作,但它们永远不会被“锁定”
编辑我很抱歉,我正在试着让问题尽可能的具体。
发布于 2017-07-09 01:52:55
我想通了..。原来我是使用Euler角度进行旋转,而不是首先在四元数中使用它们。
所以不是使用
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);现在我将使这段代码更容易阅读,但这样它实际上是按照我想要的方式工作的。
我事先知道万向节锁,但我的印象是Unity使用四元数来处理旋转(使用旋转方法)。
https://stackoverflow.com/questions/44982577
复制相似问题