
ardupirates - issue #26
Restart gyro calibration during startup while gyros and accels not stable
This was posted before on the NG issues list: http://code.google.com/p/arducopter/issues/detail?id=94
On Kinderkram's suggestion I've added the issue again here. You may also want to look at a similar solution by Dror - dcaspi on RCG: http://www.rcgroups.com/forums/showpost.php?p=17455791&postcount=4992
The code below restarts the calibration each time the gyros or accels change significantly. This gives the user more time to put down the quad after connecting the battery, and avoids taking off with miscalibrated gyros. As a bonus, the leds will cycle quickly while the calibration is restarting, and slowly if the calibration is continuing normally. You may want to tweak the threshold.
Sample code for Sensors.pde; the mods are #ifdef'ed for identification.
define WAIT_STABLE_CALIBRATION 5
void calibrateSensors(void) { ...
ifdef WAIT_STABLE_CALIBRATION
float aux_float[6];
else
float aux_float[3];
endif
... aux_float[0] = gyro_offset_roll; aux_float[1] = gyro_offset_pitch; aux_float[2] = gyro_offset_yaw;
ifdef WAIT_STABLE_CALIBRATION
aux_float[3] = acc_offset_x; aux_float[4] = acc_offset_y; aux_float[5] = acc_offset_z;
endif
// Take the gyro offset values for(i=0;i<600;i++) { Read_adc_raw(); // Read sensors
ifdef WAIT_STABLE_CALIBRATION
// restart calibration while gyros or accels unstable
for(gyro = GYROZ; gyro <= ACCELZ; gyro++)
{
float delta = AN[gyro] - aux_float[gyro];
if (delta < -WAIT_STABLE_CALIBRATION || delta > WAIT_STABLE_CALIBRATION)
i = 0; // restart
aux_float[gyro] += delta * 0.2;
}
else
for(gyro = GYROZ; gyro <= GYROY; gyro++)
aux_float[gyro] = aux_float[gyro] * 0.8 + AN[gyro] * 0.2; // Filtering
endif
... }
Comment #1
Posted on Feb 21, 2011 by Swift RhinoThanx Patrick for your suggetions. I will look into this. Its on my todo list.
Status: New
Labels:
Type-Defect
Priority-Medium