主要内容

四元数SLERP低通滤波器定向

这个例子展示了如何使用球面线性插值(SLERP)来创建四元数序列和低通滤波噪声轨迹。SLERP是一种常用的计算机图形技术,用于创建旋转物体的动画。

SLERP概述

考虑一对四元数q_0美元而且q_1美元.球面线性插值允许您创建一个四元数序列,它在q_0美元而且q_1美元以恒定的角速度。SLERP使用插值参数h它可以在0和1之间变化,并决定输出四元数与其中任何一个的接近程度q_0美元q_1美元

四元数SLERP的最初配方是由Ken Shoemake给出的[1):

$$Slerp(q_0,q_1,h) = q_1(q_1^{-1} q_2)^h$$

一种与正弦曲线的替代配方(用于slerp函数实现):

$ $ Slerp (q_0 q_1, h) = \压裂{\罪((1小时)\θ)}{\罪\θ}q_0 + & # xA;\压裂{\罪(h \θ)}{\罪\θ}q_1 $ $

在哪里\θ美元是四元数部分的点积。请注意,$\theta = dist(q_0, q_1)/2$

SLERP与四元数零件的线性插值

考虑下面的例子。从欧拉角构建两个四元数。

Q0 =四元数([-80 10 0],“eulerd”“ZYX股票”“帧”);Q1 =四元数([80 70 70],“eulerd”“ZYX股票”“帧”);

求四元数的30%从q0处第一季度,指定slerp参数为0.3。

P30 = slerp(q0, q1, 0.3);

要查看插值四元数的欧拉角表示,请使用eulerd函数。

eulerd (e,“ZYX股票”“帧”
Ans = -56.6792 33.2464 -9.6740

创造一个平滑的轨迹q0处而且第一季度,指定slerp插值参数为0到1之间均匀间隔的数的向量。

dt = 0.01;h = (0: dt: 1)。';trajSlerped = slerp(q0, q1, h);

将SLERP算法的结果与两者之间的轨迹进行比较q0处而且第一季度,利用四元数各部分的简单线性插值(LERP)。

partsLinInterp = interp1([0;1], compact([q0;q1]), h,“线性”);

注意,线性插值不会给出单位四元数,因此必须进行归一化处理。

trajLerped =正常化(四元数(partsLinInterp));

计算每一种方法的角速度。

avSlerp = helperQuat2AV(trajSlerped, dt);avLerp = helperQuat2AV(trajLerped, dt);

画出两组角速度。注意,SLERP的角速度是恒定的,但线性插值的角速度是不同的。

sp = HelperSlerpPlotting;sp.plotAngularVelocities (avSlerp avLerp);

SLERP以恒定的速率产生平稳的旋转。

SLERP低通滤波

SLERP还可以用于制作更复杂的函数。在这里,利用SLERP对噪声轨迹进行低通滤波。

旋转噪声可以由噪声旋转向量形成四元数来构造。

rcurr = rng (1);σ= 1 e 1;Noiserv = sigma .* (rand(numel(h), 3) - 0.5);qnoise =四元数(noiserv,“rotvec”);rng (rcurr);

破坏轨迹trajSlerped有噪声时,用噪声矢量增量旋转轨迹qnoise

trajnoise = trajSlerped .* qnoise;

你可以使用单极滤波器平滑实值信号,形式如下:

$$ y_k = y__ {k-1} + \alpha(x_k - y_{k-1}) $$

这个公式实际上是说新的滤波器状态求和$ k美元应该向当前输入方向移动吗xk美元步长与当前输入和当前滤波器状态之间的距离成正比美元y_ {k - 1} $

这种方法的精神说明了如何对四元数序列进行低通滤波。要做到这一点,两者经销而且slerp使用功能。

经销函数返回由两个四元数应用的旋转差的弧度测量值。的范围经销函数是半开区间[0,pi)。

slerp函数用于引导滤波器状态朝向当前输入。当输入和电流滤波状态之间的差较大时,它更多地转向输入经销时的输入较少经销给出一个小值。插值参数为slerp在闭区间[0,1],那么输出的经销必须重新规范化到这个范围。然而,插值参数的完整范围[0,1]的性能很差,因此它被限制在一个更小的范围内hrange集中在hbias

hrange = 0.4;hbias = 0.4;

限制而且到区间[0,1]。

Low = max(min(hbias - (hrange./2), 1), 0);High = max(min(hbias + (hrange./2), 1), 0);hrangeLimited =高-低;

初始化过滤器并预分配输出。

y = trajNoisy (1);%初始过滤器状态qout = 0(大小(y),“喜欢”, y);%预分配过滤器输出qout (1) = y;

逐样本过滤噪声轨迹。

ii=2:numel(trajnoise) x = trajnoise (ii);D = dist(y, x);将区域输出重新规范化到范围[低,高]hlpf = (d / pi)。* hrangeLimited +低;y = slerp (y, x, hlpf);qout (ii) = y;结束f =图;trajNoisy sp.plotEulerd (f,“o”);trajSlerped sp.plotEulerd (f,“k -”。“线宽”2);qout sp.plotEulerd (f,“- - -”“线宽”2);sp.addAnnotations (f hrange hbias);

结论

SLERP可以用于在两个方向之间创建短轨迹和用于平滑或低通滤波。它已被广泛应用于各种行业。

参考文献

  1. Shoemake,肯。用四元数曲线制作旋转动画。ACMSIGRAPH电脑图形19, no .3 (1985):245-54, doi:10.1145/325165.325242

Baidu
map