zaterdag 18 november 2023

Automatische rijden, het algoritme

Het algoritme beschrijft hoe het automatische rijden in elkaar steekt. De versie V.20 die nu te downloaden is maakt onder veel meer het automatisch rijden mogelijk. Met deze versie kan ik nu weer verder met de baan en het baanontwerp. Vooral de juiste plaatsing van melders, waar ze komen, is erg bepalend voor het automatische rijden. Laat ik dit van af nu autorijden noemen. Wissels moeten op tijd worden omgelegd en locs moeten op tijd stoppen. Ik gebruik hier een loc die goed is afgesteld, gezien snelheden, optrek en afrem tijden en een loc die dramatisch slecht is afgesteld, rijd veel te langzaam en optrekken en vooral vertragen duurt veel te lang. Perfect dus om mee te testen of autorijden met alle typen locs is te doen. 

Onderstaand verhaal is heel erg globaal en ook voor mezelf bedoeld zodat ik later kan nalezen hoe het ook al weer ongeveer in elkaar steekt.

Het algoritme.
Iedere loc heeft een eigen rijvenster. Een knop wisselt tussen handmatig of autorijden. In autorijden mode is er een doorlopend continue proces. Een knop wisselt tussen rijden en wachten. 
In mode-rijden wordt een flag 'autostart' gezet. Een wacht-lus wordt gebruikt om op gewenste plaatsen pauzes in het proces te maken. In mode-wachten wordt deze wacht-lus oneindig gemaakt zodat het autorijden proces voor deze loc uiteindelijk niet verder gaat. Resultaat is een loc die nadat het op wachten is gezet doorrijdt naar het laatste station wat door deze loc is bezet en daar dan stopt en blijft staan omdat er door het stopzetten van het routezoeken proces geen routes meer zijn. 
Zet je de loc weer naar handmatig rijden, met de knop stop/auto. Dan wordt alles wat deze loc aan bezetmeldingen, routes gewist. 
De flag autostart is een onderbreking in het doorgaande proces van autorijden, wordt autostart 'waar' gezet met de knop 'rijden' dan wordt de onderbreking weggehaald, start het proces of het proces wordt hervat.

Auto is een rondgaand proces, het ' begin' is nu enkel voor het verhaal. 
In het loc-venster wordt een 'auto-clock' gestart. Om de 20ms worden achtereenvolgens twee processen aangeroepen. AutoDrive en AutoRoute. 
AutoDrive aangeroepen door de clock >
Getest wordt of de doelmelder in het huidige route bezet is. >
Als bezet, is doelstation bereikt. Loc gaat vertragen naar stop, wissels en melders worden weer vrijgegeven, route wordt uit de lijst met routes voor deze loc gehaald.
De volgende route in deze lijst wordt ingesteld als nieuwe route. Loc gaat versnellen. Nieuw doelstation.
Als doelmelder niet bezet, loc gaat versnellen, als er geen vervolgroute is, zoeken naar een vervolgroute.   

Als er geen vervolgroute is gevonden kan dit komen doordat alle routes bezet zijn, dan wordt wacht-lus  gestart, na aflopen van de wachttijd wordt opnieuw gezocht naar vrije route. Of er zijn geen routes meer in deze rijrichting dan wordt de rijrichting gekeerd een wacht-lus wordt gestart. Na aflopen wordt opnieuw gezocht naar routes nu in de omgekeerde richting. 

Rijd de loc niet een route maar zijn er wel routes voor deze loc bepaald, dan wordt de eerste route in de lijst ingesteld. 

Zijn er geen nieuwe routes gaat de loc door met vertragen tot stop.

AutoRoute periodiek aangeroepen door auto. Autoroute werkt met een routefase, bij iedere doorloop wordt een fase doorlopen. Autoroute bepaald de routes die een loc gaat rijden, daarbij worden de bepaalde routes bezet gesteld. Als er geen routes hoeven te worden gezocht dan staat de route fase op een idle fase. Helaas daar weet ik geen nl woord voor, een fase die gewoon niks doet. Vanuit andere delen van het programma kan een 'start-zoeken-route-fase' worden ingesteld. Bekend moet zijn de rijrichting, vooruit  of achteruit rijdend, de stand, neus naar links  of neus  naar rechts en de melder van waaruit een vrije route moet worden gezocht. 

Er wordt een lijst gemaakt met alle mogelijke routes. Routes in de verkeerde rijrichting worden eruit gefilterd. 

