Ground Handling -- Anyone actully got it to work anywhere near realistically yet

Has anyone, ASOBO or 3PDs, managed to make any sense of the current Ground Handling, and produced a SEL GA Plane, that handles anywhere near realistically on the ground, ( and during the take off / landing phase in a Crosswind)

OK, A2A have, with their External Flight Model (so it is technically possible), but currently in the SU Beta, it seems to be an elusive goal for those strictly developing under the SDK.

Actually no… and in my opinion is not working very well (specially for turboprops)… but since no public documentation is available I am waiting first in case more improvements are coming… so @Jonx you go first… :laughing:

Best,
Raul

1 Like

Well, it seems that ASOBO “**has gone first” ** with 3 stock planes having the new Ground handling parameters, but they seem to be set to values, where they have no effect !!!

One thing I find so puzzling, is that most “Racing car” simulations have exceptionally detailed and precise “Ground handing” simulation programmed into them … If it can be done with such precision and detail fro a car at 60 MPH, and various road conditions from dry-wet-icy, why cant it be done for a plane, on the runway @ 60 Mph.

Same goes with water/wave physics & simulation. Done exceptionally well & realistically in most ship simulators, but in MSFS the plane on floats stays at the same mean water height, and the water rises up and falls around the plane, often completely covering it if the winds are high, (ie 10+ foot swell )

Well… As Raul pointed out with the Tag, the ground handling is isn’t the best right now. Actually it may have gotten a little worse in SU-15 until they optimize their changes.

As far as some aspects like Free-Castoring Tailwheel, Ice/Snow Physics, Dirt Physics, and other nuances… our team has developed customed code in our XML that overrides these physical limitations and allows for realistic handling in these scenarios. That said, these are custom in-house solutions and have nothing to do with Asobo’s implementation. Therefore, your question is still valid and we are waiting for deeper integration. Even if not in MSFS 2020, hopefully in MSFS 2024.

As for water simulation… that needs a complete overhaul, but I know that’s not doable in MSFS 2020 and I’m sure they may be looking at a new system in 2024 based on the feedback in MSFS 2020 in general.

All questions… good questions… but empty at the moment.

The closest we’ve gotten to realistic ground handling is our Double Ender with “Realism” mode checked. May want to look into that aircraft if you’re looking for a temporary solution until Asobo integrates it deeper.

As mentioned, ours are fully custom XML injects (which I find is more reliable than an external flight model, and it’s Xbox compatible):

		<Component ID="FLIGHT_MODEL_AUGMENTATION">
			<UseTemplate Name="ASOBO_GT_Update">
				<FREQUENCY>3</FREQUENCY>
				<UPDATE_CODE>
					(A:IS SLEW ACTIVE, Bool) ! (A:AI CONTROLS, Bool) ! and
					if{
						(* Surface Conditions *)
						(A:SURFACE CONDITION, Enum) s0
						l0 0 ==
						if{
							1.00 (&gt;O:GgGpGrip) (* Dry *)
						} els{
							l0 1 ==
							if{
								0.77 (&gt;O:GgGpGrip) (* Wet *)
							} els{
								l0 2 ==
								if{
									0.23 (&gt;O:GgGpGrip) (* Ice *)
								} els{
									0.46 (&gt;O:GgGpGrip) (* Snow *)
								}
							}
						}

						(* Surface Types, effect on stopping distance (https://www.experimentalaircraft.info/flight-planning/aircraft-performance-7.php) *)
						(A:SURFACE TYPE, Enum) s1
						l1 1 == l1 3 == or l1 5 == or l1 7 == or (* Short grass *)
						if{
							0.80 s2
							2 (&gt;L:GgGpSfxSurface)
						} els{
							l1 6 == (* Long grass *)
							if{
								0.70 s2
								2 (&gt;L:GgGpSfxSurface)
							} els{
								11 14 l1 rng 21 22 l1 rng or (* Lose soil (sand, gravel etc) *)
								if{
									0.75 s2
									3 (&gt;L:GgGpSfxSurface)
								} els{ (* Hard surfaces *)
									1.00 s2
									1 (&gt;L:GgGpSfxSurface)
								}
							}
						}

						(* Final Surface Grip *)
						(O:GgGpGrip) l2 * (&gt;O:GgGpGrip)
					}
				</UPDATE_CODE>
			</UseTemplate>
			<UseTemplate Name="ASOBO_GT_Update">
				<FREQUENCY>30</FREQUENCY>
				<UPDATE_CODE>
					(A:IS SLEW ACTIVE, Bool) ! (A:AI CONTROLS, Bool) ! and
					if{
						(A:GEAR IS ON GROUND:1, Bool)
						(A:GEAR IS ON GROUND:2, Bool) or
						-35 5 (A:PLANE PITCH DEGREES, Degrees) rng and
						if{
							(* COMMON DATA *)

							(A:PROP THRUST:1, pounds) (A:PROP THRUST:2, pounds) + (&gt;O:GgGpThrust)
	                        (A:RUDDER POSITION, Percent over 100) (A:RUDDER TRIM PCT, Percent over 100) 0.15 * + (&gt;O:GgGpRudderPosition)
							(A:BRAKE LEFT POSITION, Percent over 100) (A:CONTACT POINT COMPRESSION:1, Percent over 100) * (O:GgGpGrip) * (&gt;O:GgGpBrakeLeft)
							(A:BRAKE RIGHT POSITION, Percent over 100) (A:CONTACT POINT COMPRESSION:2, Percent over 100) * (O:GgGpGrip) * (&gt;O:GgGpBrakeRight)
							(A:GROUND VELOCITY, Knots) 0.5 - 0.333 * 0 max 1 min (&gt;O:GgGpGroundVelocityEasing)
							(A:GROUND VELOCITY, Knots) 1.0 - 0.125 * 0 max 1 min (&gt;O:GgGpGroundVelocityEasingLong)
							(A:PROP BETA:1, Degrees) 0 &lt;
							if{
								(A:ENG COMBUSTION:1, Bool) (A:GENERAL ENG PCT MAX RPM:1, Percent over 100) 0.40 - 0 max * 0.90 * (&gt;O:GgGpReverseThrust)
							} els{
								0 (&gt;O:GgGpReverseThrust)
							}


							(* STEERING *)

							(* Simplified Ground Physics (Additional steering with rudder) *)
							(L:GsGpGroundHandlingFullPhysics) !
							if{
								(O:GgGpRotationVBodyY) (A:VELOCITY BODY Z, Knots) (O:GgGpRudderPosition) 0.00080 * * + (&gt;O:GgGpRotationVBodyY)
							}

							(* P-Factor (consider Helical Propwash nil due to contra-rotation cancelling) *)
							(L:GsGpGroundHandlingFullPhysics)
							if{
								-0.00000030 (A:PLANE PITCH DEGREES, Degrees) * s0 (* P-Factor *)
								(O:GgGpRotationVBodyY) (O:GgGpThrust) 100 - 0 max l0 * + (&gt;O:GgGpRotationVBodyY)
							}

							(* Rudder steering through regular airflow and propwash *)
							(O:GgGpRotationVBodyY) (O:GgGpThrust) 100 - 0 max 0.000034 * (A:RELATIVE WIND VELOCITY BODY Z, Feet per second) 0.000180 * + (O:GgGpRudderPosition) * + (&gt;O:GgGpRotationVBodyY)

							(* Differental Braking *)
							1 (A:GROUND VELOCITY, Knots) 0.5 pow 0.12 * - 0 max s0
							(O:GgGpRotationVBodyY) 0.001200 (A:LEFT WHEEL RPM, Rpm) (A:RIGHT WHEEL RPM, Rpm) + * (O:GgGpGroundVelocityEasing) * l0 * (O:GgGpThrust) 300 - 0 max 0.000155 * + (O:GgGpReverseThrust) 0.15 * - (O:GgGpBrakeRight) (O:GgGpBrakeLeft) - * + (&gt;O:GgGpRotationVBodyY)

							(* Rotation Braking *)
							(O:GgGpBrakeLeft) (O:GgGpBrakeRight) + 1.333 (A:BRAKE LEFT POSITION, Percent over 100) (A:BRAKE RIGHT POSITION, Percent over 100) - abs - * (&gt;O:GgGpBrakeSimultaneous)
							(O:GgGpRotationVBodyY) 0 &gt;
							if{
								(O:GgGpRotationVBodyY) (O:GgGpBrakeSimultaneous) 0.0950 * - 0 max (&gt;O:GgGpRotationVBodyY)
							} els{
								(O:GgGpRotationVBodyY) (O:GgGpBrakeSimultaneous) 0.0950 * + 0 min (&gt;O:GgGpRotationVBodyY)
							}

							(* Groundloop *)
							(L:GsGpGroundHandlingFullPhysics)
							if{
								(A:ACCELERATION BODY Z, Feet per second squared) s0
								l0 0 &lt;
								if{
									(A:VELOCITY BODY X, Feet per second) s1
									(O:GgGpRotationVBodyY) l1 l0 * 0.000275 * + (&gt;O:GgGpRotationVBodyY)
								}
							}

							(* Weathervaning *)
							(O:GgGpRotationVBodyY) (A:RELATIVE WIND VELOCITY BODY X, Feet per second) 0.000235 * (O:GgGpGroundVelocityEasingLong) * + (&gt;O:GgGpRotationVBodyY)

							(* Rotation, Friction, Moments and Normalisation *)
							(O:GgGpRotationVBodyY) 0.9920 (A:TAILWHEEL LOCK ON, Bool) (A:CONTACT POINT COMPRESSION:0, Percent over 100) * 0.080 * - * -1.85 max 1.85 min (&gt;O:GgGpRotationVBodyY)
							(O:GgGpRotationVBodyY) (&gt;A:ROTATION VELOCITY BODY Y, Feet per second)


							(* BRAKING *)

							(* Brake Effectiveness (Brake and Tire wear and tear) *)
							(L:MVP50RealismNew)
							if{
								(L:WearLeftBrake) (L:WearRightBrake) + 0.5 * 0.70 - 0 max 3.333 * s0
								(L:WearLeftTire) (L:WearRightTire) + 0.5 * 0.70 - 0 max 0.750 * s1
								1 l0 - l1 - 0 max (&gt;O:GgGpBrakeEffectiveness)
							} els{
								1 (&gt;O:GgGpBrakeEffectiveness)
							}

							(* Augmented Smart Power Brakes (power reduces at nose-over risk speeds) *)
							(O:GgGpGroundVelocityEasing) 0 &gt; (O:GgGpReverseThrust) 0 &gt; or
							if{
								(O:GgGpBrakeSimultaneous) (O:GgGpBrakeEffectiveness) * (O:GgGpGroundVelocityEasing) * 0.80 * (&gt;O:GgGpBrakePower)
								(A:VELOCITY BODY Z, Knots) 0 &gt;
								if{
									(A:VELOCITY BODY Z, Feet per second) (O:GgGpBrakePower) - (O:GgGpReverseThrust) - (&gt;A:VELOCITY BODY Z, Feet per second)
								} els{
									(A:VELOCITY BODY Z, Feet per second) (O:GgGpBrakePower) + (O:GgGpReverseThrust) - -12 max (&gt;A:VELOCITY BODY Z, Feet per second)
								}
							}


							(* MISCELANEOUS *)

							(* Sound Support *)
							(A:VELOCITY BODY X, Feet per second) abs 10 - 15 / 0 max 1 min (&gt;L:GgGpSfxSkidding)
						} els{
							0 (&gt;O:GgGpRotationVBodyY)
							0 (&gt;L:GgGpSfxSkidding)
						}
					} els{
						0 (&gt;O:GgGpRotationVBodyY)
						0 (&gt;L:GgGpSfxSkidding)
					}
				</UPDATE_CODE>
			</UseTemplate>
		</Component>
3 Likes