CogniPilot

MODELICA LIBRARY · ENGINEERING REFERENCE

Control/tiltRateSetpoint.mo

Download original .moGitHub source

Documentation: Control.tiltRateSetpoint

within Control;

// SPDX-License-Identifier: Apache-2.0

function tiltRateSetpoint
  "Geometric roll/pitch rate demand from the world-up direction"
  input Real desiredTilt[2] "{roll, pitch} demand [rad]";
  input Real worldUpBody[3] "World up expressed in the body frame";
  input Real gain[2] "Tilt-error gains {roll, pitch} [1/s]";
  input Real rateLimit[2] "Symmetric body-rate limits [rad/s]";
  output Real rateSetpoint[2] "{roll rate, nose-up rate} [rad/s]";

protected
  Real desiredRotation[3, 3];
  Real desiredWorldUpBody[3];
  Real tiltError[3];

algorithm
  assert(rateLimit[1] >= 0.0 and rateLimit[2] >= 0.0,
    "Tilt-rate limits must be nonnegative");
  desiredRotation := LieGroups.SO3.EulerB321.to_DCM(
    {0.0, desiredTilt[2], desiredTilt[1]});
  desiredWorldUpBody := desiredRotation[3, :];
  tiltError := cross(worldUpBody, desiredWorldUpBody);
  rateSetpoint := {
    MathUtilities.clip(-gain[1] * tiltError[1],
      -rateLimit[1], rateLimit[1]),
    MathUtilities.clip(gain[2] * tiltError[2],
      -rateLimit[2], rateLimit[2])};
end tiltRateSetpoint;