spacer.png, 0 kB

Torna indietro   Roboitalia.com - Il primo portale in Italia sulla robotica amatoriale > Robotica di base > Elettronica > E. Digitale

Rispondi
 
Strumenti discussione Modalità  visualizzazioe
  #1  
Vecchio 11-08-2009, 16.06.55
Cyber'93 Cyber'93 non è collegato
Robottaro master
 
Data registrazione: 31-10-2004
Residenza: casa mia
Messaggi: 345
Potenza reputazione: 70
Cyber'93 E' sulla buona strada
Predefinito Guida differenziale

Ciao,
mi è sorto un annoso problema, così annoso che non vi racconto la vicenda ma vi faccio una semplificazione
Supponete di avere due informazioni, diciamo due signed char (-128 ~ +127): la prima la chiamiamo GAS è la seconda STERZO (poi capite).
Ora supponete di avere un robot con una trazione differenziale: un motore DX e un motore SX, come se muovessero i cingoli di un carroarmato.
Il problema è convertire i dati di GAS e STERZO perché riescano a pilotare i due motori del robot DX e SX.
Adesso avete capito il perché di questi nomi.... devo elaborarmi una routine che somiglia molto a quella dei mixer per modelli R/C.
"Compratene uno di quelli, che costa una patacca!" direte voi.
Beh, non ci farei nulla, perché il tutto gira completamente in SW su un pc... quindi niente hardware....

Googlando un po' ho recuperato questa semplicerrima routine:

DX = (GAS-STERZO) / 2
SX = (GAS+STERZO) / 2

In effetti ottengo dei bei risultati... però....



Queste sono le due tabelline delle velocità, motore SX e DX.
127 = maz avanti
-127 = max indietro
Vedetele un po' come una rosa dei venti: in entrambe le tabelle, la casella in alto al centro è la velocità del relativo motore per fare andare il robot in avanti al max; la casella a destra al centro è la velocità di quel motore per la rotazione su sé stesso in senso orario e così via.
Ottengo dunque che la velocità media del robot è costante: sommando le due velocità dei motori ottengo sempre un valore assoluto pari a 127 (tranne il caso al centro in cui il robot è fermo...).
Questo mi limita fortemente: infatti, quando il robot va avanti dritto, indietro dritto o gira su sé stesso, i motori vanno a metà velocità.
Posso usare qualche formula che mi consenta di avere una migliore risposta dell'algoritmo??
Ho pensato anche a come funzionano i joystick della playstation: se l'asse X è 127 (parlo del valore letto sul potenziomentro da un AD, non dal software), l'asse Y è per forza 0, in quanto la concezione del joystick, all'aumentare di X abbassa Y; i joystick infatti "roteano" liberamente sui 360° (giocatori di PS incalliti capite cosa intendo), non hanno "angoli" Nord-est, nord-ovest, sud-est o sud-ovest. Il software della console o degli adattatori per PC correggono queste mancanze, come si può vedere dalla immagine che ho cercato di mettere assieme.



Dunque se io usassi il valore letto dal potenziometro NON QUELLO RIELABORATO e lo dessi in pasto alle due formule di cui sopra, avrei risultati con motori al 100% sia in avanti che indietro e in spin?

Ultima modifica di Cyber'93 : 12-08-2009 alle ore 08.44.45
Rispondi citando
  #2  
Vecchio 12-08-2009, 08.22.13
L'avatar di Myzhar
Myzhar Myzhar non è collegato
Robottaro master
 
Data registrazione: 07-04-2008
Residenza: Marina di Massa
Età : 42
Messaggi: 363
Potenza reputazione: 224
Myzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua fama
Predefinito

Non ho mai sentito parlare di quelle tabelle, nessuno ti obbliga di seguirle.
Se vuoi che il robot vada dritto l'importante è che la velocità di entrambi i motori sia uguale... imporre che la somma sia 127 non è certo un obbligo.

La modalità di guida che stai utilizzando segue il modello cinematico dell'UNICICLO, cioè un veicolo a "due ruote" disposte su un solo asse.
Puoi trovare qualche info utile qui:
http://www.automazione.ingre.unimore...a%20Mobile.pdf

Le formule per l'uniciclo si possono riassumere (con molte semplificazioni) in queste due:

velocità avanzamento = (Vd+Vs)/2
velocità rotazione = (Vd-Vs)/(2d)

dove Vd è la velocità del motore destro, Vs la velocità del motore sinistro e d la distanza in metri delle ruote.
Le velocità devono essere considerate in m/sec, cioè devi prendere la velocità angolare del motore (giri/sec) e moltiplicarla per il raggio delle ruote.

Come potrai notare se Vd=Vs non c'è rotazione e la velocità di avanzamento è uguale alla velocità dei motori.


Poi sinceramente ho notato una cosa: parli di signed char e di valori che vanno da -127 a 127... stai attento che gli interi signed vanno da -2^n a (2^n-1), dove "n" è il numero dei bit (in questo caso 8), cioè nel tuo caso da -128 a +127 (lo zero è considerato tra i positivi).
__________________
-------------------------------
_________ Myzhar _________
._______ Open Source _______.
.__________ Robot __________.
__ myzharbot.robot-home.it __
____ www.robot-home.it ____
-------------------------------

Ultima modifica di Myzhar : 12-08-2009 alle ore 08.24.23
Rispondi citando
  #3  
Vecchio 12-08-2009, 08.24.44
Cyber'93 Cyber'93 non è collegato
Robottaro master
 
Data registrazione: 31-10-2004
Residenza: casa mia
Messaggi: 345
Potenza reputazione: 70
Cyber'93 E' sulla buona strada
Predefinito

Ok siccome vedo che il problema è un poco complicato e di difficile spiegazione ho pensato di creare una piccola applicazione visuale che aiuti un po'; peccato che non riesco ad allegare il file zip da 17kb.... amministratooooriiiii.......
Rispondi citando
  #4  
Vecchio 12-08-2009, 08.27.18
L'avatar di Myzhar
Myzhar Myzhar non è collegato
Robottaro master
 
Data registrazione: 07-04-2008
Residenza: Marina di Massa
Età : 42
Messaggi: 363
Potenza reputazione: 224
Myzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua fama
Predefinito

Citazione:
Orginalmente inviato da Cyber'93 Visualizza messaggio
Ok siccome vedo che il problema è un poco complicato e di difficile spiegazione ho pensato di creare una piccola applicazione visuale che aiuti un po'; peccato che non riesco ad allegare il file zip da 17kb.... amministratooooriiiii.......
Potresti iniziare postando semplicemente il link al sito dove hai preso quella tabella in modo da farci capire bene a cosa si riferisce
__________________
-------------------------------
_________ Myzhar _________
._______ Open Source _______.
.__________ Robot __________.
__ myzharbot.robot-home.it __
____ www.robot-home.it ____
-------------------------------
Rispondi citando
  #5  
Vecchio 12-08-2009, 08.30.44
Cyber'93 Cyber'93 non è collegato
Robottaro master
 
Data registrazione: 31-10-2004
Residenza: casa mia
Messaggi: 345
Potenza reputazione: 70
Cyber'93 E' sulla buona strada
Predefinito

Scusa Myzhar ho scritto di fretta ed ero pure un poco assonnato per quanto riguarda le char.. mo' correggo così si capisce meglio...
CMQ le tabelle me le sono fatte con excel, rappresentano i valori di velocità dei motori per ogni angolo del joystick, in pratica se io sposto il Joy in alto a destra al massimo, ottengo che il motore di DX è fermo, quello di SX va al massimo (127)

PS: e comunque in excel riesco a lavorare bene solo se vado da -127 a +127, ma non è una grande differenza per quello che devo fare

Ultima modifica di Cyber'93 : 12-08-2009 alle ore 08.36.10
Rispondi citando
  #6  
Vecchio 12-08-2009, 08.41.45
Cyber'93 Cyber'93 non è collegato
Robottaro master
 
Data registrazione: 31-10-2004
Residenza: casa mia
Messaggi: 345
Potenza reputazione: 70
Cyber'93 E' sulla buona strada
Predefinito

Per risponderti ancora (scusa ma la velocità di questo topic è quasi quella di una chat), io non devo calcolare le velocità di rotazione o di avanzamento, per altro le formule le so perché ho letto diversi tutorial di Marnic sulle "due ruote vaganti non sono un robot" e tutto il manuale semiserio di robotica. Grazie Marco
Che la somma sia 127 è quello che risulta dalle due formula che ho usato io

Cmq il documento che mi hai linkato è un filino complesso (tesi di laurea..) e non tratta nello specifico quello che ho in mente io....

Ultima modifica di Cyber'93 : 12-08-2009 alle ore 08.44.06
Rispondi citando
  #7  
Vecchio 12-08-2009, 08.51.39
Cyber'93 Cyber'93 non è collegato
Robottaro master
 
Data registrazione: 31-10-2004
Residenza: casa mia
Messaggi: 345
Potenza reputazione: 70
Cyber'93 E' sulla buona strada
Predefinito

terzo post... per specificare che non sono io a decidere come muovere i motori in piena libertà, ma devo convertire due segnali a 8bit, di cui uno indica la velocità e l'altro la quantità di sterzatura (posso definirla così??)
Rispondi citando
  #8  
Vecchio 12-08-2009, 08.59.43
L'avatar di Myzhar
Myzhar Myzhar non è collegato
Robottaro master
 
Data registrazione: 07-04-2008
Residenza: Marina di Massa
Età : 42
Messaggi: 363
Potenza reputazione: 224
Myzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua fama
Predefinito

Citazione:
Orginalmente inviato da Cyber'93 Visualizza messaggio
Che la somma sia 127 è quello che risulta dalle due formula che ho usato io
Effettivamente è vero, ma è un difetto di quelle tabelle.
Per andare dritto devi imporre che lo sterzo sia 0 e quindi devi dare ai motori un valore pari a 127/2... è qui la fregatura.

Non è un modo corretto di pilotare l'uniciclo secondo me

Citazione:
Orginalmente inviato da Cyber'93 Visualizza messaggio
Cmq il documento che mi hai linkato è un filino complesso (tesi di laurea..) e non tratta nello specifico quello che ho in mente io....
Lo so, per quello ti ho riportato nel post le due formule che secondo me devi utilizzare... ho visto dalla tua età che poteva essere troppo per te.

Per quanto riguarda -128/127 non farti troppi problemi, utilizza pure il range -127/127, ma tieni conto che il limite inferiore può essere -128 e la cosa in un programma può portare a problemi se non la tieni in considerazione.
__________________
-------------------------------
_________ Myzhar _________
._______ Open Source _______.
.__________ Robot __________.
__ myzharbot.robot-home.it __
____ www.robot-home.it ____
-------------------------------
Rispondi citando
  #9  
Vecchio 12-08-2009, 09.11.55
L'avatar di Myzhar
Myzhar Myzhar non è collegato
Robottaro master
 
Data registrazione: 07-04-2008
Residenza: Marina di Massa
Età : 42
Messaggi: 363
Potenza reputazione: 224
Myzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua famaMyzhar La sua reputazione è oltre la sua fama
Predefinito

Prova a fare così:
non utilizzare le tue due formule alla lettera, ma usa un piccolo accorgimento, cioè non dividere per due, ma imponi una saturazione a 127 (o -127) per la velocità massima di ogni motore.

In questo modo se non hai sterzo il veicolo va avanti a velocità massima, se hai solo sterzo il veicolo ruota su se stesso, se hai un po' di gas e un po' di sterzo il veicolo "curva"... il tutto un po' più velocemente

Un esempio: se hai gas a 127 e sterzo a 127 avresti una somma di 254, velocità che non potresti assegnare al motore sinistro... la saturazione però ti impone di dargli 127 e sei a posto.

Tradotto in pseudo-codice diventa una cosa del genere:
Codice:
// Velocità motori
DX = GAS - STERZO
SX = GAS + STERZO

// Saturazione
if ( DX > 127 )
   DX = 127
else if( DX < -127 )
   DX = -127

if ( SX > 127 )
   SX = 127
else if( SX < -127 )
   SX = -127
naturalmente ricordati di utilizzare degli int (non dei char) per SX e DX altrimenti facendo le somme andresti in overflow.
Dovrai convertirli in char solo dopo aver fatto la saturazione


Fammi sapere come ti funziona in questo modo
__________________
-------------------------------
_________ Myzhar _________
._______ Open Source _______.
.__________ Robot __________.
__ myzharbot.robot-home.it __
____ www.robot-home.it ____
-------------------------------

Ultima modifica di Myzhar : 12-08-2009 alle ore 09.21.10
Rispondi citando
  #10  
Vecchio 12-08-2009, 09.20.27
Cyber'93 Cyber'93 non è collegato
Robottaro master
 
Data registrazione: 31-10-2004
Residenza: casa mia
Messaggi: 345
Potenza reputazione: 70
Cyber'93 E' sulla buona strada
Predefinito

Myzhar sei un grande...
Avevo già pensato di implicare una saturazione, ma perderei di proporzionalità, pensavo piuttosto di dividere per 2 il 254 e tutti i valori che ci sono di mezzo (il joy è proporzionale), però senza dividere il 127 dell'"avanti dritto". Però pensandoci dovrei dividere per 1 sul 127, e man mano che arrivo al 254 dividere per 1,05 , 1,10 , 1,15 .... 1,90 , 1,95 , 2,00.
Non so se hai capito...
Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione
Modalità  visualizzazioe

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code è Attivato
Le smilies sono Attivato
[IMG] è Attivato
Il codice HTML è Disattivato

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
Simulatore di guida furlo88 Forum generale 24 17-06-2012 22.10.09
Guida download Smigol Forum generale 3 10-04-2009 07.38.32
guida microprocessori & C Earth Elettronica 5 23-01-2007 17.42.35
c'era una volta... la guida di marnic... selfservice CNC e Robotica Cartesiana 2 07-12-2006 08.05.57


Tutti gli orari sono GMT. Adesso sono le: 05.41.33.


Basato su: vBulletin Versione 3.8.8
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Realizzazione siti web Cobaltica Foligno
spacer.png, 0 kB