AP_InertialSensor: Correct SITL IMU1 accel for position in body frame
This commit is contained in:
parent
d830f68901
commit
470f5c4562
@ -73,6 +73,26 @@ void AP_InertialSensor_SITL::timer_update(void)
|
||||
float yAccel2 = sitl->state.yAccel + accel2_noise * rand_float();
|
||||
float zAccel2 = sitl->state.zAccel + accel2_noise * rand_float();
|
||||
|
||||
// correct for the acceleration due to the IMU position offset and angular acceleration
|
||||
// correct for the centripetal acceleration
|
||||
// only apply corrections to first accelerometer
|
||||
Vector3f pos_offset = sitl->imu_pos_offset;
|
||||
if (!pos_offset.is_zero()) {
|
||||
// calculate sensed acceleration due to lever arm effect
|
||||
// Note: the % operator has been overloaded to provide a cross product
|
||||
Vector3f angular_accel = Vector3f(radians(sitl->state.angAccel.x) , radians(sitl->state.angAccel.y) , radians(sitl->state.angAccel.z));
|
||||
Vector3f lever_arm_accel = angular_accel % pos_offset;
|
||||
|
||||
// calculate sensed acceleration due to centripetal acceleration
|
||||
Vector3f angular_rate = Vector3f(radians(sitl->state.rollRate), radians(sitl->state.pitchRate), radians(sitl->state.yawRate));
|
||||
Vector3f centripetal_accel = angular_rate % (angular_rate % pos_offset);
|
||||
|
||||
// apply corrections
|
||||
xAccel1 += lever_arm_accel.x + centripetal_accel.x;
|
||||
yAccel1 += lever_arm_accel.y + centripetal_accel.y;
|
||||
zAccel1 += lever_arm_accel.z + centripetal_accel.z;
|
||||
}
|
||||
|
||||
if (fabsf(sitl->accel_fail) > 1.0e-6f) {
|
||||
xAccel1 = sitl->accel_fail;
|
||||
yAccel1 = sitl->accel_fail;
|
||||
|
Loading…
Reference in New Issue
Block a user