Pages: 1 ... 6 7 [8] 9 10 11   Go Down
Author Topic: [Progetto comune] - Robotica  (Read 24684 times)
0 Members and 1 Guest are viewing this topic.
kokiua
Guest
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
senza almeno un accelerometro che determini il reale vettore gravità i nostri amici non potranno mai fare una salita o una discesa.
Utilizzando un semplice sensore ottico da mouse posto al centro, di fatto puoi fare a meno anche di un accelerometro, perchè ti basterà correggere il punto zero sino a quando non rileverai che il tutto si ferma, e con il "mouse" puoi determinare esattamente in quale direzione ti stai spostando e quindi dove si trova "all'incirca" anche il punto di equilibrio... o no?   :-?
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

io ho avuto un'idea che potrebbe tornare utile...
l'idea è questa:
per diminuire l'effetto "beccheggio" potreste (tramite un servo centrale) spostare un peso messo in cima ad un braccetto di lunghezza adok in avanti o indietro in modo da controbilanciare l'inclinazione  invece di farlo con le ruote, forse così si riesce a separare il bilanciamento dal movimento, e diventa tutto più semplice. smiley
Edit:
aggiungendo robe il peso potrebbe cambiare, ma basterebbe rendere il peso mobile sul braccio con un grano di bloccaggio.
altro piccolo problemino potrebbe essere la velocità di reazione del servo, ma adesso ci sono servi abbastanza veloci da poter superare il problema.
« Last Edit: June 29, 2010, 11:46:00 am by brainbooster » Logged

kokiua
Guest
 Bigger Bigger  Smaller Smaller  Reset Reset

Anche il portare in peso da una parte all'altra richiede una capacità di reazione tale che dubito possa funzionare bene... e poi si rischia di peggiorare l'effetto (stiamo parlando di Arduino smiley-wink )

Me lo immagino che balzella in qua e la con un peso che oscilla nel tentativo di stabilizzare il tutto  ;D (molto comico ;D )

Per stabilizzare eventuali oscillazioni può essere utilizzato anche un volano centrale... ma la cosa migliore è un controllo più preciso sulle ruote (maggiore la precisione minore il "beccheggio") e forse l'utilizzo di servi standard non è proprio la soluzione ideale, forse sarebbe meglio dei passo passo di precisione (ma tutto dipende anche dal costo totale smiley-wink )
Logged

Milano, Italy
Offline Offline
Faraday Member
**
Karma: 11
Posts: 3091
Sideralis Arduino!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Siccome ho visto modelli autobilancianti su questo forum anche di dimensioni notevoli e alti quasi un metro, credo che le richieste per andare bene siano due: la costruzione hardware e il software! smiley
Comunque da quello che ho visto in giro e' fattibile. Forza.
F
Logged

Federico - Sideralis
Arduino &C: http://www.sideralis.org
Foto: http://blackman.amicofigo.com

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 ;D ;D per un istante "è partito il filmato" di quello che ha scritto kokiua ;D ;D
però con un servo tipo questo http://www.hitecrcd.com/products/servos/digital/hv-ultra-premium-digital/hs-7940th.html forse il sistema sarebbe abbastanza rapido (costi permettendo), e poi nelle piattaforme, in mare aperto, si usa una cosa simile, se non sbaglio, per stabilizzarle  :smiley

