四元数+互补滤波

四元数

圆点博士小四轴之四元数算法。四元数算法在小四轴上一般直接采用Madgwick的算法就差不多。

这是一个居于GPL的协议,大家可以自由使用。

//================
// IMU.c
// S.O.H. Madgwick
// 25th September 2010
//=================

转载如下:

void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az) {
 float norm;
 float vx, vy, vz;
 float 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*(q1*q3 - q0*q2);
 vy = 2*(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。当前陀螺仪运动所产生的角度

3。当前物体运动所产生的加速度角度

通过改变系数a和b, 我们能够调整上述各个成分的权重值,从而得到不同的滤波结果。通常我们采用a>b来进行运算。即当前的角度和陀螺仪运动产生的角度占有更大的比重,而当前加速度角度占有比较小的比重。

 

圆点博士小四轴之互补滤波

根据该理论,我们来看圆点博士小四轴代码中的实现方法:

bs004_mpu6050_acc_pitch_com=

(bs004_filter_high*(bs004_mpu6050_acc_pitch_com+bs004_mpu6050_gyro_pitch_raw*bs004_filter_time)

+bs004_filter_low*bs004_mpu6050_acc_pitch_raw)

/(bs004_filter_high+bs004_filter_low); 
 

bs004_mpu6050_acc_roll_com=

(bs004_filter_high*(bs004_mpu6050_acc_roll_com +bs004_mpu6050_gyro_roll_raw *bs004_filter_time)

+bs004_filter_low*bs004_mpu6050_acc_roll_raw)

/(bs004_filter_high+bs004_filter_low);


 




转载于:https://www.cnblogs.com/jins-note/p/9512586.html

### 四元数在一阶互补滤波中的应用 #### 四元数简介 四元数是一种扩展复数的概念,用于表示三维空间的姿态。相比于欧拉角,四元数可以有效避免万向锁问题,并且计算效率更高。一个单位四元数 \( q \) 可以表示为: \[ q = w + xi + yj + zk \] 其中 \( w, x, y, z \) 是实数,\( i, j, k \) 是虚部基底。 #### 一阶互补滤波概述 一阶互补滤波通过组合来自不同传感器的数据来提高姿态估计的准确性。通常情况下,该滤波器结合了加速度计和陀螺仪的数据。加速度计提供绝对方向信息,而陀螺仪则提供了相对旋转速率的信息。两者结合起来可以在一定程度上弥补各自的缺点[^3]。 #### 四元数与一阶互补滤波结合的方法 为了将四元数应用于一阶互补滤波中,主要思路是在更新过程中保持四元数形式的状态变量而不是传统的欧拉角。以下是具体的实现步骤: 1. **初始化** 初始化状态向量(即初始姿态),并设定合适的比例因子 `alpha` 来平衡两种测量源的影响程度。 2. **预测阶段 (基于陀螺仪)** 使用当前时刻的角速度读数对前一刻的姿态进行微分方程求解,从而获得新的姿态预估值。这一步骤可以通过下面的方式完成: ```python def predict_orientation(gyro_data, dt, current_quaternion): omega_x, omega_y, omega_z = gyro_data # 计算半角增量 half_delta_angle_x = omega_x * dt / 2.0 half_delta_angle_y = omega_y * dt / 2.0 half_delta_angle_z = omega_z * dt / 2.0 # 构建纯虚四元数 delta_q = np.array([np.cos(np.sqrt(half_delta_angle_x**2 + \ half_delta_angle_y**2 + \ half_delta_angle_z**2)), half_delta_angle_x, half_delta_angle_y, half_delta_angle_z]) normed_delta_q = delta_q / np.linalg.norm(delta_q) next_quaternion = quaternion_multiply(normed_delta_q, current_quaternion) return normalize_quaternion(next_quaternion) ``` 3. **校正阶段 (利用加速度计)** 利用重力矢量的方向作为参考来进行误差补偿。这里假设设备处于静止状态下,此时加速度计测得的主要成分就是地球引力场的作用力。因此可以根据此特性调整之前由陀螺仪积分得出的结果偏差。 ```python def correct_with_accelerometer(acceleration_vector, predicted_quaternion): gravity_direction = acceleration_vector / np.linalg.norm(acceleration_vector) # 将重力方向转换成相对于世界坐标系下的期望朝向 desired_upward_unit_vec_world_frame = [0., 0., 1.] # 寻找最接近于垂直向上指向的地平面法线 optimal_rotation_axis = cross_product(desired_upward_unit_vec_world_frame, gravity_direction) rotation_angle = acos(dot_product(desired_upward_unit_vec_world_frame, gravity_direction)) correction_quat = axisangle_to_quat(optimal_rotation_axis, rotation_angle) corrected_quaternion = slerp(predicted_quaternion, correction_quat, alpha=ALPHA_CORRECTION_WEIGHT) return normalized(corrected_quaternion) ``` 4. **最终输出** 经过上述两步操作之后所得到的就是经过优化后的最新姿态描述——也就是我们想要的一帧内物体的空间方位变化情况。 这种方法不仅能够有效地减少漂移现象的发生几率,而且还能较好地保留快速动态响应的能力。值得注意的是,在实际编程实践中还需要考虑更多细节上的处理,比如数值稳定性保障措施等[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值