Commit 54e00356 authored by Andrey Filippov's avatar Andrey Filippov

Improving mount correction, implementing gyro (omegas) correction

parent 76f96ef8
...@@ -4659,7 +4659,10 @@ public class OpticalFlow { ...@@ -4659,7 +4659,10 @@ public class OpticalFlow {
// skip completely if no color or mono, tiff or video // skip completely if no color or mono, tiff or video
boolean adjust_imu_orient = clt_parameters.imp.adjust_imu_orient; // calculate camera orientation correction from predicted by IMS boolean adjust_imu_orient = clt_parameters.imp.adjust_imu_orient; // calculate camera orientation correction from predicted by IMS
boolean calc_quat_corr = clt_parameters.imp.calc_quat_corr; // calculate camera orientation correction from predicted by IMS boolean calc_quat_corr = clt_parameters.imp.calc_quat_corr; // calculate camera orientation correction from predicted by IMS
// apply_quat_corr used inside getGroundIns() - used when generating output // apply_quat_corr used inside getGroundIns() - used when generating output
// boolean apply_quat_corr = clt_parameters.imp.apply_quat_corr; // apply camera orientation correction from predicted by IMS // boolean apply_quat_corr = clt_parameters.imp.apply_quat_corr; // apply camera orientation correction from predicted by IMS
boolean use_ims_rotation = clt_parameters.imp.use_quat_corr; // use internally (probably deprecated boolean use_ims_rotation = clt_parameters.imp.use_quat_corr; // use internally (probably deprecated
......
...@@ -221,12 +221,13 @@ public class QuaternionLma { ...@@ -221,12 +221,13 @@ public class QuaternionLma {
debug_level); // final int debug_level); debug_level); // final int debug_level);
return; return;
} }
//MODE_XYZQ
N = vect_x.length; N = vect_x.length;
this.mode = mode; this.mode = mode;
samples = 3+ quat0.length; samples = 3+ quat0.length;
samples_x = 7; samples_x = 7;
pure_weight = 1.0 - reg_w; pure_weight = 1.0 - reg_w;
int extra_samples = 0; // (quat0.length < 4)? 0:REGLEN; int extra_samples = (reg_w > 0) ? quat0.length:0; // (quat0.length < 4)? 0:REGLEN;
x_vector = new double [samples_x * N]; x_vector = new double [samples_x * N];
y_vector = new double [samples * N + extra_samples]; y_vector = new double [samples * N + extra_samples];
weights = new double [samples * N + extra_samples]; weights = new double [samples * N + extra_samples];
...@@ -285,9 +286,12 @@ public class QuaternionLma { ...@@ -285,9 +286,12 @@ public class QuaternionLma {
} }
double k = (pure_weight)/sw; double k = (pure_weight)/sw;
for (int i = 0; i < weights.length; i++) weights[i] *= k; for (int i = 0; i < weights.length; i++) weights[i] *= k;
if (extra_samples>0) { if (extra_samples > 0) {
weights [samples * N] = 1.0 - pure_weight; double w = (1.0 - pure_weight)/parameters_vector.length;
y_vector[samples * N] = 1.0; for (int i = 0; i < parameters_vector.length; i++) {
weights [samples * N + i] = w;
y_vector[samples * N] = 0.0; // or target value
}
} }
last_jt = new double [parameters_vector.length][]; last_jt = new double [parameters_vector.length][];
if (debug_level > 0) { if (debug_level > 0) {
...@@ -387,7 +391,7 @@ public class QuaternionLma { ...@@ -387,7 +391,7 @@ public class QuaternionLma {
samples = 7; samples = 7;
samples_x = 7; samples_x = 7;
pure_weight = 1.0 - reg_w; pure_weight = 1.0 - reg_w;
int extra_samples = 0; // (quat0.length < 4)? 0:REGLEN; int extra_samples = 0; // (reg_w > 0)? quat0.length:0; // (quat0.length < 4)? 0:REGLEN;
x_vector = new double [samples * N]; x_vector = new double [samples * N];
y_vector = new double [samples * N + extra_samples]; y_vector = new double [samples * N + extra_samples];
y_inv_vector = new double [samples_x * N + extra_samples]; y_inv_vector = new double [samples_x * N + extra_samples];
...@@ -1130,6 +1134,14 @@ public class QuaternionLma { ...@@ -1130,6 +1134,14 @@ public class QuaternionLma {
} }
} }
} }
if (weights.length > N*samples) {
for (int i = 0; i < vector3.length; i++) {
fx[samples*N + i] = vector3[i];
if (jt != null) {
jt[i][samples*N + i] = 1.0;
}
}
}
return fx; return fx;
} }
...@@ -1563,6 +1575,26 @@ public class QuaternionLma { ...@@ -1563,6 +1575,26 @@ public class QuaternionLma {
return rslt[0]? iter : -1; return rslt[0]? iter : -1;
} }
public double [] getMinMaxDiag(
int debug_level){
double [][] jt = new double [parameters_vector.length][];
double [] fx = getFxDerivs(
parameters_vector, // double [] vector,
jt, // final double [][] jt, // should be null or initialized with [vector.length][]
debug_level); // final int debug_level)
Matrix wjtjlambda = new Matrix(getWJtJlambda(
0, // *10, // temporary
jt)); // double [][] jt)
double [] mn_mx= {Double.NaN,Double.NaN};
for (int i = 0; i < parameters_vector.length; i++) {
double d = wjtjlambda.get(i,i);
if (!(d > mn_mx[0])) mn_mx[0] = d;
if (!(d < mn_mx[1])) mn_mx[1] = d;
}
return mn_mx;
}
private boolean [] lmaStep( private boolean [] lmaStep(
double lambda, double lambda,
double rms_diff, double rms_diff,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment