От ускорения к смещению

Привет, я специализируюсь в области компьютерных наук, и этот вопрос должен быть очень простым для всех гениев физики здесь:

У меня есть набор точек данных от акселерометра на движущемся объекте, который в основном следует форме.

ускорение X, включая гравитацию

Ускорение Y, включая гравитацию

Ускорение Z, включая гравитацию

Вращение вокруг оси x

Вращение вокруг оси Y

Вращение вокруг оси Z

Я хочу построить объект в трехмерном пространстве, и после некоторых поисков мне сказали дважды интегрировать, чтобы получить смещение.

Это лучший способ? Он не должен быть вычислительно эффективным, если его легко понять.

Сначала вы должны откалибровать свои акселерометры и датчики вращения, иначе смещения, ошибки усиления и, что еще хуже, перекрестные помехи между каналами приведут к значительным ошибкам. Затем вы должны использовать данные вращения, чтобы вычислить матрицу вращения между реальными осями акселерометра и осями системы координат, в которой вы хотите получить результат. Затем вам нужно инвертировать эту матрицу и применить ее к данным акселерометра. Затем вам нужно вычесть гравитационное ускорение, и ТЕПЕРЬ вы можете интегрировать дважды. Легко, верно? :-)
Вращается ли объект при движении? т.е. всегда ли «х» указывает в одном и том же направлении или «х» вращается вместе с ориентацией объекта?
@SamBader: Конечно. Это самое интересное. Единственный способ убедиться, что это не так, — поместить его на прецизионную направляющую. Тогда, конечно, вам не нужен акселерометр. Дворовая палка сделает работу дешевле и лучше. :-)
Да, он вращается при движении. Ну, акселерометр от мобильного телефона, поэтому я не уверен, как получить доступ к оборудованию, чтобы откалибровать его. Также что касается вращения x с ориентацией на объект, ну... я сам не уверен. Это Samsung Galaxy S5, если это поможет.
Чтобы было веселее, показания акселерометра не включают ускорение под действием силы тяжести. Акселерометры измеряют все, что воздействует на человека, кроме силы тяжести. Собственно говоря, они измеряют правильное ускорение . Чтобы сделать вещи еще более увлекательными, то, что вы предлагаете сделать, называется " счисление мертвых ". Ошибки накапливаются. Ваша ориентация и скорость содержат интегрированный белый шум. Ваша позиция содержит дважды интегрированный белый шум. Вам нужны исправления, чтобы компенсировать этот шум.
Я использую переменную «accelerationвключаяgravity.x», поэтому я думаю, что она включает гравитацию. Это легче сделать, если я возьму его без гравитации?
Ваш мобильный телефон этого не чувствует. Поднимитесь на крышу здания и бросьте свой мобильный телефон. Ваш мобильный телефон будет ускоряться вниз на 9,81 м / с 2 . Акселерометр вашего мобильного телефона покажет нулевое ускорение. Если ваш мобильный телефон уцелел при падении, положите его на стол. Силы, действующие на ваш мобильный телефон, — это гравитация, направленная вниз, и нормальная сила от стола, направленная вверх. Ваш мобильный телефон не чувствует силу гравитации. Он ощущает нормальную силу, поэтому сообщает, что сотовый телефон ускоряется вверх примерно на 9,81 м / с 2 .
Хм, хорошо, я поместил его горизонтально и получил отрицательное значение 10 по оси x. Я думаю, это гравитация?

Ответы (1)

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

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

Для ясности возьмем некоторый кадр, в котором гравитация притягивает г ^ направление, Икс ^ восток, у ^ это север.

Телефон может быть направлен в любую сторону, поэтому он также определяет свою собственную систему координат, зависящую от времени, например. Икс ^ ( т ) указывает на правую часть экрана, у ^ ( т ) указывает на верхнюю часть экрана и г ^ ( т ) указывает за пределы экрана. Это кадр, в котором вы получаете данные акселерометра. а м ( т ) .

Допустим, в телефоне есть идеальный гироскоп, чтобы вы знали, как описать ориентацию телефона в пространстве. то есть вы можете написать Икс ^ ( т ) , у ^ ( т ) , г ^ ( т ) с точки зрения Икс ^ , у ^ , г ^ и т . Затем вы можете вычислить матрицу вращения р ( т ) который конвертирует между кадрами.

а м ( т ) "=" р ( т ) а м ( т )

А затем вычесть гравитацию:

а "=" а м г г ^

Затем, если предположить, что телефон запускается в состоянии покоя в начале координат:

р "=" г т г т а .

Вуаля!

Но этот метод очень подвержен ошибкам. Например, если ваша оценка ориентации хоть немного отличается, то вычитание гравитации не сработает, и алгоритм будет думать, что ваш телефон ускоряется, даже когда он неподвижен. Ошибка в один градус может легко привести к отклонению на километры порядка минут, тем более, что любая ошибка ускорения интегрируется дважды!

Смотрите здесь для хорошего обсуждения!

Ничего себе, это подробно .. Большое спасибо .. Я попытаюсь использовать фильтр Калмана для шумоподавления данных.
Конечно! Я не знаком с фильтром Калмана, но только что прочитал страницу Wiki, это звучит умно, и мне любопытно, где бы вы его применили. Пример вики включал приложение, объединяющее данные GPS с расчетом пути на основе скорости. Это похоже на то, что вы планируете?
Это несколько похоже, за исключением того, что у меня нет данных GPS, поэтому я буду использовать исходное положение и ориентацию телефона в качестве постоянных данных. Я, вероятно, применю его, прежде чем я начну делать с ним какие-либо математические вычисления.
Хм, это определенное предубеждение, нет? Например, если пользователь запускает телефон в точке А, перемещает его в точку Б и оставляет в точке Б на неопределенный срок, то результат работы вашего алгоритма будет неуклонно возвращаться к А, верно? Или, возможно, это нормально в вашем приложении...?
ааа, черт... в этом случае мне нужно найти новый алгоритм для шумоподавления. займет некоторое время.
Я не думаю, что вы найдете что-нибудь, чтобы стабилизировать долгосрочные результаты счисления пути, но, возможно, вы могли бы спроектировать приложение таким образом, чтобы вам нужно было знать только, как положение меняется за короткие промежутки времени. Я не знаю, какова конечная цель, но этот метод должен позволить вам, скажем, вычерчивать фигуры с помощью телефона. Дайте нам знать, как это происходит! : Д. (Или если есть что-то еще, что я могу сделать, чтобы адекватно ответить на ваш вопрос).
ну, на самом деле мне нужно отслеживать и отображать объект только в течение 10-20 секунд за раз. поэтому я думаю, что DR не должен иметь столько накопленной ошибки. конечно, дам вам знать, как это происходит.
Надеюсь, все идет хорошо! Кстати, если вы нашли вышеизложенное полезным, не стесняйтесь «принять» ответ. Спасибо!
На телефоне я нажал зеленую галочку. Я думаю, что принимает ответ? Это полезно, но я чертовски слаб в математике.. Так что это займет некоторое время..
Это работает, спасибо! Кстати, обзорная страница датчиков содержит множество полезных функций, которые могут сэкономить вам немного математики (например, getRotationMatrix()).
Вау, я не знал, что такие функции существуют. Спасибо. Это должно немного ускорить процесс.