Значение показания акселерометра

В настоящее время я использую акселерометр MPU-6050 для получения данных об ускорении и угловой скорости. Я пытаюсь обработать данные для своего эксперимента, но не могу понять его точный смысл. У меня есть три вопроса о сложившейся ситуации. Я добавляю код arduino ниже.

Во-первых, я случайно узнал, что значение AcX в приведенном ниже коде означает, насколько датчик наклонен вдоль оси x. Есть ли другой способ получить ускорение напрямую? или мне нужно использовать формулу(v = v_0 + a*t)?

Во-вторых, для датчика гироскопа я не могу понять значение этого значения. Передает ли он угловую скорость или угловое ускорение, и если это одно из них, каков предел?

В-третьих, согласно коду, он получает данные в виде 2^14(14 бит), но иногда отправляет значение, превышающее лимит. Как я могу перевести необработанные данные в довольно обычную единицу измерения, такую как градус и рад?

Спасибо тебе

const int MPU_addr=0x68;  // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,GyX,GyY,GyZ;

void setup(){
  Wire.begin();
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(9600);
  Serial.println("CLEARDATA");
  Serial.println("LABEL,TIME,AcX,AcY,AcZ,GyX,GyY,GyZ");
}

void loop(){
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU_addr,14,true);  // request a total of 14 registers
  
  // deviding the 16bit input??
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)    
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)

  //Serial.print("AcX = "); 
  Serial.print(AcX);
  Serial.println(",");
  //Serial.print(",");
  //Serial.print(" | AcY = "); 
  //Serial.print(AcY); Serial.print(",");
  //Serial.print(" | AcZ = ");
  //Serial.print(AcZ); Serial.print(",");
  //Serial.print(" | GyX = "); 
  //Serial.println(GyX); 
  //Serial.print(" | GyY = "); 
  Serial.println(GyY); //Serial.print(",");
  //Serial.print(" | GyZ = "); 
  //Serial.println(GyZ);
  delay(200);
}

, 👍1

Обсуждение

Разве таблица данных не отвечает на эти вопросы?, @Edgar Bonet


1 ответ


1

Есть ли другой способ получить ускорение напрямую? или я должен использовать формулу(v = v_0 + a*t)?

Похоже, что код в настоящее время извлекает необработанное ускорение X, Y и Z и сохраняет его в AcX, AcY и AcZ. Уравнение "v = v_0 + a*t", по-видимому, определяет скорость. Так что вопрос сбивает с толку.

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

Датчики акселерометра измеряют ускорение. Поскольку последний вопрос в конечном счете касался углов, гироскоп не нужен. Однако на странице 12 в спецификациях MPU-6050 размеры гироскопа указаны в градусах в секунду или угловой скорости. Вероятно, механизм внутри чипа зависит от эффекта Кориолиса

...и если это один из них, то каков предел?

На той же странице спецификации чипа MPU-6050 приведена таблица, содержащая такие значения, как ЧУВСТВИТЕЛЬНОСТЬ ГИРОСКОПА и полномасштабный диапазон. Подумайте о том, чтобы прочитать эти и другие значения, касающиеся гироскопа.

...согласно коду, он получает данные в виде 2^14(14 бит), но иногда он отправляет значение, превышающее лимит.

Код извлекает высокое 8-битное и низкое 8-битное значение для каждой оси акселерометра и гироскопа. Это составляет 16-битное значение. Не 14-битное значение.

Как я могу перевести необработанные данные в довольно обычную единицу измерения, такую как градус и рад?

  1. Для получения угла в градусах требуется только акселерометр.
  2. Рассмотрите возможность калибровки ускорителя на наличие ошибок смещения и величины, прежде чем использовать исходные значения.
  3. Рассмотрите возможность ограничения проблемы таким образом, чтобы акселерометр вращался только вокруг оси Z.
  4. Угол можно найти, взяв обратную касательную отношения откалиброванного ускорения X и откалиброванного ускорения Y.

Другие соображения:

  • Если в трехмерном пространстве требуются углы, рассмотрите возможность использования обычно называемых значений, таких как шаг, крен и рыскание. В этом случае многие размещают акселерометр таким образом, чтобы использовать эти уравнения:

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

  • До сих пор все обсуждаемые уравнения используют тригонометрию и могут идти до бесконечности (непригодные результаты) при определенных входных данных. Математический эквивалент карданного замка, если хотите. Чтобы избежать этого, рассмотрите возможность использования кватернионов. Этот математический метод представления вращения в трехмерном пространстве не сталкивается с вышеуказанной проблемой, проще для вычислений на компьютерах и широко используется в компьютерной графике.
,

Re “Все датчики измеряют ускорение”: гироскопы измеряют угловую скорость, а не угловое ускорение. Единица измерения, используемая в таблице данных для данных гироскопа, равна градусам в секунду., @Edgar Bonet

Это интересно. Я не могу себе представить, как механически сделано такое устройство. Если мы с вами оба правы, то MPU-6050 должен выполнять какой-то тип интеграции, чтобы получить скорость (т. Е. Получить постоянное значение для гироскопа MPU-6050, расположенного в центре рабочего проигрывателя фонографа 33 и 1/3 об / мин)., @st2000

Ах, неважно, я вижу, как это делается: эффект Кориолиса. Учитесь чему-то новому каждый день., @st2000

К вашему сведению, для тех, кто читает это, смотрит на ответ и чешет в затылке ... Я изменил ответ, чтобы он соответствовал тому, что комментировал @EdgarBonet. Спасибо Эдгару!, @st2000

_"в настоящее время извлекаю необработанное ускорение X, Y и Z"_ При обработке данных с помощью кода python ниже я случайно узнал, что это данные о местоположении. Вы можете объяснить, что происходит?, @John Cho

Таким образом, датчик получает данные об ускорении(может быть, loaction) и угловой скорости(максимум 2000 dps-в соответствии со спецификацией) в виде 16 бит (+, -). И для перевода мне, возможно, придется учитывать другие значения или формулы. я прав?, @John Cho

@JohnCho, интеграл ускорения дает скорость, а интеграл скорости дает местоположение. Подумайте о том, чтобы открыть отдельный вопрос об обмене стеками с вашим кодом Arduino относительно этого или переключиться на другой сайт обмена стеками, например, по физике или математике, с более общим вопросом об ускорении, скорости и положении., @st2000

@st2000, мне просто было любопытно узнать о данных, которые, похоже, отправляют местоположение, хотя у них есть имя AcX. Кстати, Спасибо!, @John Cho

Любопытство-это хорошо! Я работал только с парой IMU. Но обнаружили, что они сообщают об ускорении (и, конечно же, угловой скорости). Имейте в виду, что определить положение при ускорении очень сложно. Определение положения обычно не выполняется только с данными об ускорении. Трудность возникает при работе с накопившимися ошибками. Единственное исключение, о котором я знаю, - это игры. Здесь, поскольку вы находитесь в виртуальном мире, оказавшись на полпути через гостиную, до тех пор, пока вы ни во что не врежетесь, не так уж и важно., @st2000

Ладно, я неправильно понял датчик ускорения. Спасибо!, @John Cho