Risalire allo spostamento dall'accelerazione

hits83-votailprof
Ciao a tutti,
sono nuovo del forum e cercavo un aiuto alla domanda posta come titolo del forum.
Mi spiego meglio.
Io sono in possesso di un accelerometro digitale, quello che dovrei fare è risalire allo spazio percorso dai dati delle accelerazioni lungo due assi dal suddetto accelerometro.
Il procedimento dovrebbe essere quello di andare ad intergrare due volte il valore dell'accelerazione sia sul primo che sul secondo asse per poi ricavare lo spazio percorso. Per il calcolo dell'integrale utilizzo la seguente formula:
v=v0+aT, s=s0+vT, dove v0 e s0 sono rispettivamente velocità e posizione iniziale, T è il periodo di campionamento all'interno del quale suppongo l'accelerazione costante.
Che ne pensate?

Risposte
maurymat
Non credo di aver ben capito come funziona il tuo accelerometro. Ti rileva le due componenti dell'accelerazione $a_x$ e $a_y$ per un dato intervallo di tempo?
Se sì, un metodo alternativo è quello di calcolare il modulo dell'accelerazione a partire dalle sue componenti cioè $sqrt(a_x^2 + a_y^2)$ (che mi sembra di aver capito sia costante nell'intervallo di tempo considerato) e graficare tale valore in un piano (t,v) (tempo, velocità). Lo spostamento, allora, si ottiene banalmente calcolando l'area sottesa dal grafico della velocità rispetto al tempo (che in questo caso è una linea retta la cui inclinazione è data dal valore della tua accelerazione - quindi l'area da calcorare è quella di un triangolo rettangolo visto che la velocità iniziale è nulla)

apatriarca
Se l'accelerazione non è costante nel tempo allora integrando non ottieni la formula da te scritta... Devi integrare i valori dell'accelerazione usando un qualche metodo per la risoluzione numerica di equazioni differenziali: http://en.wikipedia.org/wiki/Numerical_ordinary_differential_equations

Falco5x
Se il tuo accelerometro è in grado di memorizzare i dati con una certa cadenza temporale, allora una volta riportati questi valori su un diagramma cartesiano avente il tempo come ascissa, la velocità la ottieni come area sotto il grafico dell'accelerazione. Riportando poi il diagramma della velocità così calcolata, lo spazio è l'area sotto il grafico della velocità. Ovviamente la cosa va effettuata separatamente per entrambe le direzioni dell'accelerometro.
Ricordati infine che lo spazio percorso (nel senso della lunghezza complessiva della strada percorsa) si ottiene riportando i valori x e y degli spazi calcolati su un diagramma cartesiano e valutando la lunghezza della curva; altrimenti se prendi solo i valori degli spazi finali ottieni soltanto la distanza in linea d'aria tra il punto di partenza e il punto di arrivo.

hits83-votailprof
Grazie mille per le risposte.
L'accelerometro di cui dispongo mi genera i valori dell'accelerazione misurata ogni 0,01s che vengono acquisti ed elaborati da un PIC il quale si occupa di fare le operazioni suddette e restituirmi il valore calcolato, questo perchè l'obbiettivo è quello di avere una visione +o- in tempo reale del percorso coperto.

apatriarca
Come ti ho già detto devi implementare un qualche algoritmo numerico per la risoluzione delle equazioni differenziali ordinarie. Di che PIC si tratta? Mi viene difficile consigliarti un algoritmo senza avere idee delle sue capacità computazionali... Nota comunque che qualsiasi algoritmo numerico ha un errore. Per quanto tempo dovresti calcolare il percorso? Sarebbe meglio avere sempre un metodo per correggere la posizione ad intervalli regolari.

hits83-votailprof
Il PIC in questione è il p18f2520

apatriarca
Non sembra particolarmente potente. Ti direi di iniziare a provare a dare un occhiata all'Euler method. Se vuoi un po' più di precisione puoi provare a passare a un algoritmo multistep come Adams–Bashforth.

