Contenido principal

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

insfilterAsync

Estimar la pose a partir de datos asíncronos de MARG y GPS

Descripción

El objeto insfilterAsync implementa la fusión de sensores de datos MARG y GPS para estimar la postura en el marco de referencia NED (o ENU). Los datos MARG (magnéticos, de velocidad angular y de gravedad) generalmente se derivan de datos de magnetómetro, giroscopio y acelerómetro, respectivamente. El filtro utiliza un vector de estado de 28 elementos para rastrear la orientación quaternion, la velocidad, la posición, los sesgos del sensor MARG y el vector geomagnético. El objeto insfilterAsync utiliza un filtro de Kalman extendido continuo-discreto para estimar estas cantidades.

Creación

Descripción

filter = insfilterAsync crea un objeto insfilterAsync para fusionar datos MARG y GPS asincrónicos con valores de propiedad predeterminados.

ejemplo

filter = insfilterAsync('ReferenceFrame',RF) le permite especificar el marco de referencia, RF, del filter.

filter = insfilterAsync(___,Name=Value) establece una o más propiedades utilizando argumentos de nombre-valor además de cualquiera de los argumentos de entrada anteriores.

Argumentos de entrada

expandir todo

Sistema de coordenadas de navegación local, especificado como 'NED' (Noreste-Abajo) o 'ENU' (Este-Norte-Arriba).

Tipos de datos: char | string

Propiedades

expandir todo

Ubicación de referencia, especificada como un vector fila de tres elementos en coordenadas geodésicas (latitud, longitud y altitud). La altitud es la altura sobre el modelo de elipsoide de referencia, WGS84. Las unidades de ubicación de referencia son [grados grados metros].

Tipos de datos: single | double

Variación aditiva del ruido del proceso de cuaterniones, especificada como un vector escalar o de cuatro elementos de partes de cuaterniones.

Tipos de datos: single | double

Ruido de proceso de velocidad angular aditivo en el sistema de coordenadas de navegación local en (rad/s)2, especificado como un vector fila escalar o de tres elementos de números finitos reales positivos.

  • Si AngularVelocityNoise es un vector fila, los elementos corresponden al ruido en los ejes x, y y z del sistema de coordenadas de navegación local, respectivamente.

  • Si AngularVelocityNoise es un escalar, el elemento individual se aplica a cada eje.

Tipos de datos: single | double

Ruido del proceso de posición aditivo en el sistema de coordenadas de navegación local en m2, especificado como un vector fila escalar o de tres elementos de números finitos reales positivos.

  • Si PositionNoise es un vector fila, los elementos corresponden al ruido en los ejes x, y y z del sistema de coordenadas de navegación local, respectivamente.

  • Si PositionNoise es un escalar, el elemento individual se aplica a cada eje.

Tipos de datos: single | double

Ruido de proceso de velocidad aditivo en el sistema de coordenadas de navegación local en (m/s)2, especificado como un vector fila escalar o de tres elementos de números finitos reales positivos.

  • Si VelocityNoise es un vector fila, los elementos corresponden al ruido en los ejes x, y y z del sistema de coordenadas de navegación local, respectivamente.

  • Si VelocityNoise es un escalar, el elemento individual se aplica a cada eje.

Tipos de datos: single | double

Ruido de proceso de aceleración aditivo en (m/s2)2, especificado como un vector fila escalar o de tres elementos de números finitos reales positivos.

  • Si AccelerationNoise es un vector fila, los elementos corresponden al ruido en los ejes x, y y z del sistema de coordenadas de navegación local, respectivamente.

  • Si AccelerationNoise es un escalar, el elemento individual se aplica a cada eje.

Tipos de datos: single | double

Variación del ruido del proceso aditivo a partir del sesgo del giroscopio en (rad/s)2, especificado como un vector fila escalar o de tres elementos de números finitos reales positivos.

  • Si GyroscopeBiasNoise es un vector fila, los elementos corresponden al ruido en los ejes x, y y z del giroscopio, respectivamente.

  • Si GyroscopeBiasNoise es un escalar, el elemento individual se aplica a cada eje.

Tipos de datos: single | double

Variación del ruido del proceso aditivo a partir del sesgo del acelerómetro en (m/s2)2, especificada como un vector fila escalar o de tres elementos de números reales positivos.

  • Si AccelerometerBiasNoise es un vector fila, los elementos corresponden al ruido en los ejes x, y y z del acelerómetro, respectivamente.

  • Si AccelerometerBiasNoise es un escalar, el elemento individual se aplica a cada eje.

Varianza del ruido del proceso aditivo del vector geomagnético en μT2, especificado como un vector fila escalar o de tres elementos de números reales positivos.

  • Si GeomagneticVectorNoise es un vector fila, los elementos corresponden al ruido en los ejes x, y y z del sistema de coordenadas de navegación local, respectivamente.

  • Si GeomagneticVectorNoise es un escalar, el elemento individual se aplica a cada eje.

Variación del ruido del proceso aditivo a partir del sesgo del magnetómetro en μT2, especificada como un vector fila escalar o de tres elementos de números reales positivos.

  • Si MagnetometerBiasNoise es un vector fila, los elementos corresponden al ruido en los ejes x, y y z del magnetómetro, respectivamente.

  • Si MagnetometerBiasNoise es un escalar, el elemento individual se aplica a cada eje.

Vector de estado del filtro de Kalman extendido. Los valores estatales representan:

