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.

dinsdag 7 november 2023

Update v2.02

 Vandaag een update op de website gepubliceerd. 

Wat kan er nu met WMapp?

  • 3 arduino projecten van Wisselmotor.nl kunnen worden aangesloten met een USB kabel. PenDelDCC, MelDers en DCCmonitor. Door DCCmonitor aan te sluiten zijn de verschillende DCC commando beter te zien en te filteren. MelDers is als terug melders monitor te gebruiken op een standaard S88 systeem. Ook geeft MelDers meldingen zonder dat het aangesloten is op een S88 systeem. Te gebruiken als systeem voor bezetmeldingen of andere gebruikers input naar WMapp. PendelDCC kan met WMapp volledig worden ingesteld en bedient wat het programmeren van routes en alle andere zaken in PenDelDCC veel eenvoudiger maakt. In combinatie met WMapp is PenDelDCC ook een volledige DCCcentrale. Via de USB aansluiting stuurt WMapp commando's die door PenDelDCC als DCC commands op de rails worden gezet.
  • Baanplan. Na het installeren van WMapp opent het programma, het vraagt direct om een bestand 'actievelocs' op een door jouw te kiezen locatie  op te slaan. Een systeembestand wat noodzakelijk is. In het grote, nu nog lege witte middenvenster kun je een baanplan tekenen. Klik daarvoor op de knop baanplan wat een nieuw venster opent. Het tekengebied is aan te passen met de plus en min knopjes op de randen. Met een knop links boven in de hoek kun je een raster laten verschijnen wat het tekenen makkelijker maakt.  Klik op een vakje in het raster opent een venster waarmee je baanstukken, rails en andere zaken in het vakje kunt zetten. Rechte en kromme rails, kruising, wissels enzo. Eigenschappen van bv.een wissel als dccadres kunnen hier worden ingevuld. Op railstukken kunnen melders met hun instellingen en eigenschappen worden geplaatst. Baanplannen kunnen met opslaan en laden worden opgeslagen en terugeladen. Het laatst bewerkte baanplan wordt automatisch na het starten van WMapp geladen.
  • In locomotieven kun je locs aanmaken en opslaan. Ook kun je ze toewijzen als actieve loc. De loc komt dan in een klein venster links. Een klik daarop opent het rijvenster van de loc. Er is een keuze tussen handmatig rijden of automatisch. In automatisch moet je de oriëntatie van de loc opgeven, hoe staat de neus en gaat het vooruit of achteruit. Verder de plek waar de loc op de baan staat. Actieve melders zijn rood, daar kun je uit kiezen. Druk op rijden en de loc gaat volledig automatisch rijden.
  • In baanontwerp kun je al melderacties aan maken. Melders worden natuurlijk gebruikt voor bezet of terugmelding, maar je kan ook een melder gebruiken voor een actie zoals bv. het omleggen van een wissel, met een fysieke schakelaar aangesloten op de melder. 
Best al veel, ik maak dit programma gelijk op met het maken van een nieuwe modelbaan, en de treinen rijden hier al vrolijk in het rond, totdat ze elkaar weer in een deadlock rijden, maar dat is voor een andere keer. 

Wordt vervolgt.....

donderdag 2 november 2023

Automatisch rijden(7), snelheden en afstanden

 Locs rijden nu met de laatste versie van WMapp automatisch routes. Nog heel veel fouten onderweg, verkeerde afslagen en deadlocks bij meerdere locs, maar voor een eenvoudig baanontwerp werkt het. 

Natuurlijk moeten de locs langzaam beginnen met rijden en op tijd afremmen om langzaam aan te komen in het volgende station. Zeker niet abrupt starten en stoppen. Al snel ga je dan denken aan snelheid en afstanden op een of andere manier meten. En een heel circus optuigen om deze waardes te gebruiken om versnellingen en afremmen te berekenen en deze waardes opslaan voor vervolgsessies. Veel treinenprogrammaas gebruiken dit principe. 

De snelheid per snelheidstap nauwkeurig bepalen met bv. mijn SpeedMeter arduino project of met een ander een hulpprogramma of een functie in het treinenprogramma. Deze gevonden waardes daarna in het programma ingeven. De afstanden tussen de meldpunten kunnen dan door het programma worden berekend. 

Maar goed bekeken, de lengtes van de trajecten zijn natuurlijk ook niet 'op schaal'.  Een wisselstraat in het echt bij grootspoor met een overall lengte van een kilometer is op H0 altijd nog een metertje of 9, en zoveel ruimte hebben we meestal niet op zolder. Dus snelheden op schaal resulteerd in treinen die veel te snel rijden. De snelheden instellen op dat het er gewoon zo realistisch als mogelijk uitziet is de praktijk.

Zeker hebben programma's als koploper en Itrain bewezen dat het op deze manier wel perfect kan werken. Maar kan het niet simpeler?

