主要内容

meanrot

四元数平均旋转

描述

例子

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

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

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

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

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

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

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

例子

全部折叠

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

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

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

quatAverage = meanrot(quat)
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 = 1e6;Ax = 2*rand(nrows,3) - 1;Ax = Ax ./√(sum(Ax .^2,2));Ang = 0.5*randn(size(ax,1),1);Q =四元数(ax。* ang,“rotvec”);noisyEulerAngles = eulerd(q,“ZYX股票”“帧”);图(1)subplot(3,1,1) plot(noisyEulerAngles(:,1)) title(z轴的) ylabel (的旋转(度))举行subplot(3,1,2) plot(noisyEulerAngles(:,2)) title(“轴”) ylabel (的旋转(度))举行subplot(3,1,3) plot(noisyEulerAngles(:,3)) title(“轴”) ylabel (的旋转(度))举行

图中包含3个轴。标题为z轴的轴1包含一个类型为line的对象。标题为y轴的坐标轴2包含一个类型为line的对象。标题为X-Axis的Axes 3包含一个类型为line的对象。

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

qAverage = meanrot(q);qAverageInEulerAngles = eulerd,“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轴的轴1包含2个line类型的对象。标题为y轴的轴2包含两个line类型的对象。标题为x轴的轴3包含两个line类型的对象。

meanrot算法

meanrot函数输出一个四元数,使旋转矩阵之间的差的平方弗罗比尼乌斯范数最小化。考虑两个四元数:

  • 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 =四元数([zeros(numel(eulerSweep),2),eulerSweep],...“eulerd”“ZYX股票”“帧”);

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

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

图中包含一个坐标轴。坐标轴包含一个line类型的对象。

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

度规的最小值对应于45度的欧拉角掠。也就是说,meanrot定义之间的平均值四元数([0 0 0],'ZYX','frame')而且四元数([0 0 90],'ZYX','frame')作为四元数([0 0 45],'ZYX','frame').调用meanrotq0处而且q90验证相同的结果。

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

限制

这个度规meanrot用于确定平均旋转的方法对于间隔很大的四元数并不是唯一的。对于间隔180度的四元数,重复上面的实验。

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

图中包含一个坐标轴。坐标轴包含一个line类型的对象。

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

四元数的平均值通常是为彼此接近的旋转计算的,这使得本例中显示的边界情况在实际应用中不太可能出现。要对两个相距很远的四元数求平均值,请使用slerp函数。重复下面的实验slerp并验证返回的四元数平均值对于长距离更直观。

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

输入参数

全部折叠

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

数据类型:四元数

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

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

数据类型:|

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

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

  • “omitnan”——忽略一切输入中的值。

数据类型:字符|字符串

输出参数

全部折叠

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

数据类型:|

算法

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

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

参考文献

Markley, F. Landis,杨晨,John Lucas Crassidis, Yaakov Oshman。“平均四元数”。制导、控制与动力学学报.2007年第4期第30卷第1193-1197页。

扩展功能

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

另请参阅

功能

对象

在R2019b中引入