Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

bostondynamics robot magazzino

PLC, servomotori, inverter...robot

Moderatori: Foto Utentecarlomariamanenti, Foto Utentedimaios

0
voti

[1] bostondynamics robot magazzino

Messaggioda Foto Utenteluxinterior » 5 apr 2019, 15:33

Affascinato come sempre
https://www.youtube.com/watch?v=5iV_hB08Uns
"il sedere" posteriore se non la sparo troppo grossa lo muove per bilanciarsi durante i movimenti mi piace un sacco
C'è nessuno in Italia che lavora su oggetti simili e che vuole un vecchietto per dare una mano ?
Avatar utente
Foto Utenteluxinterior
2.497 2 4 8
Expert EY
Expert EY
 
Messaggi: 1471
Iscritto il: 6 gen 2016, 17:48

0
voti

[2] Re: bostondynamics robot magazzino

Messaggioda Foto Utentelelerelele » 5 apr 2019, 16:53

notevole!

sarà il pacco batterie, la cosa più pesa che ha, lo sposta per bilanciarsi visto che gira su due ruote.

grande. :ok:
Avatar utente
Foto Utentelelerelele
2.191 3 7 8
Expert EY
Expert EY
 
Messaggi: 2510
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[3] Re: bostondynamics robot magazzino

Messaggioda Foto UtenteWALTERmwp » 5 apr 2019, 19:44

Per la realizzazione d'una idea, un robot ad uso amatoriale, a me farebbe comodo disporre d'una parte di codice già realizzata, quella dedicata al balance, me la studierei più che volentieri.
Lo so, sarebbe come salire sulle spalle di qualcun altro, ma se fosse disponibile software del genere, mi farebbe davvero piacere.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
22,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6444
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[4] Re: bostondynamics robot magazzino

Messaggioda Foto Utentespeedyant » 5 apr 2019, 20:10

Mi preoccupa la poca delicatezza del robot addetto al nastro trasportatore. Ha problemi nella lettura del simbolo "fragile"! :lol:
Son quello delle domande strane!
Avatar utente
Foto Utentespeedyant
3.451 3 6 8
Master
Master
 
Messaggi: 2436
Iscritto il: 9 lug 2013, 18:29
Località: Torino

4
voti

[5] Re: bostondynamics robot magazzino

Messaggioda Foto UtenteEcoTan » 6 apr 2019, 7:48

WALTERmwp ha scritto:parte di codice già realizzata, quella dedicata al balance

In effetti ho realizzato un robottino balancing
https://www.youtube.com/watch?v=N2fm5-46XZA
programmato in linguaggio C senza librerie, su algoritmi ricavati da considerazioni fisiche, però la motorizzazione è troppo poco potente e non ci sono gli encoder sulle ruote. Per queste e altre ragioni il risultato non è eccellente, è quello che si vede nel filmato o poco meglio, e anche la documentazione è poco chiara, in tutti i modi allegherò qualcosa:

L'inclinazione

Per ricavare l'angolo di inclinazione dalle letture dell'accelerometro, in presenza di accelerazione orizzontale, ci sono delle formule semplici da usare ma noiose da dimostrare, quindi fornisco soltanto un disegno con un paio di esempi per verificarne la rispondenza. Notiamo che g rappresenta il campo di gravità, a il campo di forze d'inerzia che è l'opposto della accelerazione, x ed y le letture dell'accelerometro col segno cambiato, alfa l'inclinazione col segn positivo in avanti, X e Y gli assi dell'accelerometro, Xf ed Yf gli assi fissi orizzontale e verticale.
Nelle formule c'è una radice quadrata che fornirebbe un doppio segno quindi occorre determinare il segno dell'accelerazione per altra via. A tal fine viene presa in considerazione l'ultima variazione del duty cycle che alimenta i motori.
balan.JPG
vettori

xx sta per dire "quadrato di x" e così via


La calibrazione dell'accelerometro

Per leggere i valori digitali possiamo usare lo stesso programma in fase di debug, coi motori scollegati per non dare vibrazioni che falserebbero la misura. Vanno rilevate le letture di entrambi gli assi nelle 4 posizioni in quadratura assoluta. Per trovare esattamente tali posizioni possiamo cercare il massimo di una lettura, o meglio possiamo appoggiare il modulino su una livella a bolla ben fissata. Dalle letture così rilevate, viene ricavato un coefficiente di correzione per rendere le sensibilità dei due assi esattamente eguali.


L'algoritmo di controllo

All'accensione, il programma si aspetta che il robottino sia in equilibrio e fermo quindi legge e calcola la gravità g (che potrebbe anche ricavare come costante fissa dalla calibrazione già eseguita) e memorizza la lettura del giroscopio, che viene assunta come riferimento per le successive letture dello stesso giroscopio. Il riferimento per le letture dell'accelerometro invece viene preso dai dati della calibrazione già eseguita.

Viene calcolata l'inclinazione iniziale in base ai dati del solo accelerometro con le formule riportate in figura. Questa inclinazione, che dovrebbe essere nulla o assai piccola, viene assunta come riferimento (setpoint, o valore desiderato) per il successivo algoritmo di controllo.

Questo gira ogni millisecondo compiendo le operazioni qui appresso indicate.

L'inclinazione viene nuovamente calcolata in base ai dati dell'accelerometro con le formule riportate in figura, e viene sommata alla accelerazione angolare misurata col giroscopio, quest'ultima moltiplicata per una costante T.

Il risultato di tale somma viene filtrato con un passa-basso avente una sola costante di tempo ancora pari a T, nel nostro caso 1 secondo. L'uscita del filtro fornisce la stima dell'angolo di inclinazione.

Detto algoritmo equivale al filtro complementare che viene solitamente indicato nel problema del pendolo invertito.

Notiamo che i segnali analogici dell'accelerometro vengono riletti ogni 143 microsecondi e pre-filtrati con un passa-basso prima hardware e poi software ma l'azione di questo filtro risulta quasi indifferente.

Invece il giroscopio viene riletto ogni 265 microsecondi, tramite la sua interfaccia I2C.

L'angolo di inclinazione così stimato deve essere ulteriormente elaborato per fornire il duty cycle ai motori.

In pratica viene aggiunta una derivata e anche una derivata seconda, moltiplicando ciascun termine per una costante determinata empiricamente e tenendo conto che la derivata dell'inclinazione dovrebbe coincidere con quanto letto dal giroscopio.

La stabilizzazione

Inseguire la inclinazione iniziale non basta per ottenere la stabilità del sistema, trattandosi di un pendolo invertito intrinsecamente instabile. Lo sbilanciamento iniziale, anche piccolissimo ma inevitabile, tende ad aumentare quindi l'algoritmo già visto, tentando di correggerlo, fa avanzare il robot nella stessa direzione. Questo avanzamento viene grossolanamente stimato sommando tutte le correzioni precedentemente effettuate e la somma così ottenuta viene utilizzata per ricorreggere blandamente l'inclinazione iniziale di riferimento, con l'aggiunta anche qui di una derivata.

Riporto il link del modulino giroscopio:

https://learn.adafruit.com/adafruit-tri ... t/overview

ed il link dove ho acquistato il modulino accelerometro (forse si può trovare a miglior prezzo):

http://www.robot-italy.com/it/adxl337-breakout.html

Il programma:
Codice: Seleziona tutto
#include "p33FJ128MC802.h"             //fusebit fastRC wPLL e tutto libero
_FOSCSEL (FNOSC_FRCPLL & IESO_ON)      //Oscillatore FastRC 7,37 MHz with PLL
#define ledr _LATA4                    // RA4 pin12 led rosso
#define ledv _LATB4                    // RB4 pin11 led verde
long int xgr, ygr, xgc, ygc;           //variabili riguardanti il giroscopio
int xg, yg, xgp, ygp, stato, lbyte, hbyte;
float gx, gy, gyp;
int bufa, seg;                         //variabili riguardanti l'accelerometro
float ax, ay, yar, xar, xa, ya, xac, yac, xap, yap, kx;
int avades, avasin, asp, adp;          //variabili riguardanti il duty cycle per il PWM ai motori
float g, tilt, tilr, tilrr;            //gravità e inclinazioni
float den, a, spa, fus, fup, fupp, auf;//altre variabili
int aux, ii;

int main (void) {             //Main Program, configurazioni
PLLFBDbits.PLLDIV=41;         // M=43 PLLDIV=41 clock oscillator Tcy=25 ns
CLKDIVbits.PLLPOST=0;         // N1=2  N2=2(default) 7.37*M/N1/N2=79Mhz~40MIPS
TRISA = 0b1111111111101111;   //OUT RA4 PIN12 LED rosso
TRISB = 0b0000111111101111;   //OUT RB4pin11 LED verde
I2C1BRG=100;           //BoudRate I2C =400.000 ; (1/400.000-0,000000120)x39.600.000-2=92,3
AD1CHS0bits.CH0SA = 0; //AN0 pin 2 acc.x verso alto (CH0SA=1 AN1 pin 3 acc.y verso avanti)
AD1CON1bits.SSRC=7;    //ADC1 module auto-convert
AD1CON1bits.ASAM=1;    //ADC1 module auto-start
AD1CON1bits.AD12B=1;   //ADC1 module 12 bit
AD1CON1bits.FORM=1;    //ADC1 module signed integer
AD1CON3bits.SAMC = 31; // SAMPLE TIME 31 CK
AD1CON3bits.ADCS = 63; //ADC CK 40/(63+1)MHz 14conv+31samp 13,8kS/s 72,7us
AD1PCFGL = 0b0000000111111100; //analog input AN0pin2 x, AN1pin3 y
IEC0bits.AD1IE = 1;    //ADC int.ENABLE
AD1CON1bits.ADON=1;    //ADC1 module ON
T1CONbits.TCKPS = 3;   //timer1 prescale 256 6,4 uS/count 0,4 sec/rollover per attese
P1TCONbits.PTCKPS = 1; //PWM1 clock prescale 4
P1TCONbits.PTMOD = 2;  //PWM1 up/down mode P1DCx = 0-1000 indietro, 1000-2000 avanti
P1DC1=1000; P1DC2=1000;//motori inizialmente fermi
P1TPER = 999;          //PWM1 time base half period/presc.Tcy PWM 5 kHz motori
T1CONbits.TON = 1;     //timer1 run ON

while (TMR1 <32500) ;  //attesa circa 0,2 sec per assestamento alimentazioni
I2C1CONbits.I2CEN=1;   //abilitazione modulo per comunicazione I2C
IFS1bits.MI2C1IF = 0;  //serve!
IEC1bits.MI2C1IE = 1;  //Master events enable bit
stato=81;              //inizio configurazione accelerometro
I2C1CONbits.SEN=1;     //start bit per attivare la catena di interrupt

TMR1=0; while (TMR1 <65500) ;      //attesa circa 0,4 sec per assestamento manuale e filtri
for (ii=0; ii<64; ii++) {          //cumula 64 letture
TMR1=0; while (TMR1 <5000) ;
yar=yar+ya; xar=xar+xa; ygr=ygr+yg;}
yar=yar/64; xar=xar/64; ygr=ygr>>6;//fa la media delle 64 letture

PWM1CON2bits.IUE = 1;  //PWM1 duty cycle immediate update enable
PWM1CON1bits.PEN1H = 1;//PWM1 duty cycle enabled channel 1 pin 25 RB14 high motore sinistro
PWM1CON1bits.PEN1L = 1;//PWM1 duty cycle enabled channel 1 pin 26 RB15 low motore sinistro
PWM1CON1bits.PEN2H = 1;//PWM1 duty cycle enabled channel 1 pin 23 RB12 high motore destro
PWM1CON1bits.PEN2L = 1;//PWM1 duty cycle enabled channel 1 pin 24 RB13 low motore destro
P1DTCON1bits.DTAPS = 2;//PWM1 dead time prescale=4
P1DTCON1bits.DTA = 10; //PWM1 dead time A = 10*presc.Tcy = 1 microsec
P1TCONbits.PTEN = 1;   //PWM1 time base enabled

// risultati della calibrazione:
//massima x=410 con y=-40 e robot verticale
//massima y=382 con x=-10 e robot inclinato 90 gradi indietro   
//con livello a bolla, accelerometro verticale: x=410,  y=-43
//         accelerometro inclinato 90 indietro: y=382,  x=-7
//         accelerometro inclinato 90 avanti:   y=-466, x=-8
//         accelerometro inclinato 180      :   x=-425, y=-42

kx=(382+466)/(410+425);    //coefficiente per rendere eguali le sensibilità degli assi x e y
ax=-(xar+7)*kx; ay=-yar-42;//letture calibrate e rovesciate espresse in count digitali
g=sqrtf(ax*ax+ay*ay);      //gravità espressa in count digitali
//g=(382+466)/2;           //gravità fissa presa dalla calibrazione=424 count digitali
tilr=ay*1000/g; tilrr=tilr;//inclinazione di riferimento e iniziale espresse in milliradianti

rip:                       //loop di controllo ogni millisecondo
ax=-(xa+7)*kx; ay=-ya-42;  //letture calibrate e rovesciate
gy=(yg-ygr)*.305;//velocità angolare dal giroscopio in mrad/sec (fondo scala=28.570 count per 500 gradi/sec)
den=(ax*ax+ay*ay);         //denominatore della formula
auf=den-g*g;
if (auf>0) a=sqrtf(auf);   //formula della -accelerazione in count
else a=0;                  //impedisce eccezioni software per radice di un numero negativo
aux=avades-adp+avasin-asp; //accelerazione ricavata dall'ultima variazione del duty cycle
if (aux>0) seg=-1;         //ne inverte il segno
if (aux<0) seg=1;
if (seg==-1)a=-a;          //applica il segno alla -accelerazione
adp=avades; asp=avasin;    //memorizza i duty cycle
tilt=(1000*(ay*g+a*ax))/den;//inclinazione da accelerometro in mrad trascurando arcsen
//tilt=(tilt+ay/g)/2;      //fa una media con l'inclinazione approssimata che trascura l'accelerazione
tilt=tilt-tilr;            //inclinazione da acelerometro riferita all'inclinazione di equilibrio iniziale

fus=tilt+gy;               //fusione delle variabili da accelerometro e da giroscopio
fus=fup+(fus-fup)*.001;    //filtro passa-basso con costante di tempo 1 msec / .001 = 1 secondo
auf=fus*60+(fus-fup)*1500; //sommiamo la derivata con coefficienti empirici
auf=auf+(fus-2*fup+fupp)*.3;//sommiamo la derivata seconda con coefficienti empirici
auf=auf+(gy-gyp)*.7; gyp=gy;//ricavandola in maggior parte dall'ultima variazione del giroscopio
fupp=fup; fup=fus;         //memorizzaziamo i valori per calcolarne le derivate

aux=auf;                   //prepariamo il duty cycle in formato integer
if(aux>0)aux=aux+400;      //duty cycle minimo per vincere l'attrito al distacco
if(aux<0)aux=aux-400;
if (aux<-1000) aux=-1000;  //limiti del duty cycle
if (aux>1000) aux=1000;
avades=aux;                //duty cycle destro con segno
if(aux>0)aux=aux+400;      //idem lato sinistro
if(aux<0)aux=aux-400;
if (aux<-1000) aux=-1000;
if (aux>1000) aux=1000; 
avasin=aux;                //duty cycle sinistro con segno
if (gy>0.1) ledv=1; else ledv=0;//usiamo i Led come ci pare
if (gy<-0.1) ledr=1; else ledr=0;
P1DC1=avasin+1000;         //duty cycle sinistro 0-2000 senza segno per unità PWM1
P1DC2=avades+1000;         //duty cycle destro 0-2000 senza segno per unità PWM1

spa=spa+tilt+gy;           //cumula i segnali di errore già considerati che grossomodo danno lo spazio percorso 
tilr=tilrr-spa/1500;       //e usa il cumulo per ricorreggere il riferimento della regolazione
tilr=tilr-(tilt+gy)/70;    //aggiungendo l'ultima variazione a titolo di derivata

TMR1=0; while (TMR1 <150) ;//attesa 150*0.0064=1msec
goto rip; }                //fine di 1 ciclo di regolazione, ricomincia daccapo

