- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我真的很难找到从任意四元数获取绕单个轴的旋转角度的正确方法。换句话说,我想找到围绕指定轴(在我的例子中是坐标系的 Z 轴,但任意解决方案都很好)的角度表示的旋转部分。有人能指出要实现这一目标吗?理想情况下,一些 java 片段会很好。
我尝试了 1 中提出的解决方案对于态度,即:
asin(2*qx*qy + 2*qz*qw)
但是,这在某些情况下会失败,例如绕 Z 轴旋转一次,旋转角度超过 0.6 * PI。
最佳答案
每个四元数 q 都可以分解为某种极分解
q = r * (c + s * e)
哪里
r = |q|, s = |imag(q/r)|, c = real(q/r) and e = imag(q/s/r)
x ↦ q * x * q^(-1) 的旋转轴为 e,角度为单位圆上点 (c,s)=(cos(α),sin(α)) 的角度 α 的 2 倍。
为了计算旋转角度,r 的缩放并不那么重要,所以
angle = 2*atan2( norm(imag(q)), real(q) )
<小时/>
绕X轴的旋转由四元数ca+sa*i
表示,绕Y轴的旋转由四元数cb+sb*j
表示,Z轴由cc+sc*k
表示,其中ca²+sa²=1表示旋转角a的一半的余弦-正弦对等。后面的2a、c2a和s2a等将表示双角及其余弦和正弦值。
按照应用到原点处的对象的 xyz 顺序相乘得到一个乘积
q=qw+qx*i+qy*j+qz*k
=(cc+sc*k)*(cb+sb*j)*(ca+sa*i)
现在,q*i*q^(-1)
和 q^(-1)*k*q
中发生了有趣的事情,因为内部项交换并取消,因此
q*i*q^(-1)*(-i) = (cc+sc*k)*(cb+sb*j)*(cb+sb*j)*(cc+sc*k)
= (cc+sc*k)*(c2b+s2b*j)*(cc+sc*k)
= (c2c+s2c*k)*c2b+s2b*j
(-k)*q^(-1)*k*q = (ca+sa*i)*(cb+sb*j)*(cb+sb*j)*(ca+sa*i)
=(ca+sa*i)*(c2b+s2b*j)*(ca+sa*i)
=(c2a+s2a*i)*c2b+s2b*j
然后可以使用它来隔离角度 2a、2b 和 2c
q*i*q^(-1)*(-i) = (q*i)*(i*q)^(-1)
= (qw*i-qx-qy*k+qz*j)*(-qw*i-qx-qy*k+qz*j)
= (qw²+qx²-qy²-qz²)
+ 2*(qw*qy-qx*qz)*j
+ 2*(qw*qz+qx*qy)*k
(-k)*q^(-1)*k*q = (q*k)^(-1)*(k*q)
= (-qw*k+qx*j-qy*i-qz)*(qw*k+qx*j-qy*i-qz)
= (qw²-qx²-qy²+qz²)
+ 2*(qw*qx+qy*qz)*i
+ 2*(qw*qy-qx*qz)*j
<小时/>
识别表达式结果
s2b = 2*(qw*qy-qx*qz)
c2b*(c2a+s2a*i) = (qw²-qx²-qy²+qz²) + 2*(qw*qx+qy*qz)*i
c2b*(c2c+s2c*k) = (qw²+qx²-qy²-qz²) + 2*(qw*qz+qx*qy)*k
或
2a = atan2(2*(qw*qx+qy*qz), (qw²-qx²-qy²+qz²))
2b = asin(2*(qw*qy-qx*qz))
2c = atan2(2*(qw*qz+qx*qy), (qw²+qx²-qy²-qz²))
这以这样的方式构造角度
c2b=sqrt( (qw²+qx²+qy²+qz²)²+8*qw*qx*qy*qz )
为正数,因此 2b 介于 -pi/2 和 pi/2 之间。通过一些符号操作,也可以获得 c2b 为负的解。
<小时/>显然,使用了不同类型的旋转顺序,其中 Z 旋转是中间旋转。准确地说,
q = (cb+sb*j)*(cc+sc*k)*(ca+sa*i)
哪里
2b = 标题 2a = 银行 2c = 态度
要处理大于 0.5*pi 的姿态旋转角度 2c,您需要计算全套欧拉角,因为它们将在 Z 旋转之前和之后包含围绕其他轴的两次翻转。
或者您需要检测这种情况,要么保持坡度余弦为正,要么检查是否存在过大的角度变化,并在 atan 公式中应用符号修改,通过 pi(+ 或 -)更改其结果角度,并将 Z 角度计算更改为 pi-asin(...)
或者,仅在计算后操纵角度,如果 (2a,2b,2c) 是计算的解,则
(2a-sign(2a)*pi, 2b-sign(2b)*pi, sign(2c)*pi-2c)
是另一个给出相同四元数和旋转的解决方案。选择最接近预期行为的一个。
关于Java代码从四元数获取绕轴的旋转角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23115739/
我尝试理解[c代码 -> 汇编]代码 void node::Check( data & _data1, vector& _data2) { -> push ebp -> mov ebp,esp ->
我需要在当前表单(代码)的上下文中运行文本文件中的代码。其中一项要求是让代码创建新控件并将其添加到当前窗体。 例如,在Form1.cs中: using System.Windows.Forms; ..
我有此 C++ 代码并将其转换为 C# (.net Framework 4) 代码。有没有人给我一些关于 malloc、free 和 sprintf 方法的提示? int monate = ee; d
我的网络服务器代码有问题 #include #include #include #include #include #include #include int
给定以下 html 代码,将列表中的第三个元素(即“美丽”一词)以斜体显示的 CSS 代码是什么?当然,我可以给这个元素一个 id 或一个 class,但 html 代码必须保持不变。谢谢
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我试图制作一个宏来避免重复代码和注释。 我试过这个: #define GrowOnPage(any Page, any Component) Component.Width := Page.Surfa
我正在尝试将我的旧 C++ 代码“翻译”成头条新闻所暗示的 C# 代码。问题是我是 C# 中的新手,并不是所有的东西都像 C++ 中那样。在 C++ 中这些解决方案运行良好,但在 C# 中只是不能。我
在 Windows 10 上工作,R 语言的格式化程序似乎没有在 Visual Studio Code 中完成它的工作。我试过R support for Visual Studio Code和 R-T
我正在处理一些报告(计数),我必须获取不同参数的计数。非常简单但乏味。 一个参数的示例查询: qCountsEmployee = ( "select count(*) from %s wher
最近几天我尝试从 d00m 调试网络错误。我开始用尽想法/线索,我希望其他 SO 用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境。 整个事情始于用户注意到我们应用程
我有一个 app.js 文件,其中包含如下 dojo amd 模式代码: require(["dojo/dom", ..], function(dom){ dom.byId('someId').i
我对“-gencode”语句中的“code=sm_X”选项有点困惑。 一个例子:NVCC 编译器选项有什么作用 -gencode arch=compute_13,code=sm_13 嵌入库中? 只有
我为我的表格使用 X-editable 框架。 但是我有一些问题。 $(document).ready(function() { $('.access').editable({
我一直在通过本教程学习 flask/python http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-wo
我想将 Vim 和 EMACS 用于 CNC、G 代码和 M 代码。 Vim 或 EMACS 是否有任何语法或模式来处理这种类型的代码? 最佳答案 一些快速搜索使我找到了 this vim 和 thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve this
这个问题在这里已经有了答案: Enabling markdown highlighting in Vim (5 个回答) 6年前关闭。 当我在 Vim 中编辑包含 Markdown 代码的 READM
我正在 Swift3 iOS 中开发视频应用程序。基本上我必须将视频 Assets 和音频与淡入淡出效果合并为一个并将其保存到 iPhone 画廊。为此,我使用以下方法: private func d
pipeline { agent any stages { stage('Build') { steps { e
我是一名优秀的程序员,十分优秀!