- 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/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!