Android получит нормализованное ускорение - PullRequest
6 голосов
/ 19 декабря 2011

Я хочу получить вектор ускорения телефона Android. Проблема в том, что координаты акселерометра связаны с вращением телефона. То, что я хочу, - это «абсолютное» ускорение, то есть оно должно возвращать одинаковые значения в зависимости от того, с какой стороны телефон смотрит. (Я хочу определить, скользит ли пользователь, который катается на лыжах, по склону без использования GPS. Мне также нужно иметь возможность различать скольжение и подъем по канатной дороге.)

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

Возможно ли это, и если да, то как?

Ответы [ 4 ]

11 голосов
/ 18 января 2012

То, что вы описываете, не может быть сделано, если вы не переопределите проблему немного. Чтобы помочь вам переопределить его, я выделю основные вопросы:

Во-первых, я предполагаю, что вы подразумеваете под «абсолютным ускорением» ускорение по отношению к географической привязке. Это невозможно сделать только с помощью акселерометра, поскольку он не имеет представления о географических привязках. Если вы переместитесь достаточно далеко для GPS или используете компас, вы можете обойти это, но у каждого из них есть свои проблемы (хотя, по крайней мере, проблема решаема).

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

И последнее замечание: вы, кажется, думаете о земной системе координат, а акселерометр телефона - только телефон. То есть, по оси Z акселерометра многие не имеют ничего общего с подъемом и опусканием на землю - и отношения будут зависеть от ориентации телефона. Действительно, многие люди предпочли бы стационарную систему, но телефон просто не знает об этом. Вы можете использовать внешние сигналы (GPS, магнитное поле, гироскоп, гравитацию, горизонт и т. Д.), Чтобы попытаться выровнять их, но, учитывая только одно произвольное считывание с акселерометра, информации просто нет.

Определения:
вектор ускорения : это чтение x, y, z с акселерометра (и каждое чтение будет зависеть от ориентации телефона), иногда записываемое как A = (a x , a у , z ).
величина ускорения : это = sqrt (a x 2 + a y 2 + a z 2 ), и это не должно зависеть от ориентации телефона (если разные оси откалиброваны на одинаковую). Если телефон неподвижен, это будет просто показание гравитации. Также обратите внимание, что при использовании этой меры большая часть информации в векторе ускорения теряется.
нормализованное ускорение : направление ускорения, которое имеет величину 1, , т.е. , A / a
ускорение в земных координатах: Я думаю, это то, что вы действительно хотите, просто нет простого способа получить его, и даже если бы вы могли, я не думаю, что это было бы так полезно, как могло бы показаться сначала.

лыжи
Я думаю, у вас есть хороший шанс определить, когда кто-то катается на лыжах, основываясь на измерениях акселерометра. Такие вещи, как удары и повороты, должны быть совершенно отличительными при использовании акселерометра. Для этого я бы использовал полный вектор ускорения. Например, в свою очередь, величина ускорения будет оставаться примерно постоянной, а направление будет стремительным. Также обратите внимание, что свободное падение (то есть, в основном, когда у лыжника нет неба / ног / приклада и т. Д. На земле, идет ли он вверх при спуске с удара / прыжка или выпадает из кресельной канатной дороги) , величина ускорения будет нулевой в свободном падении. Для кресельной канатной дороги кажется, что она, скорее всего, будет отличаться ритмичным влиянием, в основном, в пределах одной плоскости.

Все это можно понять. Я бы порекомендовал, если вы действительно хотите решить эту проблему, это записать данные с вашего акселерометра во время катания на лыжах и посмотреть, сможете ли вы определить, когда вы катаетесь на лыжах, основываясь на характеристиках данных. (Я предполагаю, что вашим главным камнем преткновения в этом случае будет математика, потому что было бы немного сложно придумать алгоритм, который может различать сигнатуры лыж, поэтому кажется, что было бы неплохо рассмотреть вектор математика и такие вещи, как точечные продукты и перекрестные продукты, а также, я подозреваю, что немного по другой теме, известной как БПФ или преобразования Фурье, может быть полезно для сортировки временных и частотных сигнатур лыж против качания в кресельном подъемнике .)

Вы также можете сложить измерения GPS, которые не будут столь же надежными, или дать хорошее временное разрешение, но, по крайней мере, могут быть использованы для двойной проверки вашего алгоритма.

3 голосов
/ 19 декабря 2011

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

a = sqrt(x*x + y*y + z*z)

Где a - абсолютное ускорение, а x, y и z - значения акселерометра для каждой из 3 осей телефона.

1 голос
/ 03 июля 2015

Некоторые телефоны имеют встроенный барометр (датчик давления воздуха). После применения скользящего среднего я обнаружил, что он готов к записи, чтобы определить, идет ли пользователь вверх или вниз - возможно, полезно для вашей проблемы.На Galaxy S4 и 5 я получаю достаточно хорошее разрешение, чтобы определить, переместилось ли устройство только со стола на пол.

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

0 голосов
/ 18 января 2012

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

/**
 * Remove noise from the measurement of the location.
 * @param loc a location
 * @return Answer <code>false</code> iff the location should not be used.
 */
private boolean filterNoise(final Location loc) {
    if( ! loc.hasSpeed() )
        return true;
    if( this.recentSpeeds.isEmpty() ) {  // rescentSpeeds is a queue of locations
        this.recentSpeeds.add(loc);
        return true;
    }
    final Location lastFix = this.recentSpeeds.getHead();
    final long delta_t = (loc.getTime() - lastFix.getTime()) / 1000;
    if( delta_t == 0 )
        return false;
    final float delta_v = loc.getSpeed() - lastFix.getSpeed();
    final float a = delta_v / delta_t;
    if( Math.abs(a) <= AccelThreshold ) {
        this.recentSpeeds.add(loc);
        return true;
    }
    return false;
}

Если вы вычислите скорость, используя координаты из последнего и текущего исправлений, вы получите ускорение в виде вектора.

...