主要内容

meanrot

四元数是指旋转

描述

例子

quatAverage= meanrot (皮疹的元素的平均旋转皮疹沿着第一个大小不等于1的数组维度。

  • 如果皮疹是一个矢量,meanrot(皮疹)返回元素的平均旋转。

  • 如果皮疹是一个矩阵,meanrot(皮疹)返回包含每个列的平均旋转的行向量。

  • 如果皮疹是一个多维数组吗mearot(皮疹)对第一个大小不等于1的数组维进行操作,将元素视为向量。这个维度变为1,而其他所有维度的大小保持不变。

meanrot函数对输入四元数进行归一化,皮疹,然后计算平均值。

quatAverage= meanrot (皮疹昏暗的返回沿维度的平均旋转昏暗的.例如,如果皮疹是一个矩阵meanrot(皮疹,2)是包含每一行均值的列向量。

quatAverage= meanrot (___nanflag指定是包含还是省略为任何前面语法计算的值。meanrot(皮疹、“includenan”)包括所有值的计算while意思是(皮疹、“omitnan”)忽略了它们。

例子

全部折叠

创建一个四元数矩阵,对应于三组欧拉角。

eulerAngles = [40 20 10;...50 10 5;...45 70 1];皮疹=四元数(eulerAngles,“eulerd”“ZYX股票”“帧”);

确定四元数所代表的平均旋转。为便于阅读,将平均旋转转换为欧拉角的度数。

quatAverage = meanrot(皮疹)
quatAverage =四元数0.88863 - 0.062598i + 0.27822j + 0.35918k
eulerAverage = eulerd (quatAverage,“ZYX股票”“帧”
eulerAverage =1×345.7876 32.6452 6.0407

使用meanrot在四元数序列上平均掉加性噪声。

创建一个1e6四元数的向量,其距离由经销函数,从四元数(1,0,0,0)是正态分布。画出噪声四元数向量对应的欧拉角。

nrows = 1 e6;x = 2*rand(nrows,3) - 1;ax = ax. /√(sum (ax。^ 2,2));ang = 0.5 * randn(大小(ax, 1), 1);q =四元数(ax。* ang,“rotvec”);noisyEulerAngles = eulerd (q,“ZYX股票”“帧”);图(1)subplot(3,1,1) plot(noisyEulerAngles(:,1)) title(z轴的) ylabel (的旋转(度))举行次要情节(1、2)情节(noisyEulerAngles(:, 2)标题(“轴”) ylabel (的旋转(度))举行次要情节(3、1,3)情节(noisyEulerAngles(:, 3)标题(“轴”) ylabel (的旋转(度))举行

图中包含3个轴对象。标题为Z-Axis的轴对象1包含一个类型为line的对象。标题为Y-Axis的axis对象2包含一个类型为line的对象。标题为X-Axis的axis对象3包含一个类型为line的对象。

使用meanrot在给定四元数向量的情况下确定四元数的平均值。转换成欧拉角并绘制结果。

qAverage = meanrot (q);qAverageInEulerAngles = eulerd (qAverage,“ZYX股票”“帧”);图(1)subplot(3,1,1) plot(ones(nrows,1)*qAverageInEulerAngles(:,1)) title(z轴的) subplot(3,1,2) plot(ones(nrows,1)*qAverageInEulerAngles(:,2)) title(“轴”) subplot(3,1,3) plot(ones(nrows,1)*qAverageInEulerAngles(:,3)) title(“轴”

图中包含3个轴对象。标题为Z-Axis的轴对象1包含2个类型为line的对象。标题为Y-Axis的axis对象2包含2个类型为line的对象。标题为X-Axis的轴对象3包含2个类型为line的对象。

meanrot算法

meanrot函数输出四元数,使旋转矩阵之间的差异的平方Frobenius范数最小化。考虑两个四元数:

  • q0处代表没有旋转。

  • q90表示绕的90度旋转x设在。

Q0 =四元数([0 0 0],“eulerd”“ZYX股票”“帧”);Q90 =四元数([0 0 90],“eulerd”“ZYX股票”“帧”);

创建四元数扫描,qSweep,表示从0到180度的旋转x设在。

eulerSweep = (0:1:180) ';qSweep =四元数([0(元素个数(eulerSweep), 2), eulerSweep),...“eulerd”“ZYX股票”“帧”);

转换q0处q90,qSweep旋转矩阵。在循环中,计算四元数扫描的每个成员的最小化度量。绘制结果并返回对应于度量的最小值的欧拉扫描值。

r0 = rotmat (q0,“帧”);r90 = rotmat (q90,“帧”);rSweep = rotmat (qSweep,“帧”);metricToMinimize = 0(大小(rSweep, 3), 1);i = 1:numel(qSweep) metricToMinimize(i) = norm((rSweep(:,:,i) - r0),“摇来摇去”).^ 2 +...规范(rSweep (:,:, i) - r90),“摇来摇去”)。^ 2;结束情节(eulerSweep metricToMinimize)包含(“欧拉扫描(度)”) ylabel (“指标最小化”

图中包含一个轴对象。axis对象包含一个类型为line的对象。

[~, eulerIndex] = min (metricToMinimize);eulerSweep (eulerIndex)
ans = 45

度规的最小值对应于欧拉角扫45度。也就是说,meanrot定义了quaterion([0 0 0],“ZYX股票”,“框架”)四元数([0 0 90),“ZYX股票”,“框架”)作为四元数([0 0 45],“ZYX股票”,“框架”).调用meanrotq0处q90来验证相同的结果。

eulerd (meanrot ([q0 q90]),“ZYX股票”“帧”
ans =1×30 0 45.0000

限制

度规,meanrot用于确定平均旋转不是唯一的四元数明显的距离。对被180度分隔的四元数重复上面的实验。

Q180 =四元数([0 0 180],“eulerd”“ZYX股票”“帧”);r180 = rotmat (q180,“帧”);i = 1:numel(qSweep) metricToMinimize(i) = norm((rSweep(:,:,i) - r0),“摇来摇去”).^ 2 +...规范(rSweep (:,:, i) - r180),“摇来摇去”)。^ 2;结束情节(eulerSweep metricToMinimize)包含(“欧拉扫描(度)”) ylabel (“指标最小化”

图中包含一个轴对象。axis对象包含一个类型为line的对象。

[~, eulerIndex] = min (metricToMinimize);eulerSweep (eulerIndex)
ans = 159

四元数均值通常计算相互接近的旋转,这使得本例中显示的边缘情况在实际应用程序中不太可能。要平均两个相隔甚远的四元数,使用slerp函数。使用以下方法重复实验slerp并验证了四元数平均返回值对于长距离更直观。

qMean = slerp (q0 q180, 0.5);q0_q180 = eulerd (qMean,“ZYX股票”“帧”
q0_q180 =1×30 0 90.0000

输入参数

全部折叠

用于计算平均值的四元数,指定为标量、向量、矩阵或四元数的多维数组。

数据类型:四元数

要操作的维数,指定为正整数标量。如果没有指定值,则默认为大小不等于1的第一个数组维度。

昏暗的长度减为1的维度。的大小(quatAverage dim)1,而其他尺寸保持不变。

数据类型:|

条件,指定为以下值之一:

  • “includenan”——包括值时计算平均旋转,得到

  • “omitnan”——忽略所有值。

数据类型:字符|字符串

输出参数

全部折叠

四元数平均旋转,作为标量、向量、矩阵或多维数组返回。

数据类型:|

算法

meanrot确定四元数平均值, ¯ ,根据[1] ¯ 是四元数,使旋转矩阵之间的差异的平方Frobenius范数最小化:

¯ 参数 最小值 年代 3. 1 n 一个 一个 F 2

参考文献

[1] Markley, F. Landis,杨陈,John Lucas Crassidis, Yaakov Oshman。“平均四元数”。制导,控制和动力学杂志.2007年第4期,第30卷,第1193-1197页。

扩展功能

C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。

另请参阅

功能

对象

介绍了R2018b