Значение показания акселерометра
В настоящее время я использую акселерометр 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);
}
@John Cho, 👍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-битное значение.
Как я могу перевести необработанные данные в довольно обычную единицу измерения, такую как градус и рад?
- Для получения угла в градусах требуется только акселерометр.
- Рассмотрите возможность калибровки ускорителя на наличие ошибок смещения и величины, прежде чем использовать исходные значения.
- Рассмотрите возможность ограничения проблемы таким образом, чтобы акселерометр вращался только вокруг оси Z.
- Угол можно найти, взяв обратную касательную отношения откалиброванного ускорения 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
- Снять гравитацию с акселерометра MPU-6050
- Использование MPU-6050 без I2C
- Изменение скорости передачи данных не работает
- MPU-6050 с Arduino – вскрытие
- Как управлять двигателем постоянного тока с помощью mpu6050?
- Можно ли измерить скорость акселерометром? Насколько точно?
- Как очистить буфер FIFO на MPU6050?
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
Разве таблица данных не отвечает на эти вопросы?, @Edgar Bonet