[Linuxtrent] Re: Suggerimento python per wiimote

  • From: matteo ruffoni <mattruffoni@xxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Wed, 1 Dec 2010 00:52:27 +0100

Il giorno 30 novembre 2010 17:33, Antonio Galea <antonio.galea@xxxxxxxxx> ha
scritto:

> 2010/11/30 matteo ruffoni <mattruffoni@xxxxxxxxx>:
> >
> > 1)il file che fa i grafici di dati casuali in real time è qui
> > http://eli.thegreenplace.net/2008/08/01/matplotlib-with-wxpython-guis/(il
> > secondo esempio) e se ho ben capito i dati che grafica si trovano nella
> > classe DataGen sotto le voci
> >
> > def _recalc_data(self):
> >         delta = random.uniform(-0.5, 0.5)
> >         r = random.random()
>
> Hai capito benissimo, sì. La classe GraphFrame registra un timer
> per ridisegnare il grafico ogni 100ms. Ogni volta che il timer scatta,
> se la "raccolta dati" non è stata fermata, chiama la classe DataGen
> e si fa restituire un nuovo numero da aggiungere ai dati che ha in
> memoria (il metodo on_redraw_timer).
>
> > 2) forse dovrei riuscire, ovviamente non ne sono sicuro, a sostituire
> > delta(?) e r(?) , con idati provenienti dalle accelerezioni dello wimote,
> > che dovrebbero essere fornite dalle librerie cwiid
> >  e sono nei campi(?) cwiid.Y
>
> Il primo problema è che non ho ben capito che differenza c'è tra delta e r?

delta è un numero random tra -0,5 e +0,5 ma a cosa serve? (se lo sostituisco
con 0 il grafico sta fisso sul 50)
r ? è il random.random() (randomissimo?) sostituito ocn 0 non fa cambiare
nulla
Quale dei due deve essere sostituiro con le acc?




>  def _recalc_data(self):
>    ax, ay, az = [], [], []
>    messages = wiimote.get_mesg()   # Get Wiimote Messages
>    for mesg in messages:   # Loop through Wiimote Messages
>        if mesg[0] == cwiid.MESG_ACC: # If a accelerometer message
>                ax.append( mesg[1][cwiid.X] )
>                ay.append(  mesg[1][cwiid.Y] )
>                az.append( mesg[1][cwiid.Z] )
>    #adesso che hai i tre array delle accelerazioni, li puoi usare
>    #per calcolare delta ed r
>
ho provato
 delta=ay
  r=0
oppure
delta=1
r=ay
oppure

    delta = int(ay)
>    r       = 0
>
> Wiimote activiated...
Press + to start recording and - to stop recording
Traceback (most recent call last):
  File "mat10_wx_mpl_dynamic_graph.py", line 355, in <module>
    app.frame = GraphFrame()
  File "mat10_wx_mpl_dynamic_graph.py", line 144, in __init__
    self.data = [self.datagen.next()]
  File "mat10_wx_mpl_dynamic_graph.py", line 62, in next
    self._recalc_data()
  File "mat10_wx_mpl_dynamic_graph.py", line 75, in _recalc_data
    delta = int(ay)
TypeError: int() argument must be a string or a number, not 'list'

Mi sembra che il problema sia che vuole dei dati che non siano liste (in
tutti i casi la risposta è più o meno la stessa) e anche a me sembra un po'
logico nel real time non c'è bisogno di liste

Ciao Matteo

> Ovviamente, le funzioni per delta ed r te le inventi a gusto. Ricordati
> di gestire il caso in cui gli array sono vuoti - potresti avere il Wiimote
> spento.
>
> > Sto "studiando" python da una settimana quindi non sono in grado di usare
> un
> > linguaggio adatto e non so nemmeno se le soluzioni che ho individuato
> sono
> > quelle giuste.
>
> Beh, per essere alle prime armi hai già messo le mani su "roba
> buona"!
>
> > Un file che fa dei grafici ragionevoli, ma non in real time, è qui
> > http://convolutedlogic.com/projects/wiimote/index.htm e si chiama
> > wiimote_record_accel_vel_pos.py
>
> Per graficare questi, devi cambiare la logica della classe
> wxPython/matplotlib che hai postato: quella usa un'unica
> variabile in y, e un semplice indice di iterazione in x.
>
> Potresti usare un thread[1] separato, che raccoglie i dati del Wiimote
> e li accumula in un semplice array di tuple etichettate con il tempo
> di lettura:
>       data = [ (t0,ax0,ay0,az0),...]
>
> Poi la classe che grafica la modifichi per visualizzare quel che ti pare
> di questi dati.
>
> Spero di non aver sparato troppo in alto, e che i suggerimenti
> ti tornino utili!
>
> Antonio
>
> [1] http://www.doughellmann.com/PyMOTW/threading/index.html
> --
> Per iscriversi  (o disiscriversi), basta spedire un  messaggio con OGGETTO
> "subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx
>
>
>

Other related posts: