consiglio su logica di programmazione robot

Salve a tutti, sono in una fase cruciale col mio primo robot. Al momento ho realizzato, riciclando componenti da una stampante jet e un lettore dvd, una piattaforma mobile a 3 ruote (1 sterzante), dotato di una torretta girevole con sopra un sensore ir che tira fino a 1,5 mt. ovviamente c'e' arduino uno sopra.
Tutte le parti, singolarmente funzionano perfettamente, sono in grado di scandagliare a 180 gradi lo spazio che ha difronte, o di muovermi.
Ora vorrei rendere il robot in grado di muoversi autonomamente nell'ambiente (il progetto futuro, e' dotarlo di fotoresistenza e pannellino solare per permettergli di autoalimentarsi quando ne ha bisogno :slight_smile: ).

e qui il consigio: una struttura di software tipo "parallelo", che ad es. calcoli ed elabori gradatamente a ogni ciclo di programma (spero di riuscire a spiegarmi) oppure una struttura tipo "sequenziale", dove le varie funzioni vengono eseguite una alla volta (con dei do-while, per es.)

arduino può fare solo una struttura sequenziale. Però, se ogni loop leggi tutti i sensori una volta e fai certe azioni, allora probabilmente arduino sarà talmente veloce ad eseguire il loop che all'occhio umano è come se tu avessi creato un sistema parallelo.

Ovviamente alcune azioni come governare il motore è meglio non prenderle troppo spesso, magari solo 10 o 20 volte al secondo, in modo da evitare di inviare troppi comandi che tanto il motore non riuscirebbe ad eseguire per via di inerzie etc...

grazie per il consiglio :slight_smile:
mi sembra di capire che una struttura "tipo parallelo" possa offrire il vantaggio di una buona interazione col mondo esterno, nonche' interazione tra le varie parti del robot. per contro mi da l'idea che richieda uno sforzo maggiore per quanto riguarda la programmazione, e che possa risultare una struttura piu' fragile rispetto a un sistema "a blocchi". o magari mi sbaglio..
sarei tentato, a causa del brucio per vedere il mio robottino andare autonomamente, di scegliere quest'ultima strada, ma mi rendo conto che forse e' meglio investire subito nella via migliore.. tu come faresti Lesto?
grazie

sarei tentato, a causa del brucio per vedere

Giuro ho letto circa 10 volte, ma non sono riuscito a trovare una parola plausibile da sostituirea a "brucio". :stuck_out_tongue:

e qui il consigio: una struttura di software tipo "parallelo", che ad es. calcoli ed elabori gradatamente a ogni ciclo di programma (spero di riuscire a spiegarmi) oppure una struttura tipo "sequenziale", dove le varie funzioni vengono eseguite una alla volta (con dei do-while, per es.)

mmmm... vedi, il fatto è che non sono le parole adatte, e io non trovo quelle giuste al momento. Vediamo, il microcontroller montato su arduino non è in grado di eseguire due compiti in modo paralello. Per cui l'unica è l'esecuzione sequenziale delle istruzioni. Anche quando usi AttachInterrupt per eseguire una tua funzione a seguito di un evento hardware, le istruzioni vengono processate sequenzialmente.

Io intuisco il problema che ti poni, tu dici: Come faccio a scandagliare una zona e contemporaneamente comandare un motore?

Per il momento concentrati sul problema pensando di avere solo un microntroller a disposizione, poi pensa se potessi chiedere ad un microcontroller "fai questo e avvisami quando hai terminato". Ciò è possibile dividendo i compiti in più di un microcontroller. Ma si deve creare un protocollo veloce di comunicazione.

C'è un modo di sviluppare sequenziale che viene chiamato "macchina a stati finiti" dove ad esempio prima di terminare uno stato/modo disabiliti quello attuale e abiliti quello che decidi tu. Lo stato seguente lo decidi prima di abbandonare lo stato attuale. Ovviamente lo stato attivo viene eseguito e tutti gli altri no, se serve eseguire un determinato stato lo devi abilitare da dentro lo stato attivo.

