Files
balance/src/dm_imu/imu_driver.h
ydy0615 c3dac34dcc feat: add IMU Python package with pybind11 bindings
- Add dm_imu_pkg/__init__.py to dynamically load compiled IMU module during development and installation
- Update .vscode/settings.json to ignore missing CMakeLists for flexible builds
- Generate egg-info metadata and package structure for distribution
2025-12-08 23:54:56 +08:00

104 lines
2.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef _IMU_DRIVER_H_
#define _IMU_DRIVER_H_
#include <iostream>
#include <thread>
#include <initializer_list>
#include <fstream>
#include <array>
#include <mutex>
#include <atomic>
#include <math.h>
#include "bsp_crc.h"
namespace dmbot_serial
{
#pragma pack(1)
typedef struct
{
uint8_t FrameHeader1;
uint8_t flag1;
uint8_t slave_id1;
uint8_t reg_acc;
uint32_t accx_u32;
uint32_t accy_u32;
uint32_t accz_u32;
uint16_t crc1;
uint8_t FrameEnd1;
uint8_t FrameHeader2;
uint8_t flag2;
uint8_t slave_id2;
uint8_t reg_gyro;
uint32_t gyrox_u32;
uint32_t gyroy_u32;
uint32_t gyroz_u32;
uint16_t crc2;
uint8_t FrameEnd2;
uint8_t FrameHeader3;
uint8_t flag3;
uint8_t slave_id3;
uint8_t reg_euler; // r-p-y
uint32_t roll_u32;
uint32_t pitch_u32;
uint32_t yaw_u32;
uint16_t crc3;
uint8_t FrameEnd3;
} IMU_Receive_Frame;
#pragma pack()
typedef struct
{
float accx;
float accy;
float accz;
float gyrox;
float gyroy;
float gyroz;
float roll;
float pitch;
float yaw;
} IMU_Data;
class DmImu
{
public:
DmImu(const std::string& port = "/dev/ttyACM1", int baud = 921600);
~DmImu();
// Start data acquisition thread; returns true on success
bool start();
// Stop acquisition and close serial port
void stop();
// Get latest IMU data (threadsafe copy)
IMU_Data getData() const;
private:
void init_imu_serial();
void get_imu_data_thread();
void enter_setting_mode();
void turn_on_accel();
void turn_on_gyro();
void turn_on_euler();
void turn_off_quat();
void set_output_1000HZ();
void save_imu_para();
void exit_setting_mode();
void restart_imu();
int imu_seial_baud;
std::string imu_serial_port;
int serial_fd = -1;
std::thread rec_thread;
mutable std::mutex data_mutex;
bool stop_thread_ = false;
IMU_Receive_Frame receive_data{};
IMU_Data data{};
};
}
#endif