forked from fritob/Camper-Monitor
Auffahrkeile: Höhe je Rad statt getrennt für quer und längs
Bisher standen dort zwei Angaben nebeneinander, etwa "rechts 8 cm" und "vorne 4 cm". Das liest sich wie zwei Aufgaben, ist aber eine: Unter "rechts" liegen zwei Räder, unter "vorne" auch, und eines davon ist dasselbe. Ausführen lässt sich das so nicht. Gerechnet wird jetzt über alle vier Aufstandspunkte auf einmal. Aus Spurweite, Radstand und den beiden Winkeln ergeben sich deren Höhen; angehoben wird auf das höchststehende Rad, das liegen bleibt. Aus dem Beispiel oben werden damit 12 cm vorne rechts, 8 cm hinten rechts, 4 cm vorne links und nichts hinten links – dieselbe Geometrie, nur richtig zusammengesetzt. Angezeigt wird das als Draufsicht auf das Fahrzeug (WheelLiftPlan), auf iPhone und Uhr dieselbe Ansicht, auf der Uhr kompakt. LevelingWedge entfällt. Abgesichert in run-tests.sh: reine Querneigung, reine Längsneigung, beides zusammen (16,1 / 9,2 / 7,0 / 0 cm), gespiegelte Vorzeichen und die Fälle ohne Fahrzeugmasse. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+44
-19
@@ -826,28 +826,53 @@ ageing.add(pitch: 1, roll: 0, at: start.addingTimeInterval(AlignmentAssistant.me
|
||||
checkEqual("alte Messwerte fallen heraus", ageing.samples.count, 1)
|
||||
|
||||
// MARK: Auffahrkeile
|
||||
print("\nAuffahrkeile")
|
||||
|
||||
// tan(2°) x 2,00 m = 6,99 cm
|
||||
let acrossWedge = LevelingWedge.across(roll: 2.0, trackWidth: 2.0)
|
||||
checkEqual("Keilhöhe quer",
|
||||
acrossWedge.map { ($0.heightInCentimetres * 10).rounded() / 10 }, 7.0)
|
||||
checkEqual("rechts höher heisst Keil nach links", acrossWedge?.side, .left)
|
||||
checkEqual("links höher heisst Keil nach rechts",
|
||||
LevelingWedge.across(roll: -2.0, trackWidth: 2.0)?.side, .right)
|
||||
print("\nAuffahrkeile – Höhe je Rad")
|
||||
|
||||
// tan(1,5°) x 3,50 m = 9,16 cm
|
||||
let alongWedge = LevelingWedge.along(pitch: 1.5, wheelbase: 3.5)
|
||||
checkEqual("Keilhöhe längs",
|
||||
alongWedge.map { ($0.heightInCentimetres * 10).rounded() / 10 }, 9.2)
|
||||
checkEqual("Heck höher heisst Keil nach vorne", alongWedge?.side, .front)
|
||||
checkEqual("Front höher heisst Keil nach hinten",
|
||||
LevelingWedge.along(pitch: -1.5, wheelbase: 3.5)?.side, .rear)
|
||||
// Reine Querneigung: tan(2°) x 2,00 m = 6,99 cm unter beide Räder der
|
||||
// tieferstehenden Seite. Rechts steht höher, also muss links hoch.
|
||||
let acrossOnly = LevelingLift.compute(pitch: 0, roll: 2.0, trackWidth: 2.0, wheelbase: 3.5)
|
||||
checkEqual("quer: vorne links",
|
||||
acrossOnly.map { ($0.centimetres(.frontLeft) * 10).rounded() / 10 }, 7.0)
|
||||
checkEqual("quer: hinten links",
|
||||
acrossOnly.map { ($0.centimetres(.rearLeft) * 10).rounded() / 10 }, 7.0)
|
||||
checkEqual("quer: rechts bleibt liegen",
|
||||
acrossOnly.map { $0.centimetres(.frontRight) + $0.centimetres(.rearRight) }, 0)
|
||||
|
||||
checkEqual("innerhalb der Toleranz kein Keil",
|
||||
LevelingWedge.across(roll: 0.3, trackWidth: 2.0) == nil, true)
|
||||
checkEqual("ohne Maß kein Keil",
|
||||
LevelingWedge.across(roll: 3.0, trackWidth: 0) == nil, true)
|
||||
// Reine Längsneigung: tan(1,5°) x 3,50 m = 9,16 cm unter beide Vorderräder,
|
||||
// wenn das Heck höher steht.
|
||||
let alongOnly = LevelingLift.compute(pitch: 1.5, roll: 0, trackWidth: 2.0, wheelbase: 3.5)
|
||||
checkEqual("längs: vorne links",
|
||||
alongOnly.map { ($0.centimetres(.frontLeft) * 10).rounded() / 10 }, 9.2)
|
||||
checkEqual("längs: vorne rechts",
|
||||
alongOnly.map { ($0.centimetres(.frontRight) * 10).rounded() / 10 }, 9.2)
|
||||
checkEqual("längs: hinten bleibt liegen",
|
||||
alongOnly.map { $0.centimetres(.rearLeft) + $0.centimetres(.rearRight) }, 0)
|
||||
|
||||
// Beides zusammen: Das tiefste Rad braucht die Summe, das höchste nichts, und
|
||||
// die beiden dazwischen je einen Anteil. Genau das lässt sich mit getrennten
|
||||
// Angaben für "rechts" und "vorne" nicht ausdrücken.
|
||||
let liftBoth = LevelingLift.compute(pitch: 1.5, roll: 2.0, trackWidth: 2.0, wheelbase: 3.5)
|
||||
checkEqual("kombiniert: tiefstes Rad ist vorne links", liftBoth?.deepest, .frontLeft)
|
||||
checkEqual("kombiniert: vorne links trägt beide Anteile",
|
||||
liftBoth.map { ($0.centimetres(.frontLeft) * 10).rounded() / 10 }, 16.1)
|
||||
checkEqual("kombiniert: vorne rechts nur den Längsanteil",
|
||||
liftBoth.map { ($0.centimetres(.frontRight) * 10).rounded() / 10 }, 9.2)
|
||||
checkEqual("kombiniert: hinten links nur den Queranteil",
|
||||
liftBoth.map { ($0.centimetres(.rearLeft) * 10).rounded() / 10 }, 7.0)
|
||||
checkEqual("kombiniert: hinten rechts steht am höchsten und bleibt liegen",
|
||||
liftBoth.map { $0.centimetres(.rearRight) }, 0)
|
||||
|
||||
// Vorzeichen: andersherum geneigt, andere Ecke.
|
||||
let mirrored = LevelingLift.compute(pitch: -1.5, roll: -2.0, trackWidth: 2.0, wheelbase: 3.5)
|
||||
checkEqual("umgekehrt geneigt: tiefstes Rad ist hinten rechts",
|
||||
mirrored?.deepest, .rearRight)
|
||||
|
||||
checkEqual("fast eben: kein Keil nötig",
|
||||
LevelingLift.compute(pitch: 0.1, roll: 0.1,
|
||||
trackWidth: 2.0, wheelbase: 3.5)?.isNegligible, true)
|
||||
checkEqual("ohne Fahrzeugmasse keine Rechnung",
|
||||
LevelingLift.compute(pitch: 2, roll: 2, trackWidth: 0, wheelbase: 3.5) == nil, true)
|
||||
|
||||
// MARK: 12 – Einbaulage des Neigungsmessers
|
||||
print("\nEinbaulage")
|
||||
|
||||
Reference in New Issue
Block a user