首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity中的四轴飞行器PID在旋转时出现故障

Unity中的四轴飞行器PID在旋转时出现故障
EN

Stack Overflow用户
提问于 2017-07-08 12:42:48
回答 2查看 326关注 0票数 0

我正在用Unity (5.6.0f3)做一个四轴飞行器模拟器游戏。我的四轴飞行器有四个均匀分布的“转子”,连接到一个有固定关节的中心体(和腿)。它通过对转子施加力(rigidbody.AddForce方法)来飞行(目前仅向上)。我正在使用PID控制器来稳定直升机,我已经做了足够的调整,使它在受到外力时稳定得很好……

然而,当我绕着Y轴(偏航)旋转直升机,直升机的前轴接近-90度时,稳定器就会崩溃,并戏剧性地上下倾斜(由于某种原因,如果我在直升机再次稳定后继续在同一方向上偏航,它就会在上下交替,每次都是在-90度)。

我不知道出了什么问题--我使用的PID控制器只稳定俯仰(围绕X轴旋转)和滚动(围绕Z轴旋转),所以更改Y旋转应该不会影响任何东西。

我只是使用transform.Rotate方法来旋转直升机(因此与力或偏航的另一个PID控制器无关)。

其他人在使用PID控制器时遇到过类似的问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-08 16:34:48

当您围绕其中一个轴旋转对象时,有时其他轴会对齐,导致奇怪的行为。这就是所谓的万向锁,谷歌它。这就是我们使用四元数的原因--它们很难阅读,并且以神秘的方式工作,但它们永远不会被“锁定”

编辑我很抱歉,我正在试着让问题尽可能的具体。

票数 0
EN

Stack Overflow用户

发布于 2017-07-09 01:52:55

我想通了..。原来我是使用Euler角度进行旋转,而不是首先在四元数中使用它们。

所以不是使用

代码语言:javascript
复制
transform.Rotate(transform.right, totalPitch);
transform.Rotate(transform.forward, -totalRoll);

我修复它的方式是使用

代码语言:javascript
复制
transform.Rotate(Quaternion.Euler(new Vector3(totalPitch, 0, 0)).eulerAngles);
transform.Rotate(Quaternion.Euler(new Vector3(0, 0, -totalRoll)).eulerAngles);

现在我将使这段代码更容易阅读,但这样它实际上是按照我想要的方式工作的。

我事先知道万向节锁,但我的印象是Unity使用四元数来处理旋转(使用旋转方法)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44982577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档