Een route bestaat uit een onbeperkt aantal raildelen, rechte of gebogen rails, wissels kruisingen. Ieder railstuk heeft een oriëntatie van links naar rechts. En 1 of meerdere aansluitingen. Als voorbeeld een recht stuk heeft 2 aansluitingen, waar de trein het railstuk opkomt en waar het de rail verlaat. Van en naar heb ik dat in het programma genoemd. Een wissel heeft er drie en een kruising 4. Een draaischijf, nu nog niet in WMapp geïmplementeerd, dat volgt nog, heeft misschien wel 30 aansluitingen.

Railstukken kunnen in stappen 45graden worden gedraaid, zodat er per single railstuk 8 verschillende mogelijke aansluitingen zijn. Bij een rechte rail ligt de naar aansluiting in het verlengde van de van aansluiting dus is de van aansluiting bv.1 dan is de naar aansluiting 5. De van aansluiting is altijd 1,2,3 of 4 en de naar aansluiting is altijd 5,6,7 of 8. Om nu niet alle lezers te laten  afhaken zal ik de andere railstukken niet behandelen.

Een loc staat met zijn neus naar rechts en rijd de railstukken van de van aansluiting naar de naar aansluiting. Nu zit er in de route een 180 graden bocht. Aan het einde van de bocht staat de loc met zijn neus naar links. Dit wordt opgemerkt tijdens het bepalen van de route. Deze route met die bocht heeft een van aansluiting van 5 en een naar aansluiting van 5 dus is gekeerd. Dit wordt als een flag in de route meegeven. Is de loc klaar met het rijden van deze route dan wordt de oriëntatie, de stand van de loc omgezet. Ook te zien aan het plaatje in het rijvenster.  Een loc met zijn neus naar links rijdt de railstukken van de naar aansluiting naar de van aansluiting. Vanzelfsprekend bij vooruit rijden, bij achteruit rijden andersom. 

Zijn er geen routes meer  in de lijst na het filteren op rijrichting, dan stopt het zoeken, met terugmelding dat er geen routes in deze richting zijn. Rijrichting wordt gekeerd, een wachtfase gestart en na aflopen van die wachtfase worden opnieuw alle mogelijke routes bepaald en op rijrichting gefilterd. Haast onmogelijk is het dat er dan opnieuw geen routes worden gevonden, immers die loc is toch ook op deze plek gekomen, maar is dat toch zo dan wordt het autorijden voor deze loc afgesloten. 

Staat er na het filteren op rijrichting nog 1 route in de lijst. Dan hebben we te maken  met een routeblok. Een stuk rails met twee of meer melders zonder wissels of andere aftakkingen. Voor iedere route, dus van melder naar melder, in dit routeblok wordt nu een route aangemaakt in de lijst routes voor deze loc. Melders worden bezet gezet. Op het baanplan is te zien hoe 1 voor 1 de melders de kleur van de loc krijgen. Deze routes, de delen van een routeblok, kunnen niet bezet zijn. Voordat een route voor een loc kan worden ingesteld naar een routeblok wordt gekeken of alle melders in dat routeblok vrij zijn. Is dat niet zo, dan kan deze route niet worden ingesteld.

Staan er na het filteren op de rijrichting meerdere routes nog in de lijst, dan gaan we de bezette routes eruit filteren. Dit gaat in meerdere stappen.

Is het doelstation, melder van de geteste route vrij. Zijn alle wissels opgenomen in deze route vrij. (zijn alle andere blokkades, als een gelijkvloerse kruising vrij. In v2.2 nog niet geïmplementeerd) en (last but not least, and by far the most complex one) zijn alle melders van een railblok opgenomen in de geteste route vrij.

Alle bezette routes zijn dus uitgefilterd.

Zitten er nu geen routes meer in de lijst, dan zijn alle mogelijke routes dus bezet. Het zoeken stopt nu en aan het zoekproces wordt gemeld dat alle routes bezet zijn. Een wachtfase wordt weer ingesteld en na een tijdje gaan we weer opnieuw zoeken. 

Is er nog 1 route mogelijk na het filteren op bezet, dan wordt deze aan de lijst routes van de loc  toegevoegd. Melders, wissels en blokkades worden apart bezet gezet.

Zijn er meerdere routes overgebleven, dan wordt daaruit een willekeurig keuze gemaakt en deze wordt aan de lijst te rijden routes van de loc toegevoegd.

En dit werkt dus nu ....wordt vervolgd.

Geen opmerkingen:

Een reactie posten

SchakelBord

Tijdje niet gepost. Werk aan WMapp staat even stil omdat ik aan andere projecten momenteel werk. Een robot schip, werknaam RoBoot waarmee st...