主要内容

低通滤波器使用四元数SLERP取向

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

SLERP概述

考虑两个四元数q_0美元q_1美元。球形线性插值允许您创建一个序列的四元数之间的平稳变化q_0美元q_1美元以恒定的角速度。SLERP使用插值参数h可以在0和1之间变化,并确定如何关闭输出四元数q_0美元q_1美元

四元数的原始配方SLERP是由肯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 $ $

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

SLERP vs四元数的线性插值部分

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

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

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

e = 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处第一季度使用简单的线性插值(昆虫蜜)每个四元数的部分。

partsLinInterp = interp1([0, 1],紧凑([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 =σ。*(兰德(元素个数(h), 3) - 0.5);qnoise =四元数(noiserv,“rotvec”);rng (rcurr);

腐败轨迹trajSlerped噪音,增量旋转轨迹噪声向量qnoise

trajNoisy = trajSlerped。* qnoise;

你可以顺利实值信号使用一个单极过滤器的形式:

求和$ $ k = y_ {k - 1} + \α(xk - y_ {k - 1}) $ $

这个公式本质上说,新滤波器的状态求和$ k美元应该朝着当前输入xk美元的步长之间的距离成正比当前输入和当前过滤器的状态美元y_ {k - 1} $

这种方法的精神告诉如何低通滤过一个四元数的序列。要做到这一点,经销slerp使用功能。

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

slerp函数是用来引导滤波器对当前输入状态。更是引领向输入时输入和当前过滤状态之间的差别很大经销少,对输入的时候经销给一个小值。插值参数slerp在闭区间[0,1],那么的输出呢经销必须重新规范这个范围。然而,[0,1]的各种插值参数给表现不佳,这是限制在一个较小的范围内hrange集中在hbias

hrange = 0.4;hbias = 0.4;

限制区间[0,1]。

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

初始化滤波器和preallocate输出。

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

过滤噪声轨迹,取样。

2 = 2:元素个数(trajNoisy) x = trajNoisy (ii);d = dist (y, x);% Renormalize dist输出范围(低,高)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电脑图形193号(1985):245 - 54岁,doi: 10.1145/325165.325242