реклама на сайте
подробности

 
 
> Гироскоп - помогите, как туда притянули акселерометр?
alexPec
сообщение Sep 11 2013, 07:12
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Всем добрый день.

Господа математики, не могу понять как в расчете положения (динамического) может участвовать акселерометр (магнитомера у меня не будет).
Есть там (проект freeIMU) функция:

Код
void  imu_AHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz) { //gx,gy,gz - угловые ускорения, рад/сек
  float recipNorm;                                                                                                                                          //ax,ay,az - линейные ускорения
  float q0q0, q0q1, q0q2, q0q3, q1q1, q1q2, q1q3, q2q2, q2q3, q3q3;
  float halfex = 0.0f;
  float halfey = 0.0f;
  float halfez = 0.0f;
  float qa, qb, qc;

  // Auxiliary variables to avoid repeated arithmetic
  q0q0 = q0 * q0;
  q0q1 = q0 * q1;
  q0q2 = q0 * q2;
  q0q3 = q0 * q3;
  q1q1 = q1 * q1;
  q1q2 = q1 * q2;
  q1q3 = q1 * q3;
  q2q2 = q2 * q2;
  q2q3 = q2 * q3;
  q3q3 = q3 * q3;

  // Use magnetometer measurement only when valid (avoids NaN in magnetometer normalisation)
  if((mx != 0.0f) && (my != 0.0f) && (mz != 0.0f)) {                                                          //Магнитомер не интересует
    float hx, hy, bx, bz;
    float halfwx, halfwy, halfwz;

    // Normalise magnetometer measurement
    recipNorm = imu_invSqrt(mx * mx + my * my + mz * mz);
    mx *= recipNorm;
    my *= recipNorm;
    mz *= recipNorm;

    // Reference direction of Earth's magnetic field
    hx = 2.0f * (mx * (0.5f - q2q2 - q3q3) + my * (q1q2 - q0q3) + mz * (q1q3 + q0q2));
    hy = 2.0f * (mx * (q1q2 + q0q3) + my * (0.5f - q1q1 - q3q3) + mz * (q2q3 - q0q1));
    bx = sqrt(hx * hx + hy * hy);
    bz = 2.0f * (mx * (q1q3 - q0q2) + my * (q2q3 + q0q1) + mz * (0.5f - q1q1 - q2q2));

    // Estimated direction of magnetic field
    halfwx = bx * (0.5f - q2q2 - q3q3) + bz * (q1q3 - q0q2);
    halfwy = bx * (q1q2 - q0q3) + bz * (q0q1 + q2q3);
    halfwz = bx * (q0q2 + q1q3) + bz * (0.5f - q1q1 - q2q2);

    // Error is sum of cross product between estimated direction and measured direction of field vectors
    halfex = (my * halfwz - mz * halfwy);
    halfey = (mz * halfwx - mx * halfwz);
    halfez = (mx * halfwy - my * halfwx);
  }

  // Compute feedback only if accelerometer measurement valid (avoids NaN in accelerometer normalisation)
  if((ax != 0.0f) && (ay != 0.0f) && (az != 0.0f)) {
    float halfvx, halfvy, halfvz;

    // Normalise accelerometer measurement                     Нормируем вектор ускорения
    recipNorm = imu_invSqrt(ax * ax + ay * ay + az * az);
    ax *= recipNorm;
    ay *= recipNorm;
    az *= recipNorm;

    // Estimated direction of gravity  //через направляющие косинусы вычисляем вектор гравитации
    halfvx = q1q3 - q0q2;
    halfvy = q0q1 + q2q3;
    halfvz = q0q0 - 0.5f + q3q3;

    // Error is sum of cross product between estimated direction and measured direction of field vectors
    halfex += (ay * halfvz - az * halfvy);     //Непонятно зачем комбинируем вектор гравитации и измеренные ускорения!!!!
    halfey += (az * halfvx - ax * halfvz);
    halfez += (ax * halfvy - ay * halfvx);
  }

  // Apply feedback only when valid data has been gathered from the accelerometer or magnetometer
  if(halfex != 0.0f && halfey != 0.0f && halfez != 0.0f) {                        
    // Compute and apply integral feedback if enabled
    if(twoKi > 0.0f) {
      integralFBx += twoKi * halfex * (1.0f / sampleFreq);  // integral error scaled by Ki
      integralFBy += twoKi * halfey * (1.0f / sampleFreq);  //Интегрируем по времени и добавляем к угловым ускорениям - зачем!!!!!!
      integralFBz += twoKi * halfez * (1.0f / sampleFreq);  //Самое непонятное это!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      gx += integralFBx;  // apply integral feedback          
      gy += integralFBy;
      gz += integralFBz;
    }
    else {
      integralFBx = 0.0f; // prevent integral windup
      integralFBy = 0.0f;
      integralFBz = 0.0f;
    }

    // Apply proportional feedback
    gx += twoKp * halfex;
    gy += twoKp * halfey;
    gz += twoKp * halfez;
  }

  // Integrate rate of change of quaternion
  gx *= (0.5f * (1.0f / sampleFreq));   // pre-multiply common factors  //Корректируем матрицу направляющих косинусов
  gy *= (0.5f * (1.0f / sampleFreq));
  gz *= (0.5f * (1.0f / sampleFreq));
  qa = q0;
  qb = q1;
  qc = q2;
  q0 += (-qb * gx - qc * gy - q3 * gz);
  q1 += (qa * gx + qc * gz - q3 * gy);
  q2 += (qa * gy - qb * gz + q3 * gx);
  q3 += (qa * gz + qb * gy - qc * gx);

  // Normalise quaternion
  recipNorm = imu_invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
  q0 *= recipNorm;
  q1 *= recipNorm;
  q2 *= recipNorm;
  q3 *= recipNorm;
}


