Skip to content

Commit 4c64d83

Browse files
committed
left update
1 parent 5e66a7a commit 4c64d83

File tree

1 file changed

+50
-9
lines changed

1 file changed

+50
-9
lines changed

src/benchmark/bavoxel.hpp

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -986,7 +986,7 @@ class BALM2
986986
public:
987987
BALM2(){}
988988

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)
990990
{
991991
int thd_num = 4;
992992
double residual = 0;
@@ -1022,6 +1022,42 @@ class BALM2
10221022
return residual;
10231023
}
10241024

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+
10251061
double only_residual(vector<IMUST> &x_stats, VOX_HESS &voxhess, vector<IMUST> &x_ab)
10261062
{
10271063
double residual1 = 0, residual2 = 0;
@@ -1068,20 +1104,25 @@ class BALM2
10681104
for(int i=0; i<10; i++)
10691105
{
10701106
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+
10721112

10731113
D.diagonal() = Hess.diagonal();
10741114
dxi = (Hess + u*D).ldlt().solve(-JacT);
10751115

10761116
for(int j=0; j<win_size; j++)
10771117
{
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);
10851126
}
10861127
double q1 = 0.5*dxi.dot(u*D*dxi-JacT);
10871128

0 commit comments

Comments
 (0)