Main Content

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

Orientación del filtro de paso bajo utilizando Quaternion SLERP

Este ejemplo muestra cómo utilizar la interpolación lineal esférica (SLERP) para crear secuencias de cuaterniones y trayectorias ruidosas de filtro de paso bajo. SLERP es una técnica de gráficos por computadora de uso común para crear animaciones de un objeto giratorio.

Descripción general de SLERP

Considere un par de cuaterniones y . La interpolación lineal esférica le permite crear una secuencia de cuaterniones que varían suavemente entre y con una velocidad angular constante. SLERP utiliza un parámetro de interpolación h que puede variar entre 0 y 1 y determina qué tan cerca está el cuaternión de salida de o .

La formulación original del cuaternión SLERP fue dada por Ken Shoemake [ 1] como:

Una formulación alternativa con sinusoides (utilizada en la implementación de la función slerp ) es:

donde es el producto escalar de las partes del cuaternión. Tenga en cuenta que .

SLERP frente a interpolación lineal de partes de cuaterniones

Considere el siguiente ejemplo. Construye dos cuaterniones a partir de los ángulos de Euler.

q0 = quaternion([-80 10 0], 'eulerd', 'ZYX', 'frame');
q1 = quaternion([80 70 70], 'eulerd', 'ZYX', 'frame');

Para encontrar un cuaternión en el 30 por ciento del camino desde q0 a q1, especifique el parámetro slerp como 0,3.

p30 = slerp(q0, q1, 0.3);

Para ver la representación del ángulo de Euler del cuaternión interpolado, utilice la función eulerd .

eulerd(p30, 'ZYX', 'frame')
ans =

  -56.6792   33.2464   -9.6740

Para crear una trayectoria suave entre q0 y q1, especifique el parámetro de interpolación slerp como un vector de números espaciados uniformemente entre 0 y 1. .

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

Compare los resultados del algoritmo SLERP con una trayectoria entre q0 y q1, utilizando interpolación lineal simple (LERP) de cada parte del cuaternión.

partsLinInterp = interp1( [0;1], compact([q0;q1]), h, 'linear');

Tenga en cuenta que la interpolación lineal no da cuaterniones unitarios, por lo que deben normalizarse.

trajLerped = normalize(quaternion(partsLinInterp));

Calcule las velocidades angulares de cada aproximación.

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

Trace ambos conjuntos de velocidades angulares. Observe que la velocidad angular para SLERP es constante, pero varía para la interpolación lineal.

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

SLERP produce una rotación suave a un ritmo constante.

Filtrado de paso bajo con SLERP

SLERP también se puede utilizar para realizar funciones más complejas. Aquí, SLERP se utiliza para filtrar paso bajo una trayectoria ruidosa.

El ruido rotacional se puede construir formando un cuaternión a partir de un vector de rotación ruidoso.

rcurr = rng(1);
sigma = 1e-1;
noiserv = sigma .* ( rand(numel(h), 3) - 0.5);
qnoise = quaternion(noiserv, 'rotvec');
rng(rcurr);

Para corromper la trayectoria trajSlerped con ruido, gire incrementalmente la trayectoria con el vector de ruido qnoise.

trajNoisy = trajSlerped .* qnoise;

Puede suavizar señales de valor real utilizando un filtro unipolar de la forma:

Esta fórmula esencialmente dice que el nuevo estado de filtro debe moverse hacia la entrada actual en un tamaño de paso que sea proporcional a la distancia entre la entrada actual y la estado actual del filtro .

El espíritu de este enfoque informa cómo se puede filtrar una secuencia de cuaterniones con un filtro de paso bajo. Para ello se utilizan tanto las funciones dist como slerp .

La función dist devuelve una medida en radianes de la diferencia de rotación aplicada por dos cuaterniones. El rango de la función dist es el intervalo medio abierto [0, pi).

La función slerp se utiliza para dirigir el estado del filtro hacia la entrada actual. Se dirige más hacia la entrada cuando la diferencia entre la entrada y el estado actual del filtro tiene un dist grande, y menos hacia la entrada cuando dist da un valor pequeño. El parámetro de interpolación de slerp está en el intervalo cerrado [0,1], por lo que la salida de dist debe volver a normalizarse a este rango. Sin embargo, el rango completo de [0,1] para el parámetro de interpolación proporciona un rendimiento deficiente, por lo que se limita a un rango más pequeño hrange centrado en hbias.

hrange = 0.4;
hbias = 0.4;

Limite low y high al intervalo [0, 1].

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

Inicialice el filtro y asigne previamente las salidas.

y = trajNoisy(1); % initial filter state
qout = zeros(size(y), 'like', y); % preallocate filter output
qout(1) = y;

Filtre la trayectoria ruidosa, muestra por muestra.

for ii=2:numel(trajNoisy)
    x = trajNoisy(ii);
    d = dist(y, x);

    % Renormalize dist output to the range [low, high]
    hlpf = (d./pi).*hrangeLimited + low;
    y = slerp(y,x,hlpf);
    qout(ii) = y;
end

f = figure;
sp.plotEulerd(f, trajNoisy, 'o');
sp.plotEulerd(f, trajSlerped, 'k-.', 'LineWidth', 2);
sp.plotEulerd(f, qout, '-', 'LineWidth', 2);
sp.addAnnotations(f, hrange, hbias);

Conclusión

SLERP se puede utilizar para crear trayectorias cortas entre dos orientaciones y para suavizar o filtrar de paso bajo. Ha encontrado un uso generalizado en una variedad de industrias.

Referencias

  1. Zapatero, Ken. "Animación de la rotación con curvas de cuaterniones". ACM SIGRAPH Computadora Gráficos 19, no 3 (1985):245-54, doi:10.1145/325165.325242