Вычислить вертикальное расстояние, используя ускорение

У меня следующий сценарий: iPhone подключен к вертикальной направляющей (его движение ограничено осью Y). С помощью механических средств телефон поднимается вверх, а затем возвращается в исходное положение. Расстояние варьируется (от 6 до 24 дюймов). Общее время, необходимое для полной поездки, составляет примерно 1-2 секунды. Цель состоит в том, чтобы оценить расстояние, которое проходит устройство.

Я прочитал оба:

Расчет расстояния по измеренному ускорению в зависимости от времени

Получение положения с помощью акселерометра на телефоне Android

(хотя я должен признать, что уже много лет мне не приходилось иметь дело непосредственно с этими темами)

В настоящее время я собираю данные об ускорении (по оси Y) и использую следующее для оценки интеграла ускорения и скорости (через Excel):

1  Time [A]  Acceleration [B]   Velocity [C]                Distance [D]
2  0         a(z)               0                           0
3  1         a(z)               =C2+(A3-A2)*(B2+B3)/2       =D2+(A3-A2)*(C2+C3)/2
4  2         a(z)               =C3+(A4-A3)*(B3+B4)/2       =D3+(A4-A3)*(C3+C4)/2
5  3         a(z)               =C4+(A5-A4)*(B4+B5)/2       =D4+(A5-A4)*(C4+C5)/2
6  4         a(z)               =C5+(A6-A5)*(B5+B6)/2       =D5+(A6-A5)*(C5+C6)/2
7  5         a(z)               =C6+(A7-A6)*(B6+B7)/2       =D6+(A7-A6)*(C6+C7)/2
8  6         a(z)               =C7+(A8-A7)*(B7+B8)/2       =D7+(A8-A7)*(C7+C8)/2
9  7         a(z)               =C8+(A9-A8)*(B8+B9)/2       =D8+(A9-A8)*(C8+C9)/2
10 8         a(z)               =C9+(A10-A9)*(B9+B10)/2     =D9+(A10-A9)*(C9+C10)/2
11 9         a(z)               =C10+(A11-A10)*(B10+B11)/2  =D10+(A11-A100)*(C10+C11)/2
12 10        a(z)               =C11+(A12-A11)*(B11+B12)/2  =D11+(A12-A11)*(C11+C12)/2
   ...       ...                ...                         ...

Вот пример моих данных: test_data_1.csv

Если единицы ускорения измеряются в G (9,8 м/с^2), каковы результирующие единицы скорости и расстояния?

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

Любые указатели/разъяснения будут высоко оценены.

Если временные интервалы находятся в с е с о н г с тогда интегралы м е т е р / с е с о н г и м е т е р .
Вы используете CMAccelerometerData#accelerationили CMDeviceMotion#userAccelerationдля получения значения ускорения? Потому что первое — это собственное ускорение , векторная сумма G и знакомое dv/dtускорение.
@LeonidShevtsov Я использую CMAccelerometerData#acceleration- это то, что вы предлагаете мне использовать?
@RobertJoseph Нет, вы должны использовать startDeviceMotionUpdates, и CMDeviceMotion#userAccelerationсм. обзор на этой странице . По сути, API отфильтровывает гравитацию и предоставляет ее dv/dtвам.

Ответы (3)

Акселерометр измеряет отрицательное значение силы тяжести плюс любое восходящее ускорение, см. ПРИМЕЧАНИЕ № 1.

а с с "=" ( г + Икс ¨ )

и вы хотите интегрировать Икс ¨ чтобы получить скорость в "=" Икс ˙ и положение Икс . Таким образом, ваши выражения должны быть

в ( т ) "=" 0 т ( а с с + г ) г т Икс ( т ) "=" 0 т 0 т ( а с с + г ) г т г т

Вы также знаете, что конечное положение должно быть равно начальному, а конечная скорость должна быть в состоянии покоя. Это требует от вас настройки результатов интеграции, чтобы получить желаемый результат. Это может быть оправдано, поскольку у вас есть дискретные значения ускорения. Именно здесь вы калибруете модель с данными измерений.

Итак, вот шаги, которые нужно предпринять

  1. Найдите частоту дискретизации н "=" # с а м п л е с с е с о н г
  2. Предположим, что начальная позиция равна нулю
  3. Предположим, что начальная скорость равна нулю
  4. С первых секунд найдите локальный г значение, когда телефон не движется
  5. Примеры значений ускорения а с с и рассчитать время для каждой выборки, используя частоту выборки и количество выборок.
  6. Найдите начало события, проверив, когда а с с начинает отклоняться от г . Установить время равным нулю до начала события
  7. Интегрировать а с с г с течением времени от нулевого времени и обратите внимание на конечную скорость в 1 и время т 1 в конце концов.
  8. Теперь интегрируйте скорости, чтобы получить положение, и отметьте конечное положение. Икс 1 вовремя т 1 в конце концов.
  9. Теперь нужно настроить значения ускорения с помощью линейной функции с течением времени, чтобы в конце концов получить желаемый эффект покоя телефона. Это делается с помощью этого аналитического волшебства, см. ПРИМЕЧАНИЕ № 2.
    в ( т ) "=" 0 т ( а с с + г ) + ( 2 в 1 т 1 6 Икс 1 т 1 2 ) + т ( 12 Икс 1 т 1 3 6 в 1 т 1 2 ) г т Икс ( т ) "=" 0 т 0 т ( а с с + г ) + ( 2 в 1 т 1 6 Икс 1 т 1 2 ) + т ( 12 Икс 1 т 1 3 6 в 1 т 1 2 ) г т г т
  10. Теперь вы можете найти пиковую скорость и пиковую высоту.

ПРИМЕЧАНИЕ № 1. Чтобы получить уравнение акселерометра, вам нужно сделать свободную диаграмму тела на самом акселерометре, поскольку он прикреплен к телефону и следует за движением телефона. Сила соединения Ф используются пьезоэлектрические материалы, такие, что Ф м а с с г "=" м а с с Икс ¨ . Сообщаемое ускорение откалибровано так, чтобы

а с с "=" Ф м а с с "=" г Икс ¨
таким образом, направленная вверх сила реакции указывает на направленное вниз ускорение (так называемое правило Даламбера). Обратите внимание, что изначально, когда а с с "=" г результат Икс ¨ "=" ( г ) г "=" 0 .

ПРИМЕЧАНИЕ № 2: Вы можете убедиться, что

0 т 1 ( 2 в 1 т 1 6 Икс 1 т 1 2 ) + т ( 12 Икс 1 т 1 3 6 в 1 т 1 2 ) г т "=" в 1 0 т 1 0 т ( 2 в 1 т 1 6 Икс 1 т 1 2 ) + т ( 12 Икс 1 т 1 3 6 в 1 т 1 2 ) г т г т "=" Икс 1

На самом деле разделение d²x/dt²настолько полезно, что существует iPhone API, который выполняет шаги с 1 по 6 за вас: см. CMDeviceMotion#userAcceleration.

Как сказал Росс, вам нужно попытаться удалить общую постоянную часть ваших данных об ускорении. Большинство ускорителей постоянно сообщают о гравитации. Таким образом, даже если ваш телефон неподвижно сидел на столе, он сообщал об ускорении -9,8 м/с ^ 2 «вниз», однако вниз выровнялся с осями вашего телефона.

Глядя на ваши данные немного, для первой 1/3 вашего интервала ускорение в основном постоянно около -0,977. Я предполагаю, что для этой части данных ваше измерительное устройство на самом деле не двигалось, поэтому я могу взять его за основу и удалить. Если я уберу это, а затем проведу трапециевидное интегрирование, мы получим что-то вроде:

Интегрированные позиции

Это похоже на то, что вы ожидали?

Кроме того, вы ошиблись в описании трапециевидной интеграции. В обоих случаях, когда мы интегрируем а получить в и когда мы интегрируем в получить Икс , мы хотим выполнять эту интеграцию с течением времени. Так что в твоей колонке Dвместо чего-то вроде D3=D2+(B3-B2)*(C2+C3)/2должно бытьD3=D2+(A3-A2)*(C2+C3)/2

Большое спасибо @alemi! Ваш график именно то, что я ищу. Кажется, я не могу заставить свой график расстояний выглядеть так же, как ваш (я использую данные, на которые я ссылался в своем вопросе) - можете ли вы каким-либо образом отправить мне данные, которые вы использовали для его построения? К вашему сведению: я исправил свои уравнения трапецеидального интегрирования, как вы предложили.
Шкала задается единицами, в которых измеряется время. Я не знал вашу частоту дискретизации, поэтому я просто масштабировал ее до тех пор, пока график не выглядел хорошо, но если вам нужна скорость в м/с и x в метрах, вы должны сделать столбец времени в секундах и умножить столбец ускорения на 9,8.
@RobertJoseph Боюсь, у меня его больше нет.
@RobertJoseph Если вы заглянете в чат по физике, мы сможем это обсудить. Компенсация не нужна.
Разве красная линия (позиция) не должна вернуться к нулю после события?
@ ja72 Это ошибка дрейфа, которую мы накопили.
Что ОП может устранить, если они будут следовать методу, изложенному в моем ответе.

Если ваши ускорения находятся в г , вы должны умножить второй член в столбце C на 9,8 . Тогда скорости будут в м/с, а ваше интегрирование для получения D будет в метрах. Затем вы можете захотеть применить любые ограничения, о которых вы знаете. Если вы знаете, что скорость начинается и заканчивается на нуле, вы можете добавить или вычесть постоянное ускорение к данным, чтобы оно получилось таким. Если вы знаете, что телефон возвращается в исходное положение, вы можете применить другую коррекцию (линейное изменение ускорения в зависимости от времени?), чтобы добиться этого. Это может повысить точность.