Added a state machine intended to run at 250hz to the DCM. Spread load of DCM out to lower CPU.

This commit is contained in:
Jason Short 2011-09-11 11:03:55 -07:00
parent b0c3cda23b
commit e8fcf72966
2 changed files with 69 additions and 9 deletions

View File

@ -41,7 +41,7 @@ AP_DCM::set_compass(Compass *compass)
/**************************************************/ /**************************************************/
void void
AP_DCM::update_DCM(float _G_Dt) AP_DCM::update_DCM_fast(float _G_Dt)
{ {
_imu->update(); _imu->update();
_gyro_vector = _imu->get_gyro(); // Get current values for IMU sensors _gyro_vector = _imu->get_gyro(); // Get current values for IMU sensors
@ -49,13 +49,48 @@ AP_DCM::update_DCM(float _G_Dt)
matrix_update(_G_Dt); // Integrate the DCM matrix matrix_update(_G_Dt); // Integrate the DCM matrix
//if(_toggle){ switch(_toggle++){
case 0:
normalize(); // Normalize the DCM matrix normalize(); // Normalize the DCM matrix
//}else{ break;
drift_correction(); // Perform drift correction
//}
//_toggle = !_toggle;
case 1:
//drift_correction(); // Normalize the DCM matrix
euler_rp(); // Calculate pitch, roll, yaw for stabilization and navigation
break;
case 2:
drift_correction(); // Normalize the DCM matrix
break;
case 3:
//drift_correction(); // Normalize the DCM matrix
euler_rp(); // Calculate pitch, roll, yaw for stabilization and navigation
break;
case 4:
euler_yaw();
break;
default:
euler_rp(); // Calculate pitch, roll, yaw for stabilization and navigation
_toggle = 0;
//drift_correction(); // Normalize the DCM matrix
break;
}
}
/**************************************************/
void
AP_DCM::update_DCM(float _G_Dt)
{
_imu->update();
_gyro_vector = _imu->get_gyro(); // Get current values for IMU sensors
_accel_vector = _imu->get_accel(); // Get current values for IMU sensors
matrix_update(_G_Dt); // Integrate the DCM matrix
normalize(); // Normalize the DCM matrix
drift_correction(); // Perform drift correction
euler_angles(); // Calculate pitch, roll, yaw for stabilization and navigation euler_angles(); // Calculate pitch, roll, yaw for stabilization and navigation
} }
@ -83,11 +118,12 @@ AP_DCM::matrix_update(float _G_Dt)
Matrix3f temp_matrix; Matrix3f temp_matrix;
//Record when you saturate any of the gyros. //Record when you saturate any of the gyros.
/*
if( (fabs(_gyro_vector.x) >= radians(300)) || if( (fabs(_gyro_vector.x) >= radians(300)) ||
(fabs(_gyro_vector.y) >= radians(300)) || (fabs(_gyro_vector.y) >= radians(300)) ||
(fabs(_gyro_vector.z) >= radians(300))){ (fabs(_gyro_vector.z) >= radians(300))){
gyro_sat_count++; gyro_sat_count++;
} }*/
_omega_integ_corr = _gyro_vector + _omega_I; // Used for _centripetal correction (theoretically better than _omega) _omega_integ_corr = _gyro_vector + _omega_I; // Used for _centripetal correction (theoretically better than _omega)
_omega = _omega_integ_corr + _omega_P; // Equation 16, adding proportional and integral correction terms _omega = _omega_integ_corr + _omega_P; // Equation 16, adding proportional and integral correction terms
@ -335,6 +371,25 @@ AP_DCM::euler_angles(void)
yaw_sensor += 36000; yaw_sensor += 36000;
} }
void
AP_DCM::euler_rp(void)
{
pitch = -asin(_dcm_matrix.c.x);
roll = atan2(_dcm_matrix.c.y, _dcm_matrix.c.z);
roll_sensor = degrees(roll) * 100;
pitch_sensor = degrees(pitch) * 100;
}
void
AP_DCM::euler_yaw(void)
{
yaw = atan2(_dcm_matrix.b.x, _dcm_matrix.a.x);
yaw_sensor = degrees(yaw) * 100;
if (yaw_sensor < 0)
yaw_sensor += 36000;
}
/**************************************************/ /**************************************************/
float float

View File

@ -50,6 +50,7 @@ public:
// Methods // Methods
void update_DCM(float _G_Dt); void update_DCM(float _G_Dt);
void update_DCM_fast(float _G_Dt);
float get_health(void); float get_health(void);
@ -98,6 +99,10 @@ private:
void drift_correction(void); void drift_correction(void);
void euler_angles(void); void euler_angles(void);
void euler_rp(void);
void euler_yaw(void);
// members // members
Compass * _compass; Compass * _compass;
@ -122,7 +127,7 @@ private:
float _course_over_ground_y; // Course overground Y axis float _course_over_ground_y; // Course overground Y axis
float _health; float _health;
bool _centripetal; bool _centripetal;
bool _toggle; uint8_t _toggle;
}; };
#endif #endif