Java Central Station

Gebruikersavatar
fransja
Berichten: 19
Lid geworden op: 03 sep 2023, 11:27
Locatie: Alblasserdam
Contacteer:

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) 940 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) 940 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) 940 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) 940 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

Gebruikersavatar
fransja
Berichten: 19
Lid geworden op: 03 sep 2023, 11:27
Locatie: Alblasserdam
Contacteer:

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) 890 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) 890 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) 890 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) 890 keer bekeken
Aangekomen in bestemmings-blok (in)
arrived_route2_state.png
arrived_route2_state.png (11.67 KiB) 890 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) 890 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

Gebruikersavatar
fransja
Berichten: 19
Lid geworden op: 03 sep 2023, 11:27
Locatie: Alblasserdam
Contacteer:

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

Gebruikersavatar
fransja
Berichten: 19
Lid geworden op: 03 sep 2023, 11:27
Locatie: Alblasserdam
Contacteer:

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) 229 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) 229 keer bekeken
De rijrichting van de locomotief t.o.v. het blok moet je kunnen instellen.
richtingoost.png
richtingoost.png (3.28 KiB) 229 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

Gebruikersavatar
fransja
Berichten: 19
Lid geworden op: 03 sep 2023, 11:27
Locatie: Alblasserdam
Contacteer:

Bericht door fransja »

Hallo,

Hier een korte update van JCS. Door de vakantie een paar weken even niet aan mijn modelspoor automatiserings project (JCS) gewerkt.
Dat heeft goed gewerkt. Na mij vakantie was het op sommige punten even nadenken wat ik ook alweer aan het doen was ;)
Dus er even uit help ieder geval tegen tunnel visie.

Vlak voor mijn vakantie had ik al gemeld dat ik met meerdere locomotieven kon rijden maar die ging niet helemaal foutloos.
Na mijn vakantie heb ik mijn gestort in het schijven van test cases, zodat ik de State Machine stap voor stap kan door testen.
Hier kwam veel uit. (Grappig hoe je altijd weer wordt afgestraft als je ergens een short-cut maakt om iets voor elkaar te krijgen).

Enfin na de nodige issues met Threads (~tegelijkertijd tijd lopende “processen”) heb ik nu een versie die heel netjes meerdere locomotieven kan besturen.
Om verde testen te vereenvoudigen heb in een Virtuele Centrale in JCS toegevoegd (naast de bestaande fysieke centrales Markin CS 2/3 en DCC-EX plus HSI-S88). Deze Virtuele Centrale triggert automatisch de eerst volgende sensor die een locomotief nadert als die rijdt.

Ik heb in middel een nieuwe virtuele test baan gemaakt. Waar in dit voorbeeld 2 locomotieven rijden, ik heb er een
YouTube filmpje van gemaakt.

Nu moet ik nog een hoop scherm wijzigingen maken, bv om de wachttijd per blok te kunnen instellen.
En natuurlijk test cases.
Werk nu toe naar de 2e release.

Inmiddels ben ik ook op zoek naar iemand die mij een ESU Ecos voor enige tijd kan lenen, zodat ik deze hardware ook kan ondersteunen.

Zoals altijd staan de laatste wijzigingen op Github (actieve branch op dit moment is 15-automatic-control)

Frans
Bouwer van JCS

Gebruikersavatar
fransja
Berichten: 19
Lid geworden op: 03 sep 2023, 11:27
Locatie: Alblasserdam
Contacteer:

Bericht door fransja »

Hallo,

Afgelopen weken heb ik verder gewerkt aan mijn besturings- software project JCS.
In de vorige bijdrage had ik al vermeld dat ik bezig was met het maken van testcases, zgn Unit tests. Deze Unit tests testen "los" een functie in de software.
Ik heb hard gewerkt om de module die het automatische rijden “regelt", grondig door te testen.
Hier kwamen de nodige issues naar voren. Het is een redelijk complex stuk, daar het in meerdere threads (processen) asynchroon draait. Er gebeuren er allerlei dingen tegelijkertijd.
Het heeft me enkele brein krakers en tijd gekost om het goed door te testen.

Ik denk dat ik nu op een punt gekomen ben gekomen waar het er nu echt op lijkt dat de software stabiel en goed werkt, althans bij mij dan ;)

Vervolgens ben ik aan de gang gegaan met het maken van documentatie. Dit werkte voor mij verhelderend om eens alle stappen op te schrijven die je moet nemen voordat je überhaupt automatisch kan rijden. Ik heb dit aan de hand van mijn testbaan met de DCC-EX gedaan.
Dit bleek okk een hele goede test. Ik heb me verbaast over het aantal stappen dat je moet nemen.
Als je bezig ben met de software zelf te maken sta je er niet zo bij stil, daar je bezig bent met een klein stapje te bouwen, maar nu ik naar het geheel kijk was dat toch heel verhelderend.
Nooit echt bij stil gestaan hoeveel stappen moet nemen voordat je automatisch kan rijden.
TestLayoutSideBySide.png
TestLayoutSideBySide.png (477.1 KiB) 135 keer bekeken
Inmiddels ook documentatie gemaakt in het Nederlands, Setup Guide voor JCS en Rijden met JCS

Als klap op de vuurpijl, met toch wel een beetje gepaste trots, heb ik m’n eigen baan (zolderhoek) in JCS getekend en kan nu met 4 treinen automatisch rijden.
zolderhoek_layout.png
zolderhoek_layout.png (151.11 KiB) 135 keer bekeken
Terwijl dit rijdt heb ik alweer nieuwe ideeën om het programma te verbeteren :)

Ook is er een nieuwe release, versie 0.0.2 gepubliceerd.
Ik nodig iedereen, uit te testen, daar kan ik nog wel hulp gebruiken ;) hoe meer hoe beter.

Inmiddels ben ik in het bezit gekomen van een ESU Ecos 50000. Volgende stap is het toevoegen van deze centrale.

Groet,
Frans
Bouwer van JCS

Gebruikersavatar
fransja
Berichten: 19
Lid geworden op: 03 sep 2023, 11:27
Locatie: Alblasserdam
Contacteer:

Bericht door fransja »

Hallo,

Het is alweer enige tijd geleden dat ik iets het gepost over mijn JCS project. Ik maak nog steeds vorderingen

In mij laatste post had ik al vermeld dat ik in het bezit ben gekomen van een ESU EoS 50000. Ik ben nu bezig met het implementeren van het protocol.
En ik heb inmiddels verbinding.

Daar deze ECoS (inmiddels) 2 strepen in het scherm heeft (als iemand weet waar ik een vervangend scherm zou kunnen krijgen, graag).
Ecos50000.png
Ecos50000.png (632.24 KiB) 62 keer bekeken
Ik heb bedacht ik dat het "leuk" zou zijn dat JCS een ingebouwde VNC viewer krijgt (ook handig voor de Marklin CS3) dus ben ik daar mee begonnen en zie hier het eerste resultaat.
jcs-esu-vnc-viewer.png
jcs-esu-vnc-viewer.png (104.63 KiB) 62 keer bekeken
Toen ik deze VNC viewer aan het bouwen was en tijdens reverse engineering van het protocol kwam ik er achter dat ESU Ecos MDNS ondersteund.

Voor die genen die dit niets zegt, MDNS is een methodiek om apparaten op je netwerk automatisch te vinden. Dus ook dit ingebouwd.
JCS vindt nu de ECoS automatisch, je hoeft het ip-adres niet in te voeren.
Het enige is dat ze in het zelfde netwerk segment moeten zitten, maar dat is bij de meeste thuis netwerken meestal wel het geval.

Wat bleek verder dat ook de Marklin CS 3 dit ondersteund :) (al had ik automatisch vinden van het CS-3 ip-adres al op de "Marklin" manier geïmplementeerd).

Het protocol van de ESU is compleet anders als bij Marklin. Heb inmiddels "first light"
jcs-esu-ecos-first-light.png
jcs-esu-ecos-first-light.png (323.6 KiB) 62 keer bekeken
Kan nu het ECoS basis object uitlezen, krijg door hoeveel terug meld modules er zijn geconfigureerd en krijg nu de terug meldingen binnen.
Kan ook de rail spanning aan en uit zetten en krijg events binne als de rail spanning op de ECoS zelf wordt in of uitgeschakeld.

Ga nu beginnen aan het Locomotief gedeelte.
Ik moet binnen JCS wel het e.e.a. aanpassen om het ook met de ECoS te laten werken. Helaas blijkt de HAL nog niet abstract genoeg, maar het wordt er dus uiteindelijk alleen maar beter van.

Tot zo ver de vorderingen.
Zoals altijd is dit ook te volgen op github.

BTW heb je een github account laat een ster achter ;)

Groet,
Frans
Bouwer van JCS

Plaats reactie

Terug naar “Zelfbouw software”