void __attribute__((no_auto_psv)) _ISR _ADC1Interrupt(void) //ADC ogni 73 uS alternando le due letture
{if (AD1CHS0bits.CH0SA == 0) {            //se lo ADC ha letto il canale x
bufa=ADC1BUF0;                            //lo salva nel buffer
AD1CHS0bits.CH0SA = 1;                    //e predispone la lettura del canale y
xa=(float)bufa;                           //lettura asse x in formato floating (finezze)
xac=31*xap+xa; xa=xac/32;//passa basso abbastanza inutile con costante di tempo 0,073x2x32=4,7 msec
xap=xa;                                   //memorizza il valore filtrato   
goto ex; }                                //esce dalla ISR

bufa=ADC1BUF0;                            //se invece lo ADC ha letto il canale y, lo salva nel buffer
AD1CHS0bits.CH0SA = 0;                    //e predispone la lettura del canale x
ya=(float)bufa;                           //idem per asse y
yac=31*yap+ya; ya=yac/32;
yap=ya;
ex: IFS0bits.AD1IF = 0; }                 //la InterruptServicingRoutine esce

void __attribute__((no_auto_psv)) _ISRFAST _MI2C1Interrupt(void) { //ISR I2C master ciclo letture ogni 265 microsec
if (stato == 0)     //inizio
{if (I2C1STATbits.P==1)stato++; else goto res;//se era ozioso (idle) fa start altrimenti resetta
I2C1CONbits.SEN=1;    //start bit
goto ex; } 
if (stato == 1)     //dopo start
{if (I2C1STATbits.S==1)stato++; else goto res;  //se fatto start altrimenti resetta
I2C1TRN=0b11010110;  //slave address giroscopio pin SA0 adafruit al positivo D6=trasm D7=ric 
goto ex; } 
if (stato == 2)     //se ha scritto slave address
{if (I2C1STATbits.ACKSTAT == 0)stato++; else goto res;//se ACK scrive sub address registro slave
  I2C1TRN=0b10101000; //28h=OUT_X_L, MSBit=1 per lettura multipla
goto ex; } 
if (stato == 3)     //se ha scritto indirizzo registro slave
{if (I2C1STATbits.ACKSTAT == 0)stato++; else goto res;//se ACK ripete start
I2C1CONbits.RSEN=1;  //repeated start
goto ex; } 
if (stato == 4)     //dopo start
{if (I2C1STATbits.S==1)stato++; else goto res;  //se fatto start altrimenti resetta
I2C1TRN=0b11010111;  //slave address giroscopio pin SA0 adafruit al positivo D6=trasm D7=ric 
goto ex; } 
if (stato == 5)     //se era indirizzo slave lettura
{if (I2C1STATbits.ACKSTAT == 0)stato++; else goto res;//se ACK
I2C1CONbits.RCEN=1;  //abilitazione lettura
goto ex; } 
if (stato == 6)     //
{if (I2C1STATbits.RBF == 1)stato++; else goto res;//se letto primo byte fa ACK
lbyte=I2C1RCV;  //e memorizza lettura
I2C1CONbits.ACKDT=0;//predispone Ack da master
I2C1CONbits.ACKEN=1;//Ack
goto ex; } 
if (stato == 7)     //
{if (I2C1STATbits.ACKSTAT == 0)stato++; else goto res;//se  ACK
I2C1CONbits.RCEN=1;  //abilitazione lettura
goto ex; } 
if (stato == 8)     //
{if (I2C1STATbits.RBF == 1)stato++; else goto res;//se letto secondo byte fa ACK
hbyte=I2C1RCV;  //e memorizza lettura
xg=-((hbyte<<8)+lbyte);
xgc=(long int)7*xgp+xg; xg=(long int)xgc>>3;
xgp=xg;//filtro 2120 uS 
I2C1CONbits.ACKEN=1;//Ack
goto ex; } 
if (stato == 9)     //se era secondo byte
{if (I2C1STATbits.ACKSTAT == 0)stato++; else goto res;//se ACK
I2C1CONbits.RCEN=1;  //abilitazione lettura altro asse
goto ex; } 
if (stato == 10)     //
{if (I2C1STATbits.RBF == 1)stato++; else goto res;//se letto primo byte fa ACK
lbyte=I2C1RCV;  //e memorizza lettura
I2C1CONbits.ACKEN=1;//Ack
goto ex; } 
if (stato == 11)     //
{if (I2C1STATbits.ACKSTAT == 0)stato++; else goto res;//se  ACK
I2C1CONbits.RCEN=1;  //abilitazione lettura
goto ex; } 
if (stato == 12)     //
{if (I2C1STATbits.RBF == 1)stato++; else goto res;//se letto secondo byte manda NACK
hbyte=I2C1RCV;  //e memorizza lettura
I2C1CONbits.ACKDT=1;//predispone NAck da master
yg=((hbyte<<8)+lbyte);
//ygc=(long int)7*ygp+yg; yg=(long int)ygc>>3;
//ygp=yg;//filtro 2120 uS 
//yg=yg<<1;
I2C1CONbits.ACKEN=1;//NAck
goto ex; } 
if (stato == 13)     //dopo Nack mandato da master
{stato=0;
I2C1CONbits.PEN=1;//Stop
goto ex; } 

if (stato == 81)     //configurazione dopo start
{if (I2C1STATbits.S==1)stato++; else goto res;  //se fatto start altrimenti resetta
  I2C1TRN=0b11010110;  //slave address giroscopio pin SA0 adafruit al positivo D6=trasm D7=ric
goto ex; } 
if (stato == 82)     //se ha scritto slave address
{if (I2C1STATbits.ACKSTAT == 0)stato++; else goto res; //se ACK scrive indirizzo registro slave
  I2C1TRN=0b00100000; //sub address registro giroscopio 20h CTRL1 per dato singolo
goto ex; } 
if (stato == 83)     //se ha scritto sub address registro slave
{if (I2C1STATbits.ACKSTAT == 0)stato++; else goto res; //se ACK manda configurazione registro acc.
  I2C1TRN=0b11111111; //giroscopio ON OutDataRate 1000 Hz cutoff 100 Hz XYZ axis enabled
goto ex; }
if (stato == 84)     //se ha mandato configurazione
{if (I2C1STATbits.ACKSTAT == 0)stato++; else goto res; //se ACK stop poi configura fondo scala
I2C1CONbits.PEN=1;//Stop
goto ex; }
if (stato == 85)     //prosegue configurazione giroscopio
{if (I2C1STATbits.P==1)stato++; else goto res;//se era ozioso (idle) fa start altrimenti resetta
I2C1CONbits.SEN=1;    //start bit
goto ex; } 
if (stato == 86)     //dopo start
{if (I2C1STATbits.S==1)stato++; else goto res;  //se fatto start altrimenti resetta
I2C1TRN=0b11010110;  //slave address giroscopio pin SA0 adafruit al positivo D6=trasm D7=ric
goto ex; } 
if (stato == 87)     //se ha scritto slave address
{if (I2C1STATbits.ACKSTAT == 0)stato++; else goto res; //se ACK scrive sub-address registro slave
  I2C1TRN=0b00100011; //sub address registro giroscopio 23h CTRL4 per dato singolo
goto ex; } 
if (stato == 88)     //se ha scritto sub address registro slave
{if (I2C1STATbits.ACKSTAT == 0)stato++; else goto res; //se ACK manda configurazione registro gir.sin.
I2C1TRN=0b00010000; //giroscopio fondo scala 500 dps
goto ex; }
if (stato == 89)     //se ha mandato configurazione
{if (I2C1STATbits.ACKSTAT == 0)stato=0; else goto res; //se ACK fa stop
I2C1CONbits.PEN=1;//Stop
goto ex; }
goto ex;
res:I2C1CONbits.SEN=0; //reset
I2C1CONbits.RSEN=0; I2C1CONbits.RCEN=0;
I2C1CONbits.ACKEN=0;
I2C1CONbits.PEN=1;//Stop
if (I2C1STATbits.P != 1)goto res;//accerta bus ozioso
stato=1;
I2C1CONbits.SEN=1;    //start bit per riattivare?
ex: IFS1bits.MI2C1IF = 0; } // fine ISR

