CogniPilot

MODELICA LIBRARY · ENGINEERING REFERENCE

Vehicles/Cubs2/Test/Scenarios.mo

Download original .moGitHub source

Documentation: Vehicles.Cubs2.Test.Scenarios · Vehicles.Cubs2.Test.Scenarios.TakeoffOpenLoop · Vehicles.Cubs2.Test.Scenarios.Takeoff · Vehicles.Cubs2.Test.Scenarios.AltitudeHold · Vehicles.Cubs2.Test.Scenarios.HeadingHold · Vehicles.Cubs2.Test.Scenarios.PatternMission · Vehicles.Cubs2.Test.Scenarios.Mission

within Vehicles.Cubs2.Test;

package Scenarios "Executable CUBS2 test missions"
  import Components = Vehicles.Cubs2.OuterLoopComponents;

model TakeoffOpenLoop
  Vehicles.Cubs2.Plant plant;
  Vehicles.Cubs2.OnboardStabilizerSurrogate onboardStabilizer;

  output Real time_s;
  output Real position_m[3];
  output Real euler_rad[3];
  output Real airspeed_m_s;
  output Real stickCommand[4];
  output Real actuatorCommand[4];

equation
  if time < 0.8 then
    stickCommand = {0.0, 0.0, 0.0, 1.0};
  else
    stickCommand = {0.0, 0.55, 0.0, 1.0};
  end if;
  onboardStabilizer.armed = 1.0;
  onboardStabilizer.pilotCommand = stickCommand;
  onboardStabilizer.gyro = plant.gyro;
  onboardStabilizer.up_body = plant.up_body;
  onboardStabilizer.airspeed = plant.airspeed;
  actuatorCommand = onboardStabilizer.surfaceCommand;
  {plant.ail, plant.elev, plant.rud, plant.thr} = actuatorCommand;
  time_s = time;
  position_m = plant.position;
  euler_rad = Vehicles.Interfaces.eulerFromQuaternion(plant.quat);
  airspeed_m_s = plant.airspeed;
end TakeoffOpenLoop;

model Takeoff
  parameter Components.RouteParameters takeoffRoute = Components.RouteParameters(
    cruiseSpeed = 4.5,
    waypoints = [
      0.0, 0.0, 0.0;
      30.0, 0.0, 3.0;
      60.0, 0.0, 3.0;
      90.0, 0.0, 3.0;
      120.0, 0.0, 3.0;
      150.0, 0.0, 3.0;
      180.0, 0.0, 3.0]);
  extends Vehicles.Cubs2.ClosedLoopVehicle(
    route = takeoffRoute,
    engaged = true,
    armed = true,
    stickOverrideActive = not airborne,
    stickOverride = {0.0, 0.0, 0.0, 1.0});
end Takeoff;

model AltitudeHold
  parameter Real targetAltitude_m = 3.0;
  parameter Components.RouteParameters straightRoute = Components.RouteParameters(
    cruiseSpeed = 4.0,
    waypointSwitchingDistance = 3.0,
    waypoints = [
      0.0, 0.0, 3.0;
      30.0, 0.0, 3.0;
      60.0, 0.0, 3.0;
      90.0, 0.0, 3.0;
      120.0, 0.0, 3.0;
      150.0, 0.0, 3.0;
      180.0, 0.0, 3.0]);
  extends Vehicles.Cubs2.ClosedLoopVehicle(
    route = straightRoute,
    initialPosition_m = {0.0, 0.0, targetAltitude_m},
    initialVelocityBody_m_s = {4.0, 0.0, 0.0},
    engaged = true,
    armed = true,
    stickOverrideActive = false,
    stickOverride = zeros(4));
  output Real altitudeError_m;
equation
  altitudeError_m = targetAltitude_m - position_m[3];
end AltitudeHold;

model HeadingHold
  parameter Real targetAltitude_m = 3.0;
  parameter Components.RouteParameters straightRoute = Components.RouteParameters(
    cruiseSpeed = 4.0,
    waypointSwitchingDistance = 3.0,
    waypoints = [
      0.0, 0.0, targetAltitude_m;
      30.0, 0.0, targetAltitude_m;
      60.0, 0.0, targetAltitude_m;
      90.0, 0.0, targetAltitude_m;
      120.0, 0.0, targetAltitude_m;
      150.0, 0.0, targetAltitude_m;
      180.0, 0.0, targetAltitude_m]);
  extends Vehicles.Cubs2.ClosedLoopVehicle(
    route = straightRoute,
    initialPosition_m = {0.0, 0.0, targetAltitude_m},
    initialVelocityBody_m_s = {4.0, 0.0, 0.0},
    initialQuaternion = {0.9689124217106447, 0.0, 0.0, -0.24740395925452294},
    engaged = true,
    armed = true,
    stickOverrideActive = false,
    stickOverride = zeros(4));
  output Real headingError_rad;
equation
  headingError_rad = MathUtilities.wrapAngle(setpoints.heading - euler_rad[3]);
end HeadingHold;

model PatternMission
  parameter Components.RouteParameters patternRoute = Components.RouteParameters(
    cruiseSpeed = 4.0,
    waypointSwitchingDistance = 3.0,
    waypoints = [
      0.0, 0.0, 3.0;
      12.0, 0.0, 3.0;
      30.0, 0.0, 3.0;
      30.0, 20.0, 3.0;
      0.0, 20.0, 3.0;
      0.0, 0.0, 3.0;
      12.0, 0.0, 3.0]);
  extends Vehicles.Cubs2.ClosedLoopVehicle(
    route = patternRoute,
    initialPosition_m = {0.0, 0.0, 3.0},
    initialVelocityBody_m_s = {4.0, 0.0, 0.0},
    engaged = true,
    armed = not (landing and position_m[3] < 0.4),
    stickOverrideActive = landing,
    stickOverride = {0.0, -0.25, 0.0, 0.12});
  discrete output Integer lapCount(start = 0, fixed = true);
  discrete output Boolean landing(start = false, fixed = true);
  output Integer missionPhase;
protected
  discrete Integer previousWaypoint(start = 1, fixed = true);
algorithm
  when sample(0.0, 0.02) then
    if not pre(landing) and position_m[3] > 2.0
        and pre(previousWaypoint) == 6 and currentWaypoint == 1 then
      lapCount := pre(lapCount) + 1;
    else
      lapCount := pre(lapCount);
    end if;
    previousWaypoint := currentWaypoint;
    landing := pre(landing) or lapCount >= 2;
  end when;
equation
  if landing then
    missionPhase = 3;
  elseif position_m[3] > 0.4 then
    missionPhase = 2;
  else
    missionPhase = 1;
  end if;
end PatternMission;

model Mission
  extends Vehicles.Cubs2.ClosedLoopVehicle(
    initialQuaternion =
      {0.38268343236508984, 0.0, 0.0, -0.9238795325112867},
    engaged = true,
    armed = true,
    stickOverrideActive = false,
    stickOverride = zeros(4));
  discrete output Integer lapCount(start = 0, fixed = true);
protected
  discrete Integer previousWaypoint(start = 1, fixed = true);
algorithm
  when sample(0.0, 0.02) then
    if pre(previousWaypoint) == route.nSegments and currentWaypoint == 1 then
      lapCount := pre(lapCount) + 1;
    else
      lapCount := pre(lapCount);
    end if;
    previousWaypoint := currentWaypoint;
  end when;
end Mission;

end Scenarios;