Browse Source

AP_NavEKF : Updates to range finder fusion

mission-4.1.18
priseborough 10 years ago committed by Andrew Tridgell
parent
commit
744c72d40b
  1. 33
      libraries/AP_NavEKF/AP_NavEKF.cpp

33
libraries/AP_NavEKF/AP_NavEKF.cpp

@ -526,7 +526,7 @@ void NavEKF::ResetHeight(void)
for (uint8_t i=0; i<=49; i++){ for (uint8_t i=0; i<=49; i++){
storedStates[i].position.z = -hgtMea; storedStates[i].position.z = -hgtMea;
} }
flowStates[1] = states[9] + 0.5f; flowStates[1] = states[9] + 0.1f;
} }
// this function is used to initialise the filter whilst moving, using the AHRS DCM solution // this function is used to initialise the filter whilst moving, using the AHRS DCM solution
@ -920,9 +920,18 @@ void NavEKF::SelectFlowFusion()
flow_state.obsIndex = 2; flow_state.obsIndex = 2;
// indicate that flow fusion has been performed. This is used for load spreading. // indicate that flow fusion has been performed. This is used for load spreading.
flowFusePerformed = true; flowFusePerformed = true;
} else if (flow_state.obsIndex == 2) { } else if (flow_state.obsIndex == 2 || newDataRng) {
// enable fusion of range data if available and permitted
if(newDataRng && useRngFinder()) {
fuseRngData = true;
} else {
fuseRngData = false;
}
// the fact that we have got this far means we do have optical flow data
fuseOptFlowData = true;
// Estimate the focal length scale factor and terrain offset (runs a two state EKF) // Estimate the focal length scale factor and terrain offset (runs a two state EKF)
RunAuxiliaryEKF(); RunAuxiliaryEKF();
// turn of fusion permissions
// increment the index so that no further flow fusion is performed using this measurement // increment the index so that no further flow fusion is performed using this measurement
flow_state.obsIndex = 3; flow_state.obsIndex = 3;
// clear the flag indicating that flow fusion has been performed. The 2-state fusion is relatively computationally // clear the flag indicating that flow fusion has been performed. The 2-state fusion is relatively computationally
@ -2565,7 +2574,7 @@ void NavEKF::RunAuxiliaryEKF()
varInnovRng = 1.0f/SK_RNG[1]; varInnovRng = 1.0f/SK_RNG[1];
// constrain terrain height to be below the vehicle // constrain terrain height to be below the vehicle
flowStates[1] = max(flowStates[1], statesAtRngTime.position[2] + 0.5f); flowStates[1] = max(flowStates[1], statesAtRngTime.position[2] + 0.1f);
// estimate range to centre of image // estimate range to centre of image
range = (flowStates[1] - statesAtRngTime.position[2]) * SK_RNG[2]; range = (flowStates[1] - statesAtRngTime.position[2]) * SK_RNG[2];
@ -2585,7 +2594,7 @@ void NavEKF::RunAuxiliaryEKF()
} }
// constrain the states // constrain the states
flowStates[0] = constrain_float(flowStates[0], 0.1f, 10.0f); flowStates[0] = constrain_float(flowStates[0], 0.1f, 10.0f);
flowStates[1] = max(flowStates[1], statesAtRngTime.position[2] + 0.5f); flowStates[1] = max(flowStates[1], statesAtRngTime.position[2] + 0.1f);
// correct the covariance matrix // correct the covariance matrix
float nextPopt[2][2]; float nextPopt[2][2];
@ -2639,7 +2648,7 @@ void NavEKF::RunAuxiliaryEKF()
vel.z = statesAtFlowTime.velocity[2]; vel.z = statesAtFlowTime.velocity[2];
// constrain terrain height to be below the vehicle // constrain terrain height to be below the vehicle
flowStates[1] = max(flowStates[1], statesAtFlowTime.position[2] + 0.5f); flowStates[1] = max(flowStates[1], statesAtFlowTime.position[2] + 0.1f);
// estimate range to centre of image // estimate range to centre of image
range = (flowStates[1] - statesAtFlowTime.position[2]) / Tnb_flow.c.z; range = (flowStates[1] - statesAtFlowTime.position[2]) / Tnb_flow.c.z;
@ -2708,7 +2717,7 @@ void NavEKF::RunAuxiliaryEKF()
} }
// constrain the states // constrain the states
flowStates[0] = constrain_float(flowStates[0], 0.1f, 10.0f); flowStates[0] = constrain_float(flowStates[0], 0.1f, 10.0f);
flowStates[1] = max(flowStates[1], statesAtFlowTime.position[2] + 0.5f); flowStates[1] = max(flowStates[1], statesAtFlowTime.position[2] + 0.1f);
// correct the covariance matrix // correct the covariance matrix
for (uint8_t i = 0; i < 2 ; i++) { for (uint8_t i = 0; i < 2 ; i++) {
@ -2773,12 +2782,12 @@ void NavEKF::FuseOptFlow()
velNED_local.z = vd; velNED_local.z = vd;
// constrain terrain to be below vehicle // constrain terrain to be below vehicle
flowStates[1] = max(flowStates[1], pd + 0.5f); flowStates[1] = max(flowStates[1], pd + 0.1f);
float heightAboveGndEst = flowStates[1] - pd; float heightAboveGndEst = flowStates[1] - pd;
// Calculate observation jacobians and Kalman gains // Calculate observation jacobians and Kalman gains
if (obsIndex == 0) { if (obsIndex == 0) {
// calculate range from ground plain to centre of sensor fov assuming flat earth // calculate range from ground plain to centre of sensor fov assuming flat earth
float range = constrain_float((heightAboveGndEst/Tnb_flow.c.z),0.5f,1000.0f); float range = constrain_float((heightAboveGndEst/Tnb_flow.c.z),0.1f,1000.0f);
// calculate relative velocity in sensor frame // calculate relative velocity in sensor frame
relVelSensor = Tnb_flow*velNED_local; relVelSensor = Tnb_flow*velNED_local;
@ -3713,6 +3722,12 @@ void NavEKF::CovarianceInit()
P[19][19] = 0.0f; P[19][19] = 0.0f;
P[20][20] = P[19][19]; P[20][20] = P[19][19];
P[21][21] = P[19][19]; P[21][21] = P[19][19];
// optical flow focal length scale factor
Popt[0][0] = 0.0f;
// ground height
Popt[0][0] = 0.25f;
} }
// force symmetry on the covariance matrix to prevent ill-conditioning // force symmetry on the covariance matrix to prevent ill-conditioning
@ -4254,7 +4269,7 @@ bool NavEKF::useAirspeed(void) const
bool NavEKF::useRngFinder(void) const bool NavEKF::useRngFinder(void) const
{ {
// TO-DO add code to set this based in setting of optical flow use parameter and presence of sensor // TO-DO add code to set this based in setting of optical flow use parameter and presence of sensor
return false; return true;
} }
// return true if we should use the optical flow sensor // return true if we should use the optical flow sensor

Loading…
Cancel
Save