From 42737faf2cef08eed1f1796ba0c69759d397d6eb Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Mon, 24 Oct 2016 23:27:49 +0200 Subject: [PATCH] Fix wrong pitch and bank value interpolation Pitch and bank angle in CAircraftSituation are according to the common aeronautical convention: * Bank in degrees, positive = roll right * Pitch in degrees, positive = pitch up Microsoft Flight Simulator is using inverted angles, which was incorrectly adjusted in the interpolator. This caused wrong values for X-Plane. This angle correction is now moved into the MSFS specific plugins. Additionally, so far the pitch and bank angles from own aircraft were not yet corrected for MSFS. So we did send wrong values to the network. refs #790 --- src/blackmisc/interpolatorlinear.cpp | 8 -------- src/plugins/simulator/fs9/fs9client.cpp | 6 ++++++ src/plugins/simulator/fs9/simulatorfs9.cpp | 3 +++ src/plugins/simulator/fscommon/fsuipc.cpp | 3 +++ src/plugins/simulator/fsx/simulatorfsx.cpp | 3 +++ 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/blackmisc/interpolatorlinear.cpp b/src/blackmisc/interpolatorlinear.cpp index 76d9029f9..e46c95d3b 100644 --- a/src/blackmisc/interpolatorlinear.cpp +++ b/src/blackmisc/interpolatorlinear.cpp @@ -161,20 +161,12 @@ namespace BlackMisc CAngle pitchBegin = oldSituation.getPitch(); CAngle pitchEnd = newSituation.getPitch(); CAngle pitch = (pitchEnd - pitchBegin) * simulationTimeFraction + pitchBegin; - - // TODO: According to the specification, pitch above horizon should be negative. - // But somehow we get positive pitches from the network. - pitch *= -1; currentSituation.setPitch(pitch); // Interpolate bank: Bank = (BankB - BankA) * t + BankA CAngle bankBegin = oldSituation.getBank(); CAngle bankEnd = newSituation.getBank(); CAngle bank = (bankEnd - bankBegin) * simulationTimeFraction + bankBegin; - - // TODO: According to the specification, banks to the right should be negative. - // But somehow we get positive banks from the network. - bank *= -1.0; currentSituation.setBank(bank); currentSituation.setGroundSpeed((newSituation.getGroundSpeed() - oldSituation.getGroundSpeed()) diff --git a/src/plugins/simulator/fs9/fs9client.cpp b/src/plugins/simulator/fs9/fs9client.cpp index 2b55adedf..f685ff060 100644 --- a/src/plugins/simulator/fs9/fs9client.cpp +++ b/src/plugins/simulator/fs9/fs9client.cpp @@ -53,6 +53,9 @@ namespace BlackSimPlugin pbhstrct.hdg = newSituation.getHeading().value(CAngleUnit::deg()) * CFs9Sdk::headingMultiplier(); pbhstrct.pitch = newSituation.getPitch().value(CAngleUnit::deg()) * CFs9Sdk::pitchMultiplier(); pbhstrct.bank = newSituation.getBank().value(CAngleUnit::deg()) * CFs9Sdk::bankMultiplier(); + // MSFS has inverted pitch and bank angles + pbhstrct.pitch = -pbhstrct.pitch; + pbhstrct.bank = -pbhstrct.bank; positionVelocity.pbh = pbhstrct.pbh; // Ground velocity @@ -107,6 +110,9 @@ namespace BlackSimPlugin pbhstrct.hdg = situation.getHeading().value(CAngleUnit::deg()) * CFs9Sdk::headingMultiplier(); pbhstrct.pitch = situation.getPitch().value(CAngleUnit::deg()) * CFs9Sdk::pitchMultiplier(); pbhstrct.bank = situation.getBank().value(CAngleUnit::deg()) * CFs9Sdk::bankMultiplier(); + // MSFS has inverted pitch and bank angles + pbhstrct.pitch = -pbhstrct.pitch; + pbhstrct.bank = -pbhstrct.bank; positionSlewMode.pbh = pbhstrct.pbh; return positionSlewMode; diff --git a/src/plugins/simulator/fs9/simulatorfs9.cpp b/src/plugins/simulator/fs9/simulatorfs9.cpp index f7c0ec891..29b4e9593 100644 --- a/src/plugins/simulator/fs9/simulatorfs9.cpp +++ b/src/plugins/simulator/fs9/simulatorfs9.cpp @@ -86,6 +86,9 @@ namespace BlackSimPlugin if (bank > 180.0) bank -= 360; + // MSFS has inverted pitch and bank angles + pitch = -pitch; + bank = -bank; situation.setPitch(CAngle(pitch, CAngleUnit::deg())); situation.setBank(CAngle(bank, CAngleUnit::deg())); situation.setHeading(CHeading(pbhstrct.hdg / CFs9Sdk::headingMultiplier(), CHeading::Magnetic, CAngleUnit::deg())); diff --git a/src/plugins/simulator/fscommon/fsuipc.cpp b/src/plugins/simulator/fscommon/fsuipc.cpp index a99392a88..0db807ac2 100644 --- a/src/plugins/simulator/fscommon/fsuipc.cpp +++ b/src/plugins/simulator/fscommon/fsuipc.cpp @@ -358,6 +358,9 @@ namespace BlackSimPlugin situation.setPosition(position); // speeds, situation + // MSFS has inverted pitch and bank angles + pitchRaw = -pitchRaw; + bankRaw = -bankRaw; const double angleCorrectionFactor = 360.0 / 65536.0 / 65536.0; // see FSUIPC docu CAngle pitch = CAngle(pitchRaw * angleCorrectionFactor, CAngleUnit::deg()); CAngle bank = CAngle(bankRaw * angleCorrectionFactor, CAngleUnit::deg()); diff --git a/src/plugins/simulator/fsx/simulatorfsx.cpp b/src/plugins/simulator/fsx/simulatorfsx.cpp index e93569813..41fd444a7 100644 --- a/src/plugins/simulator/fsx/simulatorfsx.cpp +++ b/src/plugins/simulator/fsx/simulatorfsx.cpp @@ -378,6 +378,9 @@ namespace BlackSimPlugin BlackMisc::Aviation::CAircraftSituation aircraftSituation; aircraftSituation.setPosition(position); + // MSFS has inverted pitch and bank angles + simulatorOwnAircraft.pitch = -simulatorOwnAircraft.pitch; + simulatorOwnAircraft.bank = -simulatorOwnAircraft.bank; aircraftSituation.setPitch(CAngle(simulatorOwnAircraft.pitch, CAngleUnit::deg())); aircraftSituation.setBank(CAngle(simulatorOwnAircraft.bank, CAngleUnit::deg())); aircraftSituation.setHeading(CHeading(simulatorOwnAircraft.trueHeading, CHeading::True, CAngleUnit::deg()));