imu_data_proc.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #!/usr/bin/env python3
  2. # -*- coding: UTF-8 -*-
  3. # Copyright: 2016-2022 https://www.corvin.cn ROS小课堂
  4. # Author: corvin
  5. # Description: 使用python3从IIC接口中读取IMU模块的三轴加速度、三轴角速度、四元数。
  6. # History:
  7. # 20220523: Initial this file.
  8. import smbus
  9. import numpy as np
  10. class MyIMUClass(object):
  11. def __init__(self, dev_iic_addr):
  12. self.i2c = smbus.SMBus(1)
  13. self.addr = dev_iic_addr
  14. def get_YPRAG(self):
  15. try:
  16. rpy_data = self.i2c.read_i2c_block_data(self.addr, 0x3d, 6)
  17. axyz_data = self.i2c.read_i2c_block_data(self.addr, 0x34, 6)
  18. gxyz_data = self.i2c.read_i2c_block_data(self.addr, 0x37, 6)
  19. except IOError:
  20. print("Read IMU RPYAG date error !")
  21. else:
  22. self.raw_roll = float(np.short(np.short(rpy_data[1]<<8)|rpy_data[0])/32768.0*180.0)
  23. self.raw_pitch = float(np.short(np.short(rpy_data[3]<<8)|rpy_data[2])/32768.0*180.0)
  24. self.raw_yaw = float(np.short(np.short(rpy_data[5]<<8)|rpy_data[4])/32768.0*180.0)
  25. self.raw_ax = float(np.short(np.short(axyz_data[1]<<8)|axyz_data[0])/32768.0*16.0)
  26. self.raw_ay = float(np.short(np.short(axyz_data[3]<<8)|axyz_data[2])/32768.0*16.0)
  27. self.raw_az = float(np.short(np.short(axyz_data[5]<<8)|axyz_data[4])/32768.0*16.0)
  28. self.raw_gx = float(np.short(np.short(gxyz_data[1]<<8)|gxyz_data[0])/32768.0*2000.0)
  29. self.raw_gy = float(np.short(np.short(gxyz_data[3]<<8)|gxyz_data[2])/32768.0*2000.0)
  30. self.raw_gz = float(np.short(np.short(gxyz_data[5]<<8)|gxyz_data[4])/32768.0*2000.0)
  31. def get_quatern(self):
  32. try:
  33. quat_data = self.i2c.read_i2c_block_data(self.addr, 0x51, 8)
  34. except IOError:
  35. print("Read IMU quaternion date error !")
  36. else:
  37. self.raw_q0 = float((np.short(np.short(quat_data[1]<<8)|quat_data[0]))/32768.0)
  38. self.raw_q1 = float((np.short(np.short(quat_data[3]<<8)|quat_data[2]))/32768.0)
  39. self.raw_q2 = float((np.short(np.short(quat_data[5]<<8)|quat_data[4]))/32768.0)
  40. self.raw_q3 = float((np.short(np.short(quat_data[7]<<8)|quat_data[6]))/32768.0)