У меня следующий сценарий: 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), каковы результирующие единицы скорости и расстояния?
Вот как выглядит график моих данных - мне это действительно не имеет смысла (что неудивительно, поскольку у меня нет большого опыта в этих областях). Опять же, цель состоит в том, чтобы получить оценку расстояния (она не обязательно должна быть идеальной).
Любые указатели/разъяснения будут высоко оценены.
Акселерометр измеряет отрицательное значение силы тяжести плюс любое восходящее ускорение, см. ПРИМЕЧАНИЕ № 1.
и вы хотите интегрировать чтобы получить скорость и положение . Таким образом, ваши выражения должны быть
Вы также знаете, что конечное положение должно быть равно начальному, а конечная скорость должна быть в состоянии покоя. Это требует от вас настройки результатов интеграции, чтобы получить желаемый результат. Это может быть оправдано, поскольку у вас есть дискретные значения ускорения. Именно здесь вы калибруете модель с данными измерений.
Итак, вот шаги, которые нужно предпринять
ПРИМЕЧАНИЕ № 1. Чтобы получить уравнение акселерометра, вам нужно сделать свободную диаграмму тела на самом акселерометре, поскольку он прикреплен к телефону и следует за движением телефона. Сила соединения используются пьезоэлектрические материалы, такие, что . Сообщаемое ускорение откалибровано так, чтобы
ПРИМЕЧАНИЕ № 2: Вы можете убедиться, что
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
Если ваши ускорения находятся в , вы должны умножить второй член в столбце C на . Тогда скорости будут в м/с, а ваше интегрирование для получения D будет в метрах. Затем вы можете захотеть применить любые ограничения, о которых вы знаете. Если вы знаете, что скорость начинается и заканчивается на нуле, вы можете добавить или вычесть постоянное ускорение к данным, чтобы оно получилось таким. Если вы знаете, что телефон возвращается в исходное положение, вы можете применить другую коррекцию (линейное изменение ускорения в зависимости от времени?), чтобы добиться этого. Это может повысить точность.
Джон Алексиу
Леонид Шевцов
CMAccelerometerData#acceleration
илиCMDeviceMotion#userAcceleration
для получения значения ускорения? Потому что первое — это собственное ускорение , векторная сумма G и знакомоеdv/dt
ускорение.РобертДжозеф
CMAccelerometerData#acceleration
- это то, что вы предлагаете мне использовать?Леонид Шевцов
startDeviceMotionUpdates
, иCMDeviceMotion#userAcceleration
см. обзор на этой странице . По сути, API отфильтровывает гравитацию и предоставляет ееdv/dt
вам.