+#include <stdio.h>
+
#include "Atmosphere.hpp"
#include "ControlMap.hpp"
#include "Gear.hpp"
#include "Airplane.hpp"
namespace yasim {
+// gadgets
+inline float norm(float f) { return f<1 ? 1/f : f; }
+inline float abs(float f) { return f<0 ? -f : f; }
+
Airplane::Airplane()
{
_emptyWeight = 0;
_tailIncidence = 0;
}
+void Airplane::setElevatorControl(int control)
+{
+ _approachElevator.control = control;
+ _approachElevator.val = 0;
+ _approachControls.add(&_approachElevator);
+}
+
void Airplane::addApproachControl(int control, float val)
{
Control* c = new Control();
// Run an approach iteration, and do likewise
runApproach();
+ _model.getBody()->getAngularAccel(tmp);
+ float apitch0 = tmp[1];
+
_model.getBody()->getAccel(tmp);
float alift = _approachWeight * tmp[2];
return;
}
- // And apply:
+ // And the elevator control in the approach. This works just
+ // like the tail incidence computation (it's solving for the
+ // same thing -- pitching moment -- by diddling a different
+ // variable).
+ const float ELEVDIDDLE = 0.0001f;
+ _approachElevator.val += ELEVDIDDLE;
+ runApproach();
+ _approachElevator.val -= ELEVDIDDLE;
+
+ _model.getBody()->getAngularAccel(tmp);
+ float apitch1 = tmp[1];
+ float elevDelta = -apitch0 * (ELEVDIDDLE/(apitch1-apitch0));
+
+ // Now apply the values we just computed. Note that the
+ // "minor" variables are deferred until we get the lift/drag
+ // numbers in the right ballpark.
+
applyDragFactor(dragFactor);
applyLiftRatio(liftFactor);
continue;
}
- // OK, now we can adjust the minor variables
+ // OK, now we can adjust the minor variables:
_cruiseAoA += 0.5f*aoaDelta;
_tailIncidence += 0.5f*tailDelta;
+ _approachElevator.val += 0.5f*elevDelta;
_cruiseAoA = clamp(_cruiseAoA, -0.174f, 0.174f);
_tailIncidence = clamp(_tailIncidence, -0.174f, 0.174f);
+ _approachElevator.val = clamp(_approachElevator.val, -1.f, 1.f);
+
+ fprintf(stderr, "p0 %6f p1 %6f e %5f d %5f\n",
+ apitch0, apitch1, _approachElevator.val, elevDelta); // DEBUG
+
+ fprintf(stderr, "l %5f d %5f aoa %5f inc %5f ele %5f\n",
+ _liftRatio, _dragFactor, _cruiseAoA, _tailIncidence,
+ _approachElevator.val);
- if(dragFactor < 1.00001 && liftFactor < 1.00001 &&
- aoaDelta < .000017 && tailDelta < .000017)
+ if(norm(dragFactor) < 1.00001 &&
+ norm(liftFactor) < 1.00001 &&
+ abs(aoaDelta) < .000017 &&
+ abs(tailDelta) < .000017 &&
+ abs(elevDelta) < 0.00001)
{
break;
}
float drag = 1000 * a->getDragCoefficient();
SG_LOG(SG_FLIGHT,SG_INFO,"YASim solution results:");
- SG_LOG(SG_FLIGHT,SG_INFO," Iterations: "<<a->getSolutionIterations());
- SG_LOG(SG_FLIGHT,SG_INFO,"Drag Coefficient: "<< drag);
- SG_LOG(SG_FLIGHT,SG_INFO," Lift Ratio: "<<a->getLiftRatio());
- SG_LOG(SG_FLIGHT,SG_INFO," Cruise AoA: "<< aoa);
- SG_LOG(SG_FLIGHT,SG_INFO," Tail Incidence: "<< tail);
+ SG_LOG(SG_FLIGHT,SG_INFO," Iterations: "<<a->getSolutionIterations());
+ SG_LOG(SG_FLIGHT,SG_INFO," Drag Coefficient: "<< drag);
+ SG_LOG(SG_FLIGHT,SG_INFO," Lift Ratio: "<<a->getLiftRatio());
+ SG_LOG(SG_FLIGHT,SG_INFO," Cruise AoA: "<< aoa);
+ SG_LOG(SG_FLIGHT,SG_INFO," Tail Incidence: "<< tail);
+ SG_LOG(SG_FLIGHT,SG_INFO,"Approach Elevator: "<<a->getApproachElevator());
+
float cg[3];
char buf[256];