De hele reden waarom ik WMapp aan het maken ben is, afgezien van het feit dat het gewoon hartstikke leuk is om te doen en dat je apetrots bent op jezelf als het überhaupt lukt, dat het eenvoudig moet worden, en dat meten van snelheden en afstanden is zo een gedoe.  Ik wil gewoon een baan plan tekenen, loc op de rails en op start drukken en de rest moet vanzelf gaan. 

Dus wat heb ik bedacht. WMapp werkt met PenDelDCC als centrale. (Of met een door jezelf te maken USB>DCC interface). Geen multiprotocol centrale, alleen DCC en alleen 28 snelheidsstappen. Zeker kun je met CV instellingen curves maken in de relaties tussen deze 28 stappen. Maar, we houden het eenvoudig, in WMapp nemen we de verschillende snelheidsstappen alsof ze volledig lineair oplopen. 

In WMapp kun je voor een loc in het locvenster een max, med en min snelheidsstap instellen. Max de maximale snelheidsstap waarin de loc mag rijden, komt voor als een loc een route, traject rijdt en het opvolgende traject, route is al bepaald en gereserveerd. De loc gaat dan niet vertragen  en stoppen  maar rijd op volle snelheid het volgende traject in. Min is de minimale snelheidsstap die de loc kan rijden, dit wordt dus eigenlijk de eerste snelheidsstap. Gebruikt vooral in het laatste stukje van een traject wachtend tot de melder actief wordt en de loc stopt. Med, medium of gemiddeld. Is de lengte van een route, traject bepaald, waarover later meer, dan rijdt de loc in snelheidsstap med +2 extra stappen tot het punt waar het afremmen moet beginnen. Is de lengte van het traject nog niet bepaald dan rijdt de loc in de snelheidsstap med -2 stappen totdat de melder van het station waar de loc naar  op weg is actief wordt en stopt de loc. 

Het automatische rijden wordt aangestuurd door een klok. 2x Per seconde wordt gekeken of er iets aan het auto-rijden van een loc moet veranderen.  Als voorbeeld stoppen als de loc het doel heeft bereikt, of sneller of langzamer gaan rijden als dat mag of moet. Bij begin van een traject wordt een variabele die de lengte van het te rijden traject voorsteld op nul gezet. Zolang de loc rijdt, en dus nog niet het eindstation van dit traject heeft bereikt, wordt deze waarde op iedere klik van de klok, 2x per seconde dus, verhoogd met de snelheidsstap waar de loc dan in rijdt. Bij het bereiken van het eindstation wordt deze waarde als de lengte/snelheid van het zojuist gereden traject opgeslagen. De rijrichting wordt hierin meegenomen, een traject heeft voor iedere loc twee waardes vooruit en achteruit rijdend. Wordt  hetzelfde traject later weer een keer gereden dan wordt de nieuwe waarde met de eerder gemeten waarde gemiddeld en dit wordt dan als de nieuwe lengte/snelheid waarde voor deze loc in deze richting rijdend onthouden.

Lengte/snelheid. Stel een gemeten waarde is 112. In snelheidsstap 28 rijdend is de loc dan 4 seconde onderweg op dit traject. Rijdend in snelheidsstap 1 duurt deze rit dan 112 seconden. In snelheidstap 8 112/8=14 seconden. De snelheid van de loc wisseld voortdurend en het gereden deel van het traject wordt in mindering gebracht op de totale afstand/snelheid. Op ieder moment is dus bekend hoever er nog moet worden gereden op dit traject. Van de huidige snelheid kan worden berekend hoeveel van deze afstand/snelheid nodig is om de loc met de minimale snelheid op het station te laten aankomen, dus wanneer het afremmen moet beginnen. 

En dit werkt dus. Al geïmplementeerd in WMapp. Versnellen, vertragen en stoppen wordt volledig automatisch bepaald. Wat je als gebruiker nog wel moet doen is de snelheden max, med en min instellen zodanig dat het er allemaal gewoon goed en realistisch uitziet.

Deze versie heb ik gepubliceerd en kun je downloaden van de website. Zoals vermeld zit nog vol met fouten, bugmeldingen naar mij hebben nu nog geen nut, er wordt aan gewerkt. Wel ben ik geïnteresseerd in hoe het installatie proces is verlopen of het überhaupt is gelukt, een mailtje hierover wordt op prijs gesteld.

Ik ga nu beginnen aan een 'afstand' bediening op de baan, om accessoires te kunnen schakelen zonder dat ik achter ' de computer' hoef te zitten. Ja ik weet er zijn prachtige digitale oplossingen voor als loconet of allerlei WiFi gedoe met apps, maar ook hier geldt ik wil iets eenvoudigs..

Wordt vervolgt....






SchakelBord

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