vegetablu1
Buon pomeriggio.
Ho lo stesso identico problema. Ho un accelerometro che mi da l'accelerazione espressa in m/s^2 ed il tempo lo misuro io in secondi (o millisecondi).
Da questi due valori vorrei calcolare la posizione.

Esiste una formula per farlo? L'oggetto si va spostando e man mano vado acquisendo i dati.

Grazie

apatriarca
Devi usare un metodo di integrazione numerica. Siccome vuoi arrivare alla posizione dall'accelerazione dovrai integrare "due volte". Nota che qualsiasi metodo usato avrà un errore che crescerà con il tempo. E' quindi opportuno avere un qualche sistema che corregge questo errore ad intervalli regolari (se possibile e se il sistema deve funzionare per tempi lunghi).

vegetablu1
"apatriarca":
Devi usare un metodo di integrazione numerica. Siccome vuoi arrivare alla posizione dall'accelerazione dovrai integrare "due volte". Nota che qualsiasi metodo usato avrà un errore che crescerà con il tempo. E' quindi opportuno avere un qualche sistema che corregge questo errore ad intervalli regolari (se possibile e se il sistema deve funzionare per tempi lunghi).

Grazie per avermi risposto.
Si, lo so che devo integrare due volte, ma questo lavoro devo farlo fare al mio pc. Il problema è riuscire a capire la formula precisa.

Se io integro due volte l'accelerazione avendo definito il tempo, la formula finale sarà:
Spazio = (accelerazione * tempo^2)/2
dove il tempo è la distanza di tempo tra la prima e la seconda rilevazione. Dico bene?
Ho provato ad integrare due volte utilizzando wolfram alpha (noto programma per i calcoli matematici) ma il risultato viene differente (a me viene la metà). Sbaglio io oppure sbaglio ad inserire la formula in wolfram?

Grazie mille!

apatriarca
Devi prima di tutto considerare anche la velocità e la posizione iniziale. La tua accelerazione non è poi costante, ma cambia nel tempo. Non puoi quindi usare la formula per il moto uniformemente accelerato. Devi integrare una funzione \( \mathbf{a}(t) \) ottenendo:
\[\begin{align*}
\mathbf{v}(t) &= \mathbf{v_0} + \int_0^t \mathbf{a}(s)\,\mathrm{ds} = \mathbf{v_0} + \mathbf{A}(t) \\
P(t) &= P_0 + \mathbf{v_0}\,t + \int_0^t \mathbf{A}(s)\,\mathrm{ds} = P_0 + \mathbf{v_0}\,t + \mathbf{\Lambda}(t).
\end{align*} \]
Supponendo \(\mathbf{a}(t)\) costante tra intervalli di tempo consecutivi puoi pensare di usare la formula per il moto uniformemente accelerato per aggiornare i valori di \(\mathbf{v}(t)\) e \(P(t)\) tra intervalli consecutivi. Si tratta del metodo di integrazione più semplice. Ce ne sono di più complessi.

vegetablu1
"apatriarca":
Devi prima di tutto considerare anche la velocità e la posizione iniziale. La tua accelerazione non è poi costante, ma cambia nel tempo. Non puoi quindi usare la formula per il moto uniformemente accelerato. Devi integrare una funzione \( \mathbf{a}(t) \) ottenendo:
\[\begin{align*}
\mathbf{v}(t) &= \mathbf{v_0} + \int_0^t \mathbf{a}(s)\,\mathrm{ds} = \mathbf{v_0} + \mathbf{A}(t) \\
P(t) &= P_0 + \mathbf{v_0}\,t + \int_0^t \mathbf{A}(s)\,\mathrm{ds} = P_0 + \mathbf{v_0}\,t + \mathbf{\Lambda}(t).
\end{align*} \]
Supponendo \(\mathbf{a}(t)\) costante tra intervalli di tempo consecutivi puoi pensare di usare la formula per il moto uniformemente accelerato per aggiornare i valori di \(\mathbf{v}(t)\) e \(P(t)\) tra intervalli consecutivi. Si tratta del metodo di integrazione più semplice. Ce ne sono di più complessi.


Sia in V che in P, come tratto l'accelerazione?
Cioè, se $V = V0 + A(t) = m + m/s^2$
mi verranno metri più metri fratto secondi al quadrato, quindi la posizione sarà metri su secondo quadrato. Devo sicuramente applicare la radice quadrata su entrambe le formule no?
Anzi su entrambe forse no. Come faccio a far andare via i secondi al quadrato?
Grazie

apatriarca
Non capisco il commento.. Entrambe le grandezze hanno unità di misura m/s

vegetablu1
"apatriarca":
Non capisco il commento.. Entrambe le grandezze hanno unità di misura m/s

Intendo che l'accelerazione si misura in $m/s^2$, quindi sia per la velocità che per la posizione sommerò metri con metri su secondo quadro.

Facciamo un esempio con numeri per capire se ho capito o se sbaglio (cosa molto probabile ehehhe, scusatemi):

FORMULA:
V = V0 + A(t);
P = P0 + V0*t + A(t);


Quindi supponendo che io effettuo 4 misure ogni 40 millisecondi ed ottengo:

misura, tempo (secondi), accelerazione (metri/secondi*secondi)
1, 0 sec, 0.03 m/s^2;
2, 0.04 sec, 0.05 m/s^2;
3, 0.08 sec, 0.02 m/s^2;
4, 0.12 sec, 0.04 m/s^2;


Avrò:
1)$ v1 = 0 + A(1) = 0 + 0.03 = 0.03 m/s;
P1 = 0 + 0*0 + A(1) = 0 + 0*0 + 0.03 = 0.03 m $
2) $ v2 = V1 + A(2) = 0.03m/s + 0.05m/s^2 = 0.08 m/s;
P2 = P1 + V1*T + A(2) = 0.03m + 0.04s*0.03m/s + 0.05m/s^2 = 0.0812 m$
3) $ v3 = V2 + A(3) = 0.08m/s + 0.02m/s^2 = 0.10 m/s;
P3 = P2 + V2*T + A(3) = 0.0812m + 0.04s*0.08m/s + 0.02m/s^2 = 0.1044 m$
4) $ v4 = V3 + A(4) = 0.10m/s + 0.04m/s^2 = 0.14 m/s;
P4 = P3 + V3*T + A(3) = 0.1044m + 0.04s*0.10m/s + 0.04m/s^2 = 0.1484 m$

Totale = P1 + P2 + P3 + P4 = 0.03 + 0.0812 + 0.1044 + 0.1484 = 0.364metri ovvero 36.4cm (anche se in realtà l’oggetto non si è mai mosso con queste misure ehhehehhehe ).

apatriarca
Devi stare molto più attento alla notazione. Non ho usato simboli a caso. Quindi \(\mathbf{a}(t) \neq \mathbf{A}(t)\).. La prima è l'accelerazione, l'altra il suo integrale. Hai insomma completamente frainteso la formula.

apatriarca
Nota che quello che ho scritto non è una formula risolutiva numerica. Ho semplicemente riportato le formule matematiche che definiscono il moto nel tuo caso. Quindi non puoi usarle direttamente.

Per usarle devi fare qualche passaggio intermedio. Supponiamo ad esempio (è ovviamente una approssimazione) che tra il tempo \(t_i\) e \(t_{i+1}\) l'accelerazione varierà in modo lineare tra \(a_i\) e \(a_{i+1}\). Sia quindi \(t_i <= t <= t_{i+1}.\) Possiamo calcolare la velocità al tempo \(t\) con la formula:
\[ \begin{align*}
\mathbf{v_{t}} &= \mathbf{v_{i}} + \int_{t_i}^{t} \Bigl( \mathbf{a_i} + \frac{s - t_i}{t_{i+1} - t_i}\,(\mathbf{a_{i+1}} - \mathbf{a_{i}}) \Bigr)\,\mathrm{ds} \\
&= \mathbf{v_i} + \mathbf{a_i}\,(t - t_i) + \frac{\mathbf{a_{i+1}} - \mathbf{a_i}}{2\,(t_{i+1} - t_i)}\,(t - t_i)^2.
\end{align*} \]

