IMU acc and gyro fusion

Needs tweaking to get the right amount of acc data
This commit is contained in:
philsson 2018-09-02 19:06:20 +02:00
parent 443c441279
commit 15dd8e6bc7
3 changed files with 55 additions and 0 deletions

View File

@ -645,6 +645,7 @@ OBJECTS += ./src/drivers/MPU6000.o
OBJECTS += ./src/drivers/MS5611.o
OBJECTS += ./src/drivers/stepper.o
OBJECTS += ./src/drivers/servo.o
OBJECTS += ./src/control/ImuFusion.o
OBJECTS += ./src/control/PID.o
OBJECTS += ./src/math/Utilities.o

31
src/control/ImuFusion.cpp Normal file
View File

@ -0,0 +1,31 @@
#include "src/control/ImuFusion.h"
namespace control {
ImuFusion::ImuFusion(mpu6000_spi* pImu)
: m_pImu(pImu)
, m_angle(0)
{
}
float ImuFusion::getAngle(float dT)
{
int axis = 0;
float rot = m_pImu->read_rot(axis);
m_angle += dT*rot;
//float ratio = 0.99;
float ratio = 0.95f;
//float ratio = 0.9996;
float rawAngle = m_pImu->read_acc_deg(axis); // conversion from G to Deg
m_angle = (m_angle * ratio) + (rawAngle * ((float)1.0f-ratio));
return m_angle;
}
}

23
src/control/ImuFusion.h Normal file
View File

@ -0,0 +1,23 @@
#include "src/drivers/MPU6000.h"
namespace control {
class ImuFusion
{
public:
ImuFusion(mpu6000_spi* pImu);
float getAngle(float dT);
private:
mpu6000_spi* m_pImu;
float m_angle;
};
}