edit: se disponete di un imu allora qui ho trovato roba che potrebbe interessare (magari l'avete già visto):
http://sites.google.com/site/onewheeledselfbalancing/Home/easy-build-low-cost-arduino-self-balancer
« Last Edit: June 29, 2010, 12:16:49 pm by brainbooster » Logged

Milan
Offline Offline
Edison Member
*
Karma: 2
Posts: 1128
gioblu.com
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie dei complimenti raga ma è proprio una cavolata!! Piu' che altro mi fa piacere di aver creato un oggetto che sta in piedi da solo e corregge in un range di 25 / 30 gradi (totali), con 53 linee di codice  smiley-wink
Un grande grazie va a Martino che come al solito si diverte con me a creare questi oggettini.

Quindi vorreste tiltare le batterie ;D.
E' sorto un mega-dibattito con Martino, proprio sulla problematica del rallentare. Cioè come si puo' rallentare con una struttura in equilibrio senza rovesciarla nella direzione del senso di marcia. Ho notato sperimentalmente che il principale problema di un selfbalancing che esca dalla situazione statica è rallentare la sua corsa per correggere. Nei programmi postati da me in precedenza manca una cosa fondamentale, prendere in considerazione l'inerzia ottenuta da una eventuale accelerazione. Molti di voi avranno impennato o visto moto impennare. C'è chi ha la dote che ci serve, cioè chi sa impennare decelerando, alcuni sanno anche quasi fermarsi ancora in equilibrio. Come? Controbilanciando il momento dato dalla decelerazione inclinando verso la direzione opposta al moto la struttura e quindi il peso. Piu' si vorrà frenare piu' il codino rischiera' di grattare a terra se si vuole rimanere in equilibrio (passatemi la metafora sono un motardista). Credo che il PID da solo non sia in grado di fare questo.

Credo ci voglia un termine da inserire che vari in rapporto a inclinazione * ultimo comando dato ai servi (cioè velocità attuale). Un valore che vari quando velocità e angolo aumentano. Come un motociclista deve saper togliere gas (o meglio frenare) se sta per ribaltarsi indietro  e accelerare se sta per appoggiare la ruota e rimanere in quel sottile angolo che mantiene stabile il mezzo fino all'arresto e all'esaurimento della forza di inerzia, tutto questo variando l'intervento in rapporto alla forza di inerzia a cui è soggetto (e quindi calcolare il momento ottenuto dall'eventuale frenata in rapporto alla velocità). Per ora come potrete sperimentare il robot se viene spinto con forza si riposiziona corretto ma non sa che sta andando in una direzione, quindi toglie motore perchè per lui cosi' è ok, di conseguenza per momento dato dalla decelerazione si ri-inclina, questo ciclicamente fino a quando arriva alla massima velocità e non avendo piu' momento imprimibile (accelerazione) cade nel senso di marcia.
Sarei curioso di sapere cosa ne pensa Guido.
Magari muovento il peso si puo' fare le veci del motociclista meglio che semplicemente frenando e accelerando.

Mi fa piacere che vi abbia intrippato la cosa  smiley-wink
« Last Edit: June 29, 2010, 08:43:47 pm by gioscarab » Logged

Community robotica / programmazione Arduino
www.gioblu.com

Milano, Italy
Offline Offline
Faraday Member
**
Karma: 11
Posts: 3091
Sideralis Arduino!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ho visto il progetto sul mio rss che segue let's make robots!
Logged

Federico - Sideralis
Arduino &C: http://www.sideralis.org
Foto: http://blackman.amicofigo.com

Rome (Italy)
Offline Offline
Newbie
*
Karma: 0
Posts: 12
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sono la persona meno adatta, non sono mai salito su una moto smiley
Scherzi a parte, secondo me si può anche fare senza muovere un peso, però devi sapere con una buona precisione tutto quello che succede. Come hai detto anche tu, i sensori IR ti fanno stare sempre parallelo al terreno, che non è necessariamente la stessa cosa di stare dritto.
Con un accelerometro puoi bilanciare il tutto, quando freni si inclina automaticamente indietro per compensare la decelerazione, a lui interessa che la somma vettoriale sia = 0. Se si aggiunge il vettore della decelerazione, si inclina per avere  il vettore risultante sempre rivolto verso il centro della terra. Che è poi quello che fa il motociclista con il suo senso dell'equilibrio e i sensori vestibolari.
Questo in teoria, non ho la pratica necessaria per capire quanti accelerometri servono e/o se ci vogliono anche dei giroscopi.
Segaway docet:
http://www.segway.it/default.aspx?tabid=120
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho dato un'occhiata al codice del segway e (per quanto ho potuto capire) funziona ma fino ad un certo punto...
se si inclina troppo, l'algo rinuncia al bilanciamento e "spegne" i motori.
 :smiley
Logged

Rome (Italy)
Offline Offline
Newbie
*
Karma: 0
Posts: 12
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

se si inclina troppo, l'algo rinuncia al bilanciamento e "spegne" i motori


con conseguente craniata del passeggero? smiley

E pensare che quello usa diversi accelerometri e giroscopi.
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley
con spegne non volevo chiaramente dire che disalimenta ma che non controlla più il bilanciamento smiley lo avevo virgolettato apposta.
Logged

Milan
Offline Offline
Edison Member
*
Karma: 2
Posts: 1128
gioblu.com
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao guido, brain, Fede, grazie per le risposte. Ieri notte sono andato a letto tardissimo perchè il mio cervello è partito per la tangente.
Ragionavo su un eventuale algoritmo del genere:

C (correzione) = [P (proporzionale o differenza dei valori ir) + S (ultimo comando dato ai servi)] + (S - K)
cioè la correzione è uguale alla differenza tra i due sensori + la velocità dei servi + la velocità dei servi meno quanto voglio decelerare in un loop. In poche parole:

(P+S) è un valore che si azzera in un certo punto in rapporto alla velocità, (infatti P scende quando sta salendo la velocità  smiley-wink) che è il punto di equilibrio piu' lo scarto che serve per rallentare in rapporto a quanto stiamo andando + la velocità attuale ( se no il robot si fermerebbe perchè la correzione sarebbe = 0) - quanto vogliamo decelerare.


In teoria a conti fatti stanotte (non troppo precisamente) cosi' (P + S) diventano 0 spostati rispetto al reale 0 di solo P (storpiamento del giuin rapporto alla velocità dei servi) sommati alla velocità attuale meno qualcosina, seguendo i loop portano l'oggetto a fermarsi tenendo conto della velocità  smiley-grin

poniamo di essere fermi:
C = 0 + 0 + 0 - K <- K è una variabile con cui si puo' gestire in che direziona andare il robot. Che puo' variare in rapporto ai sensori ostacolo per esempio.

poniamo che S = 12 p = -21
C = -21+12+12-1 -> 2 -> cioè motori quasi fermi.

Sto delirando?


« Last Edit: June 30, 2010, 11:27:56 am by gioscarab » Logged

Community robotica / programmazione Arduino
www.gioblu.com

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

a vederlo così non fà una piega, ma le forze in gioco sono dei vettori che cambiano direzione durante gli eventi, mentre il calcolo mi sembra molto lineare...
ma hai già provato a mettere giù il codice per implementare l'idea?
Logged

Milan
Offline Offline
Edison Member
*
Karma: 2
Posts: 1128
gioblu.com
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok P+S + S-K lo devo ancora testare anche se credo ci sia un errore di concetto alla base, spero di trovare un minimo di tempo per lavorarci. Nei pochi momenti liberi ho aggiunti la auto get up function  smiley-grin a PICO.


Code:
Servo left;
Servo right;

#define servoLeftPin     9
#define servoRightPin   10
#define servoZero       81
#define IRFront         0
#define IRBack          1
#define ledPin          13

int frontSense = 0;
int backSense = 0;
int orientation = 0;
int fall = 0;


void setup() {
pinMode(ledPin, OUTPUT);
left.attach(servoLeftPin);
right.attach(servoRightPin);
left.write(servoZero);
right.write(servoZero);
Serial.begin(9600);
}


void getOrientation() {
  frontSense = 0;
  backSense = 0;
  orientation = 0;
 for (int i = 0; i < 10; i++) {
  frontSense = analogRead(IRFront) + frontSense;
  backSense = analogRead(IRBack) + backSense;
  if (i == 9) {
   frontSense = frontSense / 10;
   backSense = backSense / 10;
   orientation = frontSense - backSense;
  }
 }
}


void loop() {
getOrientation();

float delta = orientation / 8;
if(delta > 90) delta = 90;
if(delta < -90) delta = -90;
if(orientation > 250) fall = fall + 1;
if(orientation < -250) fall = fall - 1;
left.write(81 - delta);
right.write(81 + delta);
if (fall == 25 || fall == -25) {
   left.write(servoZero);
   right.write(servoZero);
   delay(250);
   fall = 0;
}
Serial.print(orientation);
Serial.print("   ");
Serial.println(fall);
}
Logged

Community robotica / programmazione Arduino
www.gioblu.com

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vaneggio un pò...
Sapendo il peso del robot, si potrebbe precalcolare l'inclinazione in avanti (frenata) o inditero (partenza), i vettori in gioco sarebbero,
la quantità di moto e l'inerzia (alla partenza o in frenata)
ed il prodotto vettoriale di questi due vettori con verso contrario dovrebbe rappresentare la forza che spinge in testa o in coda e l'angolo di questo vettore dovrebbe essere quello "previsto" di inclinazione del robot durante le due fasi "critiche" (partenza e frenata).
Conoscendo in anticipo (con buona approssimazione)  il valore dell'inclinazione si potrebbe pensare ad un sistema tipo l'ABS delle auto che però "stacchi" quando in veicolo raggiunge l'angolo previsto.
così forse si potrebbe "smorzare" un pò di effetto "pendolo".
Logged

Pages: 1 ... 6 7 [8] 9 10 11   Go Up
Jump to: