Java Central Station

fransja
Berichten: 16
Lid geworden op: 03 sep 2023, 11:27
Locatie: Alblasserdam

Bericht door fransja »

Hallo allemaal,

Als eerste dank voor de reacties op de eerst release. Aan een 2 update wordt gewerkt.
Het is erg leuk om te zien dat dit opensource project dat op github staat wereldwijd door mensen mensen als inspiratie en als throttle voor DCC-EX wordt getest/gebruikt (en als je een github account hebt geef een ster ;) ).

Een aantal maanden geleden had ik al iets verteld hoe de layout in JCS wordt getekend, nl met "tegeltjes".
Een "tegeltje" representeert een stuk rails. Dit kan een gewone rechte rails zijn, een bocht, een wissel, een kruising, een blok, etc.

Om automatisch te kunnen rijden moet een trein dus "weten" hoe die van A naar B komt, m.a.w de route. Kortom er moet een soort van "Tom Tom" functionaliteit zijn die de plattegrond kan "lezen".
Ik heb hier voor een Router gemaakt. Deze router vertaald als eerste de plattegrond in een zg grafisch object model.
Vervolgens wordt er een route algoritme op "los gelaten" die de verbindingen maakt (soms wordt het zelfs AI genoemd, maar zo ver wil ik niet gaan daar de methodiek reeds vele tientallen jaren bestaat).

Ik mijn onderzoek naar deze functionaliteit kom je gek genoeg enorm veel voorbeeld programma's en blog post's tegen over het laatste stukje van de routing puzzel, het algoritme.
De 3 meeste gebruikte hiervan zijn: Maar bij al deze blog post's en voorbeelden was de grafische data structuur er al bij gezet.
Het maken de grafische structuur is nu juist het meest lastige stuk, hoe vertaal je een plattegrond in zo'n grafische structuur?

Hoe heb ik dat in JCS opgelost:

Een graph structuur bestaat in essentie uit nodes en edges. Een node kan gezien worden als een fysieke locatie. De edge is de verbinding tussen 2 nodes.
nodes_edges.png
nodes_edges.png (12.93 KiB) 752 keer bekeken
Een Edge, (wordt ook wel vector genoemd) heeft een richting, dus van er is een Edge van A naar B en een van B naar A.
Een Edge heeft ook een lengte, Deze lengte wordt later gebruikt om de optimale route te vinden.

In de Graph structuur wordt in JCS iedere tegel een node. De Edges zijn de verbindings punten van de rails die op de tegel wordt afgebeeld. (de "paarse" cirkels in de tekening).
rij_tegels.png
rij_tegels.png (3.39 KiB) 752 keer bekeken
De Node kan dus van A naar B en van B naar A (in de tekening met 3 tegels dus van A naar B en B naar A en van B naar C en C naar B).

Een Wissel is een "specialtje", daar kan je 3 kanten op. Een wissel heeft 6 edges. Echter een wissel heeft een beperking.
Ja kan nl van A naar B, van A naar C, van B naar A en van C naar A maar niet van C naar B. Deze beperking wordt actief tijdens het routeer proces.
tegels_met_wissel_en_richting.png
tegels_met_wissel_en_richting.png (8.95 KiB) 752 keer bekeken
Bij het maken van de grafische structuur zullen in eerste instantie alle Edges, ook die van B naar C en C naar B gemaakt worden.

A * (ster) algoritme

Zodra de grafische structuur is gemaakt wordt er getraceerd.
In een blok gestuurde omgeving zoals bij de meeste trein besturing programma's kan een trein van blok naar blok rijden. De route tussen 2 blokken wordt ook wel de rijweg genoemd.
In JCS wordt er een lijst gemaakt van alle blokken en vervolgens wordt er getest of er een route bestaat van een blok naar een ander blok.

Voor mijn test baan bijvoorbeeld zijn er 8 routes of rijwegen mogelijk. In het route paneel kun je ze selecteren en dan wordt de rijweg getoond.
testbaan_met_routes.png
testbaan_met_routes.png (23.59 KiB) 752 keer bekeken
Tot zover de vorderingen van JCS, naast het verhelpen van foutjes in de eerste release ben ik nu bezig met het opzetten van automatisch rijden. Dit is de volgende grote puzzel. :)

Groeten,

Frans
Bouwer van JCS

fransja
Berichten: 16
Lid geworden op: 03 sep 2023, 11:27
Locatie: Alblasserdam

Bericht door fransja »

Hallo allemaal,

Als eerste dank voor de reacties :)

Afgelopen weken heb ik weer wat vorderingen gemaakt met JCS.
Ik ben begonnen met het van automatisch rijden. Dit is een hele kluif! (maar wel zeer leerzaam ;) )

Als eerste een z.g. State machine gemaakt.
Het functioneel op een rijtje krijgen wat je precies allemaal moet doen heb ik zo getracht te modelleren.
Het volgen van dit state-machine pattern helpt mij om functioneel te beschrijven wat je moet doen en dit dan om te zetten in code.

Iedere locomotief die automatisch gaat rijden wordt gezien als een apart (sub) proces, een Thread.
De status kan pas verder springen als en aan bepaalde voorwaarde(s) is voldaan.

Voordat de auto mode wordt gestart wordt er "geabonneerd" op alle melders.
Zodra een melder afgaat die niet is verwacht wordt dit als "Spook" gezien en wordt de spanning van de centrale uitgeschakeld.

Ik heb de volgende functionele stappen gedefinieerd::
  • [li]Idle. Initiële status, als de locomotief in een blok staat kan naar de volgende status worden overgegaan.[/li]
    [li]SearchRoute. Zoek een route naar een volgend blok. Als er geen route is check of de locomotief van richting kan veranderen (een pendeltrein) zo ja probeer het met omgekeerde richting. Door als route is gevonden[/li]
    [li]LockRoute. Reserveer de route, zet de blokken in de juiste status, zet de wissels om. Een gereserveerde route of routedelen kunnen niet door een andere route worden gebruikt. Door als dit gelukt is.[/li]
    [li]Start Loco. Zet de melders in het vertrek blok tijdelijk uit, abonneer op de aankomstmelder in het bestemmings-blok. Start de locomotief op kruissnelheid (75%).[/li]
    [li]EnterDestination. Wacht op de aankomstmelder in het bestemmings-blok. Zodra deze afgaat (de trein rijdt dan het blok binnen) verlaag dan de snelheid van de locomotief tot 10%. Zet de status van het bestemmings-blok op "Binnenrijden", zet de melders in het vertrek blok weer aan. Abonneer op de bezet melder van het bestemmingsblok.[/li]
    [li]DestinationReached. Wacht op de bezetmelder van het bestemmings-blok. Zodra deze is afgegaan stop de locomotief (de bestemming is bereikt). Zet de status van het vertrek blok op "Vrij" Zet de status van het bestemmings-blok op "Bezet". Geef de route weer vrij, schakel alle melders vrij. Spring naar de wacht status.[/li]
    [li]Wait. Wacht een vooraf ingestelde tijd, als de automode is uitgeschakeld spring naar einde, anders naar SearchRoute.[/li]
statemachine.png
statemachine.png (225.08 KiB) 702 keer bekeken
Als ik dit zo opschrijf lijkt allemaal simpel, maar is het viel soms behoorlijk tegen voordat ik het goed functioneel had beschreven, laat staan geprogrammeerd.
Ik kwam allerlei deelproblemen tegen. Met name aan de GUI kant. Om namelijk het proces te begrijpen is een goede grafische terugkoppeling naar de gebruiker essentieel.
Idle, locomotief in Blok 1 geplaatst.
start_idle_mode.png
start_idle_mode.png (11.63 KiB) 702 keer bekeken
Bv bij de reserveer stap wordt de route in een bepaalde kleur getekend, die per stap kan verschillen.
lock_route2_state.png
lock_route2_state.png (14.4 KiB) 702 keer bekeken
Hiervoor moest ik nogal wat rededesign doen, omdat ik iedere tegel waaruit de layout tekening is opgebouwd moet kunnen adresseren vanuit de "Auto Pilot" om feedback over het proces te geven. Ook de tekening van de blokken heb ik aangepast om meer ruimte te krijgen. De + en - zijn vervangen door een dikke streep aan de + kant. Deze ruimte was nodig om de locomotief naam en afbeelding en de richting van de route te kunnen tonen.
Aankomst in bestemmings-blok (enter).
arrival_route2_state.png
arrival_route2_state.png (14.33 KiB) 702 keer bekeken
Aangekomen in bestemmings-blok (in)
arrived_route2_state.png
arrived_route2_state.png (11.67 KiB) 702 keer bekeken

Ik heb een "Statemachine stepper" gemaakt en een virtuele centrale om e.e.a te kunnen debuggen. Dit proces is nog in volle gang.
statemachine_stepper.png
statemachine_stepper.png (39.21 KiB) 702 keer bekeken
Komende tijd nog veel debuggen nodig, maar hoop binnen niet al te lange tijd het fysiek op mijn te kunnen gaan testen B) .

Groeten,

Frans
Bouwer van JCS

Momfer
Berichten: 107
Lid geworden op: 10 sep 2021, 21:36
Locatie: Zwolle

Bericht door Momfer »

Hoi Frans,

Wat een werk!

En knap ook hoe je het zo begrijpelijk opschrijft. Dan kan ik er nog steeds niet veel mee, maar ik vind het volgen van het proces wel interessant.
Laatst gewijzigd door Momfer op 23 mei 2024, 09:52, 1 keer totaal gewijzigd.
Groet,
Rico (momfer)

Centrale: DCC-Ex
Besturing: EXRAIL | Traintastic | RocRail | Engine Driver | DecoderPro
Rails: Minitrix / Fleischmann Piccolo
En hier vind je de bouw van mijn kerstbaan

fransja
Berichten: 16
Lid geworden op: 03 sep 2023, 11:27
Locatie: Alblasserdam

Bericht door fransja »

Hallo,

Een heugelijk moment voor mijzelf: de eerste keer dat JCS een locomotief automatisch laat pendelen op de test baan.
https://www.youtube.com/watch?v=CyLmGk6gfHA

Er moet nog veel gebeuren maar ik ben blij met dit resultaat.
Centrale is DCC-E Melders via HSI-S88.

:)
Bouwer van JCS

Momfer
Berichten: 107
Lid geworden op: 10 sep 2021, 21:36
Locatie: Zwolle

Bericht door Momfer »

Mooie sprong vooruit, Frans!
Groet,
Rico (momfer)

Centrale: DCC-Ex
Besturing: EXRAIL | Traintastic | RocRail | Engine Driver | DecoderPro
Rails: Minitrix / Fleischmann Piccolo
En hier vind je de bouw van mijn kerstbaan

fransja
Berichten: 16
Lid geworden op: 03 sep 2023, 11:27
Locatie: Alblasserdam

Bericht door fransja »

Hallo,

Als eerst dank voor alle reacties!
Het is alweer enkele weken geleden dat ik meldde dat ik automatisch kon pendelen met 1 locomotief.
Inmiddels kan dat met 2 of meer. Dit vergde toch wel weer wat refactoring.
Met meerdere locomotieven moet je er namelijk zeker van zijn dat de rijweg maar door 1 locomotief bereden kan worden. Ook moeten wissels die door meerdere rijwegen gedeeld worden een locked status hebben, zodat ze niet ineens worden omgezet.
Hiervoor waar dan ook de nodige wijzigingen in mijn programma noodzakelijk.

Ook het resetten van rijwegen bleek zeer wel noodzakelijk en ben ik nu aan het implementeren.
De State machine zoals ik die die in een eerdere post beschreef is dan ook behoorlijk veranderd.

Heel belangrijk bij software ontwikkeling in het algemeen is testen.
Behalve de testen om m'n buro in een "nerd" setting, ben ik nu begonnen met het toevoegen van automatische testen.
Daar leer ik ook veel van, omdat je ieder stapje van de state machine moet zien na te bootsten in een multi-threaded omgeving.

De eerste testen zijn nu gemaakt. Als voorbeeld:
  • Zet locomotief in een blok.
  • Zet de blok status van een van de 2 mogelijke bestemmingen op buitengebruik, zodat je zeker weet dat er maar 1 route gekozen kan worden.
  • Start de automaat voor deze locomotief.
  • Check of de verwachte route gevonden wordt naar de verwachte bestemming.
  • Start de locomotief (virtueel).
  • Check of de kruissnelheid is ingesteld en de vertrek blok sensors zijn uitgeschakeld.
  • Meld de bestemmings- blok inrij sensor (enter).
  • Controleer of de status van de State machine van StartState naar EnterState verspringt.
  • Controleer of de locomotief een lagere snelheid heeft gekregen.
  • Laat de 2e melder van het bestemmings-blok melden (in).
  • Controleer of de locomotief stopt.
  • Controleer of de state machine de InState verspringt.
  • wacht heel even (100ms).
  • Controleer of de state machine de WaitState verspringt.
  • enz..
Er moeten er nog een heel aantal gemaakt worden...

Een ander belangrijk aspect is de bediening.
Ik heb ook veel tijd gestoken aan het verbeteren van de UI.
Ik kwam er pas achter bij het testen van de Autopilot dat je allerlei menu's of menu items nodig hebt (daar sta je pas bij stil als je zo iets probeer zelf te maken) om bv een locomotief in een blok te zetten, te starten, stoppen, resetten etc.
newmenuitems.png
newmenuitems.png (8.96 KiB) 41 keer bekeken
Ook het in een blok plaatsten van een locomotief. Visueel heb ik dit opgelost door het locomotief icon te tonen in het blok.
richtingwest.png
richtingwest.png (3.7 KiB) 41 keer bekeken
De rijrichting van de locomotief t.o.v. het blok moet je kunnen instellen.
richtingoost.png
richtingoost.png (3.28 KiB) 41 keer bekeken
Ook het op de UI laten zien van wat er aan het gebeuren is is zeer belangrijk om een gebruikers vriendelijk programma te krijgen waar de gebruiker ook kan begrijpen wat er precies gebeurt is soms een hele uitdaging.

Enfin, ben nu naar de 2 release aan het toewerken, maar eerst vakantie ;)

Iedereen een fijne vakantie toe gewenst.

Frans
Bouwer van JCS

Plaats reactie

Terug naar “Zelfbouw software”