mpu6050加速度角速度融合为四元数计算函数的说明

与arduino mpu6050 四元数相关基本能找到这样的源码。

至于它参数是怎么填,似乎有些迷惑,下面说说我的理解。

ax,ay,az是加速度,

一般的计算是a=acc/AcceRatio;

gx,gy,gz 是角速度,单位是弧度/秒,这个一定要注意。

g=gyro/GyroRatio;//此时单位为度/秒。

g=g/180*3.14;//这样才能带入函数进行计算


在应用时有时候会考虑静态漂移的误差,所以在程序初始一般会取n个角速度gyro求和再做平均,得到平均数 g0。

所以g就是这样计算的

g=(gyro-g0)/GyroRatio;//此时单位为度/秒。

g=g/180*3.14;//这样才能带入函数进行计算


应该注意a的计算和g的计算不能混淆,加速度a不能与平均值做差。


调节的参数有halfT Kp Ki


#define Kp 2.0f                        // proportional gain governs rate of convergence to accelerometer/magnetometer
#define Ki 0.2f  // integral gain governs rate of convergence of gyroscope biases

#define  halfT 0.05f                 // half the sample period

halfT 应该根据实际采样花费的时间作调整,是半个周期的时间值

定义一个timer记录时间

在loop可计算每次执行时的时间间隔dt

  dt = (micros() - timer) / 1000000; // Calculate delta time


  timer = micros();

其中取值

  halfT = dt / 2.0;




 void IMUupdate(double gx, double gy, double gz, double ax, double ay, double az)
{
  double norm;
  double vx, vy, vz;
  double ex, ey, ez;

  // normalise the measurements
  norm = sqrt(ax * ax + ay * ay + az * az);
  ax = ax / norm;
  ay = ay / norm;
  az = az / norm;

  // estimated direction of gravity
  vx = 2.0 * (q1 * q3 - q0 * q2);
  vy = 2.0 * (q0 * q1 + q2 * q3);
  vz = q0 * q0 - q1 * q1 - q2 * q2 + q3 * q3;

  // error is sum of cross product between reference direction of field and direction measured by sensor
  ex = (ay * vz - az * vy);
  ey = (az * vx - ax * vz);
  ez = (ax * vy - ay * vx);

  // integral error scaled integral gain
  exInt = exInt + ex * Ki;
  eyInt = eyInt + ey * Ki;
  ezInt = ezInt + ez * Ki;

  // adjusted gyroscope measurements
  gx = gx + Kp * ex + exInt;
  gy = gy + Kp * ey + eyInt;
  gz = gz + Kp * ez + ezInt;
  
  // integrate quaternion rate and normalise
  q0 = q0 + (-q1 * gx - q2 * gy - q3 * gz) * halfT;
  q1 = q1 + (q0 * gx + q2 * gz - q3 * gy) * halfT;
  q2 = q2 + (q0 * gy - q1 * gz + q3 * gx) * halfT;
  q3 = q3 + (q0 * gz + q1 * gy - q2 * gx) * halfT;

  // normalise quaternion
  norm = sqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
  q0 = q0 / norm;
  q1 = q1 / norm;
  q2 = q2 / norm;
  q3 = q3 / norm;

  

} 

对函数的理解:

1.当前加速计值转成描述重力的向量,与前一次四元数姿态表达的重力向量做差值运算(向量间的差别,用叉乘表达),计算他们直接的误差。

2.误差做积分(使用ki参数)

3.再把一定比例的当前误差(使用kp参数),和积分后的误差补到陀螺仪的角速度上。

4.通过得到的角速度,积分到四元数中(使用halfT参数),让四元数的姿态更新。

如此循环。

q0~q3为四元数 

四元数转rpy欧拉角公式(Rad=180/3.14转化单位为度)

    Angle_roll=atan2(2*q2*q3+2*q0*q1,-2*q1*q1-2*q2*q2+1)*Rad;
    Angle_pitch=asin(-2*q1*q3+2*q0*q2)*Rad;
    Angle_yaw=atan2(2*q1*q2+2*q0*q3,-2*q2*q2-2*q3*q3+1)*Rad;


  • 4
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是将MPU6050原始数据处理成四元数的代码示例: ```python import math import time from mpu6050 import mpu6050 sensor = mpu6050(0x68) # 从MPU6050读取原始数据并进行处理 def get_quaternion(): accel_data = sensor.get_accel_data() gyro_data = sensor.get_gyro_data() accel_x = accel_data['x'] accel_y = accel_data['y'] accel_z = accel_data['z'] gyro_x = gyro_data['x'] gyro_y = gyro_data['y'] gyro_z = gyro_data['z'] # 计算加速度向量的模 accel_magnitude = math.sqrt(accel_x**2 + accel_y**2 + accel_z**2) # 将加速度向量归一化 accel_x /= accel_magnitude accel_y /= accel_magnitude accel_z /= accel_magnitude # 计算pitch和roll角度 roll = math.atan2(accel_y, accel_z) pitch = math.atan2(-accel_x, math.sqrt(accel_y**2 + accel_z**2)) # 计算陀螺仪的角速度 gyro_x = gyro_x / 131 gyro_y = gyro_y / 131 gyro_z = gyro_z / 131 # 计算时间间隔 dt = time.time() - get_quaternion.last_time # 计算旋转角度 roll += gyro_x * dt pitch += gyro_y * dt # 计算四元数 q0 = math.cos(roll/2) * math.cos(pitch/2) q1 = math.sin(roll/2) * math.cos(pitch/2) q2 = math.cos(roll/2) * math.sin(pitch/2) q3 = math.sin(roll/2) * math.sin(pitch/2) # 归一化四元数 q_magnitude = math.sqrt(q0**2 + q1**2 + q2**2 + q3**2) q0 /= q_magnitude q1 /= q_magnitude q2 /= q_magnitude q3 /= q_magnitude # 保存上一次计算四元数的时间戳 get_quaternion.last_time = time.time() return (q0, q1, q2, q3) # 初始化计算四元数的时间戳 get_quaternion.last_time = time.time() # 测试代码 while True: q = get_quaternion() print(q) time.sleep(0.1) ``` 这个代码使用了MPU6050的Python库,可以通过pip安装: ``` pip install mpu6050-raspberrypi ``` 这个代码首先从MPU6050读取加速度和陀螺仪数据。然后,它根据加速度数据计算pitch和roll角度。接下来,它将陀螺仪数据转换为角速度,并计算旋转角度。最后,它使用四元数公式将旋转角度转换为四元数。这个代码还归一化了四元数,以便它们符合四元数的定义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值