|
|
|
@ -77,21 +77,6 @@ uint16_t SITL_State::_airspeed_sensor(float airspeed)
@@ -77,21 +77,6 @@ uint16_t SITL_State::_airspeed_sensor(float airspeed)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float SITL_State::_gyro_drift(void) |
|
|
|
|
{ |
|
|
|
|
if (_sitl->drift_speed == 0.0f || |
|
|
|
|
_sitl->drift_time == 0.0f) { |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
double period = _sitl->drift_time * 2; |
|
|
|
|
double minutes = fmod(_scheduler->_micros64() / 60.0e6, period); |
|
|
|
|
if (minutes < period/2) { |
|
|
|
|
return minutes * ToRad(_sitl->drift_speed); |
|
|
|
|
} |
|
|
|
|
return (period - minutes) * ToRad(_sitl->drift_speed); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
emulate an analog rangefinder |
|
|
|
|
*/ |
|
|
|
@ -156,59 +141,6 @@ void SITL_State::_update_ins(float roll, float pitch, float yaw, // Relative
@@ -156,59 +141,6 @@ void SITL_State::_update_ins(float roll, float pitch, float yaw, // Relative
|
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// minimum noise levels are 2 bits, but averaged over many
|
|
|
|
|
// samples, giving around 0.01 m/s/s
|
|
|
|
|
float accel_noise = 0.01f; |
|
|
|
|
float accel2_noise = 0.01f; |
|
|
|
|
// minimum gyro noise is also less than 1 bit
|
|
|
|
|
float gyro_noise = ToRad(0.04f); |
|
|
|
|
if (_motors_on) { |
|
|
|
|
// add extra noise when the motors are on
|
|
|
|
|
accel_noise += _sitl->accel_noise; |
|
|
|
|
accel2_noise += _sitl->accel2_noise; |
|
|
|
|
gyro_noise += ToRad(_sitl->gyro_noise); |
|
|
|
|
} |
|
|
|
|
// get accel bias (add only to first accelerometer)
|
|
|
|
|
Vector3f accel_bias = _sitl->accel_bias.get(); |
|
|
|
|
float xAccel1 = xAccel + accel_noise * _rand_float() + accel_bias.x; |
|
|
|
|
float yAccel1 = yAccel + accel_noise * _rand_float() + accel_bias.y; |
|
|
|
|
float zAccel1 = zAccel + accel_noise * _rand_float() + accel_bias.z; |
|
|
|
|
|
|
|
|
|
float xAccel2 = xAccel + accel2_noise * _rand_float(); |
|
|
|
|
float yAccel2 = yAccel + accel2_noise * _rand_float(); |
|
|
|
|
float zAccel2 = zAccel + accel2_noise * _rand_float(); |
|
|
|
|
|
|
|
|
|
if (fabsf(_sitl->accel_fail) > 1.0e-6f) { |
|
|
|
|
xAccel1 = _sitl->accel_fail; |
|
|
|
|
yAccel1 = _sitl->accel_fail; |
|
|
|
|
zAccel1 = _sitl->accel_fail; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Vector3f accel0 = Vector3f(xAccel1, yAccel1, zAccel1) + _ins->get_accel_offsets(0); |
|
|
|
|
Vector3f accel1 = Vector3f(xAccel2, yAccel2, zAccel2) + _ins->get_accel_offsets(1); |
|
|
|
|
_ins->set_accel(0, accel0); |
|
|
|
|
_ins->set_accel(1, accel1); |
|
|
|
|
|
|
|
|
|
// check noise
|
|
|
|
|
_ins->calc_vibration_and_clipping(0, accel0, 0.0025f); |
|
|
|
|
_ins->calc_vibration_and_clipping(1, accel1, 0.0025f); |
|
|
|
|
|
|
|
|
|
float p = radians(rollRate) + _gyro_drift(); |
|
|
|
|
float q = radians(pitchRate) + _gyro_drift(); |
|
|
|
|
float r = radians(yawRate) + _gyro_drift(); |
|
|
|
|
|
|
|
|
|
float p1 = p + gyro_noise * _rand_float(); |
|
|
|
|
float q1 = q + gyro_noise * _rand_float(); |
|
|
|
|
float r1 = r + gyro_noise * _rand_float(); |
|
|
|
|
|
|
|
|
|
float p2 = p + gyro_noise * _rand_float(); |
|
|
|
|
float q2 = q + gyro_noise * _rand_float(); |
|
|
|
|
float r2 = r + gyro_noise * _rand_float(); |
|
|
|
|
|
|
|
|
|
_ins->set_gyro(0, Vector3f(p1, q1, r1) + _ins->get_gyro_offsets(0)); |
|
|
|
|
_ins->set_gyro(1, Vector3f(p2, q2, r2) + _ins->get_gyro_offsets(1)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sonar_pin_value = _ground_sonar(); |
|
|
|
|
float airspeed_simulated = (fabsf(_sitl->aspd_fail) > 1.0e-6f) ? _sitl->aspd_fail : airspeed; |
|
|
|
|
airspeed_pin_value = _airspeed_sensor(airspeed_simulated + (_sitl->aspd_noise * _rand_float())); |
|
|
|
|