Arduino Nano IOT LSM6DS3 получить угол гироскопа в градусах

У меня есть Arduino Nano IOT, и я хочу получить угол наклона, используя встроенный гироскоп, но я не могу найти пример кода, который делает это. Пример кода гироскопа и акселерометра по умолчанию не помогает. Возможно ли это вообще сделать?

, 👍-1

Обсуждение

гироскоп определяет скорость изменения угла, а не абсолютный угол... акселерометр может измерять угол относительно силы тяжести, @jsotola

Я попытался найти и то, и другое, но нет кода, который это делает. Не могли бы вы помочь мне найти его?, @DragonflyRobotics

Все, что я могу найти, - это изменение чисел, но никаких углов., @DragonflyRobotics


2 ответа


Лучший ответ:

1

Вам придется вычислить углы; потребуется некоторая тригонометрия, а для гироскопов - еще и некоторая интеграция. Вы можете прочитать об этом здесьи во многих других местах.

Вы получите наилучшие результаты, если объедините данные гироскопов и акселерометров, используя дополнительный фильтр, фильтр Калманаили другой алгоритм. Они также легко гуглятся.

Здесь, на Github, есть пример кода для LSM6DS3 на Nano 33 IoT.

,

Это лучшее решение. Этот фильтр намного быстрее, чем MadgwickAHRS! Потрясающе!, @DragonflyRobotics


2

Вы должны использовать библиотеку фильтров поверх выходных данных гироскопа, а также данные акселерометра (оба используются!), Чтобы получить углы ... https://www.arduinolibraries.info/libraries/madgwick

Вот рабочий пример, который печатает шаг датчика от +90 до -90 градусов:

//#include <SPI.h>
//#include <Wire.h>  
#include <Arduino_LSM6DS3.h>
#include <MadgwickAHRS.h>
#include <Math.h>

float pitchFilteredOld;
Madgwick filter;
const float sensorRate = 104.00;

void setup() {
  Serial.begin(9600);
  while (!Serial);
  if(!IMU.begin())  {
    Serial.println("Failed to initialize IMU!");
    while (1);
  }
  filter.begin(sensorRate);
  Serial.println("Setup complete!");
}  
void loop() {
  float xAcc, yAcc, zAcc;
  float xGyro, yGyro, zGyro;
  float roll, pitch, heading;
  if(IMU.accelerationAvailable() && IMU.gyroscopeAvailable()){
    IMU.readAcceleration(xAcc, yAcc, zAcc);
    IMU.readGyroscope(xGyro, yGyro, zGyro); 
    filter.updateIMU(xGyro, yGyro, zGyro, xAcc, yAcc, zAcc);
    pitch = filter.getPitch();
    float pitchFiltered = 0.1 * pitch + 0.9 * pitchFilteredOld; // low pass filter
    Serial.println("pitch: " + String(pitchFiltered));
    pitchFilteredOld = pitchFiltered;
  }
}
,