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.

Combinar datos del sensor inercial utilizando insEKF-Marco de fusión flexible basado en

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 de estado es continuo y el paso de corrección de medición o fusió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.

insEKF_Components

Propiedades del objeto

El objeto insEKF mantiene las principales variables de filtro e información del modelo de movimiento y los modelos de sensores 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:

    • Muestre la información de estado guardada en el vector usando 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 — Modele el movimiento de la plataforma solo con orientación suponiendo una velocidad angular constante. El uso de este objeto agrega el cuaternión y el estado de velocidad angular a la propiedad State .

    • insMotionPose — Modele el movimiento 3-D suponiendo velocidad angular constante y aceleración lineal constante. El uso de este modelo agrega el cuaternión, la velocidad angular, la posición, la velocidad lineal y el estado de aceleración a la propiedad State .

    • 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 y stateTransition.

  • 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 sensores 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 propiedad State del filtro incluye el estado Acceleration .

    • insMagnetometer — Lecturas del magnetómetro modelo, incluido el vector geomagnético y la polarización del sensor.

    • insGyroscope : modelo de lecturas del giroscopio, incluido el vector de velocidad angular y la polarización del sensor.

    • insGPS : modelo de lecturas de 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étodo measurement .

  • 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 de Kalman extendido, especificado como "NED" para el marco noreste hacia abajo de forma predeterminada. Para personalizarlo como "ENU" para el marco este-norte arriba, debe usar el objeto insOptions .

    Nota

    También puede especificar el tipo de datos utilizado en el filtro como double (predeterminado) o single especificando la propiedad DataType del insOptions objeto.

Funciones de objeto

El objeto insEKF proporciona varias funciones de objeto para implementar flujos de trabajo de filtro comunes, acceder a estados y covarianzas de filtro y ajustar el filtro.

Estas funciones de objeto admiten flujos de trabajo de filtrado comunes:

  • predict : predice el estado del filtro hacia adelante en el tiempo según el modelo de movimiento utilizado en el filtro.

  • fuse : fusiona o corrige el estado del filtro utilizando una medición basada en un modelo de sensor agregado previamente 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 la covarianza residual y residual de una medición según el estado actual del filtro.

  • estimateStates : obtenga las estimaciones estatales basadas 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 propiedad State del filtro. Con esta función, puede observar en qué componentes consta el estado y los índices de todos los componentes del estado.

  • stateparts : obtiene o establece 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 : obtiene o establece partes de la matriz de covarianza del error de estimación del estado. Similar a la función stateparts , esta función de objeto le permite obtener o establecer solo una parte de la matriz de covarianza del error de estimación del 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 : ajuste la propiedad AdditiveProcessNoise del objeto del filtro y el ruido de medición de los sensores para reducir el error de estimación del estado entre las estimaciones del filtro y ground-truth.

    • Puede utilizar la función tunernoise para obtener un ejemplo de la estructura de medición del ruido, requerida por la función tune .

    • Opcionalmente, puede utilizar el objeto tunerconfig para especificar parámetros de ajuste, como la tolerancia de la función y la función de coste, así como qué elementos de la matriz de ruido del proceso ajustar.

  • createTunerCostTemplate : crea una plantilla para una función de coste del ajustador que puede modificar aún más para personalizar su propia función de coste.

  • tunerCostFcnParam : crea una estructura requerida para ajustar un filtro insEKF con una función de coste personalizada. La estructura es útil al generar código C para una función de coste usando MATLAB® Coder™.

Puede utilizar las funciones de objeto copy y reset para crear cómodamente un nuevo objeto insEKF basado en un insEKF existente. $ objeto.

  • copy : crea una copia del objeto insEKF .

  • reset : restablece las propiedades State y StateCovariance del objeto insEKF a sus valores predeterminados.

Ejemplo: Combinar datos del sensor inercial usando 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 de Kalman discreto continuo.

Crear insEKF Objeto

Cree 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'

De la propiedad Sensors , tenga en cuenta que el objeto contiene dos modelos de sensor, insAccelerometer y insGyroscope de forma predeterminada. Estos le permiten fusionar datos del acelerómetro y giroscopio, respectivamente. De la propiedad MotionModel , tenga en cuenta que el objeto tiene por defecto un modelo insMotionOrientation , que modela movimiento de solo rotación y no 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 usando 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 insAccelerometer, un insGPS y otro objeto 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 cuando utiliza 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 usando 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 del sensor 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")