@@ -986,7 +986,7 @@ class BALM2
986
986
public:
987
987
BALM2 (){}
988
988
989
- double divide_thread (vector<IMUST> &x_stats, VOX_HESS &voxhess, vector<IMUST> &x_ab, Eigen::MatrixXd &Hess, Eigen::VectorXd &JacT)
989
+ double divide_thread_right (vector<IMUST> &x_stats, VOX_HESS &voxhess, vector<IMUST> &x_ab, Eigen::MatrixXd &Hess, Eigen::VectorXd &JacT)
990
990
{
991
991
int thd_num = 4 ;
992
992
double residual = 0 ;
@@ -1022,6 +1022,42 @@ class BALM2
1022
1022
return residual;
1023
1023
}
1024
1024
1025
+ double divide_thread_left (vector<IMUST> &x_stats, VOX_HESS &voxhess, vector<IMUST> &x_ab, Eigen::MatrixXd &Hess, Eigen::VectorXd &JacT)
1026
+ {
1027
+ int thd_num = 4 ;
1028
+ double residual = 0 ;
1029
+ Hess.setZero (); JacT.setZero ();
1030
+ PLM (-1 ) hessians (thd_num);
1031
+ PLV (-1 ) jacobins (thd_num);
1032
+
1033
+ for (int i=0 ; i<thd_num; i++)
1034
+ {
1035
+ hessians[i].resize (6 *win_size, 6 *win_size);
1036
+ jacobins[i].resize (6 *win_size);
1037
+ }
1038
+
1039
+ int tthd_num = thd_num;
1040
+ vector<double > resis (tthd_num, 0 );
1041
+ int g_size = voxhess.plvec_voxels .size ();
1042
+ if (g_size < tthd_num) tthd_num = 1 ;
1043
+
1044
+ vector<thread*> mthreads (tthd_num);
1045
+ double part = 1.0 * g_size / tthd_num;
1046
+ for (int i=0 ; i<tthd_num; i++)
1047
+ mthreads[i] = new thread (&VOX_HESS::left_evaluate_acc2, &voxhess, x_stats, part*i, part*(i+1 ), ref (hessians[i]), ref (jacobins[i]), ref (resis[i]));
1048
+
1049
+ for (int i=0 ; i<tthd_num; i++)
1050
+ {
1051
+ mthreads[i]->join ();
1052
+ Hess += hessians[i];
1053
+ JacT += jacobins[i];
1054
+ residual += resis[i];
1055
+ delete mthreads[i];
1056
+ }
1057
+
1058
+ return residual;
1059
+ }
1060
+
1025
1061
double only_residual (vector<IMUST> &x_stats, VOX_HESS &voxhess, vector<IMUST> &x_ab)
1026
1062
{
1027
1063
double residual1 = 0 , residual2 = 0 ;
@@ -1068,20 +1104,25 @@ class BALM2
1068
1104
for (int i=0 ; i<10 ; i++)
1069
1105
{
1070
1106
if (is_calc_hess)
1071
- residual1 = divide_thread (x_stats, voxhess, x_ab, Hess, JacT);
1107
+ {
1108
+ // residual1 = divide_thread_right(x_stats, voxhess, x_ab, Hess, JacT);
1109
+ residual1 = divide_thread_left (x_stats, voxhess, x_ab, Hess, JacT);
1110
+ }
1111
+
1072
1112
1073
1113
D.diagonal () = Hess.diagonal ();
1074
1114
dxi = (Hess + u*D).ldlt ().solve (-JacT);
1075
1115
1076
1116
for (int j=0 ; j<win_size; j++)
1077
1117
{
1078
- x_stats_temp[j].R = x_stats[j].R * Exp (dxi.block <3 , 1 >(DVEL*j, 0 ));
1079
- x_stats_temp[j].p = x_stats[j].p + dxi.block <3 , 1 >(DVEL*j+3 , 0 );
1080
- // x_stats_temp[j].p = x_stats[j].p + x_stats[j].R * dxi.block<3, 1>(DVEL*j+3, 0);
1081
-
1082
- // Eigen::Matrix3d dR = Exp(dxi.block<3, 1>(DVEL*j, 0));
1083
- // x_stats_temp[j].R = dR * x_stats[j].R;
1084
- // x_stats_temp[j].p = dR * x_stats[j].p + dxi.block<3, 1>(DVEL*j+3, 0);
1118
+ // right update
1119
+ // x_stats_temp[j].R = x_stats[j].R * Exp(dxi.block<3, 1>(DVEL*j, 0));
1120
+ // x_stats_temp[j].p = x_stats[j].p + dxi.block<3, 1>(DVEL*j+3, 0);
1121
+
1122
+ // left update
1123
+ Eigen::Matrix3d dR = Exp (dxi.block <3 , 1 >(DVEL*j, 0 ));
1124
+ x_stats_temp[j].R = dR * x_stats[j].R ;
1125
+ x_stats_temp[j].p = dR * x_stats[j].p + dxi.block <3 , 1 >(DVEL*j+3 , 0 );
1085
1126
}
1086
1127
double q1 = 0.5 *dxi.dot (u*D*dxi-JacT);
1087
1128
0 commit comments