Armanio
@Armanio

Акселлерометр айфона: движение телефона вверх/вниз. Как реализовать?

Господа, был бы очень благодарен за консультацию по работе с акселерометром айфона:
требуется вычислить, когда человек подтягивается с телефоном в кармане.
То есть телефон поднимается вверх и опускается примерно в тоже самое место (+1 подтягивание).

Такое реализовано в пачке приложений спортивной тематики компании runtastic.
Конкретно: pull ups.

Как считать данные с датчика я понял, но что делать с ними дальше -- не очень (вообще нет):
self.motionManager = [[CMMotionManager alloc]init];
    self.motionManager.deviceMotionUpdateInterval = 10.0/100.0;
    [self.motionManager startDeviceMotionUpdatesToQueue:[[NSOperationQueue alloc]init] withHandler:^(CMDeviceMotion *motion, NSError *error) {
        CMAcceleration acceleration = motion.userAcceleration;
        NSLog(@"%f", acceleration.y);
}];

Данные приходят в double вида -0.270925, -0.211401 и т. п.
Как я понял - это разложение вектора ускорения на указанные оси (в нашем случае -- y), но что делать с этим далее...

Чую, что решение проще, чем кажется.

Пальцы в кровь уже сгуглил. :(
  • Вопрос задан
  • 3193 просмотра
Решения вопроса 1
Armanio
@Armanio Автор вопроса
Всем спасибо!

Решение найдено:
-(void) start{
    double __block firstY, mediumY, lastY=0;
    int __block i=0;
    [self addObserver:self forKeyPath:@"count" options:NSKeyValueObservingOptionNew context:nil];
    self.motionManager = [[CMMotionManager alloc]init];
    self.motionManager.deviceMotionUpdateInterval = 0.1;
    [self.motionManager startDeviceMotionUpdatesToQueue:[[NSOperationQueue alloc]init] withHandler:^(CMDeviceMotion *motion, NSError *error) {
        CMAcceleration acceleration = motion.userAcceleration;
        [self changeFilter:[LowpassFilter class]];
        [filter addAcceleration:&acceleration];
        if([UIDevice currentDevice].orientation!=1){
            [self.messageText performSelectorOnMainThread:@selector(setText:) withObject:@"Держите телефон вертикально!" waitUntilDone:NO];
        } else {
            [self.messageText performSelectorOnMainThread:@selector(setText:) withObject:@"" waitUntilDone:NO];
            double y = filter.y>0.5?filter.y:0;
            if (i < 3){
                if(i%3==0){
                    firstY = y;
                }
                if(i%3==1){
                    mediumY = y;
                }
                if(i%3==2){
                    lastY = y;
                }
            }else{
                firstY = mediumY;
                mediumY = lastY;
                lastY = y;
            }
        
        if(mediumY>firstY){
            if(mediumY>lastY){
                self.count++;
                AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

            }
        }
        i++;
        }
    }];
    self.trained = YES;
}


Считает не без корявостей, конечно. Но хоть как-то. Буду благодарен за модификации.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
подозреваю, что надо еще и данные с гироскопа снять
Ответ написан
@tre
Физика подтягиваний: сначала тело движется по вертикали с положительным ускорением от земли, потом с отрицательным к земле. Соответственно нужно фиксировать эти моменты перемены знака.

Важно учесть, что телефон будет находится у человека как попало, значит сначала нужно найти вертикаль, а также по вертикали всегда действует ускорение свободного падения g.
Ответ написан
Комментировать
@tre
https://www.inkling.com/read/learning-ios-programm...
Много про core motion y iphone
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы