Migration to OpenModelica 1.25 and FMUs Generation
This commit is contained in:
@@ -1,91 +0,0 @@
|
||||
model AIDA_System "AIDAModel-integrationProSivic_reference.isx"
|
||||
AIDAModelica.QuadcopterModel quadcopterModel1(
|
||||
rigidBodyKinematicModel1(
|
||||
computeDronePosition1(
|
||||
integrator10(initType = Modelica.Blocks.Types.Init.SteadyState, y_start = -0.29),
|
||||
integrator11(initType = Modelica.Blocks.Types.Init.InitialOutput),
|
||||
integrator12(initType = Modelica.Blocks.Types.Init.InitialOutput))),
|
||||
rigidBodyDynamicModel1(
|
||||
computeDroneVelocity1(
|
||||
integrator4(initType = Modelica.Blocks.Types.Init.SteadyState)))) annotation(
|
||||
Placement(visible = true, transformation(extent = {{29, -8}, {49, 17}}, rotation = 0)));
|
||||
|
||||
AIDAModelica.LowLevelFlightControlSystem lowLevelFlightControlSystem1(
|
||||
controlAltitude1(computeAltitudeConsign1(
|
||||
PID1(k = 30, Ti = 1, Td = 0.1, Nd = 10, initType=Modelica.Blocks.Types.InitPID.InitialOutput)),
|
||||
pID_2(k = 25, Ti = 0.5, Td = 0.08, initType=Modelica.Blocks.Types.InitPID.InitialOutput)),
|
||||
attitudeControl1(Test_CstMomentumActiv = false, Test_open_loop = {false, false, false},
|
||||
controlRollAngle1(xAngularSpeedErrorModel1(Kwphi = 1.5),
|
||||
PID(k = 0.07, Ti = 30, Td = 0.02, Nd = 0.1,initType=Modelica.Blocks.Types.InitPID.InitialOutput,
|
||||
Add(k1 = 1, k2 = 1, k3 = 1))),
|
||||
controlPitchAngle1(yAngularSpeedErrorModel1(Kwteta = 1.5, RTStepConsign = false),
|
||||
PID1(k = 0.07, Ti = 30, Td = 0.02, Nd = 0.1,initType=Modelica.Blocks.Types.InitPID.InitialOutput,
|
||||
Add(k1 = 1, k2 = 1, k3 = 1))),
|
||||
controlYawAngle1(zAngularSpeedErrorModel1(Kwyaw = 2),
|
||||
PID2(k = 0.04, Ti = 20, Td = 0.5, Nd = 2.5,initType=Modelica.Blocks.Types.InitPID.InitialOutput,
|
||||
Add(k1 = 1, k2 = 1, k3 = 1)))),
|
||||
|
||||
positionControl1(
|
||||
controlSpeed1(
|
||||
PID(k = 0.8, Ti = 1,initType=Modelica.Blocks.Types.InitPID.InitialOutput),
|
||||
PID2(k = 0.8, Ti = 1,initType=Modelica.Blocks.Types.InitPID.InitialOutput),
|
||||
PID1(k = 30, Ti = 1, Td=0.1,initType=Modelica.Blocks.Types.InitPID.InitialOutput)))) annotation(
|
||||
Placement(visible = true, transformation(extent = {{-37, -6}, {-12, 19}}, rotation = 0)));
|
||||
AIDAModelica.ControlDroneNavigation controlDroneNavigation1 annotation(
|
||||
Placement(visible = true, transformation(extent = {{-79, -3}, {-59, 17}}, rotation = 0)));
|
||||
AIDAModelica.RemoteControl remoteControl1(
|
||||
VS_cmd=-0.5,
|
||||
VS_cmd_t={0.1,5},
|
||||
Pitch_cmd=0.02,
|
||||
Pitch_cmd_t={6,12},
|
||||
Yaw_cmd_t={15,19},
|
||||
Roll_cmd=0.02,
|
||||
Roll_cmd_t={3,9},
|
||||
Auto_Ctl_t=0.2) annotation(
|
||||
Placement(visible = true, transformation(extent = {{-57, 49}, {-32, 69}}, rotation = 0)));
|
||||
equation
|
||||
connect(lowLevelFlightControlSystem1.AngularSpeed, quadcopterModel1.AngularVelocities) annotation(
|
||||
Line(points = {{-33, -6}, {-33, -30}, {81.1667, -30}, {81.1667, 12}, {49.1667, 12}}, color = {0, 0, 127}));
|
||||
connect(lowLevelFlightControlSystem1.Attitude, quadcopterModel1.Attitude) annotation(
|
||||
Line(points = {{-29, -6}, {-29, -26}, {69.3333, -26}, {69.3333, 8}, {49.3333, 8}}, color = {0, 0, 127}));
|
||||
connect(lowLevelFlightControlSystem1.Position, quadcopterModel1.Position) annotation(
|
||||
Line(points = {{-24.5, -6}, {-24.5, -22}, {61.5, -22}, {61.5, 4}, {49.5, 4}}, color = {0, 0, 127}));
|
||||
connect(lowLevelFlightControlSystem1.Speed, quadcopterModel1.Speed) annotation(
|
||||
Line(points = {{-21, -6}, {-17.6667, -6}, {-17.6667, -18}, {57.3333, -18}, {57.3333, 0}, {49.3333, 0}}, color = {0, 0, 127}));
|
||||
connect(lowLevelFlightControlSystem1.Accelerations, quadcopterModel1.Accelerations) annotation(
|
||||
Line(points = {{-17, -6}, {-13.8333, -6}, {-13.8333, -16.0333}, {54.9167, -16.0333}, {54.9167, -4.0333}, {48.4167, -4.0333}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.ThrottleCommand1, lowLevelFlightControlSystem1.ThrottleCommand1) annotation(
|
||||
Line(points = {{29, 10.75}, {1, 10.75}, {1, 14}, {-12, 14}}, color = {0, 0, 127}, thickness = 0.015625));
|
||||
connect(lowLevelFlightControlSystem1.ThrottleCommand2, quadcopterModel1.ThrottleCommand2) annotation(
|
||||
Line(points = {{-12, 9}, {8.5, 9}, {8.5, 7}, {29, 7}}, color = {0, 0, 127}, thickness = 0.015625));
|
||||
connect(quadcopterModel1.ThrottleCommand3, lowLevelFlightControlSystem1.ThrottleCommand3) annotation(
|
||||
Line(points = {{29, 2.41667}, {12.5, 2.41667}, {12.5, 4}, {-12, 4}}, color = {0, 0, 127}, thickness = 0.015625));
|
||||
connect(lowLevelFlightControlSystem1.ThrottleCommand4, quadcopterModel1.ThrottleCommand4) annotation(
|
||||
Line(points = {{-12, -1}, {26, -1}, {26, -2}, {29, -2}}, color = {0, 0, 127}, thickness = 0.015625));
|
||||
connect(quadcopterModel1.Speed[:], lowLevelFlightControlSystem1.Speed[:]) annotation(
|
||||
Line);
|
||||
connect(controlDroneNavigation1.YawConsign, lowLevelFlightControlSystem1.YawConsign) annotation(
|
||||
Line(points = {{-59, 7}, {-34, 7}, {-34, 4}, {-37, 4}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(controlDroneNavigation1.DronPositionConsign[:], lowLevelFlightControlSystem1.DronePositionConsign[:]) annotation(
|
||||
Line(points = {{-59, 12}, {-48, 12}, {-48, 14}, {-37, 14}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(lowLevelFlightControlSystem1.SelectedControlMode, controlDroneNavigation1.SelectedControlMode) annotation(
|
||||
Line(points = {{-37, -1}, {-54, -1}, {-54, 2}, {-59, 2}}, color = {255, 0, 255}, thickness = 0.0625));
|
||||
connect(lowLevelFlightControlSystem1.RCVerticalSpeedCommand, remoteControl1.VerticalSpeedCommand) annotation(
|
||||
Line(points = {{-31, 19}, {-52.75, 19}, {-52.75, 49}}, color = {0, 0, 127}));
|
||||
connect(lowLevelFlightControlSystem1.RCYawCommand, remoteControl1.YawCommand) annotation(
|
||||
Line(points = {{-22, 19}, {-36.4167, 19}, {-36.4167, 51}, {-35.4167, 51}, {-35.4167, 49}, {-36.4167, 49}}, color = {0, 0, 127}));
|
||||
connect(remoteControl1.RollCommand, lowLevelFlightControlSystem1.RCAttitudeCommands[1]) annotation(
|
||||
Line(points = {{-47, 49}, {-47, 22}, {-27, 22}, {-27, 19}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(remoteControl1.PitchCommand, lowLevelFlightControlSystem1.RCAttitudeCommands[2]) annotation(
|
||||
Line(points = {{-42, 49}, {-42, 22}, {-27, 22}, {-27, 19}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(remoteControl1.IndicatorYawConsign, controlDroneNavigation1.IndicatorYawConsign) annotation(
|
||||
Line(points = {{-57, 59}, {-94, 59}, {-94, 6}, {-80, 6}, {-80, 8}, {-78, 8}, {-78, 8}, {-78, 8}}, color = {255, 0, 255}));
|
||||
connect(remoteControl1.ControlMode, controlDroneNavigation1.APEngagement) annotation(
|
||||
Line(points = {{-57, 54}, {-84, 54}, {-84, 12}, {-79, 12}}, color = {255, 0, 255}, thickness = 0.015625));
|
||||
connect(controlDroneNavigation1.Yaw, quadcopterModel1.Attitude[3]) annotation(
|
||||
Line(points = {{-79, 2}, {-87, 2}, {-87, -36}, {91, -36}, {91, 8}, {49, 8}, {49, 8}, {49, 8}, {49, 8}}, color = {0, 0, 127}));
|
||||
annotation(
|
||||
Icon(coordinateSystem(grid = {3, 2})),
|
||||
experiment(StartTime = 0, StopTime = 30, Tolerance = 1e-06, Interval = 0.002),
|
||||
__OpenModelica_simulationFlags(jacobian = "coloredNumerical", s = "dassl", lv = "LOG_STATS"));
|
||||
end AIDA_System;
|
||||
@@ -1,215 +0,0 @@
|
||||
within AIDAModelica;
|
||||
// CP: 65001
|
||||
// SimulationX Version: 3.8.2.45319 x64
|
||||
|
||||
model RemoteControl "RemoteControl"
|
||||
Real VerticalSpeedCommand_i(start=0) "commande interne non filtree";
|
||||
Modelica.Blocks.Interfaces.RealOutput VerticalSpeedCommand(
|
||||
quantity="Mechanics.Translation.Velocity",
|
||||
displayUnit="m/s") "'output Real' as connector" annotation(Placement(
|
||||
transformation(extent={{12,28},{32,48}}),
|
||||
iconTransformation(
|
||||
origin={-75,-100},
|
||||
extent={{-10,-10},{10,10}},
|
||||
rotation=-90)));
|
||||
Real RollCommand_i(start=0) "commande interne non filtree";
|
||||
Modelica.Blocks.Interfaces.RealOutput RollCommand(
|
||||
quantity="Mechanics.Rotation.Angle",
|
||||
displayUnit="rad") "'output Real' as connector" annotation(Placement(
|
||||
transformation(extent={{56,8},{76,28}}),
|
||||
iconTransformation(
|
||||
origin={-25,-100},
|
||||
extent={{-10,-10},{10,10}},
|
||||
rotation=-90)));
|
||||
Real PitchCommand_i(start=0) "commande interne non filtree";
|
||||
Modelica.Blocks.Interfaces.RealOutput PitchCommand(
|
||||
quantity="Mechanics.Rotation.Angle",
|
||||
displayUnit="rad") "'output Real' as connector" annotation(Placement(
|
||||
transformation(extent={{-38,-46},{-18,-26}}),
|
||||
iconTransformation(
|
||||
origin={25,-100},
|
||||
extent={{-10,-10},{10,10}},
|
||||
rotation=-90)));
|
||||
Real YawCommand_i(start=0) "commande interne non filtree";
|
||||
Modelica.Blocks.Interfaces.RealOutput YawCommand(
|
||||
quantity="Mechanics.Rotation.Angle",
|
||||
displayUnit="rad") "'output Real' as connector" annotation(Placement(
|
||||
transformation(extent={{18,-52},{38,-32}}),
|
||||
iconTransformation(
|
||||
origin={75,-100},
|
||||
extent={{-10,-10},{10,10}},
|
||||
rotation=-90)));
|
||||
Modelica.Blocks.Interfaces.BooleanOutput ControlMode "'output Boolean' as connector" annotation(Placement(
|
||||
transformation(extent={{-10,-10},{10,10}}),
|
||||
iconTransformation(
|
||||
origin={-125,-50},
|
||||
extent={{-10,-10},{10,10}},
|
||||
rotation=180)));
|
||||
Modelica.Blocks.Interfaces.BooleanOutput IndicatorYawConsign "'output Boolean' as connector" annotation(Placement(
|
||||
transformation(
|
||||
origin={-45,45},
|
||||
extent={{-17,-17},{17,17}}),
|
||||
iconTransformation(
|
||||
origin={-125,0},
|
||||
extent={{-10,-10},{10,10}},
|
||||
rotation=-180)));
|
||||
parameter Real VS_cmd=0.5;
|
||||
parameter Real[2] VS_cmd_t={3, 5} "Instants de démarrage et fin du step";
|
||||
parameter Real Pitch_cmd=0.03;
|
||||
parameter Real[2] Pitch_cmd_t={1, 4} "Instants de démarrage et fin du step, après stabilisation verticale";
|
||||
parameter Real Yaw_cmd=0.5;
|
||||
parameter Real[2] Yaw_cmd_t={6, 8} "Instants de démarrage et fin du step";
|
||||
parameter Real Roll_cmd=0.2 "Amplitude step ";
|
||||
parameter Real Roll_cmd_t[2]={1, 100} "Instants de démarrage et fin du step";
|
||||
parameter Real Tcst=0.1 "constante de temps pour filter les sorties du remote ctl";
|
||||
Boolean Auto_Ctl_Enabled(start=true);
|
||||
parameter Real Auto_Ctl_t=0.1 "Instant de déclenchement du mode auto";
|
||||
initial equation
|
||||
PitchCommand = 0;
|
||||
RollCommand = 0;
|
||||
YawCommand = 0;
|
||||
VerticalSpeedCommand = 0;
|
||||
PitchCommand_i = 0;
|
||||
RollCommand_i = 0;
|
||||
YawCommand_i = 0;
|
||||
VerticalSpeedCommand_i = 0;
|
||||
ControlMode = false;
|
||||
IndicatorYawConsign = false;
|
||||
Auto_Ctl_Enabled=true;
|
||||
algorithm
|
||||
|
||||
when time > Auto_Ctl_t and Auto_Ctl_Enabled==true then
|
||||
ControlMode:=true;
|
||||
end when;
|
||||
|
||||
when time > VS_cmd_t[1] then
|
||||
VerticalSpeedCommand_i := VS_cmd;
|
||||
ControlMode:=false;
|
||||
Auto_Ctl_Enabled:=false;
|
||||
end when;
|
||||
when time > VS_cmd_t[2] then
|
||||
VerticalSpeedCommand_i := 0;
|
||||
end when;
|
||||
when time > VS_cmd_t[2]+ Pitch_cmd_t[1] then
|
||||
PitchCommand_i := Pitch_cmd;
|
||||
ControlMode:=false;
|
||||
end when;
|
||||
when time > VS_cmd_t[2]+ Pitch_cmd_t[2] then
|
||||
PitchCommand_i := 0;
|
||||
end when;
|
||||
when time > VS_cmd_t[2]+ Roll_cmd_t[1] then
|
||||
RollCommand_i := Roll_cmd;
|
||||
ControlMode:=false;
|
||||
end when;
|
||||
when time > VS_cmd_t[2]+ Roll_cmd_t[2] then
|
||||
RollCommand_i := 0;
|
||||
end when;
|
||||
//Yaw command
|
||||
when time > VS_cmd_t[2]+ Yaw_cmd_t[1] then
|
||||
YawCommand_i := Yaw_cmd;
|
||||
ControlMode:=false;
|
||||
IndicatorYawConsign:=true;
|
||||
end when;
|
||||
//IndicatorYawConsign := true;
|
||||
when time > VS_cmd_t[2]+ Yaw_cmd_t[2] then
|
||||
YawCommand_i := 0;
|
||||
end when;
|
||||
//IndicatorYawConsign := false;
|
||||
/*if time>Yaw_cmd_t[2] then
|
||||
|
||||
int_yaw := 0;
|
||||
IndicatorYawConsign := false;
|
||||
|
||||
elseif time>Yaw_cmd_t[1] then
|
||||
|
||||
int_yaw := DYaw_cmd;
|
||||
IndicatorYawConsign := true;
|
||||
|
||||
else
|
||||
|
||||
int_yaw := 0;
|
||||
IndicatorYawConsign := false;
|
||||
|
||||
end if;*/
|
||||
equation
|
||||
// remote control filter with Tcst time constant
|
||||
der(VerticalSpeedCommand) = (VerticalSpeedCommand_i - VerticalSpeedCommand) / Tcst;
|
||||
der(RollCommand) = (RollCommand_i - RollCommand) / Tcst;
|
||||
der(PitchCommand) = (PitchCommand_i - PitchCommand) / Tcst;
|
||||
der(YawCommand) = (YawCommand_i - YawCommand) / Tcst;
|
||||
/* initial code of Andrii VAKULKO, destined to be used with manual button included in the SimulationX interface
|
||||
if VSCommand1 > 0 then
|
||||
VerticalSpeedCommand = -1;
|
||||
elseif VSCommand2 > 0 then
|
||||
VerticalSpeedCommand = -0.8;
|
||||
elseif VSCommand3 > 0 then
|
||||
VerticalSpeedCommand = -0.6;
|
||||
elseif VSCommand4 > 0 then
|
||||
VerticalSpeedCommand = -0.4;
|
||||
elseif VSCommand5 > 0 then
|
||||
VerticalSpeedCommand = -0.2;
|
||||
elseif VSCommand6 > 0 then
|
||||
VerticalSpeedCommand = 0.2;
|
||||
elseif VSCommand7 > 0 then
|
||||
VerticalSpeedCommand = 0.4;
|
||||
elseif VSCommand8 > 0 then
|
||||
VerticalSpeedCommand = 0.6;
|
||||
elseif VSCommand9 > 0 then
|
||||
VerticalSpeedCommand = 0.8;
|
||||
elseif VSCommand10 > 0 then
|
||||
VerticalSpeedCommand = 1;
|
||||
else
|
||||
VerticalSpeedCommand = 0;
|
||||
end if;
|
||||
|
||||
if YCommandP > 0 then
|
||||
der(YawCommand) = 0.01;
|
||||
//IndicatorYawConsign = true;
|
||||
elseif YCommandM > 0 then
|
||||
der(YawCommand) = -0.01;
|
||||
//IndicatorYawConsign = true;
|
||||
else
|
||||
YawCommand = 0;
|
||||
//IndicatorYawConsign = false;
|
||||
end if;
|
||||
|
||||
if RCommandP > 0 then
|
||||
RollCommand = 0.0261799; //15 deg
|
||||
elseif RCommandM > 0 then
|
||||
RollCommand = -0.0261799;
|
||||
else
|
||||
RollCommand = 0;
|
||||
end if;
|
||||
|
||||
if PCommandP > 0 then
|
||||
PitchCommand = 0.0261799;
|
||||
elseif PCommandM > 0 then
|
||||
PitchCommand = -0.0261799;
|
||||
else
|
||||
PitchCommand = 0;
|
||||
end if;*/
|
||||
annotation(
|
||||
VerticalSpeedCommand(flags=2),
|
||||
RollCommand(flags=2),
|
||||
PitchCommand(flags=2),
|
||||
YawCommand(flags=2),
|
||||
ControlMode(flags=2),
|
||||
IndicatorYawConsign(flags=2),
|
||||
Icon(
|
||||
coordinateSystem(extent={{-125,-100},{125,100}}),
|
||||
graphics={
|
||||
Rectangle(
|
||||
fillColor={255,255,255},
|
||||
fillPattern=FillPattern.Solid,
|
||||
extent={{-123.3,100},{123.3,-100}}),
|
||||
Text(
|
||||
textString="%name",
|
||||
fillPattern=FillPattern.None,
|
||||
extent={{-86,20},{86,-20}},
|
||||
origin={-2,6})}),
|
||||
experiment(
|
||||
StopTime=10,
|
||||
StartTime=0,
|
||||
Interval=0.02,
|
||||
MaxInterval="0.001"));
|
||||
end RemoteControl;
|
||||
@@ -0,0 +1,78 @@
|
||||
model AIDA_System "AIDAModel-integrationProSivic_reference.isx"
|
||||
AIDAModelica.QuadcopterModel quadcopterModel1(rigidBodyKinematicModel1(computeDronePosition1(integrator10(initType = Modelica.Blocks.Types.Init.SteadyState, y_start = -0.29), integrator11(initType = Modelica.Blocks.Types.Init.InitialOutput, y_start = 39), integrator12(initType = Modelica.Blocks.Types.Init.InitialOutput))), rigidBodyDynamicModel1(computeDroneVelocity1(integrator4(initType = Modelica.Blocks.Types.Init.SteadyState)))) annotation(
|
||||
Placement(visible = true, transformation(origin = {16.4, 7.25}, extent = {{-10.6, -13.25}, {10.6, 13.25}}, rotation = 0)));
|
||||
AIDAModelica.LowLevelFlightControlSystem lowLevelFlightControlSystem1(controlAltitude1(computeAltitudeConsign1(PID1(k = 30, Ti = 1, Td = 0.1, Nd = 10, initType = Modelica.Blocks.Types.InitPID.InitialOutput)), pID_2(k = 25, Ti = 0.5, Td = 0.08, initType = Modelica.Blocks.Types.InitPID.InitialOutput)), attitudeControl1(Test_CstMomentumActiv = false, Test_open_loop = {false, false, false}, controlRollAngle1(xAngularSpeedErrorModel1(Kwphi = 1.5), PID(k = 0.07, Ti = 30, Td = 0.02, Nd = 0.1, initType = Modelica.Blocks.Types.InitPID.InitialOutput, Add(k1 = 1, k2 = 1, k3 = 1))), controlPitchAngle1(yAngularSpeedErrorModel1(Kwteta = 1.5, RTStepConsign = false), PID1(k = 0.07, Ti = 30, Td = 0.02, Nd = 0.1, initType = Modelica.Blocks.Types.InitPID.InitialOutput, Add(k1 = 1, k2 = 1, k3 = 1))), controlYawAngle1(zAngularSpeedErrorModel1(Kwyaw = 2), PID2(k = 0.04, Ti = 20, Td = 0.5, Nd = 2.5, initType = Modelica.Blocks.Types.InitPID.InitialOutput, Add(k1 = 1, k2 = 1, k3 = 1)))), positionControl1(controlSpeed1(PID(k = 0.8, Ti = 1, initType = Modelica.Blocks.Types.InitPID.InitialOutput), PID2(k = 0.8, Ti = 1, initType = Modelica.Blocks.Types.InitPID.InitialOutput), PID1(k = 30, Ti = 1, Td = 0.1, initType = Modelica.Blocks.Types.InitPID.InitialOutput)))) annotation(
|
||||
Placement(visible = true, transformation(origin = {-2.96, 1.52}, extent = {{-34.04, -5.52}, {-11.04, 17.48}}, rotation = 0)));
|
||||
AIDAModelica.ControlDroneNavigation controlDroneNavigation1 annotation(
|
||||
Placement(visible = true, transformation(origin = {15.9, 0.3}, extent = {{-86.9, -3.3}, {-64.9, 18.7}}, rotation = 0)));
|
||||
AIDAModelica.RemoteControl remoteControl1(VS_cmd = -0.5, Pitch_cmd = 0.02, VS_cmd_t = {1000, 1001}, Roll_cmd_t = {1000, 1001}, Pitch_cmd_t = {1000, 1001}, Yaw_cmd_t = {1000, 1001}, Auto_Ctl_t = 0.1) annotation(
|
||||
Placement(visible = true, transformation(extent = {{-37, 29}, {-12, 49}}, rotation = 0)));
|
||||
AIDAModelica.WindProfile windProfile1 annotation(
|
||||
Placement(visible = true, transformation(origin = {16, 40}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
|
||||
Requirements.StabilityRequirement stabilityRequirement1 annotation(
|
||||
Placement(visible = true, transformation(origin = {-44, -32}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
|
||||
equation
|
||||
connect(windProfile1.Fy, quadcopterModel1.Fy) annotation(
|
||||
Line(points = {{21, 29}, {22, 29}, {22, 22}}, color = {0, 0, 127}));
|
||||
connect(windProfile1.Fx, quadcopterModel1.Fx) annotation(
|
||||
Line(points = {{11, 29}, {11, 26.5}, {12, 26.5}, {12, 22}}, color = {0, 0, 127}));
|
||||
connect(remoteControl1.RollCommand, lowLevelFlightControlSystem1.RCAttitudeCommands[1]) annotation(
|
||||
Line(points = {{-27, 29}, {-27, 19}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(remoteControl1.PitchCommand, lowLevelFlightControlSystem1.RCAttitudeCommands[2]) annotation(
|
||||
Line(points = {{-22, 29}, {-22, 22}, {-27, 22}, {-27, 19}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(lowLevelFlightControlSystem1.RCVerticalSpeedCommand, remoteControl1.VerticalSpeedCommand) annotation(
|
||||
Line(points = {{-31, 19}, {-31.75, 19}, {-31.75, 29}, {-32, 29}}, color = {0, 0, 127}));
|
||||
connect(remoteControl1.YawCommand, lowLevelFlightControlSystem1.RCYawCommand) annotation(
|
||||
Line(points = {{-17, 29}, {-18, 29}, {-18, 20}, {-24, 20}, {-24, 18}}, color = {0, 0, 127}));
|
||||
connect(remoteControl1.ControlMode, controlDroneNavigation1.APEngagement) annotation(
|
||||
Line(points = {{-37, 34}, {-76, 34}, {-76, 14}, {-71, 14}}, color = {255, 0, 255}, thickness = 0.015625));
|
||||
connect(remoteControl1.IndicatorYawConsign, controlDroneNavigation1.IndicatorYawConsign) annotation(
|
||||
Line(points = {{-37, 39}, {-78, 39}, {-78, 8}, {-71, 8}}, color = {255, 0, 255}));
|
||||
connect(quadcopterModel1.Attitude[3], stabilityRequirement1.yaw) annotation(
|
||||
Line(points = {{28, 12}, {44, 12}, {44, -31}, {-34, -31}}, color = {0, 0, 127}));
|
||||
connect(controlDroneNavigation1.YawConsign, stabilityRequirement1.yawConsign) annotation(
|
||||
Line(points = {{-50, 8}, {-48, 8}, {-48, -22}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.Position[1], stabilityRequirement1.posX) annotation(
|
||||
Line(points = {{28, 8}, {48, 8}, {48, -26}, {-34, -26}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.Position[2], stabilityRequirement1.posY) annotation(
|
||||
Line(points = {{28, 8}, {48, 8}, {48, -38}, {-34, -38}}, color = {0, 0, 127}));
|
||||
connect(controlDroneNavigation1.DronPositionConsign[1], stabilityRequirement1.DronePositionConsign[1]) annotation(
|
||||
Line(points = {{-50, 14}, {-44, 14}, {-44, -22}}, color = {0, 0, 127}));
|
||||
connect(controlDroneNavigation1.DronPositionConsign[2], stabilityRequirement1.DronePositionConsign[2]) annotation(
|
||||
Line(points = {{-50, 14}, {-44, 14}, {-44, -22}}, color = {0, 0, 127}));
|
||||
connect(controlDroneNavigation1.DronPositionConsign[3], stabilityRequirement1.DronePositionConsign[3]) annotation(
|
||||
Line(points = {{-50, 14}, {-44, 14}, {-44, -22}}, color = {0, 0, 127}));
|
||||
connect(controlDroneNavigation1.Yaw, quadcopterModel1.Attitude[3]) annotation(
|
||||
Line(points = {{-71, 3}, {-75, 3}, {-75, -18}, {39, -18}, {39, 12}, {28, 12}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.Speed[:], lowLevelFlightControlSystem1.Speed[:]) annotation(
|
||||
Line);
|
||||
connect(lowLevelFlightControlSystem1.ThrottleCommand1, quadcopterModel1.ThrottleCommand1) annotation(
|
||||
Line(points = {{-14, 14}, {6, 14}}, color = {0, 0, 127}));
|
||||
connect(lowLevelFlightControlSystem1.ThrottleCommand2, quadcopterModel1.ThrottleCommand2) annotation(
|
||||
Line(points = {{-14, 10}, {-5.5, 10}, {-5.5, 9}, {6, 9}}, color = {0, 0, 127}));
|
||||
connect(lowLevelFlightControlSystem1.ThrottleCommand3, quadcopterModel1.ThrottleCommand3) annotation(
|
||||
Line(points = {{-14, 6}, {-5, 6}, {-5, 5}, {6, 5}}, color = {0, 0, 127}));
|
||||
connect(lowLevelFlightControlSystem1.ThrottleCommand4, quadcopterModel1.ThrottleCommand4) annotation(
|
||||
Line(points = {{-14, 0}, {-3.5, 0}, {-3.5, 1}, {6, 1}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.Accelerations, lowLevelFlightControlSystem1.Accelerations) annotation(
|
||||
Line(points = {{28, -1}, {30, -1}, {30, -8}, {-18, -8}, {-18, -4}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.Speed, lowLevelFlightControlSystem1.Speed) annotation(
|
||||
Line(points = {{28, 3}, {32, 3}, {32, -10}, {-22, -10}, {-22, -4}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.Position, lowLevelFlightControlSystem1.Position) annotation(
|
||||
Line(points = {{28, 7}, {34, 7}, {34, -12}, {-26, -12}, {-26, -4}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.Attitude, lowLevelFlightControlSystem1.Attitude) annotation(
|
||||
Line(points = {{28, 12}, {36, 12}, {36, -14}, {-29, -14}, {-29, -4}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.AngularVelocities, lowLevelFlightControlSystem1.AngularSpeed) annotation(
|
||||
Line(points = {{28, 16}, {42, 16}, {42, -16}, {-33, -16}, {-33, -4}}, color = {0, 0, 127}));
|
||||
connect(controlDroneNavigation1.YawConsign, lowLevelFlightControlSystem1.YawConsign) annotation(
|
||||
Line(points = {{-49, 8}, {-45, 8}, {-45, 5}, {-37, 5}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(controlDroneNavigation1.DronPositionConsign[:], lowLevelFlightControlSystem1.DronePositionConsign[:]) annotation(
|
||||
Line(points = {{-49, 14}, {-37, 14}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(lowLevelFlightControlSystem1.SelectedControlMode, controlDroneNavigation1.SelectedControlMode) annotation(
|
||||
Line(points = {{-37, 1}, {-43, 1}, {-43, 3}, {-49, 3}}, color = {255, 0, 255}, thickness = 0.0625));
|
||||
annotation(
|
||||
Icon(coordinateSystem(grid = {3, 2})),
|
||||
experiment(StartTime = 0, StopTime = 30, Tolerance = 1e-06, Interval = 0.002),
|
||||
__OpenModelica_simulationFlags(jacobian = "coloredNumerical", s = "dassl", lv = "LOG_STATS"),
|
||||
uses(Modelica(version = "3.2.2")));
|
||||
end AIDA_System;
|
||||
@@ -12,6 +12,7 @@ model ControlMotor "[SF1.1/2/3/4.1] Control motor"
|
||||
equation
|
||||
// enter your equations here
|
||||
ComdKD = (DAngVel - wb) / cR;
|
||||
|
||||
annotation(
|
||||
Icon(graphics = {Rectangle(fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {103.3, -100}}), Text(origin = {-7, 44}, extent = {{-39, 12}, {39, -12}}, textString = "%name")}, coordinateSystem(initialScale = 0.1)));
|
||||
end ControlMotor;
|
||||
1720
SimulationModels/OpenModelica 1.11/AIDAModelica/QuadcopterModel.mo
Normal file
1720
SimulationModels/OpenModelica 1.11/AIDAModelica/QuadcopterModel.mo
Normal file
File diff suppressed because it is too large
Load Diff
164
SimulationModels/OpenModelica 1.11/AIDAModelica/RemoteControl.mo
Normal file
164
SimulationModels/OpenModelica 1.11/AIDAModelica/RemoteControl.mo
Normal file
@@ -0,0 +1,164 @@
|
||||
within AIDAModelica;
|
||||
|
||||
model RemoteControl "RemoteControl"
|
||||
// CP: 65001
|
||||
// SimulationX Version: 3.8.2.45319 x64
|
||||
Real VerticalSpeedCommand_i(start = 0) "commande interne non filtree";
|
||||
Modelica.Blocks.Interfaces.RealOutput VerticalSpeedCommand(quantity = "Mechanics.Translation.Velocity", displayUnit = "m/s") "'output Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{12, 28}, {32, 48}}), iconTransformation(origin = {-75, -100}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
|
||||
Real RollCommand_i(start = 0) "commande interne non filtree";
|
||||
Modelica.Blocks.Interfaces.RealOutput RollCommand(quantity = "Mechanics.Rotation.Angle", displayUnit = "rad") "'output Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{56, 8}, {76, 28}}), iconTransformation(origin = {-25, -100}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
|
||||
Real PitchCommand_i(start = 0) "commande interne non filtree";
|
||||
Modelica.Blocks.Interfaces.RealOutput PitchCommand(quantity = "Mechanics.Rotation.Angle", displayUnit = "rad") "'output Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{-38, -46}, {-18, -26}}), iconTransformation(origin = {25, -100}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
|
||||
Real YawCommand_i(start = 0) "commande interne non filtree";
|
||||
Modelica.Blocks.Interfaces.RealOutput YawCommand(quantity = "Mechanics.Rotation.Angle", displayUnit = "rad") "'output Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{18, -52}, {38, -32}}), iconTransformation(origin = {75, -100}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
|
||||
Modelica.Blocks.Interfaces.BooleanOutput ControlMode "'output Boolean' as connector" annotation(
|
||||
Placement(transformation(extent = {{-10, -10}, {10, 10}}), iconTransformation(origin = {-125, -50}, extent = {{-10, -10}, {10, 10}}, rotation = 180)));
|
||||
Modelica.Blocks.Interfaces.BooleanOutput IndicatorYawConsign "'output Boolean' as connector" annotation(
|
||||
Placement(transformation(origin = {-45, 45}, extent = {{-17, -17}, {17, 17}}), iconTransformation(origin = {-125, 0}, extent = {{-10, -10}, {10, 10}}, rotation = -180)));
|
||||
parameter Real VS_cmd = 0.5;
|
||||
parameter Real[2] VS_cmd_t = {3, 5} "Instants de démarrage et fin du step";
|
||||
parameter Real Pitch_cmd = 0.03;
|
||||
parameter Real[2] Pitch_cmd_t = {1, 4} "Instants de démarrage et fin du step, après stabilisation verticale";
|
||||
parameter Real Yaw_cmd = 0.5;
|
||||
parameter Real[2] Yaw_cmd_t = {6, 8} "Instants de démarrage et fin du step";
|
||||
parameter Real Roll_cmd = 0.2 "Amplitude step ";
|
||||
parameter Real Roll_cmd_t[2] = {1, 100} "Instants de démarrage et fin du step";
|
||||
parameter Real Tcst = 0.1 "constante de temps pour filter les sorties du remote ctl";
|
||||
Boolean Auto_Ctl_Enabled(start = true);
|
||||
parameter Real Auto_Ctl_t = 0.1 "Instant de déclenchement du mode auto";
|
||||
initial equation
|
||||
PitchCommand = 0;
|
||||
RollCommand = 0;
|
||||
YawCommand = 0;
|
||||
VerticalSpeedCommand = 0;
|
||||
PitchCommand_i = 0;
|
||||
RollCommand_i = 0;
|
||||
YawCommand_i = 0;
|
||||
VerticalSpeedCommand_i = 0;
|
||||
ControlMode = false;
|
||||
IndicatorYawConsign = false;
|
||||
Auto_Ctl_Enabled = true;
|
||||
algorithm
|
||||
when time > Auto_Ctl_t and Auto_Ctl_Enabled == true then
|
||||
ControlMode := true;
|
||||
end when;
|
||||
when time > VS_cmd_t[1] then
|
||||
VerticalSpeedCommand_i := VS_cmd;
|
||||
ControlMode := false;
|
||||
Auto_Ctl_Enabled := false;
|
||||
end when;
|
||||
when time > VS_cmd_t[2] then
|
||||
VerticalSpeedCommand_i := 0;
|
||||
end when;
|
||||
when time > VS_cmd_t[2] + Pitch_cmd_t[1] then
|
||||
PitchCommand_i := Pitch_cmd;
|
||||
ControlMode := false;
|
||||
end when;
|
||||
when time > VS_cmd_t[2] + Pitch_cmd_t[2] then
|
||||
PitchCommand_i := 0;
|
||||
end when;
|
||||
when time > VS_cmd_t[2] + Roll_cmd_t[1] then
|
||||
RollCommand_i := Roll_cmd;
|
||||
ControlMode := false;
|
||||
end when;
|
||||
when time > VS_cmd_t[2] + Roll_cmd_t[2] then
|
||||
RollCommand_i := 0;
|
||||
end when;
|
||||
//Yaw command
|
||||
when time > VS_cmd_t[2] + Yaw_cmd_t[1] then
|
||||
YawCommand_i := Yaw_cmd;
|
||||
ControlMode := false;
|
||||
IndicatorYawConsign := true;
|
||||
end when;
|
||||
//IndicatorYawConsign := true;
|
||||
when time > VS_cmd_t[2] + Yaw_cmd_t[2] then
|
||||
YawCommand_i := 0;
|
||||
end when;
|
||||
//IndicatorYawConsign := false;
|
||||
/*if time>Yaw_cmd_t[2] then
|
||||
|
||||
int_yaw := 0;
|
||||
IndicatorYawConsign := false;
|
||||
|
||||
elseif time>Yaw_cmd_t[1] then
|
||||
|
||||
int_yaw := DYaw_cmd;
|
||||
IndicatorYawConsign := true;
|
||||
|
||||
else
|
||||
|
||||
int_yaw := 0;
|
||||
IndicatorYawConsign := false;
|
||||
|
||||
end if;*/
|
||||
equation
|
||||
// remote control filter with Tcst time constant
|
||||
der(VerticalSpeedCommand) = (VerticalSpeedCommand_i - VerticalSpeedCommand) / Tcst;
|
||||
der(RollCommand) = (RollCommand_i - RollCommand) / Tcst;
|
||||
der(PitchCommand) = (PitchCommand_i - PitchCommand) / Tcst;
|
||||
der(YawCommand) = (YawCommand_i - YawCommand) / Tcst;
|
||||
/* initial code of Andrii VAKULKO, destined to be used with manual button included in the SimulationX interface
|
||||
if VSCommand1 > 0 then
|
||||
VerticalSpeedCommand = -1;
|
||||
elseif VSCommand2 > 0 then
|
||||
VerticalSpeedCommand = -0.8;
|
||||
elseif VSCommand3 > 0 then
|
||||
VerticalSpeedCommand = -0.6;
|
||||
elseif VSCommand4 > 0 then
|
||||
VerticalSpeedCommand = -0.4;
|
||||
elseif VSCommand5 > 0 then
|
||||
VerticalSpeedCommand = -0.2;
|
||||
elseif VSCommand6 > 0 then
|
||||
VerticalSpeedCommand = 0.2;
|
||||
elseif VSCommand7 > 0 then
|
||||
VerticalSpeedCommand = 0.4;
|
||||
elseif VSCommand8 > 0 then
|
||||
VerticalSpeedCommand = 0.6;
|
||||
elseif VSCommand9 > 0 then
|
||||
VerticalSpeedCommand = 0.8;
|
||||
elseif VSCommand10 > 0 then
|
||||
VerticalSpeedCommand = 1;
|
||||
else
|
||||
VerticalSpeedCommand = 0;
|
||||
end if;
|
||||
|
||||
if YCommandP > 0 then
|
||||
der(YawCommand) = 0.01;
|
||||
//IndicatorYawConsign = true;
|
||||
elseif YCommandM > 0 then
|
||||
der(YawCommand) = -0.01;
|
||||
//IndicatorYawConsign = true;
|
||||
else
|
||||
YawCommand = 0;
|
||||
//IndicatorYawConsign = false;
|
||||
end if;
|
||||
|
||||
if RCommandP > 0 then
|
||||
RollCommand = 0.0261799; //15 deg
|
||||
elseif RCommandM > 0 then
|
||||
RollCommand = -0.0261799;
|
||||
else
|
||||
RollCommand = 0;
|
||||
end if;
|
||||
|
||||
if PCommandP > 0 then
|
||||
PitchCommand = 0.0261799;
|
||||
elseif PCommandM > 0 then
|
||||
PitchCommand = -0.0261799;
|
||||
else
|
||||
PitchCommand = 0;
|
||||
end if;*/
|
||||
annotation(
|
||||
VerticalSpeedCommand(flags = 2),
|
||||
RollCommand(flags = 2),
|
||||
PitchCommand(flags = 2),
|
||||
YawCommand(flags = 2),
|
||||
ControlMode(flags = 2),
|
||||
IndicatorYawConsign(flags = 2),
|
||||
Icon(coordinateSystem(extent = {{-125, -100}, {125, 100}}, initialScale = 0.1), graphics = {Rectangle(fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-123.3, 100}, {123.3, -100}}), Text(origin = {-12, 10}, extent = {{-78, 18}, {86, -20}}, textString = "RemoteControl")}),
|
||||
experiment(StopTime = 10, StartTime = 0, Interval = 0.02, MaxInterval = "0.001"));
|
||||
end RemoteControl;
|
||||
@@ -0,0 +1,19 @@
|
||||
within AIDAModelica;
|
||||
|
||||
model WindProfile
|
||||
Modelica.Blocks.Sources.Constant const(k = 0) annotation(
|
||||
Placement(visible = true, transformation(origin = {-54, -30}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
|
||||
Modelica.Blocks.Sources.Constant const1(k = 0) annotation(
|
||||
Placement(visible = true, transformation(origin = {50, -30}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
|
||||
Modelica.Blocks.Interfaces.RealOutput Fx annotation(
|
||||
Placement(visible = true, transformation(origin = {-50, -110}, extent = {{-10, -10}, {10, 10}}, rotation = -90), iconTransformation(origin = {-50, -110}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
|
||||
Modelica.Blocks.Interfaces.RealOutput Fy annotation(
|
||||
Placement(visible = true, transformation(origin = {50, -110}, extent = {{-10, -10}, {10, 10}}, rotation = -90), iconTransformation(origin = {50, -110}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
|
||||
equation
|
||||
connect(const.y, Fx) annotation(
|
||||
Line(points = {{-54, -41}, {-54, -75.5}, {-50, -75.5}, {-50, -110}}, color = {0, 0, 127}));
|
||||
connect(const1.y, Fy) annotation(
|
||||
Line(points = {{50, -41}, {50, -110}}, color = {0, 0, 127}));
|
||||
|
||||
annotation(
|
||||
Icon(graphics = {Rectangle(extent = {{-100, 100}, {100, -100}}), Text(origin = {-23, 18}, extent = {{57, -26}, {-11, 4}}, textString = "WindProfile")}));end WindProfile;
|
||||
14790
SimulationModels/OpenModelica 1.11/AIDAModelica/package.mo
Normal file
14790
SimulationModels/OpenModelica 1.11/AIDAModelica/package.mo
Normal file
File diff suppressed because it is too large
Load Diff
@@ -68,3 +68,4 @@ YAngularSpeedErrorModel
|
||||
YawConsignProducing
|
||||
ZAngularSpeedErrorModel
|
||||
ModelicaLicense2
|
||||
WindProfile
|
||||
BIN
SimulationModels/OpenModelica 1.11/Requirements/AIDA_System.bmp
Normal file
BIN
SimulationModels/OpenModelica 1.11/Requirements/AIDA_System.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.9 MiB |
BIN
SimulationModels/OpenModelica 1.11/Requirements/AIDA_System.pdf
Normal file
BIN
SimulationModels/OpenModelica 1.11/Requirements/AIDA_System.pdf
Normal file
Binary file not shown.
BIN
SimulationModels/OpenModelica 1.11/Requirements/AIDA_System.png
Normal file
BIN
SimulationModels/OpenModelica 1.11/Requirements/AIDA_System.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 36 KiB |
6662
SimulationModels/OpenModelica 1.11/Requirements/AIDA_System.svg
Normal file
6662
SimulationModels/OpenModelica 1.11/Requirements/AIDA_System.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 286 KiB |
@@ -0,0 +1,102 @@
|
||||
within Requirements;
|
||||
|
||||
model StabilityRequirement
|
||||
"SR-WIND-02: The UAS shall maintain lateral and yaw stability under wind disturbance and recover within limits"
|
||||
|
||||
// ---- System-level parameters (traceable to SR-WIND-02) ----
|
||||
parameter Real hoverTolerance = 2.5
|
||||
"Maximum allowed lateral deviation during hover [m]";
|
||||
parameter Real yawTolerance = 5
|
||||
"Maximum allowed yaw error [deg]";
|
||||
parameter Real recoveryBand = 0.5
|
||||
"Position error band for recovery after disturbance [m]";
|
||||
parameter Real recoveryTime = 3
|
||||
"Time to remain within recovery band [s]";
|
||||
|
||||
// ---- Inputs from the system ----
|
||||
Modelica.Blocks.Interfaces.RealInput posX
|
||||
"Measured X position [m]" annotation(
|
||||
Placement(transformation(extent={{120,40},{80,80}})));
|
||||
Modelica.Blocks.Interfaces.RealInput posY
|
||||
"Measured Y position [m]" annotation(
|
||||
Placement(transformation(extent={{120,-80},{80,-40}})));
|
||||
Modelica.Blocks.Interfaces.RealInput yaw
|
||||
"Measured yaw angle [deg]" annotation(
|
||||
Placement(transformation(extent={{120,-10},{80,30}})));
|
||||
Modelica.Blocks.Interfaces.RealInput DronePositionConsign[3]
|
||||
"Commanded reference position [m]" annotation(
|
||||
Placement(transformation(extent={{-20,120},{20,80}}, rotation=-90)));
|
||||
Modelica.Blocks.Interfaces.RealInput yawConsign
|
||||
"Commanded yaw angle [deg]" annotation(
|
||||
Placement(transformation(extent={{-60,120},{-20,80}}, rotation=-90)));
|
||||
|
||||
// ---- Outputs for monitoring ----
|
||||
Modelica.Blocks.Interfaces.RealOutput lateralError
|
||||
"2D lateral position error magnitude [m]" annotation(
|
||||
Placement(transformation(extent={{-90,50},{-110,70}})));
|
||||
Modelica.Blocks.Interfaces.RealOutput yawError
|
||||
"Yaw error magnitude [deg]" annotation(
|
||||
Placement(transformation(extent={{-90,20},{-110,40}})));
|
||||
Modelica.Blocks.Interfaces.BooleanOutput withinHoverLimit
|
||||
"true if lateralError < hoverTolerance" annotation(
|
||||
Placement(visible = true, transformation(extent = {{-110, -10}, {-90, 10}}, rotation = 0), iconTransformation(origin = {-100, 0}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
|
||||
Modelica.Blocks.Interfaces.BooleanOutput withinYawLimit
|
||||
"true if yawError < yawTolerance" annotation(
|
||||
Placement(visible = true, transformation(extent = {{-110, -40}, {-90, -20}}, rotation = 0), iconTransformation(origin = {-100, -30}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
|
||||
Modelica.Blocks.Interfaces.BooleanOutput recovered
|
||||
"true if position remains within recoveryBand for recoveryTime" annotation(
|
||||
Placement(visible = true, transformation(extent = {{-110, -70}, {-90, -50}}, rotation = 0), iconTransformation(origin = {-100, -60}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
|
||||
Modelica.Blocks.Interfaces.BooleanOutput pass
|
||||
"true if all criteria are satisfied" annotation(
|
||||
Placement(visible = true, transformation(extent = {{-110, -100}, {-90, -80}}, rotation = 0), iconTransformation(origin = {-100, -90}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
|
||||
|
||||
protected
|
||||
Real t_within(start=0) "Timer for recovery criterion";
|
||||
equation
|
||||
// --- Lateral and yaw errors ---
|
||||
lateralError = sqrt((posX - DronePositionConsign[1])^2 +
|
||||
(posY - DronePositionConsign[2])^2);
|
||||
yawError = abs(yaw - yawConsign);
|
||||
|
||||
withinHoverLimit = lateralError < hoverTolerance;
|
||||
withinYawLimit = yawError < yawTolerance;
|
||||
|
||||
// --- Recovery logic (after gust disturbance) ---
|
||||
der(t_within) = if lateralError < recoveryBand then 1 else 0;
|
||||
|
||||
// Reset timer whenever the drone leaves the recovery band
|
||||
when lateralError > recoveryBand then
|
||||
reinit(t_within, 0);
|
||||
end when;
|
||||
|
||||
recovered = t_within >= recoveryTime;
|
||||
|
||||
// --- Overall requirement pass flag ---
|
||||
//pass = withinHoverLimit and withinYawLimit and recovered;
|
||||
pass = withinHoverLimit and withinYawLimit;
|
||||
annotation(
|
||||
Documentation(info="
|
||||
<html>
|
||||
<h4>SR-WIND-02 – Performance in Wind</h4>
|
||||
<p>
|
||||
Source: EASA Means of Compliance Light-UAS.2512,
|
||||
ISO 21384-3 (Clause 10 – Operational limitations).
|
||||
</p>
|
||||
<p>
|
||||
<b>Requirement:</b><br>
|
||||
Under a steady 8 m/s wind with 12 m/s gusts, the UAS shall:
|
||||
<ul>
|
||||
<li>Maintain lateral position error ≤ 1.5 m (95th percentile) during hover.</li>
|
||||
<li>Maintain yaw pointing error ≤ 5° (95th percentile).</li>
|
||||
<li>Recover to within 0.5 m position error within 3 s after gust disturbance.</li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>
|
||||
<b>Simulation Inputs:</b> Connect to AIDA_System position, yaw, and
|
||||
reference signals.
|
||||
</p>
|
||||
</html>"),
|
||||
uses(Modelica(version="3.2.2")),
|
||||
Icon(graphics = {Text(extent = {{-100, 100}, {100, -100}}, textString = "SR-WIND-02"), Rectangle(extent = {{-104, -2}, {-104, -2}}), Rectangle(origin = {0, -1}, extent = {{-100, 101}, {100, -99}})}, coordinateSystem(initialScale = 0.1)));
|
||||
|
||||
end StabilityRequirement;
|
||||
@@ -0,0 +1,3 @@
|
||||
package Requirements
|
||||
|
||||
end Requirements;
|
||||
2289
SimulationModels/OpenModelica 1.11/images/AIDA_System.eps
Normal file
2289
SimulationModels/OpenModelica 1.11/images/AIDA_System.eps
Normal file
File diff suppressed because it is too large
Load Diff
BIN
SimulationModels/OpenModelica 1.11/images/AIDA_System.pdf
Normal file
BIN
SimulationModels/OpenModelica 1.11/images/AIDA_System.pdf
Normal file
Binary file not shown.
4559
SimulationModels/OpenModelica 1.11/images/AIDA_System.svg
Normal file
4559
SimulationModels/OpenModelica 1.11/images/AIDA_System.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 234 KiB |
@@ -0,0 +1,76 @@
|
||||
model AIDA_System "AIDAModel-integrationProSivic_reference.isx"
|
||||
AIDAModelica.QuadcopterModel quadcopterModel1(rigidBodyKinematicModel1(computeDronePosition1(integrator10(initType = Modelica.Blocks.Types.Init.SteadyState, y_start = -0.29), integrator11(initType = Modelica.Blocks.Types.Init.InitialOutput, y_start = 39), integrator12(initType = Modelica.Blocks.Types.Init.InitialOutput))), rigidBodyDynamicModel1(computeDroneVelocity1(integrator4(initType = Modelica.Blocks.Types.Init.SteadyState)))) annotation(
|
||||
Placement(visible = true, transformation(origin = {16.4, 7.25}, extent = {{-10.6, -13.25}, {10.6, 13.25}}, rotation = 0)));
|
||||
AIDAModelica.LowLevelFlightControlSystem lowLevelFlightControlSystem1(controlAltitude1(computeAltitudeConsign1(PID1(k = 30, Ti = 1, Td = 0.1, Nd = 10, initType = Modelica.Blocks.Types.Init.InitialOutput)), pID_2(k = 25, Ti = 0.5, Td = 0.08, initType = Modelica.Blocks.Types.Init.InitialOutput)), attitudeControl1(Test_CstMomentumActiv = false, Test_open_loop = {false, false, false}, controlRollAngle1(xAngularSpeedErrorModel1(Kwphi = 1.5), PID(k = 0.07, Ti = 30, Td = 0.02, Nd = 0.1, initType = Modelica.Blocks.Types.Init.InitialOutput, Add(k1 = 1, k2 = 1, k3 = 1))), controlPitchAngle1(yAngularSpeedErrorModel1(Kwteta = 1.5, RTStepConsign = false), PID1(k = 0.07, Ti = 30, Td = 0.02, Nd = 0.1, initType = Modelica.Blocks.Types.Init.InitialOutput, Add(k1 = 1, k2 = 1, k3 = 1))), controlYawAngle1(zAngularSpeedErrorModel1(Kwyaw = 2), PID2(k = 0.04, Ti = 20, Td = 0.5, Nd = 2.5, initType = Modelica.Blocks.Types.Init.InitialOutput, Add(k1 = 1, k2 = 1, k3 = 1)))), positionControl1(controlSpeed1(PID(k = 0.8, Ti = 1, initType = Modelica.Blocks.Types.Init.InitialOutput), PID2(k = 0.8, Ti = 1, initType = Modelica.Blocks.Types.Init.InitialOutput), PID1(k = 30, Ti = 1, Td = 0.1, initType = Modelica.Blocks.Types.Init.InitialOutput)))) annotation(
|
||||
Placement(visible = true, transformation(origin = {-2.96, 1.52}, extent = {{-34.04, -5.52}, {-11.04, 17.48}}, rotation = 0)));
|
||||
AIDAModelica.ControlDroneNavigation Control_Navigation annotation(
|
||||
Placement(transformation(origin = {-8.1, 6.3}, extent = {{-86.9, -3.3}, {-64.9, 18.7}})));
|
||||
AIDAModelica.RemoteControl remoteControl1(VS_cmd = -0.5, Pitch_cmd = 0.02, VS_cmd_t = {1000, 1001}, Roll_cmd_t = {1000, 1001}, Pitch_cmd_t = {1000, 1001}, Yaw_cmd_t = {1000, 1001}, Auto_Ctl_t = 0.1) annotation(
|
||||
Placement(transformation(origin = {-2, 10}, extent = {{-37, 29}, {-12, 49}})));
|
||||
Requirements.StabilityRequirement stabilityRequirement1(hoverTolerance = 1.5) annotation(
|
||||
Placement(transformation(origin = {-46, -38}, extent = {{-10, -10}, {10, 10}})));
|
||||
AIDAModelica.WindProfile windProfile annotation(
|
||||
Placement(transformation(origin = {16, 44}, extent = {{-10, -10}, {10, 10}})));
|
||||
equation
|
||||
connect(remoteControl1.RollCommand, lowLevelFlightControlSystem1.RCAttitudeCommands[1]) annotation(
|
||||
Line(points = {{-29, 39}, {-29, 29}, {-27, 29}, {-27, 19}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(remoteControl1.PitchCommand, lowLevelFlightControlSystem1.RCAttitudeCommands[2]) annotation(
|
||||
Line(points = {{-24, 39}, {-24, 22}, {-27, 22}, {-27, 19}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(lowLevelFlightControlSystem1.RCVerticalSpeedCommand, remoteControl1.VerticalSpeedCommand) annotation(
|
||||
Line(points = {{-31, 19}, {-31.75, 19}, {-31.75, 39}, {-34, 39}}, color = {0, 0, 127}));
|
||||
connect(remoteControl1.YawCommand, lowLevelFlightControlSystem1.RCYawCommand) annotation(
|
||||
Line(points = {{-19, 39}, {-19, 31}, {-18, 31}, {-18, 20}, {-24, 20}, {-24, 18}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.Attitude[3], stabilityRequirement1.yaw) annotation(
|
||||
Line(points = {{28, 12}, {44, 12}, {44, -38}, {-34, -38}}, color = {0, 0, 127}));
|
||||
connect(Control_Navigation.YawConsign, stabilityRequirement1.yawConsign) annotation(
|
||||
Line(points = {{-44, 14}, {-44, -26}, {-52, -26}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.Position[1], stabilityRequirement1.posX) annotation(
|
||||
Line(points = {{28, 8}, {48, 8}, {48, -32}, {-34, -32}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.Position[2], stabilityRequirement1.posY) annotation(
|
||||
Line(points = {{28, 8}, {48, 8}, {48, -44}, {-34, -44}}, color = {0, 0, 127}));
|
||||
connect(lowLevelFlightControlSystem1.ThrottleCommand1, quadcopterModel1.ThrottleCommand1) annotation(
|
||||
Line(points = {{-14, 14}, {6, 14}}, color = {0, 0, 127}));
|
||||
connect(lowLevelFlightControlSystem1.ThrottleCommand2, quadcopterModel1.ThrottleCommand2) annotation(
|
||||
Line(points = {{-14, 10}, {-5.5, 10}, {-5.5, 9}, {6, 9}}, color = {0, 0, 127}));
|
||||
connect(lowLevelFlightControlSystem1.ThrottleCommand3, quadcopterModel1.ThrottleCommand3) annotation(
|
||||
Line(points = {{-14, 6}, {-5, 6}, {-5, 5}, {6, 5}}, color = {0, 0, 127}));
|
||||
connect(lowLevelFlightControlSystem1.ThrottleCommand4, quadcopterModel1.ThrottleCommand4) annotation(
|
||||
Line(points = {{-14, 0}, {-3.5, 0}, {-3.5, 1}, {6, 1}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.Accelerations, lowLevelFlightControlSystem1.Accelerations) annotation(
|
||||
Line(points = {{28, -1}, {30, -1}, {30, -8}, {-18, -8}, {-18, -4}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.Speed, lowLevelFlightControlSystem1.Speed) annotation(
|
||||
Line(points = {{28, 3}, {32, 3}, {32, -10}, {-22, -10}, {-22, -4}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.Position, lowLevelFlightControlSystem1.Position) annotation(
|
||||
Line(points = {{28, 7}, {34, 7}, {34, -12}, {-26, -12}, {-26, -4}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.Attitude, lowLevelFlightControlSystem1.Attitude) annotation(
|
||||
Line(points = {{28, 12}, {36, 12}, {36, -14}, {-29, -14}, {-29, -4}}, color = {0, 0, 127}));
|
||||
connect(quadcopterModel1.AngularVelocities, lowLevelFlightControlSystem1.AngularSpeed) annotation(
|
||||
Line(points = {{28, 16}, {42, 16}, {42, -16}, {-33, -16}, {-33, -4}}, color = {0, 0, 127}));
|
||||
connect(Control_Navigation.YawConsign, lowLevelFlightControlSystem1.YawConsign) annotation(
|
||||
Line(points = {{-44, 14}, {-45, 14}, {-45, 5}, {-37, 5}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(Control_Navigation.DronPositionConsign[:], lowLevelFlightControlSystem1.DronePositionConsign[:]) annotation(
|
||||
Line(points = {{-49, 14}, {-37, 14}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(lowLevelFlightControlSystem1.SelectedControlMode, Control_Navigation.SelectedControlMode) annotation(
|
||||
Line(points = {{-37, 1}, {-43, 1}, {-43, 6}, {-44, 6}}, color = {255, 0, 255}, thickness = 0.0625));
|
||||
connect(quadcopterModel1.Attitude[3], Control_Navigation.Yaw) annotation(
|
||||
Line(points = {{28, 12}, {40, 12}, {40, 5}, {-98, 5}}, color = {0, 0, 127}));
|
||||
connect(Control_Navigation.DronPositionConsign[1], stabilityRequirement1.DronePositionConsign[1]) annotation(
|
||||
Line(points = {{-44, 22}, {-44, -3}, {-40, -3}, {-40, -26}}, color = {0, 0, 127}, thickness = 0.5));
|
||||
connect(Control_Navigation.DronPositionConsign[2], stabilityRequirement1.DronePositionConsign[2]) annotation(
|
||||
Line(points = {{-44, 22}, {-44, -3}, {-40, -3}, {-40, -26}}, color = {0, 0, 127}, thickness = 0.5));
|
||||
connect(Control_Navigation.DronPositionConsign[3], stabilityRequirement1.DronePositionConsign[3]) annotation(
|
||||
Line(points = {{-44, 22}, {-44, -3}, {-40, -3}, {-40, -26}}, color = {0, 0, 127}, thickness = 0.5));
|
||||
connect(windProfile.Fx, quadcopterModel1.Fx) annotation(
|
||||
Line(points = {{10, 33}, {10, 31.5}, {8, 31.5}, {8, 22}}, color = {0, 0, 127}));
|
||||
connect(windProfile.Fy, quadcopterModel1.Fy) annotation(
|
||||
Line(points = {{23, 33}, {24, 33}, {24, 22}}, color = {0, 0, 127}));
|
||||
connect(remoteControl1.ControlMode, Control_Navigation.APEngagement) annotation(
|
||||
Line(points = {{-38, 44}, {-112, 44}, {-112, 22}, {-98, 22}}, color = {255, 0, 255}));
|
||||
connect(remoteControl1.IndicatorYawConsign, Control_Navigation.IndicatorYawConsign) annotation(
|
||||
Line(points = {{-38, 50}, {-116, 50}, {-116, 14}, {-98, 14}}, color = {255, 0, 255}));
|
||||
annotation(
|
||||
Icon(coordinateSystem(grid = {3, 2})),
|
||||
experiment(StartTime = 0, StopTime = 240, Tolerance = 1e-06, Interval = 0.002),
|
||||
__OpenModelica_simulationFlags(jacobian = "coloredNumerical", s = "dassl", lv = "LOG_STATS"),
|
||||
uses(Modelica(version = "4.0.0")));
|
||||
end AIDA_System;
|
||||
@@ -0,0 +1,4 @@
|
||||
within;
|
||||
package AIDAModelica "AIDA Modelica Libraries"
|
||||
annotation(dateModified="2018-04-03 09:30:06Z");
|
||||
end AIDAModelica;
|
||||
@@ -0,0 +1,32 @@
|
||||
within AIDAModelica;
|
||||
|
||||
model AccelerationToSpeed "Acceleration to speed convector"
|
||||
Modelica.Blocks.Interfaces.RealInput Acceleration[3](each quantity = "Mechanics.Translation.Accel", each displayUnit = "m/s²") "'input Real' as connector" annotation(
|
||||
Placement(transformation(origin = {-26, -30}, extent = {{-120, 10}, {-80, 50}}), iconTransformation(origin = {0, -100}, extent = {{-20, -20}, {20, 20}}, rotation = 90)));
|
||||
Modelica.Blocks.Interfaces.RealOutput Speed[3](each quantity = "Mechanics.Translation.Velocity", each displayUnit = "m/s") "'output Real' as connector" annotation(
|
||||
Placement(transformation(origin = {104, -30}, extent = {{-5, 20}, {15, 40}}), iconTransformation(origin = {0, 100}, extent = {{-10, -10}, {10, 10}}, rotation = 90)));
|
||||
Modelica.Blocks.Continuous.Integrator integrator1 annotation(
|
||||
Placement(transformation(origin = {20, 10}, extent = {{-60, 50}, {-40, 70}})));
|
||||
Modelica.Blocks.Continuous.Integrator integrator2 annotation(
|
||||
Placement(transformation(origin = {20, -30}, extent = {{-60, 20}, {-40, 40}})));
|
||||
Modelica.Blocks.Continuous.Integrator integrator3 annotation(
|
||||
Placement(transformation(origin = {20, -72}, extent = {{-60, -10}, {-40, 10}})));
|
||||
equation
|
||||
connect(integrator1.u, Acceleration[1]) annotation(
|
||||
Line(points = {{-42, 70}, {-95, 70}, {-95, 0}, {-126, 0}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator2.u, Acceleration[2]) annotation(
|
||||
Line(points = {{-42, 0}, {-126, 0}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator3.u, Acceleration[3]) annotation(
|
||||
Line(points = {{-42, -72}, {-94, -72}, {-94, 0}, {-126, 0}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator1.y, Speed[1]) annotation(
|
||||
Line(points = {{-19, 70}, {0, 70}, {0, 0}, {109, 0}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator2.y, Speed[2]) annotation(
|
||||
Line(points = {{-19, 0}, {109, 0}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator3.y, Speed[3]) annotation(
|
||||
Line(points = {{-19, -72}, {35, -72}, {35, 0}, {109, 0}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
annotation(
|
||||
Acceleration(flags = 2),
|
||||
Speed(flags = 2),
|
||||
Icon(graphics = {Rectangle(fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}})}),
|
||||
experiment(StopTime = 1, StartTime = 0, Interval = 0.001));
|
||||
end AccelerationToSpeed;
|
||||
@@ -0,0 +1,230 @@
|
||||
within AIDAModelica;
|
||||
model AcquirePositioningSignal "Acquire Positioning Signal"
|
||||
Modelica.Blocks.Interfaces.RealOutput Measured_positioning_signal[4] "'output Real' as connector" annotation(Placement(
|
||||
transformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}),
|
||||
iconTransformation(extent={{90,-10},{110,10}})));
|
||||
Modelica.Blocks.Interfaces.RealInput Positioning_signal[4] "'input Real' as connector" annotation(Placement(
|
||||
transformation(origin = {-120, 0}, extent = {{-20, -20}, {20, 20}}),
|
||||
iconTransformation(extent={{-120,-20},{-80,20}})));
|
||||
equation
|
||||
// enter your equations here
|
||||
Measured_positioning_signal = Positioning_signal;
|
||||
annotation(Icon(graphics={
|
||||
Rectangle(
|
||||
fillColor={255,255,255},
|
||||
fillPattern=FillPattern.Solid,
|
||||
extent={{-100,100},{100,-100}}),
|
||||
Bitmap(
|
||||
imageSource="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
|
||||
uryBtgAAAABJRU5ErkJggg==",
|
||||
extent={{-100,-100},{100,100}})}));
|
||||
end AcquirePositioningSignal;
|
||||
@@ -0,0 +1,58 @@
|
||||
within AIDAModelica;
|
||||
|
||||
model AllocationControl "Allocation Coltrol Model"
|
||||
// CP: 65001
|
||||
// SimulationX Version: 3.8.2.45319 x64
|
||||
Modelica.Blocks.Interfaces.RealInput TotalThrustAP(quantity = "Mechanics.Translation.Force", displayUnit = "N") "'input Real' as connector" annotation(
|
||||
Placement(transformation(origin = {-46, 20}, extent = {{-95, 40}, {-55, 80}}), iconTransformation(extent = {{-120, 55}, {-80, 95}})));
|
||||
Modelica.Blocks.Interfaces.RealInput TotalThrustManual(quantity = "Mechanics.Translation.Force", displayUnit = "N") "'input Real' as connector" annotation(
|
||||
Placement(transformation(origin = {-48, -18}, extent = {{-95, 0}, {-55, 40}}), iconTransformation(extent = {{-120, 5}, {-80, 45}})));
|
||||
Modelica.Blocks.Interfaces.RealInput MomentumsConsign[3](each quantity = "Mechanics.Rotation.Torque", each displayUnit = "Nm") "'input Real' as connector" annotation(
|
||||
Placement(transformation(origin = {-90, -46}, extent = {{-50, -15}, {-10, 25}}), iconTransformation(extent = {{-120, -45}, {-80, -5}})));
|
||||
Modelica.Blocks.Interfaces.RealOutput Motor1Rate(quantity = "Mechanics.Rotation.RotVelocity", displayUnit = "rpm") "'output Real' as connector" annotation(
|
||||
Placement(transformation(origin = {66, 26}, extent = {{35, 45}, {55, 65}}), iconTransformation(extent = {{90, 65}, {110, 85}})));
|
||||
Modelica.Blocks.Interfaces.RealOutput Motor2Rate(quantity = "Mechanics.Rotation.RotVelocity", displayUnit = "rpm") "'output Real' as connector" annotation(
|
||||
Placement(transformation(origin = {64, 0}, extent = {{35, 30}, {55, 50}}), iconTransformation(extent = {{90, 15}, {110, 35}})));
|
||||
Modelica.Blocks.Interfaces.RealOutput Motor3Rate(quantity = "Mechanics.Rotation.RotVelocity", displayUnit = "rpm") "'output Real' as connector" annotation(
|
||||
Placement(transformation(origin = {66, -60}, extent = {{35, 10}, {55, 30}}), iconTransformation(extent = {{90, -35}, {110, -15}})));
|
||||
Modelica.Blocks.Interfaces.RealOutput Motor4Rate(quantity = "Mechanics.Rotation.RotVelocity", displayUnit = "rpm") "'output Real' as connector" annotation(
|
||||
Placement(transformation(origin = {66, -86}, extent = {{35, -5}, {55, 15}}), iconTransformation(extent = {{90, -85}, {110, -65}})));
|
||||
Modelica.Blocks.Interfaces.BooleanInput SelectedControlMode "'input Boolean' as connector" annotation(
|
||||
Placement(transformation(origin = {-26, 0}, extent = {{-115, 20}, {-75, 60}}), iconTransformation(extent = {{-120, -95}, {-80, -55}})));
|
||||
AIDAModelica.ComputeMotorRate computeMotorRate1 annotation(
|
||||
Placement(visible = true, transformation(extent = {{-5, 20}, {15, 45}}, rotation = 0)));
|
||||
Modelica.Blocks.Logical.Switch SelectTotalThrustConsign annotation(
|
||||
Placement(transformation(extent = {{-50, 30}, {-30, 50}})));
|
||||
equation
|
||||
connect(SelectTotalThrustConsign.y, computeMotorRate1.TotalThrust) annotation(
|
||||
Line(points = {{-29, 40}, {-5, 40}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(computeMotorRate1.Motor4Rate, Motor4Rate) annotation(
|
||||
Line(points = {{15, 25}, {40, 25}, {40, -81}, {111, -81}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(computeMotorRate1.Motor3Rate, Motor3Rate) annotation(
|
||||
Line(points = {{15, 30}, {40, 30}, {40, -40}, {111, -40}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(computeMotorRate1.Motor2Rate, Motor2Rate) annotation(
|
||||
Line(points = {{15, 35}, {40, 35}, {40, 40}, {109, 40}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(computeMotorRate1.Motor1Rate, Motor1Rate) annotation(
|
||||
Line(points = {{15, 40}, {40, 40}, {40, 81}, {111, 81}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(computeMotorRate1.MomentumConsign[:], MomentumsConsign[:]) annotation(
|
||||
Line(points = {{-5, 25}, {-25, 25}, {-25, 5}, {-30, 5}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(SelectTotalThrustConsign.u1, TotalThrustAP) annotation(
|
||||
Line(points = {{-52, 48}, {-70, 48}, {-70, 80}, {-121, 80}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(SelectTotalThrustConsign.u2, SelectedControlMode) annotation(
|
||||
Line(points = {{-52, 40}, {-121, 40}}, color = {255, 0, 255}, thickness = 0.0625));
|
||||
connect(SelectTotalThrustConsign.u3, TotalThrustManual) annotation(
|
||||
Line(points = {{-52, 32}, {-70, 32}, {-70, 2}, {-123, 2}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
annotation(
|
||||
TotalThrustAP(flags = 2),
|
||||
TotalThrustManual(flags = 2),
|
||||
MomentumsConsign(flags = 2),
|
||||
Motor1Rate(flags = 2),
|
||||
Motor2Rate(flags = 2),
|
||||
Motor3Rate(flags = 2),
|
||||
Motor4Rate(flags = 2),
|
||||
SelectedControlMode(flags = 2),
|
||||
computeMotorRate1(TotalThrust(flags = 2), MomentumConsign(flags = 2), Motor1Rate(flags = 2), Motor2Rate(flags = 2), Motor3Rate(flags = 2), Motor4Rate(flags = 2), P4(flags = 2), M4(flags = 2), AngVelVector(flags = 2), TMomVector(flags = 2), ParamCosSin(flags = 2)),
|
||||
SelectTotalThrustConsign(u1(flags = 2), u2(flags = 2), u3(flags = 2), y(flags = 2)),
|
||||
Icon(coordinateSystem(extent = {{-100, -125}, {100, 125}}, initialScale = 0.1), graphics = {Rectangle(fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-100, 126.7}, {100, -126.7}}), Text(origin = {-57, 21}, extent = {{-11, 5}, {105, -39}}, textString = "AllocationControl")}),
|
||||
experiment(StopTime = 1, StartTime = 0, Interval = 0.002, MaxInterval = "0.001"));
|
||||
end AllocationControl;
|
||||
@@ -0,0 +1,94 @@
|
||||
within AIDAModelica;
|
||||
|
||||
model AttitudeControl "Attitude Control Model"
|
||||
// CP: 65001
|
||||
// SimulationX Version: 3.8.2.45319 x64
|
||||
parameter Boolean Test_CstMomentumActiv = false;
|
||||
parameter Boolean Test_open_loop[3] = {false, false, false} "parameter";
|
||||
parameter Real Test_CstMomentumValues[3] = {0.0, 0.0, 0.0};
|
||||
Modelica.Blocks.Interfaces.RealInput AttitudeConsignAP[2](each quantity = "Mechanics.Rotation.Angle", each displayUnit = "rad") "Desired phi and teta angles input" annotation(
|
||||
Placement(visible = true, transformation(extent = {{-166, 23}, {-126, 63}}, rotation = 0), iconTransformation(origin = {-50, 100}, extent = {{-20, -20}, {20, 20}}, rotation = 270)));
|
||||
Modelica.Blocks.Interfaces.RealInput AttitudeRCConsign[2](each quantity = "Mechanics.Rotation.Angle", each displayUnit = "rad") "Desired phi and teta angles input sac" annotation(
|
||||
Placement(visible = true,transformation(extent = {{-163, -45}, {-123, -5}}, rotation = 0), iconTransformation(extent = {{-120, -20}, {-80, 20}}, rotation = 0)));
|
||||
Modelica.Blocks.Interfaces.RealInput YawConsign(quantity = "Mechanics.Rotation.Angle", displayUnit = "rad") "Desired yaw angle input" annotation(
|
||||
Placement(transformation(extent = {{-80, -70}, {-40, -30}}), iconTransformation(extent = {{-120, -70}, {-80, -30}})));
|
||||
Modelica.Blocks.Interfaces.RealInput AngularSpeed[3](each quantity = "Mechanics.Rotation.RotVelocity", each displayUnit = "rad/s") "Real angular velocities feedback input" annotation(
|
||||
Placement(transformation(origin = {-50, 2}, extent = {{-89.7, 58}, {-49.7, 98}}), iconTransformation(origin = {-50, -100}, extent = {{-20, -20}, {20, 20}}, rotation = 90)));
|
||||
Modelica.Blocks.Interfaces.RealInput Attitude[3](each quantity = "Mechanics.Rotation.Angle", each displayUnit = "rad") "Real attitude feedback input" annotation(
|
||||
Placement(transformation(origin = {-122, -124}, extent = {{-40, 45}, {0, 85}}), iconTransformation(origin = {0, -100}, extent = {{-20, -20}, {20, 20}}, rotation = 90)));
|
||||
Modelica.Blocks.Interfaces.RealOutput MomentumsConsign[3](each quantity = "Mechanics.Rotation.Torque", each displayUnit = "Nm") "Desired moments output" annotation(
|
||||
Placement(transformation(origin = {10, 4}, extent = {{90, -15}, {110, 5}}), iconTransformation(extent = {{90, -10}, {110, 10}})));
|
||||
Modelica.Blocks.Interfaces.RealInput RCYawCommand(quantity = "Mechanics.Rotation.Angle", displayUnit = "rad") "RC yaw angle input" annotation(
|
||||
Placement(transformation(extent = {{-80, -100}, {-40, -60}}), iconTransformation(origin = {-100, 50}, extent = {{-20, -20}, {20, 20}})));
|
||||
Modelica.Blocks.Interfaces.BooleanInput SelectedControlMode "'input Boolean' as connector" annotation(
|
||||
Placement(visible = true, transformation(extent = {{-164, -11}, {-124, 29}}, rotation = 0), iconTransformation(origin = {50, -100}, extent = {{-20, -20}, {20, 20}}, rotation = -270)));
|
||||
AIDAModelica.ControlRollAngle controlRollAngle1(xAngularSpeedErrorModel1(Kwphi = 3), PID(k = 0.09, Ti = 1.5, Td = 0.03, Add(k1 = 1, k2 = 1, k3 = 1))) annotation(
|
||||
Placement(visible = true, transformation(extent = {{49, -8}, {69, 12}}, rotation = 0)));
|
||||
AIDAModelica.ControlPitchAngle controlPitchAngle1(yAngularSpeedErrorModel1(Kwteta = 1.5), PID1(Add(k1 = 1, k2 = 1, k3 = 1))) annotation(
|
||||
Placement(visible = true, transformation(extent = {{49, 20}, {69, 40}}, rotation = 0)));
|
||||
AIDAModelica.ControlYawAngle controlYawAngle1(PID2(k = 0.05, Ti = 2, Td = 0.03, Add(k1 = 1, k2 = 1, k3 = 1))) annotation(
|
||||
Placement(visible = true, transformation(extent = {{48, -37}, {68, -17}}, rotation = 0)));
|
||||
Modelica.Blocks.Logical.Switch SelectRollConsign annotation(
|
||||
Placement(visible = true, transformation(extent = {{-56, -20}, {-36, 0}}, rotation = 0)));
|
||||
Modelica.Blocks.Logical.Switch SelectPitchConsign annotation(
|
||||
Placement(visible = true, transformation(extent = {{-56, 17}, {-36, 37}}, rotation = 0)));
|
||||
Modelica.Blocks.Math.Add computeYawConsign annotation(
|
||||
Placement(transformation(extent = {{-35, -75}, {-15, -55}})));
|
||||
equation
|
||||
connect(SelectRollConsign.u1, AttitudeConsignAP[1]) annotation(
|
||||
Line(points = {{-58, -2}, {-106, -2}, {-106, 43}, {-146, 43}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(SelectRollConsign.u2, SelectedControlMode) annotation(
|
||||
Line(points = {{-58, -10}, {-78, -10}, {-78, 9}, {-144, 9}}, color = {255, 0, 255}, thickness = 0.0625));
|
||||
connect(SelectRollConsign.u3, AttitudeRCConsign[1]) annotation(
|
||||
Line(points = {{-58, -18}, {-94, -18}, {-94, -25}, {-143, -25}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(controlRollAngle1.RollConsign, SelectRollConsign.y) annotation(
|
||||
Line(points = {{49, 7}, {8, 7}, {8, -10}, {-35, -10}}, color = {0, 0, 127}));
|
||||
connect(SelectPitchConsign.u1, AttitudeConsignAP[2]) annotation(
|
||||
Line(points = {{-58, 35}, {-106, 35}, {-106, 43}, {-146, 43}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(SelectPitchConsign.u2, SelectedControlMode) annotation(
|
||||
Line(points = {{-58, 27}, {-78, 27}, {-78, 9}, {-144, 9}}, color = {255, 0, 255}, thickness = 0.0625));
|
||||
connect(SelectPitchConsign.u3, AttitudeRCConsign[2]) annotation(
|
||||
Line(points = {{-58, 19}, {-94, 19}, {-94, -25}, {-143, -25}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(controlPitchAngle1.PitchCosign, SelectPitchConsign.y) annotation(
|
||||
Line(points = {{49, 35}, {22, 35}, {22, 27}, {-35, 27}}, color = {0, 0, 127}));
|
||||
connect(controlYawAngle1.YawConsign, computeYawConsign.y) annotation(
|
||||
Line(points = {{48, -22}, {-9, -22}, {-9, -65}, {-14, -65}}, color = {0, 0, 127}));
|
||||
// la sortie est soit celle caclulée par le contrôleur soit fixée selon la valeur du paramètre Test_CstMomentumActiv et Test_CstMomentumValues
|
||||
MomentumsConsign[3] = if Test_CstMomentumActiv then Test_CstMomentumValues[3] else controlYawAngle1.MomentumZ;
|
||||
MomentumsConsign[2] = if Test_CstMomentumActiv then Test_CstMomentumValues[2] else controlPitchAngle1.MomentumY;
|
||||
MomentumsConsign[1] = if Test_CstMomentumActiv then Test_CstMomentumValues[1] else controlRollAngle1.MomentumX;
|
||||
controlRollAngle1.AngularSpeedX = if Test_open_loop[1] then 0 else AngularSpeed[1] annotation(
|
||||
Line(points = {{36, 18}, {-25, 18}, {-25, 35}, {-30, 35}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
controlRollAngle1.Roll = if Test_open_loop[1] then 0 else Attitude[1] annotation(
|
||||
Line(points = {{36, 23}, {4, 23}, {4, 36}, {-4, 36}}, color = {0, 0, 127}));
|
||||
controlYawAngle1.AngularSpeedZ = if Test_open_loop[3] then 0 else AngularSpeed[3] annotation(
|
||||
Line(points = {{36, -34}, {-25, -34}, {-25, 35}, {-30, 35}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
controlYawAngle1.Yaw = if Test_open_loop[3] then 0 else Attitude[3] annotation(
|
||||
Line(points = {{36, -29}, {2, -29}, {2, 36}, {-4, 36}}, color = {0, 0, 127}));
|
||||
controlPitchAngle1.AngularSpeedY = if Test_open_loop[2] then 0 else AngularSpeed[2] annotation(
|
||||
Line(points = {{36, -8}, {-25, -8}, {-25, 35}, {-30, 35}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
controlPitchAngle1.Pitch = if Test_open_loop[2] then 0 else Attitude[2] annotation(
|
||||
Line(points = {{36, -3}, {2, -3}, {2, 36}, {-4, 36}}, color = {0, 0, 127}));
|
||||
connect(computeYawConsign.u2, RCYawCommand) annotation(
|
||||
Line(points = {{-37, -71}, {-42, -71}, {-55, -71}, {-55, -80}, {-60, -80}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(computeYawConsign.u1, YawConsign) annotation(
|
||||
Line(points = {{-37, -59}, {-42, -59}, {-55, -59}, {-55, -50}, {-60, -50}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
annotation(
|
||||
AttitudeConsignAP(flags = 2),
|
||||
AttitudeRCConsign(flags = 2),
|
||||
YawConsign(flags = 2),
|
||||
AngularSpeed(flags = 2),
|
||||
Attitude(flags = 2),
|
||||
MomentumsConsign(flags = 2),
|
||||
RCYawCommand(flags = 2),
|
||||
SelectedControlMode(flags = 2),
|
||||
controlRollAngle1(RollConsign(flags = 2), Roll(flags = 2), AngularSpeedX(flags = 2), MomentumX(flags = 2), xAngularSpeedErrorModel1(RollConsign(flags = 2), Roll(flags = 2), AngularSpeedX(flags = 2), AngularSpeedXError(flags = 2), ephi(flags = 2), wxd(flags = 2)), PID(u(flags = 2), y(flags = 2), P(u(flags = 2), y(flags = 2)), I(u(flags = 2), y(flags = 2)), D(u(flags = 2), y(flags = 2), x(flags = 2)), Gain(u(flags = 2), y(flags = 2)), Add(u1(flags = 2), u2(flags = 2), u3(flags = 2), y(flags = 2)))),
|
||||
controlPitchAngle1(PitchCosign(flags = 2), Pitch(flags = 2), AngularSpeedY(flags = 2), MomentumY(flags = 2), yAngularSpeedErrorModel1(PitchCosign(flags = 2), Pitch(flags = 2), AngularSpeedY(flags = 2), AngularSpeedYError(flags = 2), eteta(flags = 2), wyd(flags = 2)), PID1(u(flags = 2), y(flags = 2), P(u(flags = 2), y(flags = 2)), I(u(flags = 2), y(flags = 2)), D(u(flags = 2), y(flags = 2), x(flags = 2)), Gain(u(flags = 2), y(flags = 2)), Add(u1(flags = 2), u2(flags = 2), u3(flags = 2), y(flags = 2)))),
|
||||
controlYawAngle1(YawConsign(flags = 2), Yaw(flags = 2), AngularSpeedZ(flags = 2), MomentumZ(flags = 2), zAngularSpeedErrorModel1(YawCosign(flags = 2), Yaw(flags = 2), AngularSpeedZ(flags = 2), AngularSpeedZError(flags = 2), eyaw(flags = 2), wzd(flags = 2)), PID2(u(flags = 2), y(flags = 2), P(u(flags = 2), y(flags = 2)), I(u(flags = 2), y(flags = 2)), D(u(flags = 2), y(flags = 2), x(flags = 2)), Gain(u(flags = 2), y(flags = 2)), Add(u1(flags = 2), u2(flags = 2), u3(flags = 2), y(flags = 2)))),
|
||||
SelectRollConsign(u1(flags = 2), u2(flags = 2), u3(flags = 2), y(flags = 2)),
|
||||
SelectPitchConsign(u1(flags = 2), u2(flags = 2), u3(flags = 2), y(flags = 2)),
|
||||
computeYawConsign(u1(flags = 2), u2(flags = 2), y(flags = 2)),
|
||||
Icon(graphics = {Rectangle(fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Text(textString = "Control Attitude", fillPattern = FillPattern.None, extent = {{-29, 11}, {29, -11}}, origin = {1, 3})}),
|
||||
experiment(StopTime = 30, StartTime = 0, Interval = 0.002, Tolerance = 1e-06),
|
||||
__OpenModelica_simulationFlags(jacobian = "coloredNumerical", s = "dassl", lv = "LOG_STATS"));
|
||||
end AttitudeControl;
|
||||
@@ -0,0 +1,35 @@
|
||||
within AIDAModelica;
|
||||
|
||||
model ComputationAccelerationModel "Computation Acceleration Model"
|
||||
// CP: 65001
|
||||
// SimulationX Version: 3.8.2.45319 x64
|
||||
Modelica.Blocks.Interfaces.RealInput TotalThrust(quantity = "Mechanics.Rotation.Torque", displayUnit = "Nm") "'input Real' as connector" annotation(
|
||||
Placement(transformation(origin = {-66, -14}, extent = {{-75, 15}, {-35, 55}}), iconTransformation(extent = {{-95, 5}, {-55, 45}})));
|
||||
Modelica.Blocks.Interfaces.RealInput Attitude[3](each quantity = "Mechanics.Rotation.Angle", each displayUnit = "rad") "'input Real' as connector" annotation(
|
||||
Placement(transformation(origin = {-66, 6}, extent = {{-75, 55}, {-35, 95}}), iconTransformation(origin = {-25, 75}, extent = {{-20, -20}, {20, 20}})));
|
||||
Modelica.Blocks.Interfaces.RealOutput DroneAcceleration[3](each quantity = "Mechanics.Translation.Accel", each displayUnit = "m/s²") "'output Real' as connector" annotation(
|
||||
Placement(transformation(origin = {34, 26}, extent = {{65, -15}, {85, 5}}), iconTransformation(extent = {{61.7, -10}, {81.7, 10}})));
|
||||
Modelica.Blocks.Interfaces.RealInput ExternalForce[3] "'input Real' as connector" annotation(
|
||||
Placement(transformation(origin = {-80, -20}, extent = {{-60, -40}, {-20, 0}}), iconTransformation(extent = {{-95, -45}, {-55, -5}})));
|
||||
parameter Real m(quantity = "Basics.Mass", displayUnit = "kg") = 1.8 "Quadcopter mass";
|
||||
parameter Real g(quantity = "Mechanics.Translation.Accel", displayUnit = "m/s²") = 9.8 "Parameter g";
|
||||
parameter Real e3[3] = {0, 0, 1} "Unit vector";
|
||||
Real Reb[3, 3] "From the ABCF to the EFCF rotation matrix";
|
||||
Real Rz[3, 3] "Z rotation matrix";
|
||||
Real Ry[3, 3] "Y rotation matrix";
|
||||
Real Rx[3, 3] "X rotation matrix";
|
||||
equation
|
||||
// enter your equations here
|
||||
Rz = {{cos(Attitude[3]), sin(Attitude[3]), 0}, {-sin(Attitude[3]), cos(Attitude[3]), 0}, {0, 0, 1}};
|
||||
Ry = {{cos(Attitude[2]), 0, -sin(Attitude[2])}, {0, 1, 0}, {sin(Attitude[2]), 0, cos(Attitude[2])}};
|
||||
Rx = {{1, 0, 0}, {0, cos(Attitude[1]), sin(Attitude[1])}, {0, -sin(Attitude[1]), cos(Attitude[1])}};
|
||||
Reb = transpose(Rz) * transpose(Ry) * transpose(Rx);
|
||||
DroneAcceleration = g * e3 - TotalThrust / m * Reb * e3 + ExternalForce / m;
|
||||
annotation(
|
||||
TotalThrust(flags = 2),
|
||||
Attitude(flags = 2),
|
||||
DroneAcceleration(flags = 2),
|
||||
ExternalForce(flags = 2),
|
||||
Icon(coordinateSystem(extent = {{-75, -75}, {75, 75}}, initialScale = 0.1), graphics = {Rectangle(fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-76.7, 76.7}, {80, -76.7}}), Text(origin = {-6, 4}, extent = {{-12, 6}, {12, -6}}, textString = "%name")}),
|
||||
experiment(StopTime = 1, StartTime = 0, Interval = 0.002, MaxInterval = "0.001"));
|
||||
end ComputationAccelerationModel;
|
||||
@@ -0,0 +1,17 @@
|
||||
within AIDAModelica;
|
||||
|
||||
model ComputationAngularAccelerationModel "Computation Angular Acceleration Model"
|
||||
import Modelica.Math;
|
||||
Modelica.Blocks.Interfaces.RealInput Moments[3](each quantity = "Mechanics.Rotation.Torque", each displayUnit = "Nm") "'input Real' as connector" annotation(
|
||||
Placement(transformation(origin = {-120, 0}, extent = {{-20, -20}, {20, 20}}), iconTransformation(extent = {{-95, -20}, {-55, 20}})));
|
||||
Modelica.Blocks.Interfaces.RealOutput DroneAngularAcceleration[3](each quantity = "Mechanics.Rotation.RotAccel", each displayUnit = "rad/s²") "'output Real' as connector" annotation(
|
||||
Placement(transformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}), iconTransformation(extent = {{61.7, -10}, {81.7, 10}})));
|
||||
parameter Real J[3, 3] = {{0.009074, 0, 0}, {0, 0.009074, 0}, {0, 0, 0.013279}} "Diagonal matrix of inertia";
|
||||
Real invJ[3, 3] "Inverse of matrix J";
|
||||
equation
|
||||
// enter your equations here
|
||||
invJ = Modelica.Math.Matrices.inv(J);
|
||||
DroneAngularAcceleration = invJ * Moments;
|
||||
annotation(
|
||||
Icon(coordinateSystem(extent = {{-75, -50}, {75, 50}}, initialScale = 0.1), graphics = {Rectangle(fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-76.7, 50}, {76.7, -50}}), Text(origin = {-5, 4}, extent = {{-11, 6}, {11, -6}}, textString = "%name")}));
|
||||
end ComputationAngularAccelerationModel;
|
||||
@@ -0,0 +1,27 @@
|
||||
within AIDAModelica;
|
||||
|
||||
model ComputationChangeAngleVelocity "Computation ChangeAngle Velocity"
|
||||
// CP: 65001
|
||||
// SimulationX Version: 3.8.2.45319 x64
|
||||
Modelica.Blocks.Interfaces.RealInput DronAngularVelocities[3](each quantity = "Mechanics.Rotation.RotVelocity", each displayUnit = "rad/s") "'input Real' as connector" annotation(
|
||||
Placement(transformation(origin = {-120, 60}, extent = {{-20, -20}, {20, 20}}), iconTransformation(extent = {{-95, 5}, {-55, 45}})));
|
||||
Modelica.Blocks.Interfaces.RealInput Attitude[3](each quantity = "Mechanics.Rotation.Angle", each displayUnit = "rad") "'input Real' as connector" annotation(
|
||||
Placement(transformation(origin = {-120, -60}, extent = {{-20, -20}, {20, 20}}), iconTransformation(origin = {-75, -25}, extent = {{-20, -20}, {20, 20}})));
|
||||
Modelica.Blocks.Interfaces.RealOutput ChangeAngleVelocity[3](each quantity = "Mechanics.Rotation.RotVelocity", each displayUnit = "rad/s") "'output Real' as connector" annotation(
|
||||
Placement(transformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}), iconTransformation(extent = {{61.7, -10}, {81.7, 10}})));
|
||||
Real W[3, 3] "Matrix W";
|
||||
equation
|
||||
// enter your equations here
|
||||
W[1, 1] = 1;
|
||||
W[1, 2] = tan(Attitude[2]) * sin(Attitude[1]);
|
||||
W[1, 3] = tan(Attitude[2]) * cos(Attitude[1]);
|
||||
W[2, 1] = 0;
|
||||
W[2, 2] = cos(Attitude[1]);
|
||||
W[2, 3] = -sin(Attitude[1]);
|
||||
W[3, 1] = 0;
|
||||
W[3, 2] = sin(Attitude[1]) / cos(Attitude[2]);
|
||||
W[3, 3] = cos(Attitude[1]) * cos(Attitude[2]);
|
||||
ChangeAngleVelocity = W * DronAngularVelocities;
|
||||
annotation(
|
||||
Icon(coordinateSystem(extent = {{-75, -75}, {75, 75}}, initialScale = 0.1), graphics = {Rectangle(fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-80, 76.7}, {76.7, -76.7}}), Text(origin = {-5, 1}, extent = {{-19, 7}, {19, -7}}, textString = "%name")}));
|
||||
end ComputationChangeAngleVelocity;
|
||||
@@ -0,0 +1,40 @@
|
||||
within AIDAModelica;
|
||||
|
||||
model ComputeAltitudeConsign "[SF2.4.1] Compute altitude consign"
|
||||
// CP: 65001
|
||||
// SimulationX Version: 3.8.2.45319 x64
|
||||
Modelica.Blocks.Interfaces.RealInput RCVerticalSpeedCommand(quantity = "Mechanics.Translation.Velocity", displayUnit = "m/s") "RC vertical speed consign" annotation(
|
||||
Placement(transformation(origin = {10, 16}, extent = {{-150, 25}, {-110, 65}}), iconTransformation(extent = {{-120, 30}, {-80, 70}})));
|
||||
Modelica.Blocks.Interfaces.RealInput VSpeed(quantity = "Mechanics.Translation.Velocity", displayUnit = "m/s") "Real drone speed feedback" annotation(
|
||||
Placement(transformation(origin = {10, -46}, extent = {{-150, -35}, {-110, 5}}), iconTransformation(extent = {{-120, -70}, {-80, -30}})));
|
||||
Modelica.Blocks.Interfaces.RealOutput AccelerationConsign(quantity = "Mechanics.Translation.Accel", displayUnit = "m/s²") "Drone acceleration consign " annotation(
|
||||
Placement(transformation(origin = {36, -36}, extent = {{65, 25}, {85, 45}}), iconTransformation(extent = {{90, -10}, {110, 10}})));
|
||||
Modelica.Blocks.Continuous.PID PID1(k = 250, Ti = 1.5, Td = 0.02, initType = Modelica.Blocks.Types.Init.NoInit) annotation(
|
||||
Placement(transformation(origin = {8, -36}, extent = {{15, 25}, {35, 45}})));
|
||||
AIDAModelica.SpeedErrorModelSAC speedErrorModelSAC1 annotation(
|
||||
Placement(transformation(origin = {14, -40}, extent = {{-55, 30}, {-35, 50}})));
|
||||
equation
|
||||
connect(speedErrorModelSAC1.SpeedError, PID1.u) annotation(
|
||||
Line(points = {{-21, 0}, {8, 0}, {8, -1}, {21, -1}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(RCVerticalSpeedCommand, speedErrorModelSAC1.SpeedConsign) annotation(
|
||||
Line(points = {{-120, 61}, {-60, 61}, {-60, 0}, {-41, 0}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(VSpeed, speedErrorModelSAC1.Speed) annotation(
|
||||
Line(points = {{-120, -61}, {-31, -61}, {-31, -10}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(PID1.y, AccelerationConsign) annotation(
|
||||
Line(points = {{44, -1}, {111, -1}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
annotation(
|
||||
Speed(flags = 2),
|
||||
RCVerticalSpeedCommand(flags = 2),
|
||||
AccelerationConsign(flags = 2),
|
||||
PID1(u(flags = 2), y(flags = 2), P(u(flags = 2), y(flags = 2)), I(u(flags = 2), y(flags = 2)), D(u(flags = 2), y(flags = 2), x(flags = 2)), Gain(u(flags = 2), y(flags = 2)), Add(u1(flags = 2), u2(flags = 2), u3(flags = 2), y(flags = 2))),
|
||||
speedErrorModelSAC1(SpeedConsign(flags = 2), Speed(flags = 2), SpeedError(flags = 2), vzd(flags = 2), vz(flags = 2), ASE(flags = 2)),
|
||||
Icon(graphics = {Rectangle(fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}})}),
|
||||
experiment(StopTime = 1, StartTime = 0, Interval = 0.002, MaxInterval = "0.001"),
|
||||
Speed(flags = 2),
|
||||
RCVerticalSpeedCommand(flags = 2),
|
||||
AccelerationConsign(flags = 2),
|
||||
PID1(u(flags = 2), y(flags = 2), P(u(flags = 2), y(flags = 2)), I(u(flags = 2), y(flags = 2)), D(u(flags = 2), y(flags = 2), x(flags = 2)), Gain(u(flags = 2), y(flags = 2)), Add(u1(flags = 2), u2(flags = 2), u3(flags = 2), y(flags = 2))),
|
||||
speedErrorModelSAC1(SpeedConsign(flags = 2), Speed(flags = 2), SpeedError(flags = 2), vzd(flags = 2), vz(flags = 2), ASE(flags = 2)),
|
||||
Icon(graphics = {Rectangle(fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Text(origin = {-1, 4}, extent = {{-35, 10}, {35, -10}}, textString = "%name")}, coordinateSystem(initialScale = 0.1)),
|
||||
experiment(StopTime = 1, StartTime = 0, Interval = 0.002, MaxInterval = "0.001"));
|
||||
end ComputeAltitudeConsign;
|
||||
@@ -0,0 +1,39 @@
|
||||
within AIDAModelica;
|
||||
|
||||
model ComputeDroneAngularsVelocities "[SimuD4 DM] Compute drone angulars velocities"
|
||||
Modelica.Blocks.Interfaces.RealInput Moments[3](each quantity = "Mechanics.Rotation.Torque", each displayUnit = "Nm") "'input Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{-120, 20}, {-80, 60}}), iconTransformation(extent = {{-95, -20}, {-55, 20}})));
|
||||
Modelica.Blocks.Interfaces.RealOutput DroneAngularVelocities[3](each quantity = "Mechanics.Translation.Velocity", each displayUnit = "m/s") "'output Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{90, 30}, {110, 50}}), iconTransformation(extent = {{61.7, -10}, {81.7, 10}})));
|
||||
ComputationAngularAccelerationModel computationAngularAccelerationModel1 annotation(
|
||||
Placement(transformation(extent = {{-40, 35}, {-25, 45}})));
|
||||
Modelica.Blocks.Continuous.Integrator integrator1 annotation(
|
||||
Placement(transformation(extent = {{40, 60}, {60, 80}})));
|
||||
Modelica.Blocks.Continuous.Integrator integrator2 annotation(
|
||||
Placement(transformation(extent = {{40, 30}, {60, 50}})));
|
||||
Modelica.Blocks.Continuous.Integrator integrator3 annotation(
|
||||
Placement(transformation(extent = {{40, 0}, {60, 20}})));
|
||||
equation
|
||||
connect(computationAngularAccelerationModel1.Moments[:], Moments[:]) annotation(
|
||||
Line(points = {{-40, 40}, {-45, 40}, {-95, 40}, {-100, 40}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator1.u, computationAngularAccelerationModel1.DroneAngularAcceleration[1]) annotation(
|
||||
Line(points = {{38, 70}, {33, 70}, {-20.3, 70}, {-20.3, 40}, {-25.3, 40}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator2.u, computationAngularAccelerationModel1.DroneAngularAcceleration[2]) annotation(
|
||||
Line(points = {{38, 40}, {33, 40}, {-20.3, 40}, {-25.3, 40}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator3.u, computationAngularAccelerationModel1.DroneAngularAcceleration[3]) annotation(
|
||||
Line(points = {{38, 10}, {33, 10}, {-20.3, 10}, {-20.3, 40.3}, {-25.3, 40.3}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator1.y, DroneAngularVelocities[1]) annotation(
|
||||
Line(points = {{61, 70}, {66, 70}, {95, 70}, {95, 40}, {100, 40}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator2.y, DroneAngularVelocities[2]) annotation(
|
||||
Line(points = {{61, 40}, {66, 40}, {95, 40}, {100, 40}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator3.y, DroneAngularVelocities[3]) annotation(
|
||||
Line(points = {{61, 10}, {66, 10}, {95, 10}, {95, 40}, {100, 40}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
annotation(
|
||||
Moments(flags = 2),
|
||||
DroneAngularVelocities(flags = 2),
|
||||
integrator1(u(flags = 2), y(flags = 2)),
|
||||
integrator2(u(flags = 2), y(flags = 2)),
|
||||
integrator3(u(flags = 2), y(flags = 2)),
|
||||
Icon(coordinateSystem(extent = {{-75, -50}, {75, 50}}, initialScale = 0.1), graphics = {Rectangle(fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-76.7, 50}, {76.7, -50}}), Text(origin = {-13, 4}, extent = {{-13, 4}, {13, -4}}, textString = "%name")}),
|
||||
experiment(StopTime = 1, StartTime = 0, Interval = 0.001));
|
||||
end ComputeDroneAngularsVelocities;
|
||||
@@ -0,0 +1,47 @@
|
||||
within AIDAModelica;
|
||||
|
||||
model ComputeDroneAttitude "[SimuD6 KM] Compute drone attitude"
|
||||
// CP: 65001
|
||||
// SimulationX Version: 3.8.2.45319 x64
|
||||
Modelica.Blocks.Interfaces.RealInput DroneAngularVelocities[3](each quantity = "Mechanics.Rotation.RotVelocity", each displayUnit = "rad/s") "'input Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{-135, 5}, {-95, 45}}), iconTransformation(extent = {{-95, -20}, {-55, 20}})));
|
||||
Modelica.Blocks.Interfaces.RealInput AttitudeFB[3](each quantity = "Mechanics.Rotation.Angle", each displayUnit = "rad") "'input Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{-135, -25}, {-95, 15}}), iconTransformation(origin = {-25, -50}, extent = {{-20, -20}, {20, 20}}, rotation = -270)));
|
||||
Modelica.Blocks.Interfaces.RealOutput Attitude[3](each quantity = "Mechanics.Rotation.Angle", each displayUnit = "rad") "'output Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{75, 5}, {95, 25}}), iconTransformation(extent = {{61.7, -10}, {81.7, 10}})));
|
||||
ComputationChangeAngleVelocity computationChangeAngleVelocity1 annotation(
|
||||
Placement(transformation(extent = {{-60, 10}, {-45, 25}})));
|
||||
Modelica.Blocks.Continuous.Integrator integrator7 annotation(
|
||||
Placement(transformation(extent = {{10, 35}, {30, 55}})));
|
||||
Modelica.Blocks.Continuous.Integrator integrator8 annotation(
|
||||
Placement(transformation(extent = {{10, 5}, {30, 25}})));
|
||||
Modelica.Blocks.Continuous.Integrator integrator9 annotation(
|
||||
Placement(transformation(extent = {{10, -25}, {30, -5}})));
|
||||
equation
|
||||
connect(computationChangeAngleVelocity1.DronAngularVelocities[:], DroneAngularVelocities[:]) annotation(
|
||||
Line(points = {{-60, 20}, {-65, 20}, {-110, 20}, {-110, 25}, {-115, 25}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator7.u, computationChangeAngleVelocity1.ChangeAngleVelocity[1]) annotation(
|
||||
Line(points = {{8, 45}, {3, 45}, {-40.3, 45}, {-40.3, 17.3}, {-45.3, 17.3}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator8.u, computationChangeAngleVelocity1.ChangeAngleVelocity[2]) annotation(
|
||||
Line(points = {{8, 15}, {3, 15}, {-40.3, 15}, {-40.3, 17.3}, {-45.3, 17.3}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator9.u, computationChangeAngleVelocity1.ChangeAngleVelocity[3]) annotation(
|
||||
Line(points = {{8, -15}, {3, -15}, {-40.3, -15}, {-40.3, 17.7}, {-45.3, 17.7}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator7.y, Attitude[1]) annotation(
|
||||
Line(points = {{31, 45}, {36, 45}, {80, 45}, {80, 15}, {85, 15}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator8.y, Attitude[2]) annotation(
|
||||
Line(points = {{31, 15}, {36, 15}, {80, 15}, {85, 15}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator9.y, Attitude[3]) annotation(
|
||||
Line(points = {{31, -15}, {36, -15}, {80, -15}, {80, 15}, {85, 15}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(computationChangeAngleVelocity1.Attitude[:], AttitudeFB[:]) annotation(
|
||||
Line(points = {{-60, 15}, {-65, 15}, {-110, 15}, {-110, -5}, {-115, -5}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
annotation(
|
||||
DroneAngularVelocities(flags = 2),
|
||||
AttitudeFB(flags = 2),
|
||||
Attitude(flags = 2),
|
||||
computationChangeAngleVelocity1(DronAngularVelocities(flags = 2), Attitude(flags = 2), ChangeAngleVelocity(flags = 2), W(flags = 2)),
|
||||
integrator7(u(flags = 2), y(flags = 2)),
|
||||
integrator8(u(flags = 2), y(flags = 2)),
|
||||
integrator9(u(flags = 2), y(flags = 2)),
|
||||
Icon(coordinateSystem(extent = {{-75, -50}, {75, 50}}, initialScale = 0.1), graphics = {Rectangle(fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-76.7, 50}, {76.7, -50}}), Text(origin = {-3, 3}, extent = {{-13, 5}, {13, -5}}, textString = "%name")}),
|
||||
experiment(StopTime = 1, StartTime = 0, Interval = 0.002, MaxInterval = "0.001"));
|
||||
end ComputeDroneAttitude;
|
||||
@@ -0,0 +1,37 @@
|
||||
within AIDAModelica;
|
||||
|
||||
model ComputeDronePosition "[SimuD5 KM] Compute drone position"
|
||||
// CP: 65001
|
||||
// SimulationX Version: 3.8.2.45319 x64
|
||||
Modelica.Blocks.Interfaces.RealInput DronVelocity[3](each quantity = "Mechanics.Translation.Velocity", each displayUnit = "m/s") "'input Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{-125, -15}, {-85, 25}}), iconTransformation(extent = {{-95, -20}, {-55, 20}})));
|
||||
Modelica.Blocks.Interfaces.RealOutput Position[3](each quantity = "Mechanics.Translation.Displace", each displayUnit = "m") "'output Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{50, -5}, {70, 15}}), iconTransformation(extent = {{61.7, -10}, {81.7, 10}})));
|
||||
Modelica.Blocks.Continuous.Integrator integrator10(y_start = -0.5) annotation(
|
||||
Placement(transformation(extent = {{-20, -35}, {0, -15}})));
|
||||
Modelica.Blocks.Continuous.Integrator integrator11(y_start = 39) annotation(
|
||||
Placement(transformation(extent = {{-20, -5}, {0, 15}})));
|
||||
Modelica.Blocks.Continuous.Integrator integrator12 annotation(
|
||||
Placement(transformation(extent = {{-20, 25}, {0, 45}})));
|
||||
equation
|
||||
connect(integrator12.u, DronVelocity[1]) annotation(
|
||||
Line(points = {{-22, 35}, {-27, 35}, {-100, 35}, {-100, 5}, {-105, 5}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator11.u, DronVelocity[2]) annotation(
|
||||
Line(points = {{-22, 5}, {-27, 5}, {-100, 5}, {-105, 5}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator10.u, DronVelocity[3]) annotation(
|
||||
Line(points = {{-22, -25}, {-27, -25}, {-100, -25}, {-100, 5}, {-105, 5}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator12.y, Position[1]) annotation(
|
||||
Line(points = {{1, 35}, {6, 35}, {55, 35}, {55, 5}, {60, 5}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator11.y, Position[2]) annotation(
|
||||
Line(points = {{1, 5}, {6, 5}, {55, 5}, {60, 5}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator10.y, Position[3]) annotation(
|
||||
Line(points = {{1, -25}, {6, -25}, {55, -25}, {55, 5}, {60, 5}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
annotation(
|
||||
DronVelocity(flags = 2),
|
||||
Position(flags = 2),
|
||||
integrator10(u(flags = 2), y(flags = 2)),
|
||||
integrator11(u(flags = 2), y(flags = 2)),
|
||||
integrator12(u(flags = 2), y(flags = 2)),
|
||||
Icon(coordinateSystem(extent = {{-75, -50}, {75, 50}}, initialScale = 0.1), graphics = {Rectangle(fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-76.7, 50}, {76.7, -50}}), Text(origin = {-5, 1}, extent = {{-11, 5}, {11, -5}}, textString = "%name")}),
|
||||
experiment(StopTime = 1, StartTime = 0, Interval = 0.001));
|
||||
end ComputeDronePosition;
|
||||
@@ -0,0 +1,57 @@
|
||||
within AIDAModelica;
|
||||
|
||||
model ComputeDroneVelocity "[SimuD3 DM] Compute drone velocity"
|
||||
// CP: 65001
|
||||
// SimulationX Version: 3.8.2.45319 x64
|
||||
Modelica.Blocks.Interfaces.RealInput TotalThrust(quantity = "Mechanics.Translation.Force", displayUnit = "N") "'input Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{-75, 25}, {-35, 65}}), iconTransformation(extent = {{-120, 5}, {-80, 45}})));
|
||||
Modelica.Blocks.Interfaces.RealOutput Accelerations[3] "Accelerations" annotation(
|
||||
Placement(transformation(extent = {{70, -40}, {90, -20}}), iconTransformation(extent = {{90, -35}, {110, -15}})));
|
||||
Modelica.Blocks.Interfaces.RealInput Attitude[3](each quantity = "Mechanics.Rotation.Angle", each displayUnit = "rad") "'input Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{-75, -10}, {-35, 30}}), iconTransformation(origin = {0, 50}, extent = {{-20, -20}, {20, 20}}, rotation = -90)));
|
||||
Modelica.Blocks.Interfaces.RealOutput DroneVelocity[3](each quantity = "Mechanics.Translation.Velocity", each displayUnit = "m/s") "'output Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{120, 20}, {140, 40}}), iconTransformation(extent = {{90, 15}, {110, 35}})));
|
||||
Modelica.Blocks.Interfaces.RealInput ExternalForce[3] annotation(
|
||||
Placement(transformation(extent = {{-75, -40}, {-35, 0}}), iconTransformation(extent = {{-120, -45}, {-80, -5}})));
|
||||
ComputationAccelerationModel computationAccelerationModel1 annotation(
|
||||
Placement(transformation(extent = {{5, 20}, {20, 35}})));
|
||||
Modelica.Blocks.Continuous.Integrator integrator4 annotation(
|
||||
Placement(transformation(extent = {{70, -10}, {90, 10}})));
|
||||
Modelica.Blocks.Continuous.Integrator integrator5 annotation(
|
||||
Placement(transformation(extent = {{70, 20}, {90, 40}})));
|
||||
Modelica.Blocks.Continuous.Integrator integrator6 annotation(
|
||||
Placement(transformation(extent = {{70, 50}, {90, 70}})));
|
||||
equation
|
||||
connect(computationAccelerationModel1.Attitude[:], Attitude) annotation(
|
||||
Line(points = {{10, 35}, {10, 40}, {-20, 40}, {-20, 10}, {-50, 10}, {-55, 10}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(computationAccelerationModel1.TotalThrust, TotalThrust) annotation(
|
||||
Line(points = {{5, 30}, {0, 30}, {-50, 30}, {-50, 45}, {-55, 45}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator6.u, computationAccelerationModel1.DroneAcceleration[1]) annotation(
|
||||
Line(points = {{68, 60}, {63, 60}, {24.7, 60}, {24.7, 27.3}, {19.7, 27.3}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator5.u, computationAccelerationModel1.DroneAcceleration[2]) annotation(
|
||||
Line(points = {{68, 30}, {63, 30}, {24.7, 30}, {24.7, 27.3}, {19.7, 27.3}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator4.u, computationAccelerationModel1.DroneAcceleration[3]) annotation(
|
||||
Line(points = {{68, 0}, {63, 0}, {24.7, 0}, {24.7, 27.7}, {19.7, 27.7}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator6.y, DroneVelocity[1]) annotation(
|
||||
Line(points = {{91, 60}, {96, 60}, {125, 60}, {125, 30}, {130, 30}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator5.y, DroneVelocity[2]) annotation(
|
||||
Line(points = {{91, 30}, {96, 30}, {125, 30}, {130, 30}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(integrator4.y, DroneVelocity[3]) annotation(
|
||||
Line(points = {{91, 0}, {96, 0}, {125, 0}, {125, 30}, {130, 30}}, color = {0, 0, 127}, thickness = 0.0625));
|
||||
connect(computationAccelerationModel1.ExternalForce[:], ExternalForce[:]) annotation(
|
||||
Line(points = {{5, 25}, {0, 25}, {-1, -20}, {-50, -20}, {-55, -20}}, color = {0, 0, 127}, thickness = 0.0625),
|
||||
AutoRoute = false);
|
||||
connect(computationAccelerationModel1.DroneAcceleration[:], Accelerations[:]) annotation(
|
||||
Line(points = {{19.7, 27.3}, {24.7, 27.3}, {25, -30}, {75, -30}, {80, -30}}, color = {0, 0, 127}, thickness = 0.0625),
|
||||
AutoRoute = false);
|
||||
annotation(
|
||||
TotalThrust(flags = 2),
|
||||
Attitude(flags = 2),
|
||||
DroneVelocity(flags = 2),
|
||||
computationAccelerationModel1(TotalThrust(flags = 2), Attitude(flags = 2), DroneAcceleration(flags = 2), ExternalForce(flags = 2)),
|
||||
integrator4(u(flags = 2), y(flags = 2)),
|
||||
integrator5(u(flags = 2), y(flags = 2)),
|
||||
integrator6(u(flags = 2), y(flags = 2)),
|
||||
Icon(coordinateSystem(extent = {{-100, -50}, {100, 50}}, initialScale = 0.1), graphics = {Rectangle(fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-100, 53.3}, {103.3, -53.3}}), Text(origin = {-5, -3}, extent = {{-15, 5}, {15, -5}}, textString = "%name")}),
|
||||
experiment(StopTime = 1, StartTime = 0, Interval = 0.002, MaxInterval = "0.001"));
|
||||
end ComputeDroneVelocity;
|
||||
@@ -0,0 +1,28 @@
|
||||
within AIDAModelica;
|
||||
|
||||
model ComputeMoments "[SimuD2 CEM] Compute moments"
|
||||
// CP: 65001
|
||||
// SimulationX Version: 3.8.2.45319 x64
|
||||
Modelica.Blocks.Interfaces.RealInput Motor1AngularVelocity(quantity = "Mechanics.Rotation.RotVelocity", displayUnit = "rpm") "'input Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{-20, -20}, {20, 20}}), iconTransformation(extent = {{-95, 55}, {-55, 95}})));
|
||||
Modelica.Blocks.Interfaces.RealInput Motor2AngularVelocity(quantity = "Mechanics.Rotation.RotVelocity", displayUnit = "rpm") "'input Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{-20, -20}, {20, 20}}), iconTransformation(extent = {{-95, 5}, {-55, 45}})));
|
||||
Modelica.Blocks.Interfaces.RealInput Motor3AngularVelocity(quantity = "Mechanics.Rotation.RotVelocity", displayUnit = "rpm") "'input Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{-20, -20}, {20, 20}}), iconTransformation(extent = {{-95, -45}, {-55, -5}})));
|
||||
Modelica.Blocks.Interfaces.RealInput Motor4AngularVelocity(quantity = "Mechanics.Rotation.RotVelocity", displayUnit = "rpm") "'input Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{-20, -20}, {20, 20}}), iconTransformation(extent = {{-95, -95}, {-55, -55}})));
|
||||
Modelica.Blocks.Interfaces.RealOutput Moments[3](each quantity = "Mechanics.Rotation.Torque", each displayUnit = "Nm") "'output Real' as connector" annotation(
|
||||
Placement(transformation(extent = {{-10, -10}, {10, 10}}), iconTransformation(extent = {{65, -35}, {85, -15}})));
|
||||
parameter Real d(quantity = "Basics.Length", displayUnit = "m") = 0.33 "Distance from body centre mass to motor centre mass";
|
||||
parameter Real cT(quantity = "Mechanics.Translation.Force", displayUnit = "N") = 3.438e-7 "Parameter cT";
|
||||
parameter Real coef_cT(quantity = "Mechanics.Rotation.RotVelocity", displayUnit = "rpm") = 0.10471975511965977 "Parameter";
|
||||
parameter Real cM(quantity = "Mechanics.Rotation.Torque", displayUnit = "Nm") = 5.7e-9 "Parameter cM";
|
||||
parameter Real coef_cM(quantity = "Mechanics.Rotation.RotVelocity", displayUnit = "rpm") = 0.10471975511965977 "Parameter";
|
||||
equation
|
||||
// enter your equations here
|
||||
Moments[1] = d * (cT / coef_cT ^ 2) * (sqrt(2) / 2) * (Motor1AngularVelocity ^ 2 - Motor2AngularVelocity ^ 2 - Motor3AngularVelocity ^ 2 + Motor4AngularVelocity ^ 2);
|
||||
Moments[2] = d * (cT / coef_cT ^ 2) * (sqrt(2) / 2) * (Motor1AngularVelocity ^ 2 + Motor2AngularVelocity ^ 2 - Motor3AngularVelocity ^ 2 - Motor4AngularVelocity ^ 2);
|
||||
Moments[3] = cM / coef_cM ^ 2 * (Motor1AngularVelocity ^ 2 - Motor2AngularVelocity ^ 2 + Motor3AngularVelocity ^ 2 - Motor4AngularVelocity ^ 2);
|
||||
annotation(
|
||||
Icon(coordinateSystem(extent = {{-75, -125}, {75, 125}}, initialScale = 0.1), graphics = {Rectangle(fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-76.7, 126.7}, {73.3, -126.7}}), Text(origin = {-6, -6}, extent = {{-16, 8}, {16, -8}}, textString = "%name")}));
|
||||
end ComputeMoments;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user