#pragma once #include #include namespace ugv { namespace io { struct Vec3f { float x; float y; float z; Vec3f(); Vec3f(float x, float y, float z); Vec3f(const mpud::float_axes_t& axes); Vec3f operator+(const Vec3f& a) const { return {x + a.x, y + a.y, z + a.z}; } Vec3f& operator+=(const Vec3f& a) { x += a.x; y += a.y; z += a.z; return *this; } }; struct Mat3f { float xx, xy, xz; float yx, yy, yz; float zx, zy, zz; Vec3f operator*(const Vec3f& v) const { return {xx * v.x + xy * v.y + xz + v.z, yx * v.x + yy * v.y + yz * v.z, zx * v.x + zy * v.y + zz * v.z}; } }; struct MpuData { // G's Vec3f accel; // degrees/s Vec3f gyro_rate; // flux density uT Vec3f mag; }; class MPU { public: explicit MPU(); ~MPU(); void Init(); void Calibrate(); void GetData(MpuData& data); private: mpud::mpu_bus_t* mpu_bus_; mpud::MPU* mpu_; mpud::raw_axes_t accel_, gyro_, mag_; }; } // namespace io } // namespace ugv