Abstand zur nächsten Haltestelle bestimmen und ausgben

Willkommen in der OMSI-WebDisk!
Als Gast kannst du nur Inhalte in deiner ausgewählten Sprache sehen. Registrierte Nutzer können die Sichtbarkeit anderer Sprachen in ihrem Kontrollzentrum aktivieren, weitere Infos hier.
Alle Themen sind in den Foren mit einer Sprachflagge gekennzeichnet: = Englisch [EN], = Deutsch [DE], = Französisch [FR]. Wenn du die angegebene Sprache nicht beherrschst, schreibe auf Englisch!
  • Einen guten Tag zusammen,


    beim Werkeln und Scripten an meinem Nuntius-Drucker bin ich auf die Idee gekommen, dort auch eine Anzeige zu implementieren, die mir auf dem Bildschirm anzeigt, in wie vielen Metern die nächste Haltestelle kommt.

    Man kennt das ja heutzutage vom ein oder anderen, modernen Drucker, wenn die mit GPS ausgestattet sind, dass sie anzeigen, wie weit die nächste Haltestelle noch entfernt ist.

    Leider hat OMSI kein direktes Makro oder Variable, mit der es möglich ist, die Entfernung zur nächsten oder zwischen Haltestellen direkt abzufragen und anzuzeigen.

    Dennoch dürfte es mit einigen Tricks und etwas Gerechne möglich sein, diese zumindest angenähert zu bestimmen.

    Dieses Konzept möchte ich euch hier gerne kurz vorstellen. Ganz unten findet ihr dafür auch ein fertiges Script, was ihr gerne in euren Bussen und für eure Projekte verwenden dürft. Ich erhebe kein Copyright darauf. Feel free to do what you want. :)



    Die Theorie

    Für alle, die nicht einfach nur das fertige Script (ihr findet es unten) kopieren wollen, sondern auch tatsächlich verstehen wollen, warum und wie es funktioniert, hier die Erklärung, wie ich es mir überlegt habe und was der "Plot" ist:

    Es ist zuerst wichtig, die folgenden Informationen bzw. Konzepte notwendig zu kennen/verstehen.

    Wichtig ist noch, dass wir immer nur von einer Haltestelle zur nächsten denken. D.h. wir gehen immer davon aus, wir befinden uns gerade irgendwo zwischen zwei Haltestellen einer Route und wollen die Entfernung zur nächsten bestimmen.

    1. Mit den Makros (M.V.GetTTBusstopDep) und (M.V.GetTTBusstopArr) lassen sich die planmäßige Abfahrtszeit der letzten Haltestelle bzw. Ankunft an der nächsten abfragen.
    2. Über (M.V.GetTTDelay) lassen sich aus den planmäßigen Zeiten die tatsächlichen (bzw. prognostizierten für die nächste Haltestelle) errechnen.
    3. Vergleicht man diese nun mit der aktuellen Ingame-Uhrzeit ((L.S.Time)), kann man daraus einen relativen Wert bestimmen, wieviel Zeit bereits seit der letzten Haltestelle vergangen ist, bzw. wo auf der "Zeitachse" wir uns gerade zwischen Zeit Haltestellen befinden. Dazu ein Beispiel:

    Das bedeutet jetzt also, dass ein Viertel der Zeit zwischen beiden Haltestellen verstrichen ist. Wenn wir nun von einer konstanten Geschwindigkeit ausgehen, bedeutet das, dass auch ein Viertel der Strecke bereits zurückgelegt wurde und dementsprechend noch 3/4=0.75 fehlen.

    Wenn wir jetzt auch noch von einem konstanten Haltestellenabstand insgesamt ausgehen würden, könnten wir die übrige Entfernung bereits exakt berechnen. Gerade auf Überlandmaps, wo innerhalb von Ortschaften Haltestellen eng zusammenliegen können, zwischen Orten aber auch große Entfernungen haben, ist das jedoch etwas doof. Deshalb wollen wir das nun ändern. Dazu brauchen wir nur die Variablen kmcounter_km und kmcounter_m, welche zusammen den Kilometerstand repräsentieren.

    1. Beim Verlassen einer Haltestelle merken wir uns den aktuellen Kilometerstand in einer Variable.
    2. Nun können wir jederzeit den aktuellen Kilometerstand mit dem gespeicherten vergleichen und so die zurückgelegte Strecke seit der letzten Haltestelle ermitteln.
    3. Aus all diesen Daten lässt sich nun bereits eine Prognose erstellen. Wir haben nun unsere zurückgelegte Strecke auf z.B. 100m bestimmt.
    4. Wenn wir weiterhin von einer konstanten Fahrtgeschwindigkeit ausgehen, so ergibt sich:
    Code
    25% Zeit vergangen => 100m gefahren.
    100m / 25% = 400m => gesamte Entfernung zwischen den Haltestellen
    Bereits zurückgelegte Entfernung wieder subtrahieren:
    400m - 100m = 300m
                  ====

    Damit haben wir nun also die Entfernung zu nächsten Haltestelle auf 300m bestimmt.

    Wie bereits zum Anfang betont, ist das kein exakter Wert sondern nur eine Annäherung, da wir immer von einer konstanten Geschwindigkeit ausgehen müssen. Besser geht es leider nicht. Es ist und bleibt also immer eine "Prognose".

    Der Wert wird jedoch genauer, je weiter wir fortgeschritten sind. Nach 10% Strecke haben wir nur eine sehr kleine Stichprobe an bestehenden Daten und die 90% übrige Strecke werden aus dieser Stichprobe nur "hochgerechnet". Das ist natürlich nicht so genau, wie wenn schon 90% gefahren wurden und nur noch 10% errechnet werden müssen.

    Die Berechnung wird genauer, je dichter man die Zielhaltestelle erreicht.

    Damit das ganze aktuell bleibt, muss man natürlich diese ganze Berechnung regelmäßig (z.B. alle 10 Sekunden) neu durchführen.

    Wichtig ist, dass man nicht nur die Entfernungsberechnung ("2. Teil vom Beispiel") neu berechnet, sondern tatsächlich alles, da sich ja z.B. beim schnellen oder langsamen Fahren auch die Verspätung ändern kann, die man dann immer wieder neu einrechnen und daher auch die Haltestellenzeiten immer wieder neu berechnen sollte, um möglichst genaue Werte zu erhalten.



    ...und in OMSI

    Hier findet ihr nun meine Implementierung der Idee in OMSI. Es sind Kommentare vorhanden, die das meiste klären sollten. Baut euch den "Scriptschnippsel" gerne in eure Busse ein. :)


    Als erstes müsst ihr euch allerdings noch die folgenden Variblen in einer Varlist eintragen:

    Code: varlist.txt
    busstopDistance_timer
    busstopDistance_lastKmCounter_km
    busstopDistance_lastKmCounter_m
    busstopDistance_nextBusstopDistance
    busstopDistance_lastIndex

    Dies ist dann der Codeabschnitt für die Script-Datei.

    Den Bereich im Frame-Abschnitt solltet ihr euch am besten einfach in euren Bus- bzw. Drucker-Frame mit integrieren. Das Makro busstopDistance_recalculateDistance kann bzw. sollte also in jedem Frame ausgeführt werden.

    Das Makro busstopDistance_restartDistanceCalc muss immer dann ausgeführt werden, wenn die Abstandsmessung neu begonnen soll, d.h. wir z.B: eine Haltestelle erreicht haben und nun von dort den Abstand zur darauf folgenden bestimmen wollen. Darum kümmert sich der Frame-Abschnitt hier.

    Am Ende steht in der Variable busstopDistance_nextBusstopDistance immer die Entfernung zur nächsten Haltestelle in Metern bzw. "-1" falls der Wert nicht ermittelt werden kann. Diesen könnt ihr nun mit einem Textfeld verbinden oder z.B. auf eine Texttextur schreiben.

    Das war's soweit. Viel Freude damit.

    Wenn ihr weitere Fragen oder Anmerkungen habt, könnt ihr sie im Folgenden gerne posten. :thumbup: