Обнаружение прочности на разрыв давления с использованием

Вчера, в презентации о новом Garageband для iPad 2, Apple продемонстрировала интересную особенность: Обнаружение давления отвода с помощью акселерометра. (См. Раздел «Барабаны» на странице Garageband .)

Мне интересно, как это должно работать, если iPad лежит на столе. Нет движения, нет измеримого ускорения, нет?

Некоторые хорошие ответы. Вот какой рабочий код. Я реализовал это как подclass UIGestureRecognizer, чтобы вы могли просто его загрузить и прикрепить к UIView или UIButton. После срабатывания он будет иметь «давление», установленное на поплавок между 0.0f и 2.0f. Вы можете установить минимальное и максимальное давление, необходимое для распознавания. Наслаждаться.

// // 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 

Я полагаю, что алюминиевый корпус и стол не мешают очень маленьким движениям и что датчик очень чувствителен.

Или, пользовательский интерфейс Garage Band лучше работает с iPad, стоящим на Smart Cover.

Хорошо, просто сделайте этот эксперимент:

откройте приложение XCode AccelerometerGraph, включенное в комплект XCode. Затем запустите приложение (фильтр High Pass, лучше используя адаптивную фильтрацию): вы увидите, что синяя линия меняется в зависимости от силы приложения. Конечно, на это влияет дрожание в таблице, что добавляет шум в меру, но вы все равно можете отфильтровать его, проверив данные акселерометра с помощью события касания.

Таким образом, такое измерение давления возможно с помощью акселерометра.

Обнаружение размера области? (Более жесткий кран, больший отпечаток пальца) Динамика нажатия?

Просто думаю.

viggio24 является правильным. пальцевое зондирование прекрасно работает. (у меня есть несколько сообщений здесь с тривиальной строкой кода, чтобы получить его). единственная проблема заключается в том, что неясно, каковы последствия, если вы отправляете с ним включен; мы предполагаем, что он просто не будет одобрен в лучшем случае.

Возможно, это связано с более чувствительным гироскопом? В сочетании с данными Accelerometer, вероятно, достаточно легко определить даже небольшие изменения в движении. Просто догадка. Если есть что-то, что они нам не говорят, это было бы не первым.

Даже если SDK предоставляет нам только зону касания, я считаю, что аппаратное обеспечение экрана предоставляет операционной системе гораздо больше информации: касание пикселей (используется для обнаружения области) и длительность касания. Вместе (и экспериментируя) они могут дать вам хорошую оценку применяемого давления. Было бы неплохо, если бы Apple выпустила эту эмпирическую оценку давления разработчикам.

Попробуйте сами с примером приложения AccelerometerGraph. Устройство и настольное устройство имеют ограниченную жесткость, поэтому на графике могут отображаться небольшие всплески.

ДОБАВЛЕНО:

Если вы скомпилируете образец графика Apple AccelerometerGraph из исходного кода самостоятельно, вы можете увеличить коэффициент усиления по вертикальной оси и увидеть блики для меньших ускорений.

Давайте будем гением компьютера.