Personnalisez un modèle de capteur utilisé avec l'objet insEKF
. Le capteur mesure l'état de vitesse, y compris un biais affecté par un bruit aléatoire.
Personnalisez le modèle de capteur en héritant de la classe d'interface positioning.INSSensorModel
et en implémentant ses méthodes. Notez que seule la méthode measurement
est requise pour l'implémentation dans la classe d'interface positioning.INSSensorModel
. Ces sections donnent un aperçu de la façon dont la classe BiasSensor
implémente les méthodes positioning.INSSensorModel
, mais pour plus de détails sur leur implémentation, voir les détails de l'implémentation dans le ci-joint. Fichier $BiasSensor.m
.
Implémenter la méthode sensorStates
Pour modéliser le biais, la méthode sensorStates
doit renvoyer un état, Bias
, en tant que structure. Lorsque vous ajoutez un objet BiasSensor
à un objet filtre insEKF
, le filtre ajoute le composant de biais au vecteur d'état du filtre.
Implémenter la méthode measurement
La mesure est la composante de vitesse de l'état du filtre, y compris le biais. Par conséquent, renvoyez la somme de la composante de vitesse du filtre et du biais.
Implémenter la méthode measurementJacobian
La méthode measurementJacobian
renvoie la dérivée partielle de la méthode measurement
par rapport au vecteur d'état du filtre en tant que structure. Toutes les dérivées partielles sont 0
, à l'exception des dérivées partielles de la mesure par rapport aux composantes de vitesse et d'état de biais.
Implémenter la méthode stateTransition
La méthode stateTransiton
renvoie la dérivée de l'état du capteur défini dans la méthode sensorStates
. Supposons que la dérivée du biais soit affectée par un bruit blanc avec un écart type de 0.01
. Renvoie la dérivée sous forme de structure. Notez que cela montre uniquement comment configurer la méthode et ne correspond à aucune application pratique.
Implémenter la méthode stateTransitionJacobian
Puisque la fonction stateTransiton
ne dépend pas de l'état du filtre, la matrice jacobienne est 0.
Créer et ajouter un objet hérité
Créez un objet BiasSensor
.
biSensor =
BiasSensor with no properties.
Créez un objet insEKF
avec l'objet biSensor
.
filter =
insEKF with properties:
State: [17x1 double]
StateCovariance: [17x17 double]
AdditiveProcessNoise: [17x17 double]
MotionModel: [1x1 insMotionPose]
Sensors: {[1x1 BiasSensor]}
SensorNames: {'BiasSensor'}
ReferenceFrame: 'NED'
L'état du filtre contient le composant de polarisation.
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]
BiasSensor_Bias: 17
Afficher la classe BiasSensor
personnalisée
classdef BiasSensor < positioning.INSSensorModel
%BIASSENSOR Sensor measuring velocity with bias
% Copyright 2021 The MathWorks, Inc.
methods
function s = sensorstates(~,~)
% Assume the sensor has a bias. Define a Bias state to enable
% the filter to estimate the bias.
s = struct('Bias',0);
end
function z = measurement(sensor,filter)
% Measurement is the summation of the velocity measurement and
% the bias.
velocity = stateparts(filter,'Velocity');
bias = stateparts(filter,sensor,'Bias');
z = velocity + bias;
end
function dzdx = measurementJacobian(sensor,filter)
% Compute the Jacobian, which is the partial derivative of the
% measurement (velocity plus bias) with respect to the filter
% state vector.
% Obtain the dimension of the filter state.
N = numel(filter.State);
% The partial derviative of the Bias with respect to all the
% states is zero, except the Bias state itself.
dzdx = zeros(1,N);
% Obtain the index for the Bias state component in the filter.
bidx = stateinfo(filter,sensor,'Bias');
dzdx(:,bidx) = 1;
% The partial derivative of the Velocity with respect to all the
% states is zero, except the Velocity state itself.
vidx = stateinfo(filter,'Velocity');
dzdx(:,vidx) = 1;
end
function dBias = stateTransition(~,~,dt,~)
% Assume the derivative of the bias is affected by a zero-mean
% white noise with a standard deviation of 0.01.
noise = 0.01*randn*dt;
dBias = struct('Bias',noise);
end
function dBiasdx = stateTransitonJacobian(~,filter,~,~)
% Since the stateTransiton function does not depend on the
% state of the filter, the Jacobian is all zero.
N = numel(filter.State);
dBiasdx = zeros(1,N);
end
end
end