Skip to content

Commit 487c5e6

Browse files
authored
Add files via upload
1 parent fc4faa9 commit 487c5e6

File tree

6 files changed

+168
-88
lines changed

6 files changed

+168
-88
lines changed

src/examples/ba_calib.cpp

Lines changed: 17 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
#include <map>
1212

1313
int main(int argc, char** argv){
14-
if(argc < 4){
15-
std::cerr << "Got " << argc - 1 << " Parameters, but Expected parameters: yaml_file orb_setting_file orb_vocabulary_file" << std::endl;
14+
if(argc < 2){
15+
std::cerr << "Got " << argc - 1 << " Parameters, but Expected parameters: yaml_file" << std::endl;
1616
exit(0);
1717
}
18-
std::string config_file(argv[1]), ORBSetFilename(argv[2]), VocFilename(argv[3]);
18+
std::string config_file(argv[1]);
1919
YAML::Node config = YAML::LoadFile(config_file);
2020
std::string base_dir = config["BaseDir"].as<std::string>();
2121
checkpath(base_dir);
@@ -26,6 +26,12 @@ int main(int argc, char** argv){
2626
std::string KeyFrameDir = base_dir + config["KeyFrameDir"].as<std::string>();
2727
std::string KyeFrameIdFile = base_dir + config["VOIdFile"].as<std::string>();
2828
std::string MapFileNmae = base_dir + config["MapFile"].as<std::string>();
29+
std::string initSim3File = base_dir + config["init_sim3"].as<std::string>();
30+
std::string VocFilename = config["ORBVocabulary"].as<std::string>();
31+
std::string ORBSetFilename = config["ORBConfig"].as<std::string>();
32+
assert(file_exist(TwcFilename));
33+
assert(file_exist(TwlFilename));
34+
assert(file_exist(initSim3File));
2935
std::map<std::string, int> method_options = config["method_options"].as<std::map<std::string, int> >();
3036
std::string method = config["method"].as<std::string>();
3137
assert(method_options.count(method)>0);
@@ -45,32 +51,21 @@ int main(int argc, char** argv){
4551
vmTwl.reserve(vTwl.size()-1);
4652
pose2Motion(vTwc, vmTwc);
4753
pose2Motion(vTwl, vmTwl);
48-
Eigen::Matrix3d RCL;
49-
Eigen::Vector3d tCL;
54+
Eigen::Matrix4d rigid;
5055
double s;
56+
std::tie(rigid, s) = readSim3(initSim3File);
5157

52-
53-
5458
ORB_SLAM2::System VSLAM(VocFilename, ORBSetFilename, ORB_SLAM2::System::MONOCULAR, false);
5559
VSLAM.Shutdown(); // Do not need any thread
5660
VSLAM.RestoreSystemFromFile(KeyFrameDir, MapFileNmae);
5761
std::cout << "System Restored Successfully." << std::endl;
58-
std::tie(RCL,tCL,s) = HECalib(vmTwc, vmTwl);
59-
std::cout << "Ordinary Hand-eye Calibration:\n";
60-
std::cout << "Rotation: \n" << RCL << std::endl;
61-
std::cout << "Translation: \n" << tCL << std::endl;
62-
std::cout << "s :" << s << std::endl;
63-
64-
std::tie(RCL,tCL,s) = HECalibRobustKernelg2o(vmTwc, vmTwl, RCL, tCL, s, true, 0.003);
65-
std::cout << "Robust Kernel Hand-eye Calibration with Regulation:\n";
66-
std::cout << "Rotation: \n" << RCL << std::endl;
67-
std::cout << "Translation: \n" << tCL << std::endl;
62+
std::cout << "Initial Extrinsic:\n";
63+
std::cout << "Rotation: \n" << rigid.topLeftCorner(3,3) << std::endl;
64+
std::cout << "Translation: \n" << rigid.topRightCorner(3,1) << std::endl;
6865
std::cout << "s :" << s << std::endl;
69-
Eigen::Isometry3d rigidTCL = Eigen::Isometry3d::Identity();
70-
rigidTCL.rotate(RCL);
71-
rigidTCL.pretranslate(tCL);
7266

73-
Eigen::Isometry3d TCL0(rigidTCL);
67+
Eigen::Isometry3d TCL0;
68+
TCL0.matrix() = rigid;
7469
int ngood;
7570
if(method == "global"){
7671
ngood = VSLAM.OptimizeExtrinsicGlobal(vTwl, TCL0, s);
@@ -81,27 +76,12 @@ int main(int argc, char** argv){
8176
}
8277
else
8378
{
84-
TCL0 = rigidTCL;
8579
ngood = VSLAM.OptimizeExtrinsicLocal(vTwl, TCL0, s);
8680
std::cout << "Bundle Adjustment Optimization (Local):\n";
8781
std::cout << "Rotation: \n" << TCL0.rotation() << std::endl;
8882
std::cout << "Translation: \n" << TCL0.translation() << std::endl;
89-
std::cout<< "scale= "<< s <<" "<<"ngood= "<< ngood <<std::endl;
83+
std::cout<< "scale = "<< s <<" "<<"ngood= "<< ngood <<std::endl;
9084
}
9185
writeSim3(resFileName, TCL0, s);
9286
std::cout << "Result of BA Calibration saved to " << resFileName << std::endl;
93-
94-
95-
96-
// std::tie(RCL,tCL,s) = HECalibRobustKernelg2o(vmTwc, vmTwl, RCL, tCL, s);
97-
// std::cout << "Robust Hand-eye Calibration:\n";
98-
// std::cout << "Rotation: \n" << RCL << std::endl;
99-
// std::cout << "Translation: \n" << tCL << std::endl;
100-
// std::cout << "s :" << s << std::endl;
101-
102-
// std::tie(RCL,tCL,s) = HECalibLPg2o(vmTwc, vmTwl, RCL, tCL, s);
103-
// std::cout << "Line Process Hand-eye Calibration:\n";
104-
// std::cout << "Rotation: \n" << RCL << std::endl;
105-
// std::cout << "Translation: \n" << tCL << std::endl;
106-
// std::cout << "s :" << s << std::endl;
10787
}

src/examples/he_calib.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@ int main(int argc, char** argv){
2323
const std::string TwcFilename = base_dir + io_config["VOFile"].as<std::string>();
2424
const std::string TwlFilename = base_dir + io_config["LOFile"].as<std::string>();
2525
const std::string resFileName = base_dir + io_config["ResFile"].as<std::string>();
26+
const std::string resRBFileName = base_dir + io_config["ResRBFile"].as<std::string>();
2627
const std::string resLPFileName = base_dir + io_config["ResLPFile"].as<std::string>();
2728
const std::string KyeFrameIdFile = base_dir + io_config["VOIdFile"].as<std::string>();
2829

2930
const bool zero_translation = runtime_config["zero_translation"].as<bool>();
31+
const double robust_kernel_size = runtime_config["robust_kernel_size"].as<double>();
3032
const bool regulation = runtime_config["regulation"].as<bool>();
3133
const double regulation_weight = runtime_config["regulation_weight"].as<double>();
3234
const int inner_iter = runtime_config["inner_iter"].as<int>();
@@ -40,17 +42,27 @@ int main(int argc, char** argv){
4042
ReadPoseList(TwlFilename, vTwlraw);
4143
YAML::Node FrameIdCfg = YAML::LoadFile(KyeFrameIdFile);
4244
std::vector<int> vKFFrameId = FrameIdCfg["mnFrameId"].as<std::vector<int>>();
43-
for(auto &KFId:vKFFrameId)
44-
vTwl.push_back(vTwlraw[KFId]);
45+
vTwl.reserve(vKFFrameId.size());
46+
if(vKFFrameId[0]==0)
47+
for(auto &KFId:vKFFrameId)
48+
vTwl.push_back(vTwlraw[KFId]);
49+
else
50+
{
51+
Eigen::Isometry3d refPose = vTwlraw[vKFFrameId[0]].inverse();
52+
for(auto &KFId:vKFFrameId)
53+
vTwl.push_back(refPose * vTwlraw[KFId]);
54+
}
4555
vTwlraw.clear();
4656
std::cout << "Load " << vTwc.size() << " Twc Pose files." << std::endl;
4757
std::cout << "Load " << vTwl.size() << " Twl Pose files." << std::endl;
4858
assert(vTwc.size()==vTwl.size());
59+
4960
std::vector<Eigen::Isometry3d> vmTwc, vmTwl;
5061
vmTwc.reserve(vTwc.size()-1);
5162
vmTwl.reserve(vTwl.size()-1);
5263
pose2Motion(vTwc, vmTwc);
5364
pose2Motion(vTwl, vmTwl);
65+
5466
Eigen::Matrix3d RCL;
5567
Eigen::Vector3d tCL;
5668
double s;
@@ -62,14 +74,16 @@ int main(int argc, char** argv){
6274
std::cout << "s :" << s << std::endl;
6375
if(zero_translation)
6476
tCL.setZero(); // Translation is too bad
65-
std::tie(RCL,tCL,s) = HECalibRobustKernelg2o(vmTwc, vmTwl, RCL, tCL, s, regulation, regulation_weight, verborse);
77+
writeSim3(resFileName, RCL, tCL, s);
78+
std::cout << "Result of Hand-eye Calibration saved to " << resFileName << std::endl;
79+
std::tie(RCL,tCL,s) = HECalibRobustKernelg2o(vmTwc, vmTwl, RCL, tCL, s, robust_kernel_size, regulation, regulation_weight, verborse);
6680
std::cout << "Robust Kernel Hand-eye Calibration with Regulation:\n";
6781
std::cout << "Rotation: \n" << RCL << std::endl;
6882
std::cout << "Translation: \n" << tCL << std::endl;
6983
std::cout << "scale :" << s << std::endl;
70-
writeSim3(resFileName, RCL, tCL, s);
84+
writeSim3(resRBFileName, RCL, tCL, s);
7185

72-
std::cout << "Result of Hand-eye Calibration saved to " << resFileName << std::endl;
86+
std::cout << "Result of Hand-eye Calibration saved to " << resRBFileName << std::endl;
7387
std::tie(RCL,tCL,s) = HECalibLineProcessg2o(vmTwc, vmTwl, RCL, tCL, s, inner_iter, init_mu, divide_factor, min_mu, ex_iter, regulation, regulation_weight, verborse);
7488
std::cout << "Line Process Hand-eye Calibration:\n";
7589
std::cout << "Rotation: \n" << RCL << std::endl;

src/examples/iba_calib_plane2.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ void BuildProblem(const std::vector<VecVector3d> &PointClouds, const std::vector
168168
if(u1_list.size() == 0)
169169
continue; // Should Not Run into
170170
ceres::LossFunction *loss_function = new ceres::HuberLoss(iba_params.robust_kernel_delta);
171-
ceres::CostFunction *cost_function = IBA_PlaneFactor::Create(pKF->fx, pKF->fy, pKF->cx, pKF->cy, u0, v0,
171+
ceres::CostFunction *cost_function = IBA_PlaneFactor::Create(H, W, pKF->fx, pKF->fy, pKF->cx, pKF->cy, u0, v0,
172172
u1_list, v1_list, R_list, t_list, p0, n0);
173173
#pragma omp critical
174174
{

src/examples/iba_global.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class IBAGlobalParams{
4848
int PointCloudskip = 1;
4949
bool PointCloudOnlyPositiveX = false;
5050
int max_bbeval = 200;
51+
double valid_rate = 0.5;
5152
bool verborse = true;
5253
bool use_plane = true;
5354
};
@@ -90,7 +91,7 @@ void FindProjectCorrespondences(const VecVector3d &points, const ORB_SLAM2::KeyF
9091
std::vector<double> sq_dist(num_closest, std::numeric_limits<double>::max());
9192
nanoflann::KNNResultSet<double, IndexType> resultSet(num_closest);
9293
resultSet.init(indices.data(), sq_dist.data());
93-
kdtree->index->findNeighbors(resultSet, vKeyUnEigen[i].data(), nanoflann::SearchParameters(0.0F, true));
94+
kdtree->index->findNeighbors(resultSet, vKeyUnEigen[i].data(), nanoflann::SearchParameters());
9495
if(resultSet.size() > 0 && sq_dist[0] <= max_corr_dist * max_corr_dist)
9596
corrset.push_back(std::make_pair(i, ProjectIndex[indices[0]]));
9697
}
@@ -328,14 +329,19 @@ std::tuple<double, double, double, int, int> BAError(
328329
}
329330
}
330331
}
331-
assert(valid_cnt_3d_2d > 0 && valid_cnt_3d_3d > 0);
332-
corr_3d_2d_err /= valid_cnt_3d_2d;
333-
corr_3d_3d_err /= valid_cnt_3d_3d;
332+
if(valid_cnt_3d_2d==0 && iba_params.err_weight[0] > 1e-10)
333+
corr_3d_2d_err = std::numeric_limits<double>::max();
334+
else
335+
corr_3d_2d_err /= valid_cnt_3d_2d;
336+
if(valid_cnt_3d_3d==0 && iba_params.err_weight[1] > 1e-10)
337+
corr_3d_3d_err = std::numeric_limits<double>::max();
338+
else
339+
corr_3d_3d_err /= valid_cnt_3d_3d;
334340
Cval /= Ccnt;
335341
// auto logger = LogEdges(corr_3d_3d_errlist);
336342
// print_map("corr3d_3d:",logger);
337343
if(verborse)
338-
std::printf("plane: %d, point: %d\n", valid_pl_3d_3d, valid_pt_3d_3d);
344+
std::printf("plane: %d, point: %d 3d-2d: %d\n", valid_pl_3d_3d, valid_pt_3d_3d, valid_cnt_3d_2d);
339345
return {corr_3d_2d_err, corr_3d_3d_err, Cval, valid_cnt_3d_2d, cnt_3d_2d};
340346
}
341347

@@ -381,9 +387,11 @@ class BALoss: public NOMAD::Evaluator
381387
std::tie(f1val, f2val, Cval, valid_edge_cnt, edge_cnt) = BAError(xvec, *PointClouds, kdtree_list, *PointCloudPoses, *KFIdMap, *KeyFrames, *iba_params);
382388
NOMAD::Double f = f1val * iba_params->err_weight[0] + f2val * iba_params->err_weight[1];
383389
NOMAD::Double C1 = Cval - iba_params->he_threshold, C2 = -Cval - iba_params->he_threshold; // |Cval| <= he_threshold
390+
NOMAD::Double C3 = iba_params->valid_rate - static_cast<double>(valid_edge_cnt) / (edge_cnt+1);
384391
std::string bbo = f.tostring();
385392
bbo += " " + C1.tostring();
386393
bbo += " " + C2.tostring();
394+
bbo += " " + C3.tostring();
387395
x.setBBO(bbo);
388396
countEval = true;
389397
return true;
@@ -456,9 +464,11 @@ int main(int argc, char** argv){
456464
iba_params.PointCloudskip = io_config["PointCloudskip"].as<int>();
457465
iba_params.PointCloudOnlyPositiveX = io_config["PointCloudOnlyPositiveX"].as<bool>();
458466
iba_params.max_bbeval = runtime_config["max_bbeval"].as<int>();
467+
iba_params.valid_rate = runtime_config["valid_rate"].as<double>();
459468
iba_params.verborse = runtime_config["verborse"].as<bool>();
460469
iba_params.use_plane = runtime_config["use_plane"].as<bool>();
461470
bool use_cache = runtime_config["use_cache"].as<bool>();
471+
bool use_vns = runtime_config["use_vns"].as<bool>();
462472
int seed = runtime_config["seed"].as<int>();
463473
const std::string NomadCacheFile = runtime_config["cacheFile"].as<std::string>();
464474
const double min_mesh = runtime_config["min_mesh"].as<double>();
@@ -553,6 +563,7 @@ int main(int argc, char** argv){
553563
bbOutputTypes.push_back(NOMAD::BBOutputType::OBJ);
554564
bbOutputTypes.push_back(NOMAD::BBOutputType::PB); // Relaxible Constraint |he_err| < delta
555565
bbOutputTypes.push_back(NOMAD::BBOutputType::PB); // Relaxible Constraint
566+
bbOutputTypes.push_back(NOMAD::BBOutputType::PB); // Corr Valid Rate > threshold
556567
nomad_params->set_BB_OUTPUT_TYPE(bbOutputTypes);
557568
NOMAD::ArrayOfDouble nomad_lb(lb), nomad_ub(ub);
558569
nomad_params->set_LOWER_BOUND(nomad_lb);
@@ -566,7 +577,7 @@ int main(int argc, char** argv){
566577
NOMAD::ArrayOfDouble nomad_mesh_minsize(min_mesh_size), nomad_frame_init(init_frame_size);
567578
nomad_params->set_INITIAL_POLL_SIZE(nomad_frame_init);
568579
nomad_params->set_MIN_MESH_SIZE(nomad_mesh_minsize);
569-
nomad_params->setAttributeValue("VNS_MADS_SEARCH",true);
580+
nomad_params->setAttributeValue("VNS_MADS_SEARCH",use_vns);
570581
nomad_params->setAttributeValue("DIRECTION_TYPE",NOMAD::DirectionType::ORTHO_2N);
571582
nomad_params->checkAndComply();
572583
auto ev = std::make_unique<BALoss>(nomad_params->getEvalParams(), nomad_type,

0 commit comments

Comments
 (0)