Toque na detecção da força de pressão usando o acelerômetro

Ontem, na apresentação sobre o novo Garageband para iPad 2, a Apple demonstrou uma característica interessante: a detecção da pressão da torneira usando o acelerômetro. (Veja a seção de bateria na página Garageband .)

Eu estou querendo saber como isso deve funcionar se o iPad ficar na mesa. Nenhum movimento, nenhuma aceleração mensurável, não?

Algumas boas respostas. Aqui está algum código de trabalho. Eu implementei isso como uma subclass do UIGestureRecognizer para que você possa simplesmente soltá-lo e anexá-lo a um UIView ou UIButton. Uma vez acionado, ele terá a “pressão” ajustada para uma flutuação entre 0.0f e 2.0f. Opcionalmente, você pode definir as pressões mínima e máxima necessárias para reconhecer. Apreciar.

// // CPBPressureTouchGestureRecognizer.h // PressureSensitiveButton // // Created by Anthony Picciano on 3/21/11. // Copyright 2011 Anthony Picciano. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #import  #define CPBPressureNone 0.0f #define CPBPressureLight 0.1f #define CPBPressureMedium 0.3f #define CPBPressureHard 0.8f #define CPBPressureInfinite 2.0f @interface CPBPressureTouchGestureRecognizer : UIGestureRecognizer  { @public float pressure; float minimumPressureRequired; float maximumPressureRequired; @private float pressureValues[30]; uint currentPressureValueIndex; uint setNextPressureValue; } @property (readonly, assign) float pressure; @property (readwrite, assign) float minimumPressureRequired; @property (readwrite, assign) float maximumPressureRequired; @end // // CPBPressureTouchGestureRecognizer.h // PressureSensitiveButton // // Created by Anthony Picciano on 3/21/11. // Copyright 2011 Anthony Picciano. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #import  #import "CPBPressureTouchGestureRecognizer.h" #define kUpdateFrequency 60.0f #define KNumberOfPressureSamples 3 @interface CPBPressureTouchGestureRecognizer (private) - (void)setup; @end @implementation CPBPressureTouchGestureRecognizer @synthesize pressure, minimumPressureRequired, maximumPressureRequired; - (id)initWithTarget:(id)target action:(SEL)action { self = [super initWithTarget:target action:action]; if (self != nil) { [self setup]; } return self; } - (id)init { self = [super init]; if (self != nil) { [self setup]; } return self; } - (void)setup { minimumPressureRequired = CPBPressureNone; maximumPressureRequired = CPBPressureInfinite; pressure = CPBPressureNone; [[UIAccelerometer sharedAccelerometer] setUpdateInterval:1.0f / kUpdateFrequency]; [[UIAccelerometer sharedAccelerometer] setDelegate:self]; } #pragma - #pragma UIAccelerometerDelegate methods -(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { int sz = (sizeof pressureValues) / (sizeof pressureValues[0]); // set current pressure value pressureValues[currentPressureValueIndex%sz] = acceleration.z; if (setNextPressureValue > 0) { // calculate average pressure float total = 0.0f; for (int loop=0; loop= minimumPressureRequired && pressure <= maximumPressureRequired) self.state = UIGestureRecognizerStateRecognized; else self.state = UIGestureRecognizerStateFailed; } } currentPressureValueIndex++; } #pragma - #pragma UIGestureRecognizer subclass methods - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { setNextPressureValue = KNumberOfPressureSamples; self.state = UIGestureRecognizerStatePossible; } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { self.state = UIGestureRecognizerStateFailed; } - (void)reset { pressure = CPBPressureNone; setNextPressureValue = 0; currentPressureValueIndex = 0; } @end 

Imagino que a checkbox de alumínio e a mesa não impeçam movimentos muito pequenos e que o sensor seja muito sensível.

Ou, a experiência do usuário do Garage Band é melhor com o iPad em pé na Smart Cover.

Bem, simplesmente faça esta experiência:

Abra com o XCode o aplicativo tutorial do AccelerometerGraph incluído no pacote XCode. Em seguida, inicie o aplicativo (filtro High Pass, melhor usando a filtragem adaptativa): você verá a linha azul mudando de acordo com a intensidade do aplicativo. Claro que isso é afetado por tremores na tabela, o que adiciona ruído à medida, mas você ainda pode filtrá-lo, verificando os dados do acelerômetro com o evento de toque.

Portanto, esse tipo de detecção de pressão é possível usando o acelerômetro.

Toque na detecção do tamanho da área? (Harder tap, maior impressão digital) Dinâmica de torneira?

Só pensando.

viggio24 está certo. a detecção da área dos dedos funciona bem. (Eu tenho alguns posts aqui com a linha trivial de código para obtê-lo). o único problema é que não está claro quais são as conseqüências se você enviar com ele habilitado; nós assumimos que simplesmente não será aprovado no melhor dos casos.

Talvez seja devido ao giroscópio mais sensível? Combinado com dados do acelerômetro, provavelmente é razoavelmente fácil determinar até mesmo pequenas mudanças no movimento. Apenas um palpite. A menos que haja algo que eles não estejam nos dizendo, o que não seria o primeiro.

Mesmo que o SDK nos apresente apenas a área de toque, acredito que o hardware da canvas esteja fornecendo ao sistema operacional muito mais informações: pixels tocados (usados ​​para detecção de área) e duração do toque. Juntos (e experimentando) eles podem dar uma boa estimativa da pressão aplicada. Seria bom se a Apple estivesse liberando essa estimativa de pressão empírica para os desenvolvedores.

Tente você mesmo com o aplicativo de exemplo AccelerometerGraph. O dispositivo e a mesa têm rigidez finita, portanto você pode ver pequenos pontos no gráfico.

ADICIONADO:

Se você compilar o exemplo de gráfico AccelerometerGraph da Apple a partir do código-fonte, você pode aumentar o ganho no eixo vertical e ver blips para acelerações menores.

    Intereting Posts