Делалось все это как я понял по этой книге (вложение)

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

Конкретно непонятно это (кусок взят из кода выше):
Код
    halfex += (ay * halfvz - az * halfvy);     //Непонятно зачем комбинируем вектор гравитации и измеренные ускорения!!!!
    halfey += (az * halfvx - ax * halfvz);
    halfez += (ax * halfvy - ay * halfvx);
  }

  // Apply feedback only when valid data has been gathered from the accelerometer or magnetometer
  if(halfex != 0.0f && halfey != 0.0f && halfez != 0.0f) {                        
    // Compute and apply integral feedback if enabled
    if(twoKi > 0.0f) {
      integralFBx += twoKi * halfex * (1.0f / sampleFreq);  // integral error scaled by Ki
      integralFBy += twoKi * halfey * (1.0f / sampleFreq);  //Интегрируем по времени и добавляем к угловым ускорениям - зачем!!!!!!
      integralFBz += twoKi * halfez * (1.0f / sampleFreq);  //Самое непонятное это!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      gx += integralFBx;  // apply integral feedback          
      gy += integralFBy;
      gz += integralFBz;
    }
    else {
      integralFBx = 0.0f; // prevent integral windup
      integralFBy = 0.0f;
      integralFBz = 0.0f;
    }

    // Apply proportional feedback
    gx += twoKp * halfex;
    gy += twoKp * halfey;
    gz += twoKp * halfez;
  }

Прикрепленные файлы
Прикрепленный файл  An_efficient_orientation_filter_for_inertial_and_inertialmagnetic_sensor_arrays.pdf ( 1.47 мегабайт ) Кол-во скачиваний: 83
 
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- alexPec   Гироскоп - помогите   Sep 11 2013, 07:12
- - deeper_79   не очень понятно что это, похоже на кусок алгоритм...   Sep 11 2013, 08:55
|- - alexPec   Цитата(deeper_79 @ Sep 11 2013, 12:55) не...   Sep 11 2013, 11:22
- - MrAlex   Гироскоп не измеряет углы положения в пространстве...   Sep 11 2013, 13:58
|- - alexPec   Цитата(MrAlex @ Sep 11 2013, 17:58) Гирос...   Sep 11 2013, 15:08
|- - deeper_79   Цитата(alexPec @ Sep 11 2013, 18:08) Може...   Sep 13 2013, 11:03
|- - alexPec   Цитата(deeper_79 @ Sep 13 2013, 15:03) по...   Sep 13 2013, 20:33
|- - Timmy   Мне кажется, в этом коде содержится серьёзная алго...   Sep 14 2013, 15:12
||- - alexPec   ЦитатаМне кажется, в этом коде содержится серьёзна...   Sep 15 2013, 08:19
|- - deeper_79   1. Приводил уже где-то алгоритм на картинке. Перео...   Sep 16 2013, 07:51
|- - alexPec   Цитата(deeper_79 @ Sep 16 2013, 11:51) ес...   Sep 16 2013, 08:57
|- - deeper_79   Цитата(alexPec @ Sep 16 2013, 11:57) Очен...   Sep 16 2013, 10:12
- - DASM   Дрейф сильный у гироскопа. Мне очень видео понрави...   Sep 11 2013, 15:23
- - DASM   Серьезно, спасибо. Но кватернионы используют далек...   Sep 13 2013, 15:57
- - Corner   Обычно при помощи ДУС вычисляют/корректируют мгнов...   Sep 14 2013, 15:24


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 18:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016