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

 
 
> Гироскоп - помогите, как туда притянули акселерометр?
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
 
Start new topic
Ответов
DASM
сообщение Sep 13 2013, 15:57
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Серьезно, спасибо. Но кватернионы используют далеко не всегда.Уверены, что это тот случай? Офф какое же строение мозга надо иметь, чтобы это понимать. Всегда уважал математиков более всех.
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
- - Corner   Обычно при помощи ДУС вычисляют/корректируют мгнов...   Sep 14 2013, 15:24


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 15:39
Рейтинг@Mail.ru


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