Avatar utente
Foto UtenteEcoTan
5.350 4 10 13
Expert EY
Expert EY
 
Messaggi: 3225
Iscritto il: 29 gen 2014, 8:54

1
voti

[6] Re: bostondynamics robot magazzino

Messaggioda Foto Utenteelfo » 6 apr 2019, 22:59

Bob Pease sul problema del pendolo invertito (o simile):
So he set out to design a controller with pure analog. The one he came up with used six op amps

https://www.electronicdesign.com/analog/what-s-all-bobb-demo-stuff-anyhow
Avatar utente
Foto Utenteelfo
2.924 2 4 7
Master
Master
 
Messaggi: 1277
Iscritto il: 15 lug 2016, 13:27

0
voti

[7] Re: bostondynamics robot magazzino

Messaggioda Foto UtenteWALTERmwp » 8 apr 2019, 12:03

Foto UtenteEcoTan, grazie per l'intervento e la condivisione del materiale, simpatico anche il video !
Mi riprometto di leggere il codice.
Come suggerisce @elfo c'è poi da "pescare" nell'analisi del pendolo inverso.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
22,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6444
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[8] Re: bostondynamics robot magazzino

Messaggioda Foto UtenteEcoTan » 8 apr 2019, 17:34

OK e grazie per l'apprezzamento
Avatar utente
Foto UtenteEcoTan
5.350 4 10 13
Expert EY
Expert EY
 
Messaggi: 3225
Iscritto il: 29 gen 2014, 8:54


Torna a Automazione industriale ed azionamenti

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti