Есть ли способ убрать небольшой уклон по оси тяжести в данных акселерометра - PullRequest
3 голосов
/ 31 января 2012

Аналогично этому вопросу: CMDeviceMotion userAcleraration drift

Я использую CMDeviceMotion.userAcceleration в iOS5 SDK для отображения его компонентов x, y, z с течением времени. Как и в предыдущем посте, я вижу, что компонент ускорения z показывает всегда небольшие положительные значения (0,005 - 0,015), в то время как компоненты x и y центрированы вдоль нуля (-0.005 - 0.005), когда мой iPhone 4s сидит на плоской поверхности.

Это небольшое смещение продолжает прибавляться к расчетной скорости (которую я вычисляю, интегрируя данные ускорения), даже когда мой телефон не движется немного. Есть ли какой-нибудь известный способ убрать это смещение из данных акселерометра? Я не могу просто вычесть смещение из z-компонента, потому что кажется, что смещение распространяется по x y и z вдоль оси гравитации, если устройство находится в некоторой произвольной ориентации.

Я знаю, что данные в CMDeviceMotion.userAcceleration уже вычислили гравитацию, используя данные гироскопа, но задаюсь вопросом, есть ли какой-нибудь эффективный способ устранить это остаточное смещение?

Ответы [ 3 ]

1 голос
/ 08 ноября 2014

Старый вопрос, но я хотел поделиться некоторыми соображениями.Отчасти смещение акселерометров происходит не из-за неточностей в датчиках, а из-за недосмотра в вычислениях, которые делает Apple.В расчетах предполагается, что сила тяжести всегда равна 1 Г (что по определению составляет 9,80665 м / с2).Любой остаток должен быть в этом случае ускорением пользователя.

Однако, сила тяжести незначительно меняется по всему миру.Если сила тяжести в вашей области не совсем равна 9,80665 м / с2, то при ускорении пользователя будет наблюдаться небольшое смещение, которое можно обнаружить с помощью фильтра нижних частот.Такое смещение можно устранить с помощью следующего вычисления:

- (void) handleDeviceMotion:(CMDeviceMotion *)m atTime:(NSDate *)time
{
    // calculate user acceleration in the direction of gravity
    double verticalAcceleration = m.gravity.x * m.userAcceleration.x + 
                                  m.gravity.y * m.userAcceleration.y +  
                                  m.gravity.z * m.userAcceleration.z;

    // update the bias in low pass filter (bias is an object variable)
    double delta = verticalAcceleration - bias;
    if (ABS(delta) < 0.1) bias += 0.01 * delta;

    // remove bias from user acceleration
    CMAcceleration acceleration;
    acceleration.x = m.userAcceleration.x - bias * m.gravity.x;
    acceleration.y = m.userAcceleration.y - bias * m.gravity.y;
    acceleration.z = m.userAcceleration.z - bias * m.gravity.z;

    // do something with acceleration
}

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

1 голос
/ 31 января 2012

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

ОБНОВЛЕНИЕ: Невозможно получить относительное смещение, просто интегрировав ускорение, см. Мой ответ на Точность акселерометра Android (Инерциальная навигация) .Однако я привожу здесь несколько примеров того, что вы на самом деле можете сделать.

Если вы проверите мой ответ, вы увидите, что гироскопический белый шум делает интеграцию безнадежной.

0 голосов
/ 05 февраля 2012

Спасибо Али за обновление вашего ответа и других ссылок. Они, безусловно, помогли мне понять эту проблему (и я был удивлен, увидев, сколько людей заинтересовались этой проблемой). Возможно, я немного упрям, но все равно думаю, что нигде не нашел ответа на свой оригинальный вопрос. Давайте забудем об интеграции сейчас. С большим количеством экспериментов я вижу некоторые постоянные смещения (хотя и меньшие) по осям x и y, когда я усредняю ​​пользовательские данные ускорения по времени. Мне просто интересно, есть ли способ убрать эти отклонения из «пользовательских» данных ускорения, которые я получаю из iOS5 CMDeviceMotion. Если они были вызваны белым шумом гироскопа в процессе фильтрации гравитации, я думаю, мы можем видеть случайные шумы в пользовательских данных акселерометра, но не эти искажения. Но, исходя из моего впечатления, кажется, что эти отклонения были вызваны ограниченной «точностью» как акселерометра, так и гироскопа, и мы ничего не можем с этим поделать, хотя я не уверен на 100%. Я пытался поместить свое впечатление в комментарии (не в разделе ответов), но ТАК не позволил, потому что это было слишком долго, но мне было интересно, сколько людей поддержит мое впечатление, проголосовав, поэтому я решил поместить его в раздел ответов. .. Извините, если я немного болтал.

...