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.

insfilterErrorState

Estimar la pose a partir de datos de IMU, GPS y odometría visual monocular (MVO)

Descripción

El objeto insfilterErrorState implementa la fusión de sensores de IMU, GPS y datos de odometría visual monocular (MVO) para estimar la pose en el marco de referencia NED (o ENU). El filtro utiliza un vector de estado de 17 elementos para rastrear la orientación quaternion, la velocidad, la posición, los sesgos del sensor IMU y el factor de escala MVO. El objeto insfilterErrorState utiliza un filtro Kalman de estado de error para estimar estas cantidades.

Creación

Descripción

filter = insfilterErrorState crea un objeto insfilterErrorState con valores de propiedad predeterminados.

ejemplo

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

filter = insfilterErrorState(___,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

Frecuencia de muestreo de la unidad de medida inercial (IMU) en Hz, especificada como escalar positivo.

Tipos de datos: single | double

Ubicación de referencia, especificada como un vector fila de 3 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

Varianza del ruido del proceso multiplicativo del giroscopio en (rad/s)2, especificada como un vector fila escalar o de 3 elementos de números finitos reales positivos.

  • Si GyroscopeNoise se especifica como un vector fila, los elementos corresponden al ruido en los ejes x, y y z del giroscopio, respectivamente.

  • Si GyroscopeNoise se especifica como 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 3 elementos de números finitos reales positivos.

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

  • Si GyroscopeBiasNoise se especifica como un escalar, el elemento único se aplica a cada eje

Tipos de datos: single | double

Varianza del ruido del proceso multiplicativo del acelerómetro en (m/s2)2, especificada como un vector fila escalar o de 3 elementos de números finitos reales positivos.

  • Si AccelerometerNoise se especifica como un vector fila, los elementos corresponden al ruido en los ejes x, y y z del acelerómetro, respectivamente.

  • Si AccelerometerNoise se especifica como 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 3 elementos de números reales positivos.

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

  • Si AccelerometerBiasNoise se especifica como escalar, el elemento individual se aplica a cada eje.

Vector de estado del filtro de Kalman extendido, especificado como un vector columna de 17 elementos. Los valores estatales representan:

EstadoUnidadesÍndice
Orientación (partes del cuaternión)N / A1:4
Posición (NED o ENU)metro5:7
Velocidad (NED o ENU)EM8:10
Polarización del giroscopio (XYZ)rad/s11:13
Polarización del acelerómetro (XYZ)m/s214:16
Escala de odometría visual (XYZ)N / A17

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, especificada como una matriz de números reales de 16 por 16 elementos. Los valores de covarianza del error de estado representan:

Covarianza estatalÍndice de fila/columna
Vector de rotación δ (XYZ)1:3
Posición δ (NED o ENU)4:6
δ Velocidad (NED o ENU)7:9
δ Sesgo del giroscopio (XYZ)10:12
δ Polarización del acelerómetro (XYZ)13:15
Escala de odometría visual δ (XYZ)16

Tenga en cuenta que, dado que se trata de un filtro de Kalman de estado de error, realiza un seguimiento de los errores en los estados. δ representa el error en el estado correspondiente.

Tipos de datos: single | double

Funciones del objeto

predictActualizar estados utilizando datos del acelerómetro y giroscopio para insfilterErrorState
correctEstados correctos utilizando mediciones de estado directas para insfilterErrorState
residualResiduos y covarianzas residuales de mediciones de estado directas para insfilterErrorState
fusegpsEstados correctos utilizando datos GPS para insfilterErrorState
residualgpsResiduos y covarianza residual de las mediciones GPS para insfilterErrorState
fusemvoEstados correctos utilizando odometría visual monocular para insfilterErrorState
residualmvoResiduos y covarianza residual de las mediciones de odometría visual monocular para insfilterErrorState
poseEstimación de la orientación y posición actual para insfilterErrorState
resetRestablecer estados internos para insfilterErrorState
stateinfoMostrar información del vector de estado para insfilterErrorState
tuneAjuste los parámetros insfilterErrorState para reducir el error de estimación
copyCrear copia de insfilterErrorState

Ejemplos

contraer todo

Cargue datos registrados de un vehículo terrestre siguiendo una trayectoria circular. El archivo .mat contiene mediciones de sensores IMU y GPS y la orientación y posición de la ground-truth .

load('loggedGroundVehicleCircle.mat', ...
    'imuFs','localOrigin', ...
    'initialStateCovariance', ...
    'accelData','gyroData', ...
    'gpsFs','gpsLLA','Rpos','gpsVel','Rvel', ...
    'trueOrient','truePos');

Cree un filtro INS para fusionar datos IMU y GPS utilizando un filtro Kalman de estado de error.

initialState = [compact(trueOrient(1)),truePos(1,:),-6.8e-3,2.5002,0,zeros(1,6),1].';
filt = insfilterErrorState;
filt.IMUSampleRate = imuFs;
filt.ReferenceLocation = localOrigin;
filt.State = initialState;
filt.StateCovariance = initialStateCovariance;

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

numIMUSamples = size(accelData,1);
estOrient = ones(numIMUSamples,1,'quaternion');
estPos = zeros(numIMUSamples,3);

gpsIdx = 1;

Fusiona datos de acelerómetro, giroscopio y GPS. El bucle externo predice el avance del filtro a la frecuencia de muestreo más rápida (la frecuencia de muestreo de la IMU).

for idx = 1:numIMUSamples

    % Use predict to estimate the filter state based on the accelData and
    % gyroData arrays.
    predict(filt,accelData(idx,:),gyroData(idx,:));
    
    % GPS data is collected at a lower sample rate than IMU data. Fuse GPS
    % data at the lower rate.
    if mod(idx, imuFs / gpsFs) == 0
        % Correct the filter states based on the GPS data.
        fusegps(filt,gpsLLA(gpsIdx,:),Rpos,gpsVel(gpsIdx,:),Rvel);
        gpsIdx = gpsIdx + 1;
    end
    
    % Log the current pose estimate
    [estPos(idx,:), estOrient(idx,:)] = pose(filt);
end

Calcule los errores RMS entre la posición y orientación verdaderas conocidas y la salida del filtro de estado de error.

pErr = truePos - estPos;
qErr = rad2deg(dist(estOrient,trueOrient));

pRMS = sqrt(mean(pErr.^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.40, Y: 0.24, Z: 0.05 (meters)
fprintf('Quaternion Distance RMS Error\n');
Quaternion Distance RMS Error
fprintf('\t%.2f (degrees)\n\n',qRMS);
	0.30 (degrees)

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

plot(truePos(:,1),truePos(:,2),estPos(:,1),estPos(:,2),'r:','LineWidth',2)
grid on
axis square
xlabel('N (m)')
ylabel('E (m)')
legend('Ground Truth','Estimation')

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

Algoritmos

Nota: El siguiente algoritmo sólo se aplica a un marco de referencia NED.

insfilterErrorState utiliza una estructura de filtro Kalman de estado de error de 17 ejes para estimar la pose en el marco de referencia NED. El estado se define como:

x=[q0q1q2q3positionNpositionEpositionDvNvEvDgyrobiasXgyrobiasYgyrobiasZaccelbiasXaccelbiasYaccelbiasZscaleFactor]

donde

  • q0, q1, q2, q3 –– Partes del cuaternión de orientación. El cuaternión de orientación representa una rotación del marco desde la orientación actual de la plataforma hasta el sistema de coordenadas NED local.

  • positionN, positionE, positionD –– Posición de la plataforma en el sistema de coordenadas NED local.

  • gyrobiasX, gyrobiasY, gyrobiasZ –– Sesgo en la lectura del giroscopio.

  • accelbiasX, accelbiasY, accelbiasZ –– Sesgo en la lectura del acelerómetro.

  • scaleFactor –– Factor de escala de la estimación de la pose.

Dada la formulación convencional de la función de transición de estado,

xk|k1=f(x^k1|k1)

la estimación del estado previsto es:

xk|k1=[q0+Δtq1(gyrobiasX/2gyroX/2)+Δtq2(gyrobiasY/2gyroY/2)+Δtq3(gyrobiasZ/2gyroZ/2)q1Δtq0(gyrobiasX/2gyroX/2)+Δtq3(gyrobiasY/2gyroY/2)Δtq2(gyrobiasZ/2gyroZ/2)q2Δtq3(gyrobiasX/2gyroX/2)Δtq0(gyrobiasY/2gyroY/2)+Δtq1(gyrobiasZ/2gyroZ/2)q3+Δtq2(gyrobiasX/2gyroX/2)Δtq1(gyrobiasY/2gyroY/2)Δtq0(gyrobiasZ/2gyroZ/2)positionN+ΔtvNpositionE+ΔtvEpositionD+ΔtvDvNΔt{q0(q0(accelbiasXaccelX)q3(accelbiasYaccelY)+q2(accelbiasZaccelZ))+gN+q2(q1(accelbiasYaccelY)q2(accelbiasXaccelX)+q0(accelbiasZaccelZ))+q1(q1(accelbiasXaccelX)+q2(accelbiasYaccelY)+q3(accelbiasZaccelZ))q3(q3(accelbiasXaccelX)+q0(accelbiasYaccelY)q1(accelbiasZaccelZ))}vEΔt{q0(q3(accelbiasXaccelX)+q0(accelbiasYaccelY)q1(accelbiasZaccelZ))+gEq1(q1(accelbiasYaccelY)q2(accelbiasXaccelX)+q0(accelbiasZaccelZ))+q2(q1(accelbiasXaccelX)+q2(accelbiasYaccelY)+q3(accelbiasZaccelZ))+q3(q0(accelbiasXaccelX)q3(accelbiasYaccelY)+q2(accelbiasZaccelZ))}vDΔt{q0(q1(accelbiasYaccelY)q2(accelbiasXaccelX)+q0(accelbiasZaccelZ))+gD+q1(q3(accelbiasXaccelX)+q0(accelbiasYaccelY)q1(accelbiasZaccelZ))q2(q0(accelbiasXaccelX)q3(accelbiasYaccelY)+q2(accelbiasZaccelZ))q3(q1(accelbiasXaccelX)+q2(accelbiasYaccelY)+q3(accelbiasZaccelZ))}gyrobiasXgyrobiasYgyrobiasZaccelbiasXaccelbiasYaccelbiasZscaleFactor]

dónde

  • Δ t –– Tiempo de muestreo de IMU.

  • gN, gE, gD –– Vector de gravedad constante en el marco NED.

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