Fusionar datos de sensores inerciales mediante un marco de fusión flexible basado en insEKF
El objeto de filtro insEKF
proporciona un marco flexible que puede utilizar para fusionar datos de sensores inerciales. Puede fusionar datos de medición de varios sensores inerciales seleccionando o personalizando los modelos de sensor utilizados en el filtro, y estimar diferentes estados de la plataforma seleccionando o personalizando el modelo de movimiento utilizado en el filtro. El objeto insEKF
se basa en un filtro de Kalman extendido continuo-discreto, en el que el paso de predicción del estado es continuo y el paso de corrección o fusión de la medición es discreto.
En total, el objeto contiene 7 propiedades y 13 funciones de objeto. El objeto también interactúa con otros objetos y funciones para respaldar el flujo de trabajo de filtro regular, así como el ajuste de filtro.
Propiedades del objeto
El objeto insEKF
mantiene las principales variables de filtro e información del modelo de movimiento y los modelos de sensor utilizando estas propiedades:
State
— Estado de la plataforma guardado en el filtro, especificado como un vector. Esta propiedad mantiene todo el vector de estado, incluidos los estados de la plataforma definidos por el modelo de movimiento, como la orientación, la posición y la velocidad, así como los estados del sensor definidos por los modelos de sensor, como los sesgos del sensor.Puedes interactuar con esta propiedad de varias maneras:
Muestra la información de estado guardada en el vector utilizando la función de objeto
stateinfo
.Especifique directamente esta propiedad. Puede que esto no sea conveniente ya que la dimensión del vector de estado puede ser grande.
Obtenga o establezca una parte o componente del vector de estado utilizando la función de objeto
stateparts
.
StateCovariance
— Covarianza del error de estimación del estado, especificada como una matriz. Esta propiedad mantiene toda la matriz de covarianza correspondiente al vector de estado. Puedes interactuar con esta propiedad de varias maneras:Especifique directamente esta propiedad. Esto puede no ser conveniente ya que la dimensión de la matriz de covarianza puede ser grande.
Obtenga o establezca una parte de la matriz de covarianza utilizando la función de objeto
statecovparts
.
AdditiveProcessNoise
— Covarianza del ruido del proceso aditivo, especificada como una matriz. Esta propiedad mantiene toda la matriz de covarianza de ruido del proceso aditivo correspondiente al vector de estado.MotionModel
— Modelo de movimiento para predecir el estado del filtro, especificado como un objeto. Puede utilizar una de estas opciones para especificar esta propiedad al construir el filtro:insMotionOrientation
— Modelo de movimiento de plataforma de solo orientación asumiendo una velocidad angular constante. Al usar este objeto se agrega el estado de velocidad angular y cuaternión a la propiedadState
.insMotionPose
— Modela el movimiento 3D asumiendo velocidad angular constante y aceleración lineal constante. Al usar este modelo se agregan el cuaternión, la velocidad angular, la posición, la velocidad lineal y el estado de aceleración a la propiedadState
.positioning.INSMotionModel
— Una clase de interfaz para implementar un objeto de modelo de movimiento utilizado con el filtro. Para personalizar un objeto de modelo de movimiento, debe heredar de esta clase de interfaz e implementar al menos dos métodos:modelstates
ystateTransition
.
Sensors
— Modelos de sensores que modelan la medición del sensor correspondiente en función del estado de la plataforma, especificado como un arreglo de celdas de objetos de sensor INS. Puede especificar cada objeto del sensor INS usando una de estas opciones:insAccelerometer
— Lecturas del acelerómetro del modelo, incluida la aceleración gravitacional y el sesgo del sensor de forma predeterminada. El modelo también incluye la aceleración del sensor si la propiedadState
del filtro incluye el estadoAcceleration
.insMagnetometer
— Lecturas del magnetómetro modelo, incluido el vector geomagnético y el sesgo del sensor.insGyroscope
— Lecturas del giroscopio del modelo, incluido el vector de velocidad angular y el sesgo del sensor.insGPS
— Lecturas del modelo GPS, incluidas las coordenadas de latitud, longitud y altitud. Si fusiona datos de velocidad del sensor GPS, el objeto también modela mediciones de velocidad.positioning.INSSensorModel
— Una clase de interfaz para implementar un objeto de modelo de sensor utilizado con el filtro. Para personalizar un objeto de modelo de sensor, debe heredar de esta clase de interfaz e implementar al menos el métodomeasurement
.
SensorNames
— Nombres de los sensores agregados al filtro, especificados como un arreglo de celdas de un vector de caracteres. El objeto de filtro asigna nombres predeterminados a los sensores agregados. Estos nombres de sensores son útiles cuando se utilizan varias funciones de objeto del filtro.Para personalizar los nombres de los sensores, debe utilizar el objeto
insOptions
.
ReferenceFrame
— Marco de referencia del objeto de filtro Kalman extendido, especificado como"NED"
para el marco noreste-abajo de manera predeterminada. Para personalizarlo como"ENU"
para el marco este-norte-arriba, debe utilizar el objetoinsOptions
.Nota
También puede especificar el tipo de datos utilizado en el filtro como
double
(predeterminado) osingle
especificando la propiedadDataType
del objetoinsOptions
.
Funciones de objeto
El objeto insEKF
proporciona varias funciones de objeto para implementar flujos de trabajo de filtros comunes, acceder a estados y covarianzas de filtros y ajustar filtros.
Estas funciones de objeto admiten flujos de trabajo de filtrado comunes:
predict
— Predice el estado del filtro hacia adelante en el tiempo basándose en el modelo de movimiento utilizado en el filtro.fuse
— Fusiona o corrige el estado del filtro usando una medición basada en un modelo de sensor previamente agregado al filtro. Puede utilizar esta función de objeto varias veces si necesita fusionar varias mediciones.correct
— Corrija el filtro utilizando la medición directa del estado del filtro. Una medición directa contiene un subconjunto de elementos del vector de estado del filtro. Puede utilizar esta función de objeto varias veces para múltiples mediciones directas.residual
— Devuelve el residuo y la covarianza residual de una medición en función del estado actual del filtro.estimateStates
— Obtenga las estimaciones de estado basándose en un cronograma de datos de sensores. La función de objeto procesa las mediciones una por una y devuelve las estimaciones de estado correspondientes.
Estas funciones de objeto le permiten acceder a varios estados y variables mantenidas por el filtro:
stateinfo
— Devuelve o muestra los componentes de estado guardados en la propiedadState
del filtro. Con esta función, puede observar en qué componentes consta el estado y los índices de todos los componentes del estado.stateparts
— Obtener o establecer partes del vector de estado. Dado que el vector de estado contiene muchos componentes, esta función de objeto le permite obtener o configurar solo un componente de todo el vector de estado.statecovparts
— Obtener o establecer partes de la matriz de covarianza de error de estimación de estado. Similar a la funciónstateparts
, esta función de objeto le permite obtener o establecer solo una parte de la matriz de covarianza de error de estimación de estado.
Para obtener estimaciones de estado más precisas, a menudo es necesario ajustar los parámetros del filtro para reducir los errores de estimación. El objeto insEKF
proporciona estas funciones de objeto para facilitar el ajuste del filtro:
tune
— Ajusta la propiedadAdditiveProcessNoise
del objeto de filtro y el ruido de medición de los sensores para reducir el error de estimación de estado entre las estimaciones del filtro y la ground-truth.Puede utilizar la función
tunernoise
para obtener un ejemplo de la estructura de ruido de medida, requerida por la funcióntune
.Opcionalmente, puede utilizar el objeto
tunerconfig
para especificar parámetros de ajuste, como la tolerancia de la función y la función de costo, así como qué elementos de la matriz de ruido del proceso se ajustarán.
createTunerCostTemplate
— Crea una plantilla para una función de costo de sintonizador que puedes modificar para personalizar tu propia función de costo.tunerCostFcnParam
— Crea una estructura requerida para ajustar un filtroinsEKF
con una función de costo personalizada. La estructura es útil al generar código C para una función de costo usando MATLAB® Coder™.
Puede utilizar las funciones de objeto copy
y reset
para crear cómodamente un nuevo objeto insEKF
basado en un objeto insEKF
existente.
Ejemplo: Datos del sensor inercial de fusibles utilizando insEKF
Este ejemplo presenta los flujos de trabajo básicos para fusionar datos de sensores inerciales utilizando el objeto insEKF
, que admite un marco de fusión flexible basado en un filtro Kalman discreto continuo.
Crear objeto insEKF
Crea un objeto insEKF
directamente.
filter1 = insEKF
filter1 = insEKF with properties: State: [13×1 double] StateCovariance: [13×13 double] AdditiveProcessNoise: [13×13 double] MotionModel: [1×1 insMotionOrientation] Sensors: {[1×1 insAccelerometer] [1×1 insGyroscope]} SensorNames: {'Accelerometer' 'Gyroscope'} ReferenceFrame: 'NED'
Desde la propiedad Sensors
, tenga en cuenta que el objeto contiene dos modelos de sensores, insAccelerometer
y insGyroscope
de forma predeterminada. Estos le permiten fusionar datos del acelerómetro y giroscopio, respectivamente. Desde la propiedad MotionModel
, tenga en cuenta que el objeto tiene como valor predeterminado un modelo insMotionOrientation
, que modela solo el movimiento de rotación y no el movimiento de traslación. Debido al modelo de movimiento y a los modelos de sensor especificados, el estado del filtro es un vector de 13 por 1. Obtenga los componentes y los índices correspondientes del vector de estado utilizando la función de objeto stateinfo
.
stateinfo(filter1)
ans = struct with fields:
Orientation: [1 2 3 4]
AngularVelocity: [5 6 7]
Accelerometer_Bias: [8 9 10]
Gyroscope_Bias: [11 12 13]
Tenga en cuenta que, además de los estados de orientación y velocidad angular, el filtro también incluye la polarización del acelerómetro y la polarización del giroscopio.
Puede especificar explícitamente el modelo de movimiento y los modelos de sensor al construir el filtro. Por ejemplo, cree un objeto insEKF
y especifique el modelo de movimiento como un objeto insMotionPose
, que modela tanto el movimiento de rotación como el movimiento de traslación, y especifique los sensores como un objeto insAccelerometer
, un insGPS
y otro insGPS
. Esto permite la fusión de un conjunto de datos del acelerómetro y dos conjuntos de datos del GPS.
filter2 = insEKF(insAccelerometer,insGPS,insGPS,insMotionPose)
filter2 = insEKF with properties: State: [19×1 double] StateCovariance: [19×19 double] AdditiveProcessNoise: [19×19 double] MotionModel: [1×1 insMotionPose] Sensors: {[1×1 insAccelerometer] [1×1 insGPS] [1×1 insGPS]} SensorNames: {'Accelerometer' 'GPS' 'GPS_1'} ReferenceFrame: 'NED'
La propiedad State
es un vector de 19 por 1 que contiene estos componentes:
stateinfo(filter2)
ans = struct with fields:
Orientation: [1 2 3 4]
AngularVelocity: [5 6 7]
Position: [8 9 10]
Velocity: [11 12 13]
Acceleration: [14 15 16]
Accelerometer_Bias: [17 18 19]
La propiedad SensorNames
le permite indicar sensores específicos al utilizar varias funciones de objeto del filtro. El filtro genera los nombres de los sensores agregados en un formato predeterminado. Para proporcionar nombres personalizados para los sensores, debe utilizar el objeto insOptions
. El objeto insOptions
también puede especificar el tipo de datos de las variables utilizadas en el filtro y el ReferenceFrame
del filtro.
options = insOptions(SensorNamesSource="Property", ... SensorNames={'Sensor1','Sensor2','Sensor3'}, ... Datatype="single", ... ReferenceFrame="ENU"); filter3 = insEKF(insAccelerometer,insGPS,insGPS,insMotionPose,options)
filter3 = insEKF with properties: State: [19×1 single] StateCovariance: [19×19 single] AdditiveProcessNoise: [19×19 single] MotionModel: [1×1 insMotionPose] Sensors: {[1×1 insAccelerometer] [1×1 insGPS] [1×1 insGPS]} SensorNames: {'Sensor1' 'Sensor2' 'Sensor3'} ReferenceFrame: 'ENU'
También puede obtener directamente los índices de un componente de estado en función de los nombres de los sensores. Por ejemplo:
stateinfo(filter3,'Sensor1_Bias')
ans = 1×3
17 18 19
Configurar propiedades de filtro
Crea un nuevo objeto insEKF
con un acelerómetro y un giroscopio. Defina explícitamente estos dos sensores para su uso posterior.
accSensor = insAccelerometer; gyroSensor = insGyroscope; filter = insEKF(accSensor,gyroSensor)
filter = insEKF with properties: State: [13×1 double] StateCovariance: [13×13 double] AdditiveProcessNoise: [13×13 double] MotionModel: [1×1 insMotionOrientation] Sensors: {[1×1 insAccelerometer] [1×1 insGyroscope]} SensorNames: {'Accelerometer' 'Gyroscope'} ReferenceFrame: 'NED'
Cargue datos pregrabados para un acelerómetro y un giroscopio. La frecuencia de muestreo de los datos grabados es de 100 Hz. Contiene los datos del sensor, ground-truth y la orientación inicial representada por un cuaternión.
ld = load("accelGyroINSEKFData.mat")
ld = struct with fields:
sampleRate: 100
sensorData: [300×2 timetable]
groundTruth: [300×1 timetable]
initOrient: [1×1 quaternion]
Antes de fusionar los datos del sensor, debe configurar la orientación inicial para el estado del filtro. Primero, observe la información del estado.
stateinfo(filter)
ans = struct with fields:
Orientation: [1 2 3 4]
AngularVelocity: [5 6 7]
Accelerometer_Bias: [8 9 10]
Gyroscope_Bias: [11 12 13]
Consultar el índice de un componente de estado directamente utilizando el sensor correspondiente.
stateinfo(filter,accSensor,"Bias")
ans = 1×3
8 9 10
Establezca solo el componente Orientation
del vector de estado utilizando la función de objeto stateparts
.
quatElements = compact(ld.initOrient); % Convert the quaternion object to a vector of four elements stateparts(filter,"Orientation",quatElements); % Specify the Orientation state component stateparts(filter,"Orientation") % Show the specified Orientation state component
ans = 1×4
1.0000 -0.0003 0.0001 0.0002
Especifique la matriz de covarianza correspondiente a la orientación como una matriz diagonal.
statecovparts(filter,"Orientation",1e-2);
Combinar datos del sensor
Puede fusionar datos de sensores llamando recursivamente a las funciones de objeto predict
y fuse
.
Preasigne variables para guardar los resultados estimados.
N = size(ld.sensorData,1); estOrient = quaternion.zeros(N,1); dt = seconds(diff(ld.sensorData.Properties.RowTimes));
Prediga el estado del filtro, fusione los datos del sensor y obtenga las estimaciones.
for ii = 1:N if ii ~= 1 % Predict forward in time. predict(filter,dt(ii-1)); end % Fuse accelerometer data. fuse(filter,accSensor,ld.sensorData.Accelerometer(ii,:),1); % Fuse gyroscope data. fuse(filter,gyroSensor,ld.sensorData.Gyroscope(ii,:),1); % Extract the orientation state estimate using the stateparts object function. estOrient(ii) = quaternion(stateparts(filter,"Orientation")); end
Visualice el error de estimación, en distancia de cuaternión, utilizando la función de objeto dist
del objeto quaternion
.
figure times = ld.groundTruth.Properties.RowTimes; distance = rad2deg(dist(estOrient,ld.groundTruth.Orientation)); plot(times,distance) xlabel("Time (sec)") ylabel("Distance (Degrees)") title("Orientation Estimate Error")
Los resultados indican que los errores de estimación son grandes. También puede utilizar la función de objeto estimateStates
para procesar los datos del sensor y obtener los mismos resultados.
Filtro de melodía
Dado que los resultados de la estimación no son ideales, puede intentar ajustar los parámetros del filtro para reducir los errores de estimación.
Cree una estructura de ruido de medición y un objeto tunerconfig
utilizado para configurar los parámetros de ajuste.
mnoise = tunernoise(filter); cfg = tunerconfig(filter,MaxIterations=10,ObjectiveLimit=1e-4);
Reinicialice el filtro. Utilice la función de objeto tune
para ajustar el filtro y obtener el ruido ajustado.
stateparts(filter,"Orientation",quatElements); statecovparts(filter,"Orientation",1e-2); tunedmn = tune(filter,mnoise,ld.sensorData,ld.groundTruth,cfg);
Iteration Parameter Metric _________ _________ ______ 1 AdditiveProcessNoise(1) 0.3787 1 AdditiveProcessNoise(15) 0.3761 1 AdditiveProcessNoise(29) 0.3695 1 AdditiveProcessNoise(43) 0.3655 1 AdditiveProcessNoise(57) 0.3533 1 AdditiveProcessNoise(71) 0.3446 1 AdditiveProcessNoise(85) 0.3431 1 AdditiveProcessNoise(99) 0.3428 1 AdditiveProcessNoise(113) 0.3427 1 AdditiveProcessNoise(127) 0.3426 1 AdditiveProcessNoise(141) 0.3298 1 AdditiveProcessNoise(155) 0.3206 1 AdditiveProcessNoise(169) 0.3200 1 AccelerometerNoise 0.3199 1 GyroscopeNoise 0.3198 2 AdditiveProcessNoise(1) 0.3126 2 AdditiveProcessNoise(15) 0.3098 2 AdditiveProcessNoise(29) 0.3018 2 AdditiveProcessNoise(43) 0.2988 2 AdditiveProcessNoise(57) 0.2851 2 AdditiveProcessNoise(71) 0.2784 2 AdditiveProcessNoise(85) 0.2760 2 AdditiveProcessNoise(99) 0.2744 2 AdditiveProcessNoise(113) 0.2744 2 AdditiveProcessNoise(127) 0.2743 2 AdditiveProcessNoise(141) 0.2602 2 AdditiveProcessNoise(155) 0.2537 2 AdditiveProcessNoise(169) 0.2527 2 AccelerometerNoise 0.2524 2 GyroscopeNoise 0.2524 3 AdditiveProcessNoise(1) 0.2476 3 AdditiveProcessNoise(15) 0.2432 3 AdditiveProcessNoise(29) 0.2397 3 AdditiveProcessNoise(43) 0.2381 3 AdditiveProcessNoise(57) 0.2255 3 AdditiveProcessNoise(71) 0.2226 3 AdditiveProcessNoise(85) 0.2221 3 AdditiveProcessNoise(99) 0.2202 3 AdditiveProcessNoise(113) 0.2201 3 AdditiveProcessNoise(127) 0.2201 3 AdditiveProcessNoise(141) 0.2090 3 AdditiveProcessNoise(155) 0.2070 3 AdditiveProcessNoise(169) 0.2058 3 AccelerometerNoise 0.2052 3 GyroscopeNoise 0.2052 4 AdditiveProcessNoise(1) 0.2051 4 AdditiveProcessNoise(15) 0.2027 4 AdditiveProcessNoise(29) 0.2019 4 AdditiveProcessNoise(43) 0.2000 4 AdditiveProcessNoise(57) 0.1909 4 AdditiveProcessNoise(71) 0.1897 4 AdditiveProcessNoise(85) 0.1882 4 AdditiveProcessNoise(99) 0.1871 4 AdditiveProcessNoise(113) 0.1870 4 AdditiveProcessNoise(127) 0.1870 4 AdditiveProcessNoise(141) 0.1791 4 AdditiveProcessNoise(155) 0.1783 4 AdditiveProcessNoise(169) 0.1751 4 AccelerometerNoise 0.1748 4 GyroscopeNoise 0.1747 5 AdditiveProcessNoise(1) 0.1742 5 AdditiveProcessNoise(15) 0.1732 5 AdditiveProcessNoise(29) 0.1712 5 AdditiveProcessNoise(43) 0.1712 5 AdditiveProcessNoise(57) 0.1626 5 AdditiveProcessNoise(71) 0.1615 5 AdditiveProcessNoise(85) 0.1598 5 AdditiveProcessNoise(99) 0.1590 5 AdditiveProcessNoise(113) 0.1589 5 AdditiveProcessNoise(127) 0.1589 5 AdditiveProcessNoise(141) 0.1517 5 AdditiveProcessNoise(155) 0.1508 5 AdditiveProcessNoise(169) 0.1476 5 AccelerometerNoise 0.1473 5 GyroscopeNoise 0.1470 6 AdditiveProcessNoise(1) 0.1470 6 AdditiveProcessNoise(15) 0.1470 6 AdditiveProcessNoise(29) 0.1463 6 AdditiveProcessNoise(43) 0.1462 6 AdditiveProcessNoise(57) 0.1367 6 AdditiveProcessNoise(71) 0.1360 6 AdditiveProcessNoise(85) 0.1360 6 AdditiveProcessNoise(99) 0.1350 6 AdditiveProcessNoise(113) 0.1350 6 AdditiveProcessNoise(127) 0.1350 6 AdditiveProcessNoise(141) 0.1289 6 AdditiveProcessNoise(155) 0.1288 6 AdditiveProcessNoise(169) 0.1262 6 AccelerometerNoise 0.1253 6 GyroscopeNoise 0.1246 7 AdditiveProcessNoise(1) 0.1246 7 AdditiveProcessNoise(15) 0.1244 7 AdditiveProcessNoise(29) 0.1205 7 AdditiveProcessNoise(43) 0.1203 7 AdditiveProcessNoise(57) 0.1125 7 AdditiveProcessNoise(71) 0.1122 7 AdditiveProcessNoise(85) 0.1117 7 AdditiveProcessNoise(99) 0.1106 7 AdditiveProcessNoise(113) 0.1104 7 AdditiveProcessNoise(127) 0.1104 7 AdditiveProcessNoise(141) 0.1058 7 AdditiveProcessNoise(155) 0.1052 7 AdditiveProcessNoise(169) 0.1035 7 AccelerometerNoise 0.1024 7 GyroscopeNoise 0.1014 8 AdditiveProcessNoise(1) 0.1014 8 AdditiveProcessNoise(15) 0.1012 8 AdditiveProcessNoise(29) 0.1012 8 AdditiveProcessNoise(43) 0.1005 8 AdditiveProcessNoise(57) 0.0948 8 AdditiveProcessNoise(71) 0.0948 8 AdditiveProcessNoise(85) 0.0938 8 AdditiveProcessNoise(99) 0.0934 8 AdditiveProcessNoise(113) 0.0931 8 AdditiveProcessNoise(127) 0.0931 8 AdditiveProcessNoise(141) 0.0896 8 AdditiveProcessNoise(155) 0.0889 8 AdditiveProcessNoise(169) 0.0867 8 AccelerometerNoise 0.0859 8 GyroscopeNoise 0.0851 9 AdditiveProcessNoise(1) 0.0851 9 AdditiveProcessNoise(15) 0.0850 9 AdditiveProcessNoise(29) 0.0824 9 AdditiveProcessNoise(43) 0.0819 9 AdditiveProcessNoise(57) 0.0771 9 AdditiveProcessNoise(71) 0.0771 9 AdditiveProcessNoise(85) 0.0762 9 AdditiveProcessNoise(99) 0.0759 9 AdditiveProcessNoise(113) 0.0754 9 AdditiveProcessNoise(127) 0.0754 9 AdditiveProcessNoise(141) 0.0734 9 AdditiveProcessNoise(155) 0.0724 9 AdditiveProcessNoise(169) 0.0702 9 AccelerometerNoise 0.0697 9 GyroscopeNoise 0.0689 10 AdditiveProcessNoise(1) 0.0689 10 AdditiveProcessNoise(15) 0.0686 10 AdditiveProcessNoise(29) 0.0658 10 AdditiveProcessNoise(43) 0.0655 10 AdditiveProcessNoise(57) 0.0622 10 AdditiveProcessNoise(71) 0.0620 10 AdditiveProcessNoise(85) 0.0616 10 AdditiveProcessNoise(99) 0.0615 10 AdditiveProcessNoise(113) 0.0607 10 AdditiveProcessNoise(127) 0.0606 10 AdditiveProcessNoise(141) 0.0590 10 AdditiveProcessNoise(155) 0.0578 10 AdditiveProcessNoise(169) 0.0565 10 AccelerometerNoise 0.0562 10 GyroscopeNoise 0.0557
filter.AdditiveProcessNoise
ans = 13×13
0.5849 0 0 0 0 0 0 0 0 0 0 0 0
0 0.6484 0 0 0 0 0 0 0 0 0 0 0
0 0 0.5634 0 0 0 0 0 0 0 0 0 0
0 0 0 1.4271 0 0 0 0 0 0 0 0 0
0 0 0 0 4.3574 0 0 0 0 0 0 0 0
0 0 0 0 0 2.9527 0 0 0 0 0 0 0
0 0 0 0 0 0 1.3071 0 0 0 0 0 0
0 0 0 0 0 0 0 4.3574 0 0 0 0 0
0 0 0 0 0 0 0 0 2.2415 0 0 0 0
0 0 0 0 0 0 0 0 0 0.6449 0 0 0
⋮
Procese por lotes los datos del sensor utilizando la función de objeto estimateStates
. También puede llamar recursivamente a las funciones de objeto predict
y fuse
para obtener los mismos resultados.
tunedEst = estimateStates(filter,ld.sensorData,tunedmn);
Compare las estimaciones ajustadas y no ajustadas con los datos reales. Los resultados indican que el proceso de ajuste reduce en gran medida los errores de estimación.
distanceTuned = rad2deg(dist(tunedEst.Orientation,ld.groundTruth.Orientation)); hold on plot(times,distanceTuned) legend("Untuned","Tuned")