CogniPilot

MODELICA LIBRARY · ENGINEERING REFERENCE

Tests/UKFHoverCodegen.mo

Download original .moGitHub source

Documentation: Tests.UKFHoverCodegen · Tests.UKFHoverCodegen.run

within Tests;
block UKFHoverCodegen
  "Native codegen regression: symmetric sigma points must preserve hover"
  input Boolean first;
  input Boolean preintegrated;
  output Real position[3](each start=0, each fixed=true);
  output Real velocity[3](each start=0, each fixed=true);
  output Real quaternion[4](start={1.0,0.0,0.0,0.0}, each fixed=true);
  output Real gyroBias[3](each start=0, each fixed=true);
  output Real accelBias[3](each start=0, each fixed=true);
  output Real covariance[15,15](each start=0, each fixed=true);
  output Boolean success(start=false, fixed=true);

 function run
   input Boolean first;
   input Boolean preintegrated;
   input Estimation.StrapdownINS.UKF.State previous;
   output Real position[3];
   output Real velocity[3];
   output Real quaternion[4];
   output Real gyroBias[3];
   output Real accelBias[3];
   output Real covariance[15,15];
   output Boolean success;
 protected
   Estimation.StrapdownINS.UKF.State state;
  Avionics.ImuSample imu;
algorithm
    imu := Avionics.ImuSample(valid=true, fresh=true, timestamp_s=0.0,
      angularVelocityBodyFlu_rad_s=zeros(3), specificForceBodyFlu_m_s2={0.0,0.0,9.81},
      deltaAngleBodyFlu_rad=zeros(3), deltaVelocityBodyFlu_m_s={0.0,0.0,0.0981},
      deltaPositionBodyFlu_m={0.0,0.0,0.0004905}, deltaQuaternionBodyFlu={1.0,0.0,0.0,0.0},
      integrationTime_s=0.01, gyroscopeBiasLinearizationBodyFlu_rad_s=zeros(3),
      accelerometerBiasLinearizationBodyFlu_m_s2=zeros(3),
      deltaRotationGyroscopeBiasJacobian_s=-0.01*identity(3),
      deltaVelocityGyroscopeBiasJacobian_m=zeros(3,3),
      deltaVelocityAccelerometerBiasJacobian_s=-0.01*identity(3),
      deltaPositionGyroscopeBiasJacobian_m_s=zeros(3,3),
      deltaPositionAccelerometerBiasJacobian_s2=-0.00005*identity(3));
    if first then
      state := Estimation.StrapdownINS.UKF.initialize(zeros(3),zeros(3),{1.0,0.0,0.0,0.0},zeros(3),zeros(3),
        Estimation.StrapdownINS.InitialVariances(position_m2=fill(1.0,3),velocity_m2_s2=fill(1.0,3),
          attitude_rad2=fill(0.25,3),gyroscopeBias_rad2_s2=fill(1e-4,3),accelerometerBias_m2_s4=fill(0.01,3)));
      success := true;
    elseif preintegrated then
      (state,success) := Estimation.StrapdownINS.UKF.predictPreintegrated(
        Estimation.StrapdownINS.UKF.State(positionWorldEnu_m=previous.positionWorldEnu_m,velocityWorldEnu_m_s=previous.velocityWorldEnu_m_s,
          quaternionWorldBody=previous.quaternionWorldBody,gyroscopeBiasBodyFlu_rad_s=previous.gyroscopeBiasBodyFlu_rad_s,
          accelerometerBiasBodyFlu_m_s2=previous.accelerometerBiasBodyFlu_m_s2,covariance=previous.covariance),
        imu,{0.0,0.0,-9.81},Estimation.StrapdownINS.ProcessNoise(gyroscope_rad2_s=identity(3)*1e-4,
          accelerometer_m2_s3=identity(3)*0.03,gyroscopeBias_rad2_s3=identity(3)*1e-10,
          accelerometerBias_m2_s5=identity(3)*1e-6));
    else
      (state,success) := Estimation.StrapdownINS.UKF.predict(
        previous, zeros(3), {0.0,0.0,9.81}, {0.0,0.0,-9.81}, 0.01,
        Estimation.StrapdownINS.ProcessNoise(gyroscope_rad2_s=identity(3)*1e-4,
          accelerometer_m2_s3=identity(3)*0.03,gyroscopeBias_rad2_s3=identity(3)*1e-10,
          accelerometerBias_m2_s5=identity(3)*1e-6));
    end if;
    position := state.positionWorldEnu_m;
    velocity := state.velocityWorldEnu_m_s;
    quaternion := state.quaternionWorldBody;
    gyroBias := state.gyroscopeBiasBodyFlu_rad_s;
    accelBias := state.accelerometerBiasBodyFlu_m_s2;
    covariance := state.covariance;
 end run;
 algorithm
 when sample(0,0.01) then
 (position,velocity,quaternion,gyroBias,accelBias,covariance,success) := run(first, preintegrated,
   Estimation.StrapdownINS.UKF.State(positionWorldEnu_m=pre(position),velocityWorldEnu_m_s=pre(velocity),
     quaternionWorldBody=pre(quaternion),gyroscopeBiasBodyFlu_rad_s=pre(gyroBias),
     accelerometerBiasBodyFlu_m_s2=pre(accelBias),covariance=pre(covariance)));
 end when;
end UKFHoverCodegen;