文件交换

图像缩略图

四元数

version 1.8.0.0 (101 KB) by 马克Tincknell
四元数类,矢量化,转换旋转表示,数值欧拉传播

19下载

更新2017年8月24日

视图版本历史

查看许可协议

Quaternion.m是一种Matlab类,它实现四元数学运算,3维旋转,若干表示之间的旋转变换,以及欧拉方程的旋转运动的数值传播。除了传播之外的所有Quaternion.M类方法都是完全矢量化的。

引用作为

马克Tincknell(2021)。四元数(//www.tatmou.com/matlabcentral/fileexchange/33341-quaternion),Matlab中央文件兑换。检索到

意见及评分(33

Erwin Schoonderwaldt

非常有用的工具,包括很多功能,如承诺的完全矢量化。使它成为处理动作捕捉数据的伟大工具。我对欧拉转换做了一些研究。我认为以下由Masachika Saito在2019年7月23日提出的修正可能是基于对表述的误解(态度vs轮换?)但我不是这方面的专家。建议的修复可能会破坏与基于欧拉的构造函数的一致性,所以我不会使用它们。建议的修复方案似乎只是颠倒了操作,例如,
>> Eulerangles('XYZ',Q)
成为
>> -eulerangles('xyz',q.inverse())
因此,我宁愿使用后者,而不是实现建议的修复。

Zhaviz mousavimirkalaei

Masachika斋藤

我发现了一些错误并定制如下。请合并到您的代码。

1298年、1301年c1298, 1301年
< case {'121', 'xyx', 'xyx', 'iji'}
<角度(1,iel) =量化(q (iel)生产(2). * q (iel)即(3)-…
<问(iel)生产(4)。* q (iel)生产(1)),(q (iel)生产(2). * q (iel)生产(4)+…
---
>案例{'121','xyx','xyx','iji'}%修复了
>角度(1,iel) =量化(q (iel)生产(1). * q (iel)生产(4)+…
> q (iel)生产(2). * q (iel)即(3)),(q (iel)生产(1). * q (iel)即(3)-…
> q (iel)生产(2). * q (iel)生产(4)));
1304,1305C1304,1305
<角(3 iel) =量化(q (iel)生产(2). * q (iel)即(3)+…
<问(iel)生产(4)。* q (iel)生产(1)),(q (iel)即(3). * q (iel)生产(1)-…
---
>角(3 iel) =量化(q (iel)生产(2). * q (iel)即(3)-…
> Q(IEL).e(1)。* Q(IEL).e(4)),(Q(Iel).e(1)。* q(Iel).e(3)+ ...
1307年、1309年c1307, 1309年
< case {'123', 'xyz', 'xyz', 'ijk'}
<角度(1,iel) =量化(2。* (q (iel)生产(2). * q (iel)生产(1)+…
---
>案例{'123','xyz','xyz','ijk'}%修复了
>角度(1,iel) =量化(2 * (q (iel)。即(1)。* q (iel)生产(2)-…
> q (iel)即(3). * q (iel)生产(4)),(q (iel)生产(1)。^ 2 -…
1311年c1311
<角度(2,iel) = asin(2。* (q (iel)即(3). * q (iel)生产(1)-…
---
>角度(2,IEL)= ASIN(2。*(Q(IEL).e(1)。* Q(IEL).e(3)+ ...
1313年、1314年c1313, 1314年
iel <角(3日)=量化(2。* (q (iel)生产(2). * q (iel)即(3)+…
<问(iel)生产(4)。* q (iel)生产(1)),(q (iel)生产(1)。^ 2 +…
---
iel >角(3)=量化(2。* (q (iel)生产(1). * q (iel)生产(4)-…
> q (iel)生产(2). * q (iel)即(3)),(q (iel)生产(1)。^ 2 +…
1316年、1318年c1316, 1318年
<角度(1,iel) =量化(q (iel)生产(2). * q (iel)生产(4)+…
<问(iel)即(3). * q (iel)生产(1)),(q (iel)生产(4)。* q (iel)生产(1)-…
---
> case {'131', 'xzx', 'xzx', 'iki'} %固定
>角度(1,IEL)= atan2((q(q(q(2)。* q(iel).e(4) - ...
> q (iel)生产(1). * q (iel)即(3)),(q (iel)生产(1). * q (iel)生产(4)+…
1322,1327C1322,1327
<角度(3,IEL)= atan2((q(q(q(iel).e(2)。* q(iel).e(4) - ...
<问(iel)即(3). * q (iel)生产(1)),(q (iel)生产(2). * q (iel)即(3)+…
<问(iel)生产(4)。* q (iel)生产(1)));
< case {'132', 'xzy', 'xzy', 'ikj'}
<角度(1,iel) =量化(2。* (q (iel)生产(2). * q (iel)生产(1)-…
---
>角度(3,IEL)= atan2((q(q(1)。* q(iel).e(3)+ ...
> q (iel)生产(2). * q (iel)生产(4)),(q (iel)生产(1). * q (iel)生产(4)-…
> q (iel)生产(2). * q (iel)即(3)));
> case {'132', 'xzy', 'xzy', 'ikj'} %固定
>角度(1,iel) =量化(2 * (q (iel)。即(1)。* q (iel)生产(2)+…
> q (iel)即(3). * q (iel)生产(4)),(q (iel)生产(1)。^ 2 -…
1329,1331C1329,1331
<角度(2,iel) = asin(2。* (q (iel)生产(2). * q (iel)即(3)+…
<问(iel)生产(4)。* q (iel)生产(1)));
iel <角(3日)=量化(2。* (q (iel)即(3). * q (iel)生产(1)-…
---
>角度(2,iel) = asin(2。* (q (iel)生产(1). * q (iel)生产(4)-…
> q (iel)生产(2). * q (iel)即(3)));
iel >角(3)=量化(2。* (q (iel)生产(1). * q (iel)即(3)+…
1334,1336C1334,1336
---
> case {'212', 'yxy', 'yxy', 'jij'} %固定
>角度(1,Iel)= atan2((q(q(q(2)。* q(iel).e(3) - ...
> Q(IEL).e(1)。* Q(IEL).e(4)),(q(Iel).e(1)。* q(Iel).e(2)+ ...
1340年、1341年c1340, 1341年
<角(3 iel) =量化(q (iel)生产(2). * q (iel)即(3)-…
<问(iel)生产(4)。* q (iel)生产(1)),(q (iel)生产(2). * q (iel)生产(1)+…
---
>角(3 iel) =量化(q (iel)生产(1). * q (iel)生产(4)+…
> q (iel)生产(2). * q (iel)即(3)),(q (iel)生产(1). * q (iel)生产(2)-…
1343年、1345年c1343, 1345年
< case {'213', 'yxz', 'yxz', 'jik'}
<角度(1,Iel)= atan2(2。*(q(q(q(q).e(3)。* q(iel).e(1) - ...
<问(iel)生产(4)。* q (iel)生产(2)),(q (iel)生产(1)。^ 2 -…
---
> case {'213', 'yxz', 'yxz', 'jik'} %固定
>角度(1,iel) =量化(2 * (q (iel)。即(1)。* q (iel)即(3)+…
> Q(IEL).e(2)。* Q(IEL).e(4)),(Q(Iel).e(1)。^ 2- ...
1347年c1347
<角度(2,iel) = asin(2。* (q (iel)生产(2). * q (iel)生产(1)+…
---
>角度(2,IEL)= ASIN(2。*(Q(Q(IEL).e(1)。* Q(IEL).e(2) - ...
1349年c1349
iel <角(3日)=量化(2。* (q (iel)生产(4)。* q (iel)生产(1)-…
---
iel >角(3)=量化(2。* (q (iel)生产(1). * q (iel)生产(4)+…
1352,1354C1352,1354
---
> case {'231', 'yzx', 'yzx', 'jki'} %固定
>角度(1,iel) =量化(2 * (q (iel)。即(1)。* q (iel)即(3)-…
> q (iel)生产(2). * q (iel)生产(4)),(q (iel)生产(1)。^ 2 +…
1356年c1356
<角度(2,iel) = asin(2。* (q (iel)生产(4)。* q (iel)生产(1)-…
---
>角度(2,IEL)= ASIN(2。*(Q(IEL).e(1)。* Q(Iel).e(4)+ ...
1358C1358
---
>角度(3,IEL)= atan2(2。*(q(q(q(1)。* q(iel).e(2) - ...
1361年、1364年c1361, 1364年
< case {'232', 'yzy', 'yzy', 'jkj'}
<问(iel)生产(2). * q (iel)生产(1)),(q (iel)生产(2). * q (iel)即(3)+…
<问(iel)生产(4)。* q (iel)生产(1)));
---
> case {'232', 'yzy', 'yzy', 'jkj'} %固定
>角度(1,iel) =量化(q (iel)生产(1). * q (iel)生产(2)+…
> q (iel)即(3). * q (iel)生产(4)),(q (iel)生产(1). * q (iel)生产(4)-…
> q (iel)生产(2). * q (iel)即(3)));
1367,1368C1367,1368
<角(3 iel) =量化(q (iel)生产(2). * q (iel)生产(1)+…
---
>角度(3,IEL)= atan2((q(q(图4).e(3)。* q(iel).e(4) - ...
> q (iel)生产(1). * q (iel)生产(2)),(q (iel)生产(1). * q (iel)生产(4)+…
1370年、1372年c1370, 1372年
<角度(1,iel) =量化(2。* (q (iel)生产(2). * q (iel)即(3)+…
<问(iel)生产(4)。* q (iel)生产(1)),(q (iel)生产(1)。^ 2 -…
---
> case {'312', 'zxy', 'zxy', 'kij'} %固定
>角度(1,iel) =量化(2 * (q (iel)。即(1)。* q (iel)生产(4)-…
> q (iel)生产(2). * q (iel)即(3)),(q (iel)生产(1)。^ 2 -…
1374C1374
---
>角度(2,IEL)= ASIN(2。*(Q(IEL).e(1)。* Q(IEL).e(2)+ ...
1376年、1377年c1376, 1377年
iel <角(3日)=量化(2。* (q (iel)生产(2). * q (iel)生产(4)+…
<问(iel)即(3). * q (iel)生产(1)),(q (iel)生产(1)。^ 2 -…
---
iel >角(3)=量化(2。* (q (iel)生产(1). * q (iel)即(3)-…
> Q(IEL).e(2)。* Q(IEL).e(4)),(Q(Iel).e(1)。^ 2- ...
1379,1381C1379,1381
< case {'313', 'zxz', 'zxz', 'kik'}
<角度(1,iel) =量化(q (iel)生产(2). * q (iel)生产(4)-…
<问(iel)即(3). * q (iel)生产(1)),(q (iel)生产(2). * q (iel)生产(1)+…
---
> case {'313', 'zxz', 'zxz', 'kik'} %固定
>角度(1,iel) =量化(q (iel)生产(1). * q (iel)即(3)+…
> q (iel)生产(2). * q (iel)生产(4)),(q (iel)生产(1). * q (iel)生产(2)-…
1385年、1386年c1385, 1386年
<角(3 iel) =量化(q (iel)生产(2). * q (iel)生产(4)+…
<问(iel)即(3). * q (iel)生产(1)),(q (iel)生产(2). * q (iel)生产(1)-…
---
>角(3 iel) =量化(q (iel)生产(2). * q (iel)生产(4)-…
> Q(IEL).e(1)。* q(Iel).e(3)),(q(iel).e(1)。* q(iel).e(2).e(2)+ ...
1388年、1389年c1388, 1389年
< case {'321', 'zyx', 'zyx', 'kji'}
<角度(1,iel) =量化(2。* (q (iel)生产(4)。* q (iel)生产(1)-…
---
> case {'321', 'zyx', 'zyx', 'kji'} %固定
>角度(1,iel) =量化(2 * (q (iel)。即(1)。* q (iel)生产(4)+…
1392年、1394年c1392, 1394年
<角度(2,iel) = asin(2。* (q (iel)生产(2). * q (iel)生产(4)+…
iel <角(3日)=量化(2。* (q (iel)生产(2). * q (iel)生产(1)-…
---
>角度(2,IEL)= ASIN(2。*(Q(Q(IEL).e(1)。* q(Iel).e(3) - ...
> q (iel)生产(2). * q (iel)生产(4)));
iel >角(3)=量化(2。* (q (iel)生产(1). * q (iel)生产(2)+…
1397,1399C1397,1399
< case {'323', 'zyz', 'zyz', 'kjk'}
<角度(1,iel) =量化(q (iel)生产(2). * q (iel)生产(1)+…
<问(iel)即(3). * q (iel)生产(4)),(q (iel)即(3). * q (iel)生产(1)-…
---
> case {'323', 'zyz', 'zyz', 'kjk'} %固定
>角度(1,IEL)= atan2((q(q(q(q).e(3)。* q(iel).e(4) - ...
> q (iel)生产(1). * q (iel)生产(2)),(q (iel)生产(1). * q (iel)即(3)+…
1403年、1405年c1403, 1405年
<角(3 iel) =量化(q (iel)即(3). * q (iel)生产(4)-…
<问(iel)生产(2). * q (iel)生产(1)),(q (iel)生产(2). * q (iel)生产(4)+…
---
>角(3 iel) =量化(q (iel)生产(1). * q (iel)生产(2)+…
> q (iel)即(3). * q (iel)生产(4)),(q (iel)生产(1). * q (iel)即(3)-…
> q (iel)生产(2). * q (iel)生产(4)));
2419年c2419
< qout = product(q0(i0), qout);
---
> qout = product(qout, q0(i0));%固定

琼Lobo Prat.

琼Lobo Prat.

伊莱亚斯马丁内斯

塞德里克

瑞安·柯克

布鲁斯艾略特

这看起来是一个非常好的类,事实上,它是我希望MW将包括在基本的Matlab工具箱。它似乎很大程度上等同于航天工具箱中的四元数函数。有没有人测试过它们之间的一致性?

克里斯詹宁斯

我看到这个优秀的工具昨天更新(17年8月24日)。
我在哪里可以找到所列的更新原因?

Eike Grundkoetter.

Eike Grundkoetter.

[…]
S = 0.5 / sqrt(trace+ 1.0);Instead of s = 0.5 / sqrtf(trace+ 1.0);

内森博士

我在下面(3月21日)回顾了我对Chris Jennings的评论。如果将我的例子扩展到输出q2。RotationMatrix(如下所示),你可以看到第二列和第三列与R相比是负的,将向量[0 0 1]与R和R2相乘会得到不同的向量。因此,它们是不相等的。

Q2.RotationMatrix.
ans =.
1 0 0
0 0 1
0 1 0

Jacinto Colan.

达斯汀Horenburg

克里斯詹宁斯

对于你的例子q = [0 0 -0.707 +0.707]
旋转角度是180度,所以有两个对称但相反的旋转会得到相同的结果。我还没去验证这个,但也许两个答案都是一样的?

内森博士

我相信我在这个提交中发现了一个bug。我认为旋转矩阵到四元数转换是过度简化的,并没有考虑到某些情况。看看下面的执行和输出。Q和q2应该是相等的,但不是。

b = sqrt(2)/2;
q =四元数(0,0,-a,a)

Q = (0) + i(0) + j(-0.70711) + k(0.70711)
R = q.RotationMatrix

R =

1 0 0
0 0 1
0 -1 0.

>> q2 =四元数。

Q2 =(0)+ I(0)+ J(0.70711)+ k(0.70711)
Q2 = quaternion.rotationmatrix(r)

我将RotMat2e中的代码替换为下面的c++代码的MATLAB端口:http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixtoquaternion/.那么到目前为止,所有我尝试过的案例都是有效的。

马修•凯利

不错的工作!

特性要求:可以用slerp方法计算角速度矢量。例如:

[q、w] = q1.slerp (q2, t,物);

克里斯詹宁斯

我开始欣赏它的写作程度。谢谢Tuncknell先生

克里斯詹宁斯

非常令人印象深刻的工具。Quaterniontest和quaterniondemo2工作得很好,但没有提到如何运行quaterniondemo(由于没有输入时间,sap)?

安德里亚antonello

我有一个问题:你如何使用“积分”函数(第1474行在Quaternion.m中)?
我试着:

q0 = quaternion.rotationmatrix (R);
Q = Quaternion.Integrateomega.Integral(Q0,T,W);

但是我一直得到这样的错误:

没有足够的输入参数。

四元数/积分时出错(1520行)
[w, dim] = finddim(w, 3);

四元数中的错误。integrateomega(第2188行)
q =整数(四元数(1,0,0,0),varargin{:});

测试中的错误(第35行)
Q = Quaternion.Integrateomega.Integral(Q0,T,W);

马太福音

好主意,执行得很好。也
提供了良好的pdf文档。

尼特挑选:MATLAB帮助文档可能会得到很大改善。测试可以投入单位测试框架。

马修•安德森

优秀的代码——到目前为止有一个问题,见示例:

aa = 0(3、3、2);
aa (:: 1) = RotationMatrix (quaternion.rand);
AA(:,:,2)= RotationMatrix(Quaternion.rand);
q = quaternion.rotationmatrix(aa)

如果repmat(A,M)或repmat(A,M,N)中M或N是一个空数组,将返回一个错误
未来发布。使用1替换空阵列输入。
在四元数> >四元数。正常在983
在四元数>四元数。rotationmatrix在2092
在四元数>四元数。正常在983
在四元数>四元数。rotationmatrix在2092

我认为修复只是为了使NEL = 1,在呼叫REPMAT之前是真实的。

马修•安德森

艾米

我想推荐你一套强大的脚本。通过运行演示和改变参数,我学到了很多东西。伟大的贡献。
有没有办法让我用你的代码来模拟一个摇摆的刚体?我认为不平衡的情况就像一个不平衡的轮胎在太空中旋转。

Rody Oldenhuis

斯宾塞

欧拉角是否定义为“身体固定”或“世界固定”?

威诺斯

这是很棒的东西。简洁和功能。然而,我有一个问题与函数'单位向量'。在代码的几个地方都使用了它,但是它无处可见。下面是一个示例错误信息时,试图使用'OmegaAxis':

1492 [轴,欧米茄] = UniteVector(Omegav,1);
未定义函数'unitvector'用于输入类型'double'的参数。

四元数/OmegaAxis中的错误(第1492行)
=单位向量(1);

Felix.

谢谢你的出色工作。

当我使用函数“interp1”,MATLAB警告函数“isrow”未定义。这是一个bug吗?

尼古拉。

超级棒!非常感谢

亚历山德罗

好工作

泰德•舒尔茨

这是一个很好的全功能Quation0类,具有优秀的文档和清洁代码。

泰德•舒尔茨

Matlab释放兼容性
创建R2013b
与任何版本兼容
平台的兼容性
视窗 苹果系统 Linux

社区寻宝

在MATLAB中心找到宝藏,并发现社区可以如何帮助您!

开始狩猎!