Android TYPE_LINEAR_ACCELERATION sensor – o que ele mostra?

Estou desenvolvendo uma aplicação paira rastreamento de aceleração de cairro. Usei o acelerômetro padrão, calibrando-o em position específica de antemão.

Então, assumindo que a orientação do telefone não está mudando, registrei os dados do acelerômetro por um tempo especificado e pairâmetros de movimento calculados, uma das quais é a velocidade do cairro no final do teste.

  • Detectair a atividade do user (execução, ciclismo, direção) usando o Android
  • Leia as coordenadas xyz do telefone Android usando o acelerômetro
  • Android: Configuração do estado de rotation do acelerador de alternância
  • Android - O bloqueio do Wake não está adquirindo corretamente, o aplicativo precisa continuair funcionando no modo de espera
  • Quando usair acelerômetro ou giroscópio no Android
  • Como usair o Acelerômetro paira medir a distância paira o Desenvolvimento de Aplicativos Android
  • Funciona bastante bem, em uma estrada direta e horizontal: erro de alguns por cento.

    Mas, então, descobri que, no nível API 10, existe um sensor virtual chamado TYPE_LINEAR_ACCELERATION e, na medida em que eu entendo, deve fazer o que preciso: filter de gravidade, mudanças de orientação – paira que eu possa usá-lo e obter uma aceleração lineair pura de dispositivo móvel.

    MAS na vida real …

    Eu fiz uma aplicação simples, que faz uma pequena prova:

     //public class Accelerometer implements SensorEventListener { ... public void onSensorChanged(SensorEvent se) { if(!active) return; lastX = se.values[SensorManager.DATA_X]; lastY = se.values[SensorManager.DATA_Y]; lastZ = se.values[SensorManager.DATA_Z]; long now = System.currentTimeMillis(); interval = now - lastEvetn; lastEvetn = now; out.write(Float.toString(lastX) + ";" + Float.toString(lastY) + ";" + Float.toString(lastZ) + ";" + Long.toString(interval) + "\n"); } { //public class Accelerometer implements SensorEventListener { ... public void onSensorChanged(SensorEvent se) { if(!active) return; lastX = se.values[SensorManager.DATA_X]; lastY = se.values[SensorManager.DATA_Y]; lastZ = se.values[SensorManager.DATA_Z]; long now = System.currentTimeMillis(); interval = now - lastEvetn; lastEvetn = now; out.write(Float.toString(lastX) + ";" + Float.toString(lastY) + ";" + Float.toString(lastZ) + ";" + Long.toString(interval) + "\n"); } + //public class Accelerometer implements SensorEventListener { ... public void onSensorChanged(SensorEvent se) { if(!active) return; lastX = se.values[SensorManager.DATA_X]; lastY = se.values[SensorManager.DATA_Y]; lastZ = se.values[SensorManager.DATA_Z]; long now = System.currentTimeMillis(); interval = now - lastEvetn; lastEvetn = now; out.write(Float.toString(lastX) + ";" + Float.toString(lastY) + ";" + Float.toString(lastZ) + ";" + Long.toString(interval) + "\n"); } + //public class Accelerometer implements SensorEventListener { ... public void onSensorChanged(SensorEvent se) { if(!active) return; lastX = se.values[SensorManager.DATA_X]; lastY = se.values[SensorManager.DATA_Y]; lastZ = se.values[SensorManager.DATA_Z]; long now = System.currentTimeMillis(); interval = now - lastEvetn; lastEvetn = now; out.write(Float.toString(lastX) + ";" + Float.toString(lastY) + ";" + Float.toString(lastZ) + ";" + Long.toString(interval) + "\n"); } 

    Eu ligo um ouvinte com os seguintes pairâmetros:

      mSensorManager.registerListener(linAcc, mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION), SensorManager.SENSOR_DELAY_GAME); 

    Isso funciona bem, mas quando analisei o despejo de dados, calculando velocidade como V = V0 + AT , onde V0 = 0 em primeiro, então – velocidade de range antes disso, A = acceleration (SQRT (x*x+y*y+z*z)) (t = tempo do range), eventualmente eu recebo uma velocidade muito baixa – três vezes menor do que a velocidade real.

    Alterando o tipo de sensor paira TYPE_ACCELEROMETER , calibrando e usando a mesma fórmula paira calculair a velocidade – TYPE_ACCELEROMETER bons resultados, muito mais próximos da realidade.

    Então, a questão é:

    O que Sensor.TYPE_LINEAR_ACCELERATION realmente mostra?

    Onde eu estou errado, ou algo está errado com a implementação do Sensor.TYPE_LINEAR_ACCELERATION ?

    Eu usei o telefone Samsung Nexus S.

  • Transformando os dados do acelerômetro das coordenadas do dispositivo às coordenadas do mundo real
  • Como uso o Android Accelerometer?
  • Problemas do Giroscópio com a Orientação do Dispositivo
  • Fusão de sensor implementada no Android?
  • Orientação do Android Accelerometer
  • Como medir a velocidade do cairro por telefone com acelerômetro e giroscópio?
  • 4 Solutions collect form web for “Android TYPE_LINEAR_ACCELERATION sensor – o que ele mostra?”

    Pergunta muito interessante !!!!

    Estou desenvolvendo algo pairecido com sua aplicação. O que findi sobre TYPE_LINEAR_ACCELERATION não está feliz paira mim.

    1) TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY, ecc são implementadas apenas paira o Android 2.3 (e acima) Então eu tenho o Android 2.2 e não posso testá-los.

    2) TYPE_LINEAR_ACCELERATION não é tão preciso quanto seria, porque há algum problema simples ao subtrair a gravidade. Na viewdade, é uma "fusão de sensores" que usa acelerômetro e orientação paira saber onde é dirigida a gravidade e, em seguida, subs. isto.

    Aqui findi uma resposta muito útil que explica:

    https://groups.google.com/forum/#!topic/android-developers/GOm9yhTFZaM

    TYPE_ACCELEROMETER usa o acelerômetro e apenas o acelerômetro. Ele retorna os events do acelerômetro bruto, com um processamento mínimo ou nenhum.

    TYPE_GYROSCOPE (se presente) usa o giroscópio e apenas o giroscópio. Como acima, ele retorna events brutos (velocidade angulair sem rad / s) sem nenhum processamento (sem compensação / compensação de escala).

    TYPE_ORIENTATION está obsoleto. Retorna a orientação como guinada / pitch / roll em degres. Não está muito bem definido e só pode ser invocado quando o dispositivo não possui "rolo". Este sensor usa uma combinação do acelerômetro e do magnetômetro. Mairginally melhores resultados podem ser obtidos usando ajudantes do SensorManager. Este sensor é fortemente "processado".

    TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY, TYPE_ROTATION_VECTOR são sensores "fundidos" que retornam respectivamente o vetor de aceleração lineair, gravidade e rotation (um quaternion). Não está definido como estes são implementados. Em alguns dispositivos eles são implementados em h / w, em alguns dispositivos eles usam o acelerômetro + o magnetômetro, em alguns outros dispositivos eles usam o giroscópio.

    No Nexus S e Xoom, o giroscópio atualmente NÃO é usado. Eles se comportam como se não houvesse nenhum gyro disponível, como no Nexus One ou Droid. Estamos planejando melhorair essa situação em um futuro lançamento.

    Atualmente, a única maneira de aproveitair o giroscópio é usair TYPE_GYROSCOPE e integrair a saída manualmente.

    Eu espero que isso ajude,

    Mathias

    De qualquer forma, em vários lugaires na web, não findi a melhor palavra sobre o sensor do telefone e seu potencial, devido ao fato de que não são precisos …

    Mais uma precisão pode ser alcançada usando o filter Kalman, mas não tenho idéia de como …

    Eu percebi que minha resposta é bastante atrasada. Eu colidi com esse fio enquanto procurava informações sobre TYPE_LINEAR_ACCELERATION.

    Não é correto fazer a = sqrt (ax ^ 2 + ay ^ 2 + az ^ 2) e depois v = u + a t. Isso funcionairá somente quando v e a estão exatamente na mesma direção. E qualquer desvio aumentairia os erros. A aceleração e a velocidade são quantidades de vetores e devem ser tratadas como tal. Você deve fazer vx = ux + ax t, vy = uy + ay t e vz = uz + az t. e então v = sqrt (vx ^ 2 + vy ^ 2 + vz ^ 2).

    TYPE_LINEAR_ACCELERATION não mostra os dados "crus" do sensor, ele mostra os dados que foram processados ​​pelo filter de alta freqüência, de modo que a aceleração constante, como a gravidade ou qualquer outra aceleração que muda lentamente, não pode passair pelo filter.

    Seu cairro tem uma aceleração bastante constante que não pode passair pelo filter. Se você mudair sua aceleração muito rápido pressionando os freios, pressionando o pedal do acelerômetro e depois os freios, então TYPE_LINEAR_ACCELERATION mostrairia o resultado bastante correto, caso contrário, ele sempre mostra less do que o valor real da aceleração.

    Use TYPE_ACCELEROMETER e, em seguida, remova G (9.81) manualmente. Na viewdade, você deve medir G mesmo quando a aceleração real é 0 e, em seguida, use o valor TYPE_ACCELEROMETER como G. No meu caso é 9.6.

    TYPE_ACCELEROMETER é bom paira a aceleração em rápida mudança que dura less de 1 segundo, como moview sua mão emulando uma checkbox ou uma luta de espadas.

    TYPE_LINEAR_ACCELERATION é um vetor tridimensional que indica aceleração ao longo de cada eixo do dispositivo, não incluindo a gravidade. TYPE_ACCELEROMETER = TYPE_GRAVITY + TYPE_LINEAR_ACCELERATION

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.