Как считается повторение
Счёт идёт не по звуку и не по камере. В наушнике стоит датчик движения, iOS отдаёт с него ускорение, угол головы и скорость вращения, а приложение ищет в этой линии повторения. Ниже что за линия, как из неё получается число и где оно врёт. Записи настоящие, их можно скачать и посмотреть самому.
Что отдаёт наушник
iOS отдаёт поток CMDeviceMotion от датчика в наушнике: около пятидесяти кадров в секунду, в каждом ускорение по трём осям, кватернион поворота головы и скорость вращения.
Приложение берёт оттуда три вещи. Ускорение вдоль вектора гравитации: подъём и опускание тела. Угол наклона головы (pitch): куда смотрит голова относительно горизонта. Гравитацию вдоль оси уха (gy): лежит человек или стоит.
Два способа считать
Пресс и отжимания с колен считаются по углу головы. Корпус вращается целиком, темп не важен, а болтанка тела в угле почти не видна. Повторение засчитывается на возврате из нижней точки: когда угол отыграл назад и размах от прошлого верха набрал свою величину. Абсолютных порогов тут нет: у одного человека верхняя точка ниже, чем у другого нижняя.
Отжимания, приседания и подтягивания считаются по ускорению вдоль гравитации. Порог свой на упражнение: у приседа сигнал огромный и порог 0.15 G, у отжиманий 0.06, у подтягиваний 0.07. У приседа и отжиманий цикл трёхфазный: спуск, толчок, возврат, и счёт идёт на возврате в исходную позицию, а не в нижней точке.
Пресс: 22 повторения подряд
Ровный подход без пауз. Каждая яма это скручивание, засечка это момент зачёта. Видно, что нижние точки гуляют по глубине, а счёт всё равно ровный: он смотрит на размах и на возврат, а не на абсолютный уровень.
Почему одного порога мало
Порог по амплитуде ловит любое движение подходящей величины. Человек лёг в упор, сел, попил, потянулся за телефоном, потряс головой: всё это даёт цикл нужного размаха. Поэтому поверх порога стоят гейты, и каждый вырос из конкретного разбора записи, где счёт соврал.
Гейт по позе. Отжимания идут головой вниз: у живых повторений гравитация вдоль оси уха 0.55 и выше, а ложные приходят из положения стоя или сидя, там она около нуля. Присед наоборот делается с ровной головой, и наклон за чем-нибудь с пола раньше засчитывался как повторение.
Гейт по вращению. Тряска, кивки и повороты вращают голову: медиана модуля скорости вращения 1.4 и выше. Настоящее повторение едет линейно, там 0.85 и ниже. У пресса такого гейта нет: лёжа голова вращается законно.
Гейт по длительности цикла. Настоящее скручивание занимает от 0.5 до 2.4 секунды. Укладка в позу, питьё и втыкание в телефон дают 2.6 и больше.
Гейт по энергии. У ложного цикла сигнал жидкий: порог пересечён, а площади под кривой нет. Минимум по площади отсекает шум на слабом сигнале.
Рефрактерный период. После зачёта следующее повторение не раньше чем через 0.6 секунды у отжиманий и 1.2 у приседа.
Отжимания: выход из упора
Запись из тюнинга гейта по позе. К концу подхода человек садится и пытается отжиматься из полусидя. Сигнал по амплитуде остаётся похожим, а гравитация вдоль оси уха падает, и счёт останавливается.
Отжимания с колен: старт подхода
Опускание из вертикали в упор занимает две-четыре секунды и даёт цикл угла больше, чем само повторение. Раньше укладка засчитывалась, а первое настоящее повторение терялось. Лечится скользящим окном верхней точки и требованием, чтобы возврат из нижней точки был не только абсолютным, но и долей размаха.
Приседания: паузы
Между повторениями человек стоит и дышит. Счётчик состояния не теряет: фаза сбрасывается только если завис в полуцикле дольше шести секунд.
Где счёт врёт
Пороги я подбирал по записям своих тренировок и тренировок пары знакомых, все в AirPods Pro. Другие модели гонял меньше, и на них счёт может уезжать.
Слабые и очень медленные повторения теряются: размах не набирает порог. Уставшие скручивания ныряют мельче, для них порог уже опущен, но дно есть.
Лишнее приходит из движений, похожих на упражнение: перекладывание тела, разминка, потягивания в паузе.
Ошибку в подходе можно поправить голосом: плюс N, минус N. Это не костыль, а часть работы: счётчик оценивает движение, а не измеряет его.
Если модель мажет постоянно, выгрузи csv с экрана счётчика и пришли на hi@cornishreps.com. Одна запись помогает больше любого описания на словах.
Записи
Четыре записи с графиков выше, как есть, прямо с телефона. В каждой строке время, ускорение по трём осям, гравитация, угол головы, скорость вращения, сглаженный сигнал, состояние гейта и счёт на этот момент.
Личного в них нет: только числа с датчика и метки времени.
- situps-live.csv 22 повторений, 63.2 c, 318 КБ
- pushups-outofpose.csv 9 повторений, 48.2 c, 241 КБ
- knees-falsestart.csv 8 повторений, 23.8 c, 118 КБ
- squats-pauses.csv 21 повторений, 78.9 c, 397 КБ
iOS 18 и новее. Бесплатно, аккаунт не нужен. Идёт тестирование, что-то может не работать