Avendo l'equazione della velocità possiamo a questo punto calcolarci la posizione ottenendo (a meno di errori nei calcoli):
\[ \begin{align*}
P_{i+1} &= P_{i} + \int_{t_i}^{t_{i+1}} \Bigl(\mathbf{v_i} + \mathbf{a_i}\,(t - t_i) + \frac{\mathbf{a_{i+1}} - \mathbf{a_i}}{2\,(t_{i+1} - t_i)}\,(t - t_i)^2\Bigr)\,\mathrm{dt} \\
&= P_i + \mathbf{v_i}\,\mathrm{\Delta\,t} + \frac{\mathbf{a_{i+1}} + 2\,\mathbf{a_i}}{6}\,(\mathrm{\Delta\,t})^2.
\end{align*} \]

Il ciclo finale sarà quindi qualcosa di simile al seguente:
P += v*dt + (a_new + 2*a_old)*dt*dt/6
v += 0.5*(a_new + a_old)*dt


Questo è solo un esempio di metodi approssimati per calcolare il valore che stai cercando. Ce ne sono tantissimi e ognuno ha i suoi vantaggi/svantaggi. Nel tuo esempio hai che \( \mathrm{\Delta\,t} = 0.04 \mathrm{s}. \) Seguendo la formula precedente, supponendo che \(\mathbf{v_0} = 0\) e \(P_0 = 0\) ottieni:
\[\begin{align*}
P_1 &= (0.05 + 2 \times 0.03) \times 0.04 \times 0.04/6 = 2.93\,10^{-5} \\
\mathbf{v_i} &= 0.5 \times (0.05 + 0.03) \times 0.04 = 0.0016 \\
P_2 &= ...
\end{align*}\]

Nel caso di vettore devi fare lo stesso calcolo su tutte le coordinate ovviamente..

vegetablu1
"apatriarca":
Nota che quello che ho scritto non è una formula risolutiva numerica. Ho semplicemente riportato le formule matematiche che definiscono il moto nel tuo caso. Quindi non puoi usarle direttamente.

Per usarle devi fare qualche passaggio intermedio. Supponiamo ad esempio (è ovviamente una approssimazione) che tra il tempo \(t_i\) e \(t_{i+1}\) l'accelerazione varierà in modo lineare tra \(a_i\) e \(a_{i+1}\). Sia quindi \(t_i <= t <= t_{i+1}.\) Possiamo calcolare la velocità al tempo \(t\) con la formula:
\[ \begin{align*}
\mathbf{v_{t}} &= \mathbf{v_{i}} + \int_{t_i}^{t} \Bigl( \mathbf{a_i} + \frac{s - t_i}{t_{i+1} - t_i}\,(\mathbf{a_{i+1}} - \mathbf{a_{i}}) \Bigr)\,\mathrm{ds} \\
&= \mathbf{v_i} + \mathbf{a_i}\,(t - t_i) + \frac{\mathbf{a_{i+1}} - \mathbf{a_i}}{2\,(t_{i+1} - t_i)}\,(t - t_i)^2.
\end{align*} \]

Avendo l'equazione della velocità possiamo a questo punto calcolarci la posizione ottenendo (a meno di errori nei calcoli):
\[ \begin{align*}
P_{i+1} &= P_{i} + \int_{t_i}^{t_{i+1}} \Bigl(\mathbf{v_i} + \mathbf{a_i}\,(t - t_i) + \frac{\mathbf{a_{i+1}} - \mathbf{a_i}}{2\,(t_{i+1} - t_i)}\,(t - t_i)^2\Bigr)\,\mathrm{dt} \\
&= P_i + \mathbf{v_i}\,\mathrm{\Delta\,t} + \frac{\mathbf{a_{i+1}} + 2\,\mathbf{a_i}}{6}\,(\mathrm{\Delta\,t})^2.
\end{align*} \]

Il ciclo finale sarà quindi qualcosa di simile al seguente:
P += v*dt + (a_new + 2*a_old)*dt*dt/6
v += 0.5*(a_new + a_old)*dt


Questo è solo un esempio di metodi approssimati per calcolare il valore che stai cercando. Ce ne sono tantissimi e ognuno ha i suoi vantaggi/svantaggi. Nel tuo esempio hai che \( \mathrm{\Delta\,t} = 0.04 \mathrm{s}. \) Seguendo la formula precedente, supponendo che \(\mathbf{v_0} = 0\) e \(P_0 = 0\) ottieni:
\[\begin{align*}
P_1 &= (0.05 + 2 \times 0.03) \times 0.04 \times 0.04/6 = 2.93\,10^{-5} \\
\mathbf{v_i} &= 0.5 \times (0.05 + 0.03) \times 0.04 = 0.0016 \\
P_2 &= ...
\end{align*}\]

Nel caso di vettore devi fare lo stesso calcolo su tutte le coordinate ovviamente..


Praticamente ho sbagliato tutto. Per questo mi veniva metri su secondi quadrati più metri.
Di matematica non sono bravo :oops:

Nella V, le accelerazioni si sommano o si sottraggono $ V = ......(a_{i+1} - a_{i})/(........)*..... $ ? Perchè nella formula principale hai scritto che si sottragono e dopo le hai sommate.
$ V = V_{i} + a_{i}*(t-t_{i}) + ((a_{i+1} - a_{i})/(2*(t_{i+1} -t_{i}))*(t-t_{i})^2) $

Grazie

apatriarca
Quella formula vale per ogni \(t_i \leq t \leq t_{i+1}\). Nel codice sto calcolando \(v_{t+1}\) e in questo caso si semplificano diverse quantità. Il termine al quadrato diventa infatti \(t_{i+1} - t_i\) che si semplifica quindi con il denominatore. Siccome a questo punto i due termini con le accelerazioni sono moltiplicate per lo stesso termine li posso sommare tra di loro ottenendo \(a_{i+1} + a_i\). Si può arrivare a questa formula anche considerando il fatto che l'integrale che ho calcolato corrisponde a trovare l'area di un trapezio rettangolo di altezza \(t_{i+1} - t_i\) e basi \(a_{i+1}\) e \(a_i\).

vegetablu1
"apatriarca":
Quella formula vale per ogni \(t_i \leq t \leq t_{i+1}\). Nel codice sto calcolando \(v_{t+1}\) e in questo caso si semplificano diverse quantità. Il termine al quadrato diventa infatti \(t_{i+1} - t_i\) che si semplifica quindi con il denominatore. Siccome a questo punto i due termini con le accelerazioni sono moltiplicate per lo stesso termine li posso sommare tra di loro ottenendo \(a_{i+1} + a_i\). Si può arrivare a questa formula anche considerando il fatto che l'integrale che ho calcolato corrisponde a trovare l'area di un trapezio rettangolo di altezza \(t_{i+1} - t_i\) e basi \(a_{i+1}\) e \(a_i\).

Capito.

Non so perchè ma continuo a sbagliare :cry:
Il codice dovrebbe essere questo:

v = v_i + a_old*dt + (a_new+a_old)*0.5*dt;
p = p_i + v*dt + ( (a_new + 2*a_old)*dt*dt/6 );

v_i = v;
p_i = p;


Non capisco dove sbaglio :( :cry:

apatriarca
L'ordine in cui calcoli i due valori è sbagliato.. P usa la vecchia velocità, non la nuova.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.