From: Jon S. B. <jb...@us...> - 2009-02-17 08:04:24
|
Update of /cvsroot/jsbsim/JSBSim/src/models In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv21764/src/models Modified Files: FGLGear.cpp FGLGear.h Log Message: Implementation of Pacejka's Magic Formula for landing gear Index: FGLGear.cpp =================================================================== RCS file: /cvsroot/jsbsim/JSBSim/src/models/FGLGear.cpp,v retrieving revision 1.50 retrieving revision 1.51 diff -C2 -r1.50 -r1.51 *** FGLGear.cpp 5 Feb 2009 04:59:54 -0000 1.50 --- FGLGear.cpp 17 Feb 2009 08:04:15 -0000 1.51 *************** *** 247,326 **** CosWheel = 0.0; ! Debug(0); ! } ! //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! FGLGear::FGLGear(const FGLGear& lgear) ! { ! GearNumber = lgear.GearNumber; ! State = lgear.State; ! Aircraft = lgear.Aircraft; ! Propagate = lgear.Propagate; ! Auxiliary = lgear.Auxiliary; ! Exec = lgear.Exec; ! FCS = lgear.FCS; ! MassBalance = lgear.MassBalance; ! ! vXYZ = lgear.vXYZ; ! vMoment = lgear.vMoment; ! vWhlBodyVec = lgear.vWhlBodyVec; ! vLocalGear = lgear.vLocalGear; ! ! WOW = lgear.WOW; ! lastWOW = lgear.lastWOW; ! ReportEnable = lgear.ReportEnable; ! FirstContact = lgear.FirstContact; ! StartedGroundRun = lgear.StartedGroundRun; ! LandingDistanceTraveled = lgear.LandingDistanceTraveled; ! TakeoffDistanceTraveled = lgear.TakeoffDistanceTraveled; ! TakeoffDistanceTraveled50ft = lgear.TakeoffDistanceTraveled50ft; ! MaximumStrutForce = lgear.MaximumStrutForce; ! MaximumStrutTravel = lgear.MaximumStrutTravel; ! SideForce = lgear.SideForce; ! RollingForce = lgear.RollingForce; ! ! kSpring = lgear.kSpring; ! bDamp = lgear.bDamp; ! bDampRebound = lgear.bDampRebound; ! compressLength = lgear.compressLength; ! compressSpeed = lgear.compressSpeed; ! staticFCoeff = lgear.staticFCoeff; ! dynamicFCoeff = lgear.dynamicFCoeff; ! rollingFCoeff = lgear.rollingFCoeff; ! brakePct = lgear.brakePct; ! maxCompLen = lgear.maxCompLen; ! SinkRate = lgear.SinkRate; ! GroundSpeed = lgear.GroundSpeed; ! LandingReported = lgear.LandingReported; ! TakeoffReported = lgear.TakeoffReported; ! name = lgear.name; ! sSteerType = lgear.sSteerType; ! sRetractable = lgear.sRetractable; ! sContactType = lgear.sContactType; ! eContactType = lgear.eContactType; ! sBrakeGroup = lgear.sBrakeGroup; ! eSteerType = lgear.eSteerType; ! eBrakeGrp = lgear.eBrakeGrp; ! maxSteerAngle = lgear.maxSteerAngle; ! isRetractable = lgear.isRetractable; ! GearUp = lgear.GearUp; ! GearDown = lgear.GearDown; ! GearPos = lgear.GearPos; ! useFCSGearPos = lgear.useFCSGearPos; ! WheelSlip = lgear.WheelSlip; ! TirePressureNorm = lgear.TirePressureNorm; ! Servicable = lgear.Servicable; ! ForceY_Table = lgear.ForceY_Table; ! CosWheel = lgear.CosWheel; ! SinWheel = lgear.SinWheel; ! RFRV = lgear.RFRV; ! SFRV = lgear.SFRV; ! LongForceLagFilterCoeff = lgear.LongForceLagFilterCoeff; ! LatForceLagFilterCoeff = lgear.LatForceLagFilterCoeff; ! WheelSlipLagFilterCoeff = lgear.WheelSlipLagFilterCoeff; ! WheelSlipFilter = lgear.WheelSlipFilter; ! LongForceFilter = lgear.LongForceFilter; ! LatForceFilter = lgear.LatForceFilter; } --- 247,258 ---- CosWheel = 0.0; ! // Set Pacejka terms ! Stiffness = 0.06; ! Shape = 2.8; ! Peak = staticFCoeff; ! Curvature = 1.03; ! Debug(0); } *************** *** 625,649 **** //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! // Compute the sideforce coefficients using similar assumptions to LaRCSim for now. ! // Allow a maximum of 10 degrees tire slip angle before wheel slides. At that point, ! // transition from static to dynamic friction. There are more complicated formulations ! // of this that avoid the discrete jump (similar to Pacejka). Will fix this later. void FGLGear::ComputeSideForceCoefficient(void) { if (ForceY_Table) { - FCoeff = ForceY_Table->GetValue(WheelSlip); - } else { ! ! if (fabs(WheelSlip) <= 10.0) { ! FCoeff = staticFCoeff*WheelSlip/10.0; ! } else if (fabs(WheelSlip) <= 40.0) { ! FCoeff = (dynamicFCoeff*(fabs(WheelSlip) - 10.0)/10.0 ! + staticFCoeff*(40.0 - fabs(WheelSlip))/10.0)*(WheelSlip>=0?1.0:-1.0); ! } else { ! FCoeff = dynamicFCoeff*(WheelSlip>=0?1.0:-1.0); ! } } } --- 557,576 ---- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! // Compute the sideforce coefficients using Pacejka's Magic Formula. ! // ! // y(x) = D sin {C arctan [Bx - E(Bx - arctan Bx)]} ! // ! // Where: B = Stiffness Factor (0.06, here) ! // C = Shape Factor (2.8, here) ! // D = Peak Factor (0.8, here) ! // E = Curvature Factor (1.03, here) void FGLGear::ComputeSideForceCoefficient(void) { if (ForceY_Table) { FCoeff = ForceY_Table->GetValue(WheelSlip); } else { ! double StiffSlip = Stiffness*WheelSlip; ! FCoeff = Peak * sin(Shape*atan(StiffSlip - Curvature*(StiffSlip - atan(StiffSlip)))); } } *************** *** 714,717 **** --- 641,646 ---- property_name = base_property_name + "/compression-ft"; Exec->GetPropertyManager()->Tie( property_name.c_str(), &compressLength ); + property_name = base_property_name + "/side_friction_coeff"; + Exec->GetPropertyManager()->Tie( property_name.c_str(), &FCoeff ); } Index: FGLGear.h =================================================================== RCS file: /cvsroot/jsbsim/JSBSim/src/models/FGLGear.h,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -r1.26 -r1.27 *** FGLGear.h 5 Feb 2009 04:59:54 -0000 1.26 --- FGLGear.h 17 Feb 2009 08:04:15 -0000 1.27 *************** *** 219,225 **** */ FGLGear(Element* el, FGFDMExec* Executive, int number); - /** Constructor - @param lgear a reference to an existing FGLGear object */ - FGLGear(const FGLGear& lgear); /// Destructor ~FGLGear(); --- 219,222 ---- *************** *** 314,317 **** --- 311,315 ---- double compressSpeed; double staticFCoeff, dynamicFCoeff, rollingFCoeff; + double Stiffness, Shape, Peak, Curvature; // Pacejka factors double brakePct; double BrakeFCoeff; |