EstadoUnidadesÍndice
Orientación (partes del cuaternión)N / A1:4
Velocidad angular (XYZ)rad/s5:7
Posición (NED o ENU)metro8:10
Velocidad (NED o ENU)EM11:13
Aceleración (NED o ENU)m/s214:16
Polarización del acelerómetro (XYZ)m/s217:19
Polarización del giroscopio (XYZ)rad/s20:22
Vector de campo geomagnético (NED o ENU)µT23:25
Polarización del magnetómetro (XYZ)µT26:28

El estado inicial predeterminado corresponde a un objeto en reposo ubicado en [0 0 0] en coordenadas geodésicas LLA.

Tipos de datos: single | double

Covarianza de error de estado para el filtro de Kalman extendido, especificada como una matriz de números reales de 28 por 28 elementos.

Tipos de datos: single | double

Funciones del objeto

predictActualizar estados según el modelo de movimiento para insfilterAsync
fuseaccelEstados correctos utilizando datos del acelerómetro para insfilterAsync
fusegyroEstados correctos utilizando datos de giroscopio para insfilterAsync
fusemagEstados correctos utilizando datos del magnetómetro para insfilterAsync
fusegpsEstados correctos utilizando datos GPS para insfilterAsync
correctEstados correctos utilizando mediciones de estado directas para insfilterAsync
residualResiduos y covarianzas residuales de mediciones de estado directas para insfilterAsync
residualaccelResiduos y covarianza residual de las mediciones del acelerómetro para insfilterAsync
residualgpsResiduos y covarianza residual de las mediciones GPS para insfilterAsync
residualmagResiduos y covarianza residual de las mediciones del magnetómetro para insfilterAsync
residualgyroResiduos y covarianza residual de las mediciones del giroscopio para insfilterAsync
poseEstimación de la posición, orientación y velocidad actuales para insfilterAsync
resetRestablecer estados internos para insfilterAsync
stateinfoMostrar información del vector de estado para insfilterAsync
copyCrear copia de insfilterAsync
tuneAjuste los parámetros insfilterAsync para reducir el error de estimación
tunernoiseEstructura de ruido del filtro de fusión.

Ejemplos

contraer todo

Cargue los datos del sensor registrados y la pose ground-truth.

load('uavshort.mat','refloc','initstate','imuFs', ...
    'accel','gyro','mag','lla','gpsvel', ...
    'trueOrient','truePos')

Cree un filtro INS para fusionar datos MARG y GPS asincrónicos para estimar la pose.

filt = insfilterAsync;
filt.ReferenceLocation = refloc;
filt.State = [initstate(1:4);0;0;0;initstate(5:10);0;0;0;initstate(11:end)];

Definir ruidos de medición del sensor. Los ruidos se determinaron a partir de hojas de datos y experimentación.

Rmag  = 80;
Rvel  = 0.0464;
Racc  = 800;
Rgyro = 1e-4;
Rpos  = 34;

Preasigne variables para posición y orientación. Asigne una variable para indexar los datos del GPS.

N = size(accel,1);
p = zeros(N,3);
q = zeros(N,1,'quaternion');

gpsIdx = 1;

Fusiona datos de acelerómetro, giroscopio, magnetómetro y GPS. El bucle externo predice el avance del filtro en un paso de tiempo y fusiona los datos del acelerómetro y el giroscopio a la frecuencia de muestreo de la IMU.

for ii = 1:N
    
    % Predict the filter forward one time step
    predict(filt,1./imuFs);
    
    % Fuse accelerometer and gyroscope readings
    fuseaccel(filt,accel(ii,:),Racc);
    fusegyro(filt,gyro(ii,:),Rgyro);
    
    % Fuse magnetometer at 1/2 the IMU rate
    if ~mod(ii, fix(imuFs/2))
        fusemag(filt,mag(ii,:),Rmag);
    end
    
    % Fuse GPS once per second
    if ~mod(ii,imuFs)
        fusegps(filt,lla(gpsIdx,:),Rpos,gpsvel(gpsIdx,:),Rvel);
        gpsIdx = gpsIdx + 1;
    end
    
    % Log the current pose estimate
    [p(ii,:),q(ii)] = pose(filt);
    
end

Calcule los errores RMS entre la posición y orientación verdaderas conocidas y la salida del filtro IMU asíncrono.

posErr = truePos - p;
qErr = rad2deg(dist(trueOrient,q));

pRMS = sqrt(mean(posErr.^2));
qRMS = sqrt(mean(qErr.^2));

fprintf('Position RMS Error\n');
Position RMS Error
fprintf('\tX: %.2f, Y: %.2f, Z: %.2f (meters)\n\n',pRMS(1),pRMS(2),pRMS(3));
	X: 0.55, Y: 0.71, Z: 0.74 (meters)
fprintf('Quaternion Distance RMS Error\n');
Quaternion Distance RMS Error
fprintf('\t%.2f (degrees)\n\n', qRMS);
	4.72 (degrees)

Visualice la posición real y la posición estimada.

plot3(truePos(:,1),truePos(:,2),truePos(:,3),'LineWidth',2)
hold on
plot3(p(:,1),p(:,2),p(:,3),'r:','LineWidth',2)
grid on
xlabel('N (m)')
ylabel('E (m)')
zlabel('D (m)')

Figure contains an axes object. The axes object with xlabel N (m), ylabel E (m) contains 2 objects of type line.

Algoritmos

expandir todo

Capacidades ampliadas

expandir todo

Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.

Historial de versiones

Introducido en R2019a