Nota: Esto es un trabajo de consultoría del que no puedo revelar detalles que lo relacionen con el motivo de la consulta. Por ello falta alguna sección, párrafos, etc. (marcados con [...]) y puede haber pequeñas inconsistencias en el texto y en el código. Sin embargo he salvado la parte que es meramente Física básica por considerarlo libre del contrato de confidencialidad y por tanto susceptible de ser compartido.


Motivo de la consulta

[…]

Sensores de movimiento en dispositivos móviles

Introducción

Las nuevas tecnologías han convertido los teléfonos móviles en pequeños laboratorios de física, cualquier dispositivo de gama media cuenta al menos con GPS, acelerómetro, giroscopio y magnetómetro, instrumentos que en general trabajan juntos y coordinados por software, para proporcionar toda una variedad de información sobre el comportamiento del teléfono.

Planteamiento

Supongamos un caso ideal en el que el desplazamiento del dispositivo se produce exclusivamente en la dirección del eje \(Y\), es decir \(a_{x}(t)=a_{z}(t)=0\).

Tenemos entonces que \(a(t)\) se puede expresar mediante la siguiente relación:

\[a(t)=\sqrt[]{a_{x}(t)^{2}+a_{y}(t)^{2}+a_{z}(t)^{2}}=a_{y}(t)\]

y podemos calcular la velocidad media experimentada por el móvil entre los instantes \(t_{0}\) y \(t_{f}\) mediante la integral:

\[v(t)=\int_{t_{0}}^{t_{f}} a_{y}(t)\mathrm{d}t={v_{y}}_{m}\]

El desplazamiento total en el eje \(Y\) entre los instantes \(t_{0}\) y \(t_{f}\) será entonces:

\[\delta y={v_{y}}_{m}(t_{f}-t_{0})={v_{y}}_{m}\Delta t\]

[…]

El dispositivo proporciona datos de la aceleración lineal tanto total como de cada una de sus tres componentes cartesianas (\(A_{x}\),\(A_{y}\),\(A_{z}\)), que como todas las medidas, llevan asociados dos tipos de errores, los aleatorios (fluctuaciones inherentes y no predecibles de los valores calculados) y los sistemáticos (errores corregibles por ejemplo mediante una apropiada calibración).

En relación a los errores sistemáticos el principal factor y el más fácilmente detectable es la descalibración de los sensores. En general este tipo de error no supone ningún problema y se corrige simplemente aplicando a los valores una corrección fija que se determina durante la propia calibración del sistema.

Por ejemplo, en el caso de la componente vertical de la aceleración (\(a_{z}\)) en un móvil en reposo con los valores que se muestran en la gráfica siguiente, el error sistemático sería aproximadamente -0.075 \(m/s^2\), y sería fácilmente corregible aplicando un desplazamiento equivalente (línea roja) a todos los valores de \(a_{z}\) proporcinados por el dispositivo.

Por otro lado, los errores aleatorios son por definición inevitables y a lo máximo que podemos aspirar es a cuantificar su magnitud, e incluir esa incertidumbre en los resultados. Esa tarea se realiza a continuación.

Estimación de errores

Uno de los requisitos para poder realizar un análisis de propagación de errores es la comprobación de que los errores aleatorios se ajustan a una distribución normal. Se ha utilizado para ello los datos proporcionados por el dispositivo entre los instantes 25 s y 35 s.

Nótese que en este gráfico también se puede distinguir perfectamente el error sistemático de la componente \(z\) (en verde, \(\sim -0{.}08 \ m/sg^2\)), y su efecto sobre la aceleración total (en violeta). Las componentes \(x\) e \(y\) sin embargo presentan un error sistemático de unas pocas centésimas de \(m/sg^2\), pequeño pero no irrelevante.

Una manera rápida e intuitiva de comprobar la normalidad de un conjunto de datos es mediante el uso de histogramas, una representación gráfica de la frecuencia de cada medida, es decir, del número de veces que cada valor aparece en la muestra.

Un histograma se ajusta a una distribución gaussiana cuando su forma se asemeja a una campana de Gauss. El valor medio de esa distribución (línea punteada), y la desviación típica (área sombreada) que puede ser interpretada como la media de las desviaciones de la media, e identificada con el error aleatorio, son mostrados a continuación.

# bindwidth = 0.005
Acc00 <- read.csv("Data/RawData.csv", sep = ",", header = TRUE, stringsAsFactors = FALSE)
colnames(Acc00) <- c("Time", "Ax","Ay", "Az","Atot")
save(Acc00,file = "acc00.Rda")
acc00to60 <- melt(Acc00, id.vars = "Time")
acc25to35 <- subset(acc00to60, Time > 25 & Time < 35)
acc25to35X <- subset(acc25to35, variable == "Ax")
acc25to35Y <- subset(acc25to35, variable == "Ay")
acc25to35Z <- subset(acc25to35, variable == "Az")
###
mx <- round(mean(acc25to35X$value),digits = 4)
dx <- round(sd(acc25to35X$value), digits = 4)
hx <- ggplot(acc25to35X, aes(x = value)) +
  geom_histogram(color = "black", fill = "red", binwidth = 0.005)
hxd <- ggplot_build(hx)
mx_X <- max(hxd[["data"]][[1]]$ymax)
hx <- hx + geom_rect(xmin = mx - dx, xmax = mx + dx, ymin = 0, ymax = mx_X, fill = "gray", alpha = 0.01) +
  geom_vline(xintercept = mean(acc25to35X$value), color = "black", size = 0.45, linetype = "twodash") +
  labs(x = expression(a[x] ~ (m/sg^2)), y = "")
# print(hx)
###
my <- round(mean(acc25to35Y$value),digits = 4)
dy <- round(sd(acc25to35Y$value), digits = 4)
hy <- ggplot(acc25to35Y, aes(x = value)) +
  geom_histogram(color = "black", fill = "blue", binwidth = 0.005)
hyd <- ggplot_build(hy)
mx_Y <- max(hyd[["data"]][[1]]$ymax)
hy <- hy + geom_rect(xmin = my - dy, xmax = my + dy, ymin = 0, ymax = mx_Y, fill = "gray", alpha = 0.01) +
  geom_vline(xintercept = mean(acc25to35Y$value), color = "black", size = 0.45, linetype = "twodash") +
  labs(x = expression(a[y] ~ (m/sg^2)), y = "")
# print(hy)
###
mz <- round(mean(acc25to35Z$value),digits = 4)
dz <- round(sd(acc25to35Z$value), digits = 4)
hz <- ggplot(acc25to35Z, aes(x = value)) +
  geom_histogram(color = "black", fill = "green", binwidth = 0.005)
hzd <- ggplot_build(hz)
mx_Z <- max(hzd[["data"]][[1]]$ymax)
hz <- hz + geom_rect(xmin = mz - dz, xmax = mz + dz, ymin = 0, ymax = mx_Z, fill = "gray", alpha = 0.01) +
  geom_vline(xintercept = mean(acc25to35Z$value), color = "black", size = 0.45, linetype = "twodash") +
  labs(x = expression(a[z] ~ (m/sg^2)), y = "")
# print(hz)

tit1 = text_grob(expression(paste("Intervalo: 0.005 (m/", s^2,")")), face = "bold")
hists_5 <- grid.arrange(hx,hy,hz,nrow = 3, top = tit1)

Error aleatorio

Es posible calcular el desplazamiento experimentado por un un cuerpo (o por su centro de masas) entre dos instantes dados \(t_{0}\) y \(t_{f}\) mediante la sucesiva integración de la aceleración (el área bajo la curva se corresponde con la velocidad media)

\[v(t)=\int_{t_{0}}^{t_{f}} a(t)\mathrm{d}t=v_{m}\]

y de la posición

\[r(t)=\int_{t_{0}}^{t_{f}} v(t)\mathrm{d}t=\delta r\]

Las aceleraciones lineales son calculadas programáticamente por el software de adquisición de datos por medio de llamadas a la API del sistema operativo del dispositivo. En el caso de Android toda la información relevante se puede encontrar en la página de desarroladores.

La aceleración lineal del dispositivo es calculada mediante la expresión:

\[a=\sqrt[]{a_{x}^{2}+a_{y}^{2}+a_{z}^{2}}\]

La fórmula de propagación de error para una función genérica con varias variables (tres en este caso \(a_{x}\), \(a_{y}\) y \(a_{z}\)) con sus correspondientes errores aleatorios (\(\delta a_{x}\), \(\delta a_{y}\), \(\delta a_{z}\)), despreciando efectos covariantes (interdependencia entre componentes) y no lineales, y considerando un comportamiento gaussiano de los errores en cada componente es:

\[\delta a(\delta a_{x}, \delta a_{y}, \delta a_{z})= \sqrt[]{(\frac{\partial a}{\partial x}\delta a_{x})^2 + (\frac{\partial a}{\partial y}\delta a_{y})^2+(\frac{\partial a}{\partial z}\delta a_{z})^2}\]

y derivando se llega a la siguiente relación:

\[\delta a=\sqrt[]{a_{x}^{2}\delta a_{x}^2 + a_{y}^{2}\delta a_{y}^2 +a_{z}^{2}\delta a_{z}^2 }\]

Los valores de \(\delta a_{x}\), \(\delta a_{y}\) y \(\delta a_{z}\) pueden ser calculados mediante el análisis de los datos obtenidos para cada componente de la aceleración.

Adquisición de datos

Se han tomado datos de los acelerómetros a través de la aplicación phyphox que permite exportar el resultado a un fichero de texto.

Para ello se ha situado el dispositivo en reposo y se han recolectado los datos de los acelerómetros durante 60 segundos. A continuación se puede ver la cabecera y la cola del fichero utilizado para los cálculos.

Cabezera de datos
Time Ax Ay Az Atot
0.0000000 -7.705887 0.0419590 4.207242 8.779712
0.0097896 -7.572671 0.1101002 3.447035 8.321029
0.0197597 -7.593965 0.1238641 3.647338 8.425362
0.0297147 -7.588127 0.1146144 3.733517 8.457657
0.0396641 -7.597141 0.0810961 3.662285 8.434184
0.0496667 -7.629551 0.0476547 3.666985 8.465170
Cola de datos
Time Ax Ay Az Atot
6028 60.01705 0.0299187 0.0072442 -0.0876284 0.0928781
6029 60.02706 -0.0036835 -0.0215216 -0.1115704 0.1136868
6030 60.03682 -0.0037656 0.0406912 -0.1211472 0.1278538
6031 60.04678 0.0153076 -0.0024399 -0.0780516 0.0795759
6032 60.05674 0.0152276 -0.0072626 -0.0876284 0.0892376
6033 60.06670 0.0486653 -0.0216605 -0.0828400 0.0984883

y las estadísticas globales de los datos:

Time Ax Ay Az Atot
Min. : 0.00 Min. :-7.70589 Min. :-0.0650042 Min. :-1.08360 Min. :0.01031
1st Qu.:15.02 1st Qu.:-0.04306 1st Qu.: 0.0007424 1st Qu.:-0.09720 1st Qu.:0.08559
Median :30.04 Median : 0.01958 Median : 0.0197193 Median :-0.07322 Median :0.11242
Mean :30.04 Mean :-0.51044 Mean : 0.0339292 Mean : 0.07467 Mean :0.64537
3rd Qu.:45.05 3rd Qu.: 0.05146 3rd Qu.: 0.0437600 3rd Qu.:-0.04441 3rd Qu.:0.16442
Max. :60.07 Max. : 0.23794 Max. : 0.2715163 Max. : 4.20724 Max. :8.77971

Los datos brutos pueden ser consultados o descargados en este gist, y visualizados en esta sección.

Cálculo

A continuación se muestran los valores obtenidos para cada componente de la aceleración, y sus correpondientes medias y desviaciones típicas.

\[\overline{a_{x}}=0{.}0208 \textrm{ y } \delta a_{x}=0{.}0279 \implies {a_{x}}=0{.}208 \pm 0{.}0279 \ (m/s^2) \]

\[\overline{a_{y}}=0{.}0095 \textrm{ y } \delta a_{y}=0{.}0228 \implies {a_{x}}=0{.}0095 \pm 0{.}0228 \ (m/s^2) \]

\[\overline{a_{z}}=-0{.}0789 \textrm{ y } \delta a_{z}=0{.}0315 \implies {a_{x}}=0{.}0789 \pm 0{.}0315 \ (m/s^2)\]

Utilizando estos valores en la relación obtenida en 2.3.1:

\[\delta a=\sqrt[]{a_{x}^{2}\delta a_{x}^2 + a_{y}^{2}\delta a_{y}^2 +a_{z}^{2}\delta a_{z}^2 }\]

obtenemos:

\[\delta a=0{.}03118 \ (m/s^2)\]

es decir:

\[\boxed{\delta a \sim 3 \ cm/s^2}\]

Ahora podemos utilizar ese valor en una representación equivalente a las anteriores pero para la aceleración total, es decir para \(a=\sqrt{a_{x}^{2}+a_{y}^{2}+a_{z}^{2}}\), incluyendo el error aleatorio calculado:

El siguiente paso es la integración de la aceleración para calcular la velocidad media durante el intervalo de interés. La integración es en esencia una suma de valores de aceleración (por lapso de tiempo), y por tanto el error se propagará al resultado según la relación:

\[Si \ Q=a+b+c+\cdots \ entonces \ \delta Q=\sqrt[]{(\delta a)^{^2}+(\delta b)^{^2}+(\delta c)^{^2}+\cdots} \]

Por ejemplo para una integración que consista en la suma de 10 intervalos de una décima de segundo, con un error aleatorio como el calculado arriba (\(\delta a=0{.}03 \ m/s^2\)), el error en la velocidad sería:

\[\delta v=\sqrt[]{10(\delta a)^2}= \sqrt[]{10}\delta a\approx 0{.}10 \ m/s\]

Finalmente este error se propagará al desplazamiento según:

\[Si \ Q=\kappa A, \ y \ A \ tiene \ un \ error \ \delta A, \ entonces \ \delta Q=\kappa \delta A \]

que en el ejemplo anterior se traduce en:

\[\delta d= t\delta v\approx 1s \cdot 0{.}1 \ m/s \]

\[\boxed{\delta d\approx 10 \ cm} \]

Limitaciones físicas y computacionales

El problema crítico a la hora de medir la aceleración lineal tiene su origen en un principio físico conocido como el Principio de Equivalencia, que implica que no hay manera de distinguir si un cuerpo se mueve debido a un campo gravitatorio o debido a una fuerza que produjera sobre él una aceleración equivalente.

Dado que el acelerómetro sólo es capaz de medir la aceleración en el contexto del campo gravitatorio terrestre, los datos brutos del sensor incluyen inevitablemente el valor observado de la aceleración de la gravedad (\(g=9{.}81 m/s^{^2}\)). Es por ello que las componentes que proporciona el dispositivo como componentes de aceleración lineal tienen que haber eliminado de alguna manera la componente gravitatoria.

Si bien éste proceso es trivial en el sentido general (sólo es necesario descontar la gravedad medida, un valor que es razonablemente estable en un entorno normal de uso), a la hora de realizar medidas precisas hay que tener en cuenta que cualquier giro en el dispositivo respecto a cualquiera de sus tres ejes produce una aceleración centrífuga que por el principio de equivalencia es indistinguible del campo gravitatorio y que por tanto es medida por el sensor, efectuando de esta manera una medida distorsionada del movimiento.

Es por ello que para obtener datos fiables de aceleraciones lineales es necesario contar con los valores medidos por el giróscopo, conocidos los giros a los que se ha sometido el dispositivo podemos descontar apropiadamente esas aceleraciones espurias. Por eso es habitual considerar los “acelerómetros lineales” como pseudo-sensores más que como sensores propiamente dichos, no producen una medida sino que la calculan mediante los valores proporcionados por otros sensores (en éste caso el acelerómetro y el giróscopo).

El problema entonces es coordinar distintos sensores, que en general tienen distintas tasas de refresco y/o diferentes velocidades de respuesta, algo que necesariamente requiere un trabajo de programación especialmente concienzudo, sobre todo si se quieren minimizar los errores para un caso de uso concreto, como por ejemplo la medida de pequeños desplazamientos.

Otro posible escollo es el entorno HW/SW que puede ser crucial a la hora de tomar medidas fiables y reproducibles. En general el programador tiene acceso a todas las variables relevantes del móvil y puede priorizar unas tareas respecto a otras, sin embargo es seguramente un aspecto delicado de gestionar, y dado que la respuesta y la tasa de refresco son dependientes del nivel de recursos del móvil (uso de microprocesador, memoria, calidad de componentes, etc…), es a la vez una tarea crítica.

Finalmente otro factor a tener en cuenta es la previsible discrepancia entre las distinas combinaciones posibles de sensores y sistemas operativos, aunque en principio no debería haber excesivas complicaciones más allá del caracter propietario o libre de las correspondientes licencias de uso, es difícil calibrar el grado de madurez de las librerías de código específicas, y su operatividad con los sensores disponibles en el mercado.

Conclusiones y alternativas

Analizado el procedimiento, la física involucrada y los datos experimentales obtenidos con un móvil de gama media, las respuestas a la consulta planteada serían:

[…]

  • Error de medida.- El error aleatorio de la aceleración se ha calculado a partir de los datos de los valores del pseudo-sensor de aceleración lineal, y posteriormente se ha propagado en los dos pasos necesarios para evaluar el desplazamiento, llegando a un error del orden de 10 cm que hace inviable el uso del dispositivo para medir distancias tan pequeñas (del orden de centímetros).

[…]

Es difícil de cuantificar, pero muy probablemente una buena parte del error aleatorio tenga su origen en una mala (no optimizada) aplicación de las correcciones necesarias a la hora de calcular las componentes de la aceleración lineal, que vienen impuestas por el Principio de Equivalencia. Es posible que se puedan obtener valores más estables y con menor error, ajustando la manera de implementar lógicamente los valores de las aceleraciones de rotación proporcionadas por el giróscopo, y así corregir convenientemente los valores brutos del acelerómetro. Pero como se ha comentado, no parece una tarea en absoluto trivial.


Sin salir de la línea propuesta originalmente, el siguiente paso sería examinar otras opciones instrumentales del dispositivo. Singularmente la más prometedora a primera vista sería la utilización de interferometría acústica, es decir utilizar el móvil como un emisor/receptor de ondas a través del altavóz y el micrófono, y analizar la respuesta para calcular […].

En ese sentido merece la pena repasar la página wiki de PhyPhox para evaluar la viabilidad de todas las opciones disponibles.


Apéndices

Gráficos

Sistemas de coordenadas y ejes de giro

Instrumentación

Sensores en Moto G2 (2ª Generación) / Android 6.0

Sensores en Moto G5 Plus / Android 7.0

Gráficos de aceleración vs. tiempo

Se han tomado datos con el móvil estático en posición horizontal.

Histogramas

Chequeo de normalidad de las distribuciones para los valores utilizados para estimar el error en el intervalo seleccionado (entre los segundos 25 y 35)

Graficos de aceleración vs tiempo por componentes

Hardware y software empleado

General

  • HP Pavilion / Microsoft Windows [Versión 10.0.16299.431]

  • Android Studio

  • Motorola Moto \(G\) (2ª generación) / Android 6.0

  • Motorola Moto \(G^{5}\) Plus / Android 7.0

Aplicaciones Android

Programación, datos y edición

Sólo se ha utilizado software de código abierto