CogniPilot

MODELICA LIBRARY · ENGINEERING REFERENCE

Vehicles/Rdd2/Controller.mo

Download original .moGitHub source

Documentation: Vehicles.Rdd2.Controller

within Vehicles.Rdd2;

// SPDX-License-Identifier: Apache-2.0

block Controller
  "Composed RDD2 controller used by simulation and qualification"
  import Interfaces = Vehicles.Rdd2.ControllerInterfaces;

  parameter Real samplePeriod(unit = "s") = 0.000625;
  parameter Real guidancePeriod(unit = "s") = 0.005;

  input Integer mode(min = 0, max = 3);
  input Boolean armed;
  Interfaces.PilotInput pilot;
  Avionics.NavigationEstimateInput navigation;
  Interfaces.TrajectoryReferenceInput reference;

  Interfaces.PilotCommands pilotCommands;
  Interfaces.MotorCommands motorCommands;
  output Real thrust_N;
  output Real angularVelocitySetpointFlu_rad_s[3];
  output Real angularVelocityCommandFlu_rad_s[3];
  Interfaces.TelemetrySource telemetry;

protected
  GuidanceController guidanceTask(samplePeriod = guidancePeriod);
  RateControlAllocator rateTask(samplePeriod = samplePeriod);

equation
  guidanceTask.mode = mode;
  guidanceTask.armed = armed;
  guidanceTask.pilot.stick = pilot.stick;
  guidanceTask.pilot.throttle = pilot.throttle;
  guidanceTask.navigation.positionWorldEnu_m = navigation.positionWorldEnu_m;
  guidanceTask.navigation.velocityWorldEnu_m_s = navigation.velocityWorldEnu_m_s;
  guidanceTask.navigation.quaternionWorldBody = navigation.quaternionWorldBody;
  guidanceTask.reference.positionWorld_m = reference.positionWorld_m;
  guidanceTask.reference.velocityWorld_m_s = reference.velocityWorld_m_s;
  guidanceTask.reference.accelerationWorld_m_s2 =
    reference.accelerationWorld_m_s2;
  guidanceTask.reference.yaw_rad = reference.yaw_rad;
  pilotCommands.throttleInput =
    guidanceTask.pilotCommands.throttleInput;
  pilotCommands.acroRateDesired_rad_s =
    guidanceTask.pilotCommands.acroRateDesired_rad_s;
  pilotCommands.attitudeTiltDesired_rad =
    guidanceTask.pilotCommands.attitudeTiltDesired_rad;

  rateTask.inputSignal.armed = armed;
  rateTask.inputSignal.thrust_N = guidanceTask.rateCommand.thrust_N;
  rateTask.inputSignal.angularVelocityCommandFlu_rad_s =
    guidanceTask.rateCommand.angularVelocityCommandFlu_rad_s;
  rateTask.inputSignal.angularVelocityMeasuredFlu_rad_s =
    navigation.angularVelocityBodyFlu_rad_s;
  motorCommands.motor = rateTask.commands.motor;

  thrust_N = guidanceTask.rateCommand.thrust_N;
  angularVelocitySetpointFlu_rad_s =
    guidanceTask.angularVelocitySetpointFlu_rad_s;
  angularVelocityCommandFlu_rad_s =
    guidanceTask.rateCommand.angularVelocityCommandFlu_rad_s;
  telemetry.thrust_N = thrust_N;
  telemetry.angularVelocitySetpointFlu_rad_s =
    angularVelocitySetpointFlu_rad_s;
  telemetry.motor = motorCommands.motor;

  annotation(Documentation(info = "<html>
    <p>The simulation controller is intentionally only a composition: a
    guidance eFMU produces one rate-command message and a rate/allocation eFMU
    consumes it. Firmware deploys the same two blocks as separate RTOS tasks.</p>
  </html>"));
end Controller;