una cosa del tipo:

loop()
{
if (stato == 1)
{
fai delle cose qui, in base ad eventi o in pooling decidi che stato == 2 oppure 3, 4 ecc.
}

if (stato == 2)
{
codice ....
}

if (stato == 5)
{
codice ....
}
}

Nota però che così ha solo uno stato esclusivo, mentre se use altr variabili di stato es. statoLefMotor, puoi decidere di abilitare statoLeftMotor insieme a stato=5. Ma l'ordine di esecusione sarà sempre sequenziale.

Spero di non averti confuso le idee.
Ciao.

MauroTec:

sarei tentato, a causa del brucio per vedere

Giuro ho letto circa 10 volte, ma non sono riuscito a trovare una parola plausibile da sostituirea a "brucio". :stuck_out_tongue:

avere il brucio, e' un modo per dire "avere la fotta x qualcosa", solo un po' meno grezzo :slight_smile:

grazie 1000 MauroTec, non mi hai confuso le idee, anzi.. mi hai dato un'ottima traccia su cui lavorare. probabilmente ci sono vari modi per ottenere risultati soddisfacenti da un robot, ma la tua dritta mi indirizza verso una strada ufficiale, canonica, che da debuttante con arduino non conoscevo.
Con google ho gia' trovato un sacco di informazioni (da analizzare con calma, mi sembra un argomento per ingenieri).
Mi sembra che il concetto di macchina a stati finiti sia abbastanza vicino al concetto che avevo espresso (male) di struttura sequenziale.

grazie ancora

fotta?

Meno male che c'è google, insomma la fissazione.

Mi sembra che il concetto di macchina a stati finiti sia abbastanza vicino al concetto che avevo espresso (male) di struttura sequenziale.

Si dice anche che noi esseri umani siamo delle "macchine sequenziali" e quindi in giro trovi molte teorie sulle macchine a stati sequenziali. Nota che anche per me la cosa è nuova, diciamo che conoscevo il termine per sentito dire, poi ho avuto il tempo di documentarmi un pò ed ho scoperto che avevo già scritto codice per una macchina a stati in passato, solo che io consideravo (per semplicita) la transizione da uno stato all'altro (ingresso, stato, uscita) come uno stato slegato ed assolutamente indipendente.

Mentre ci sarebbe da realizzare simbolicamente uno stato pensando alle varie fasi interne non confondendole con i sottostati. E qui mi fermo perchè è tutto molto virtuale specie con la programmazione procedurale, con gli Classi/Oggetti la cosa diventa molto meno virtuale.

Ciao.

ho trovato un documento molto interessante che parla dell'argomento, e che riporta un esempio, a mio avviso (di principiante) eccezziunale..
L'esempio in questione e' il n.2, quello basato su un array di inizializzazione, che in pochissime righe di codice, gestisce gli stati in una maniera molto flessibile.
si possono avere:

  • stati tipo flip-flop, che ad ogni scansione di programma commutano da uno stato all'altro
  • stati permanenti, che rimangono attivi fino al sucessivo cambio stato
  • stati con inizializzazione, che ne attivano uno solo all;inizio, poi si stabilizzano su un'altro stato
  • stati concatenati

e' esattamente quello che mi serviva, l'ho gia' inserito nel mio sketch con risultati incoraggianti
per chi fosse interessato il link e' : http://www.dsi.unifi.it/~fantechi/INFIND/dispAut-RT.pdf

grazie ancora

IMHO il codice che da una letta a tutti i sensori la fai quasi ogni loop, magari 30-40 volte al secondo.
poi in base alle letture decidi se devi cambiare stato del robot.
Poi esegui le azioni corrispondenti allo stato attuale.

Se vuoi vedere un pò di implementazioni IA pure, ma in java, dai un'occhiata a robocode.

edit: poi io non lo farei a stati ma tenteri il più possibile di linearizzare le azioni attraverso la matematica, ma non è certo un approccio user o cpu friendly