From: BERNDT, J. S. (J. (JSC-E. (LM) <jon...@js...> - 2001-08-28 20:56:12
|
Note, first, that you appear to be using very old code. I am not sure how old, but there are several places where there are important differences. > geography. While the body coordinate system has its origin at the > aircraft c.g., with x-forward, y-right and z-down; the local frame has > its origin at sea level UNDER THE AIRCRAFT, x-north, y-east and > z-down. Correct. > But I lucked out. The local frame is STILL an accelerated reference > frame (if the plane is turning, then the local frame is tracing out a > circle relative to the ground -- that's acceleration). The frame can also be accelerating in a straight line. > So the attached patch is now correct. Rather than calculate the > acceleration on the pilot as the time derivative of the local-frame > velocity (this doesn't work in accelerated reference frames), it uses > F=ma to calculate the acceleration relative to the _earth_ frame. > > The bottom line is that the "local" frame is a non-inertial reference > frame. Physics in non-inertial reference frames doesn't obey Newton's > laws. Yep. > =================================================================== > RCS file: > /var/cvs/FlightGear-0.7/FlightGear/src/FDM/JSBSim/FGAuxiliary.cpp,v > retrieving revision 1.14 > diff -u -r1.14 FGAuxiliary.cpp > --- FGAuxiliary.cpp 2001/06/20 20:29:32 1.14 > +++ FGAuxiliary.cpp 2001/08/28 15:23:06 > @@ -109,12 +109,13 @@ > vcas = sqrt(7*psl/rhosl*(A-1)); > veas = sqrt(2*qbar/rhosl); > > - // vPilotAccel = Translation->GetUVWdot() + > Aircraft->GetXYZep() * Rotation->GetPQRdot(); > - > + // The Pilot acceleration is the same as that of the body frame, > + // plus the centripetal acceleration due to any rotation of the > + // aircraft (remember that the pilot is not at the c.g.) I'd say this: The Pilot acceleration is the same as that of the body frame origin (w.r.t the inertial frame), plus ... Otherwise, this is correct. > vToEyePt = Aircraft->GetXYZep() - MassBalance->GetXYZcg(); > - vPilotAccel = Translation->GetUVWdot() > - + Rotation->GetPQRdot() * vToEyePt > - + Rotation->GetPQR() * > (Rotation->GetPQR() * vToEyePt); > + vPilotAccel = Translation->GetBodyAccel() > + + Rotation->GetPQRdot() * vToEyePt > + + Rotation->GetPQR() * (Rotation->GetPQR() * vToEyePt); Depending on what GetBodyAccel() returns, this looks good. > earthPosAngle += State->Getdt()*OMEGA_EARTH; > return false; > Index: FGTranslation.cpp > =================================================================== > RCS file: > /var/cvs/FlightGear-0.7/FlightGear/src/FDM/JSBSim/FGTranslation.cpp,v > retrieving revision 1.18 > diff -u -r1.18 FGTranslation.cpp > --- FGTranslation.cpp 2001/07/10 13:56:39 1.18 > +++ FGTranslation.cpp 2001/08/28 15:23:06 > @@ -82,6 +82,7 @@ > FGTranslation::FGTranslation(FGFDMExec* fdmex) : FGModel(fdmex), > vUVW(3), > vUVWdot(3), > + vBodyAccel(3), > vNcg(3), > vPQR(3), > vForces(3), > @@ -127,6 +128,16 @@ > mVel(3,3) = 0.0; > > vUVWdot = mVel*vPQR + vForces/Mass; > + > + // Body-frame acceleration is similar, but it includes gravity > + // too, and does NOT include the mVel*PQR fictitious force (which > + // is an artifact of the accelerated reference frame used here). > + // Note that the gravity vector is the Z unit vector times the > + // "local to body" matrix. > + vBodyAccel = vForces/Mass; > + vBodyAccel(1) -= 32.1 * State->GetTl2b(1, 3); > + vBodyAccel(2) -= 32.1 * State->GetTl2b(2, 3); > + vBodyAccel(3) -= 32.1 * State->GetTl2b(3, 3); vForces includes the effects of gravity already. It may not, however, in the code you have. It also includes centripetal acceleration. Jon Jon S. Berndt Coordinator, JSBSim Project http://jsbsim.sourceforge.net |