Aiuto su funzione o algoritmo per tirare fuori un robot dagli angoli

Ciao a tutti. Questo è il mio primo post sul forum e quindi faccio una piccola premessa.
Mi diletto in elettronica e ho buone competenze di programmazione. Dopo qualche esperimento mi sono messo a progettare un robot domestico partendo dalla base di un Rovio Wowee. L’unica funzionalità per il momento implementata è quella di individuare gli ostacoli tramite un sensore Ping montato su un servo e di evitarli.

Il problema nasce quando il robot si “incastra” in un angolo o spazio molto stretto come, ad esempio, lo spazio tra un divano e la libreria. Il robot inizia a girare a sinistra, poi a destra trovandosi alla fine sempre più bloccato contro la parete di fondo.

Ho provato a cercare sia sul forum che su Internet ma non sono riuscito a trovare funzioni o algoritmi che mi possano aiutare. Il problema principale, forse, è che non so proprio come descrivere il problema. Ho provato a cercare come “corner escape” oppure “stuck in corner” e via dicendo, ma non trovo nulla di utile.

Qualcuno di voi ha dovuto affrontare un problema simile? Sapreste indirizzarmi verso un esempio di codice o quantomeno suggerirmi una ricerca attinente il mio problema?

Grazie a tutti e buon fine settimana.
Fulvio.

fulviocri:
Ho provato a cercare sia sul forum che su Internet ma non sono riuscito a trovare funzioni o algoritmi che mi possano aiutare. Il problema principale, forse, è che non so proprio come descrivere il problema.

Non esiste l’algoritmo magico che ti risolve il problema in quanto fa parte due problematiche fondamentali per i robot mobili, “path planning” e “obstacle avoidance”, per la quali trovi fiumi di inchiostro, sia reale che virtuale, che descrivono la problematica e i vari algoritmi per affrontarle.
Il vero problema è che il tuo robot non dispone di nessun sensore di posizione che gli consente di elaborare una serie di movimenti atti ad uscire dall’angolo.
Dovresti prevedere almeno degli switch antibumper su i bordi in modo da poter elaborare almeno una costruzione molto grezza della disposizione delle pareti/ostacoli e in base a questa tracciare il vettore di uscita, il tuo robot è omnidirezionale pertanto non ha bisogno di ruotare per cambiare direzione di marcia.

Ciao astrobeed e grazie per la risposta. Quindi mi dici che il solo sensore ad ultrasuoni non è in grado di trarre d'impaccio il robot? A questo potrei rimediare aggiungendo come suggerisci dei bumper almeno frontali.

L'utilizzo di tecniche di path planning reputi sia strettamente necessario? Mi sono documentato un po' ma ho visto che si tratta di concetti abbastanza complessi anche se, devo essere sincero, mi stuzzica l'idea di implementare un simile tecnica nel mio robot.

In merito all'omnidirezionalitá il robot non lo è ancora visto che al momento utilizzo un solo IC driver che può pilotare solo due motori. Il terzo è ancora in stand by.

Grazie ancora e se hai qualche altro suggerimento, lo accetto volentieri.

Qualcosa come "dopo che hai fatto destra-sinistra per 6 volte, torna indietro".

Oppure, piu semplicemente, quando si arresta di fronte ad un'ostacolo, farlo arretrare per una decina di cm come prima cosa, cosi non rischia di incastrarsi sempre piu ... ;)

Etemenanki: Oppure, piu semplicemente, quando si arresta di fronte ad un'ostacolo, farlo arretrare per una decina di cm come prima cosa, cosi non rischia di incastrarsi sempre piu ... ;)

Non è così semplice, purtroppo uscire dagli angoli è una cosa molto complessa da risolvere, se poi il robot non ha possiede nemmeno un rudimentale sistema di sensori diventa praticamente impossibile farlo senza utilizzare il famoso algoritmo (!) :)

Questo video dimostra come un robot semplice quale il 3PI di Pololu, basato sul Atmega 328 e programmabile sia con Atmel Studio che tramite IDE di Arduino, è in grado di risolvere un labirinto, anche molto complesso, elaborare il percorso migliore ed eseguirlo alla massima velocità possibile.
Il vantaggio del 3PI è che nasce come line follower, e lo fa molto bene, pertanto, grazie ai sensori di riga, dispone di costanti informazioni su come si muove ed è in grado di ruotare con precisione rispetto alle segmentazioni della linea.
Il maze solving comporta l’utilizzo del path planning e obstacle avoidance, uscire dai percorsi morti ha la stessa complessità dell’uscire dagli angoli, inoltre la gestione dell’inseguimento linea viene implementata tramite un pid, realizzare un buon line follower non è una cosa semplice come sembra :slight_smile:

Grazie a tutti per le risposte. Seguendo il suggerimento di astrobeed ho iniziato a studiare meglio l'algoritmo Wavefront nella speranza di capirci qualche cosa. Per il momento sono in alto mare ed ho parecchi dubbi ma credo convenga che io apra un nuovo thread per porre le domande. Giusto?

Grazie ancora a tutti.