Wednesday, October 8, 2008

The autopilot is growing... now i've implemented a state machine, to manage the set of different behaviours that an autopilot must have.. If you're moving into a direction, but your orientation is different, and you want to go to a new target position, the autopilot first of all has to correct your orientation, and align it with your direction, then decelerate ship until 0, turn the ship to point the target, accelerate the ship and travel until your destination.
A state machine is pefect to manage similar situations.. there are some "states" that represents the phases of the voyage, and the program promote o demote from a state to another when some condition are reached.. if you're aligned with the speed position, you can be promoted to the "decelerate the ship" phase, if, during the deceleration, some error occours (i.e. round errors), the state will be demote to the "align the ship" phase, the orientation will be correct and the state will be promoted again to the "decelerate the ship" phase.
When the speed will reach 0, another promotion to "Align with target destination", and so on..

The movie you can see is a demostration of all above.

---

L'autopilota pian pianino cresce, e le complessita da gestire crescono con esso.
La procedura di navigazione da un punto all'altro dello spazio e' tutt'alto che banale, ed e' comunque suddivisibile in tante fasi che si susseguono. Per gestire le fasi ho deciso di implementare una "macchina a stati", ovvero una sorta di flow chart che in base a quel che stiamo facendo ci dice quale sara' la cosa che dovremo fare dopo.
Facciamo un esempio. Vogliamo andare in un particolare punto dello spazio, e in questo momento pero' abbiamo l'astronave che gia' si muove verso un'altra direzione, ed e' pure orientata in maniera sbagliata.
Cosa deve fare l'autopilota?
Cominciamo a dividere il problema in passi:

1) Deve inanzitutto orientare l'astronave in modo che sia allineata con la direzione che sta attualmente seguendo. (Immaginate un carro armato, mentre cammina il cannone ruota per puntare ad un nemico.. avremo quindi il carro armato che si muove verso una direzione, ed il cannone che invece ne punta un'altra.. quel che vogliamo fare e' riportare il cannone allineato in modo che punti nella stessa direzione di marcia).
2) Una volta che e' orientata, occorre fermarla. In questo caso e' semplice: basta accendere i retrorazzi e tenerli accesi fino a quando la velocita' raggiunge lo zero.
3) Da ferma, l'astronave va ruotata fino a farla puntare verso la direzione della destinazione
4) Una volta puntata, si accelera e si inizia il viaggio vero e proprio.
5) Quando si arriva a destinazione, bisogna rallentare fino a quando l'astronave si ferma.

La macchina a stati non fa altro che dirci, ad esempio "siamo nello stato 3? la rotazione e' terminata? Ok, vai nello stato 4".
La possibilita' poi di promuovere uno stato da uno stato precedente da' la possibilita' anche di "bocciare" uno stato, facendo quindi retrocedere il flow chart.
Questa possibilita' e' estremamente utile quando si devono operare correzioni di rotta dovute ad errori di arrotondamento.
Mi spiego: se io decido di puntare un obiettivo che si trova a un milione di km di distanza, per quanto io sia preciso, e' ovvio che anche un errore di pochissimi decimi di grado mi portera' a mancarlo di migliaia di km.
Con la possibilita' di "bocciare" uno stato, ad esempio, quando mi trovo nel punto 2, dove sto decelerando l'astronave, se mi accorgo che man mano che mi avvicino l'astonave si disallinea, posso dire che se l'errore supera una certa soglia, lo stato deve essere bocciato al punto 1. Quindi al punto 1 l'astronave nuovamente si riallinea con la traiettoria giusta, e riprende il punto due. Se ancora una volta dovesse col tempo disallinearsi troppo, nuovamente ritorna al punto 1, corregge lo sbandamento, e riprende la sua frenata.

Il video che segue illustra proprio i punti 1,2 e 3. Sono abbastanza evidenti le correzioni che avvengono un paio di volte, man mano che l'astronave si avvicina alla velocita' nulla.

Ci tengo a precisare che, a partire dalla prima virata che vedere (che mi serve solo a disallineare la direzione dell'astronave da quella di movimento, cosi' da mettermi nella peggiore situazione possibile) e fino alla fine del filmato, l'astronave e' totalmente pilotata dal computer.

No comments: