|
@@ -3932,7 +3932,7 @@ int Optimizer::OptimizeSim3(KeyFrame *pKF1, KeyFrame *pKF2, vector<MapPoint *> &
|
|
int Optimizer::OptimizeSim3(KeyFrame *pKF1, KeyFrame *pKF2, vector<MapPoint *> &vpMatches1, g2o::Sim3 &g2oS12, const float th2,
|
|
int Optimizer::OptimizeSim3(KeyFrame *pKF1, KeyFrame *pKF2, vector<MapPoint *> &vpMatches1, g2o::Sim3 &g2oS12, const float th2,
|
|
const bool bFixScale, Eigen::Matrix<double,7,7> &mAcumHessian, const bool bAllPoints)
|
|
const bool bFixScale, Eigen::Matrix<double,7,7> &mAcumHessian, const bool bAllPoints)
|
|
{
|
|
{
|
|
- bool bShowImages = false;
|
|
|
|
|
|
+ // bool bShowImages = false;
|
|
|
|
|
|
g2o::SparseOptimizer optimizer;
|
|
g2o::SparseOptimizer optimizer;
|
|
g2o::BlockSolverX::LinearSolverType * linearSolver;
|
|
g2o::BlockSolverX::LinearSolverType * linearSolver;
|
|
@@ -3945,8 +3945,8 @@ int Optimizer::OptimizeSim3(KeyFrame *pKF1, KeyFrame *pKF2, vector<MapPoint *> &
|
|
optimizer.setAlgorithm(solver);
|
|
optimizer.setAlgorithm(solver);
|
|
|
|
|
|
// Calibration
|
|
// Calibration
|
|
- const cv::Mat &K1 = pKF1->mK;
|
|
|
|
- const cv::Mat &K2 = pKF2->mK;
|
|
|
|
|
|
+ /*const cv::Mat &K1 = pKF1->mK;
|
|
|
|
+ const cv::Mat &K2 = pKF2->mK;*/
|
|
|
|
|
|
//const cv::Mat &DistCoeff2 = pKF2->mDistCoef;
|
|
//const cv::Mat &DistCoeff2 = pKF2->mDistCoef;
|
|
|
|
|
|
@@ -3979,7 +3979,7 @@ int Optimizer::OptimizeSim3(KeyFrame *pKF1, KeyFrame *pKF2, vector<MapPoint *> &
|
|
vpEdges21.reserve(2*N);
|
|
vpEdges21.reserve(2*N);
|
|
vbIsInKF2.reserve(2*N);
|
|
vbIsInKF2.reserve(2*N);
|
|
|
|
|
|
- float cx1 = K1.at<float>(0,2);
|
|
|
|
|
|
+ /*float cx1 = K1.at<float>(0,2);
|
|
float cy1 = K1.at<float>(1,2);
|
|
float cy1 = K1.at<float>(1,2);
|
|
float fx1 = K1.at<float>(0,0);
|
|
float fx1 = K1.at<float>(0,0);
|
|
float fy1 = K1.at<float>(1,1);
|
|
float fy1 = K1.at<float>(1,1);
|
|
@@ -3987,7 +3987,7 @@ int Optimizer::OptimizeSim3(KeyFrame *pKF1, KeyFrame *pKF2, vector<MapPoint *> &
|
|
float cx2 = K2.at<float>(0,2);
|
|
float cx2 = K2.at<float>(0,2);
|
|
float cy2 = K2.at<float>(1,2);
|
|
float cy2 = K2.at<float>(1,2);
|
|
float fx2 = K2.at<float>(0,0);
|
|
float fx2 = K2.at<float>(0,0);
|
|
- float fy2 = K2.at<float>(1,1);
|
|
|
|
|
|
+ float fy2 = K2.at<float>(1,1);*/
|
|
|
|
|
|
const float deltaHuber = sqrt(th2);
|
|
const float deltaHuber = sqrt(th2);
|
|
|
|
|
|
@@ -3997,10 +3997,10 @@ int Optimizer::OptimizeSim3(KeyFrame *pKF1, KeyFrame *pKF2, vector<MapPoint *> &
|
|
int nOutKF2 = 0;
|
|
int nOutKF2 = 0;
|
|
int nMatchWithoutMP = 0;
|
|
int nMatchWithoutMP = 0;
|
|
|
|
|
|
- cv::Mat img1 = cv::imread(pKF1->mNameFile, CV_LOAD_IMAGE_UNCHANGED);
|
|
|
|
|
|
+ /*cv::Mat img1 = cv::imread(pKF1->mNameFile, CV_LOAD_IMAGE_UNCHANGED);
|
|
cv::cvtColor(img1, img1, CV_GRAY2BGR);
|
|
cv::cvtColor(img1, img1, CV_GRAY2BGR);
|
|
cv::Mat img2 = cv::imread(pKF2->mNameFile, CV_LOAD_IMAGE_UNCHANGED);
|
|
cv::Mat img2 = cv::imread(pKF2->mNameFile, CV_LOAD_IMAGE_UNCHANGED);
|
|
- cv::cvtColor(img2, img2, CV_GRAY2BGR);
|
|
|
|
|
|
+ cv::cvtColor(img2, img2, CV_GRAY2BGR);*/
|
|
|
|
|
|
vector<int> vIdsOnlyInKF2;
|
|
vector<int> vIdsOnlyInKF2;
|
|
|
|
|
|
@@ -4067,7 +4067,7 @@ int Optimizer::OptimizeSim3(KeyFrame *pKF1, KeyFrame *pKF2, vector<MapPoint *> &
|
|
vIdsOnlyInKF2.push_back(id2);
|
|
vIdsOnlyInKF2.push_back(id2);
|
|
}
|
|
}
|
|
|
|
|
|
- cv::circle(img1, pKF1->mvKeys[i].pt, 1, cv::Scalar(0, 0, 255));
|
|
|
|
|
|
+ // cv::circle(img1, pKF1->mvKeys[i].pt, 1, cv::Scalar(0, 0, 255));
|
|
|
|
|
|
continue;
|
|
continue;
|
|
|
|
|
|
@@ -4113,7 +4113,7 @@ int Optimizer::OptimizeSim3(KeyFrame *pKF1, KeyFrame *pKF2, vector<MapPoint *> &
|
|
inKF1 = false;
|
|
inKF1 = false;
|
|
}*/
|
|
}*/
|
|
|
|
|
|
- if(bShowImages) //TODO test to project the matched points in the image
|
|
|
|
|
|
+ /*if(bShowImages) //TODO test to project the matched points in the image
|
|
{
|
|
{
|
|
cv::circle(img1, pKF1->mvKeys[i].pt, 1, cv::Scalar(0, 255, 0));
|
|
cv::circle(img1, pKF1->mvKeys[i].pt, 1, cv::Scalar(0, 255, 0));
|
|
|
|
|
|
@@ -4127,7 +4127,7 @@ int Optimizer::OptimizeSim3(KeyFrame *pKF1, KeyFrame *pKF2, vector<MapPoint *> &
|
|
|
|
|
|
cv::Point2f ptProjPoint(x, y);
|
|
cv::Point2f ptProjPoint(x, y);
|
|
cv::line(img1, pKF1->mvKeys[i].pt, ptProjPoint, cv::Scalar(255, 0, 0), 1);
|
|
cv::line(img1, pKF1->mvKeys[i].pt, ptProjPoint, cv::Scalar(255, 0, 0), 1);
|
|
- }
|
|
|
|
|
|
+ }*/
|
|
|
|
|
|
|
|
|
|
e12->setVertex(0, dynamic_cast<g2o::OptimizableGraph::Vertex*>(optimizer.vertex(id2)));
|
|
e12->setVertex(0, dynamic_cast<g2o::OptimizableGraph::Vertex*>(optimizer.vertex(id2)));
|
|
@@ -4153,10 +4153,10 @@ int Optimizer::OptimizeSim3(KeyFrame *pKF1, KeyFrame *pKF2, vector<MapPoint *> &
|
|
|
|
|
|
nInKF2++;
|
|
nInKF2++;
|
|
|
|
|
|
- if(bShowImages)
|
|
|
|
|
|
+ /*if(bShowImages)
|
|
{
|
|
{
|
|
cv::circle(img2, pKF2->mvKeys[i2].pt, 1, cv::Scalar(0, 255, 0));
|
|
cv::circle(img2, pKF2->mvKeys[i2].pt, 1, cv::Scalar(0, 255, 0));
|
|
- }
|
|
|
|
|
|
+ }*/
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
@@ -4180,10 +4180,10 @@ int Optimizer::OptimizeSim3(KeyFrame *pKF1, KeyFrame *pKF2, vector<MapPoint *> &
|
|
inKF2 = false;
|
|
inKF2 = false;
|
|
nOutKF2++;
|
|
nOutKF2++;
|
|
|
|
|
|
- if(bShowImages)
|
|
|
|
|
|
+ /*if(bShowImages)
|
|
{
|
|
{
|
|
cv::circle(img2, kpUn2.pt, 1, cv::Scalar(0, 0, 255));
|
|
cv::circle(img2, kpUn2.pt, 1, cv::Scalar(0, 0, 255));
|
|
- }
|
|
|
|
|
|
+ }*/
|
|
|
|
|
|
//TODO print projection, because all of them become in outliers
|
|
//TODO print projection, because all of them become in outliers
|
|
|
|
|
|
@@ -4201,7 +4201,7 @@ int Optimizer::OptimizeSim3(KeyFrame *pKF1, KeyFrame *pKF2, vector<MapPoint *> &
|
|
Eigen::Matrix<double,3,1> eigP3D2c = g2oS12.inverse().map(eigP3D1c);
|
|
Eigen::Matrix<double,3,1> eigP3D2c = g2oS12.inverse().map(eigP3D1c);
|
|
cv::Mat cvP3D2c = Converter::toCvMat(eigP3D2c);
|
|
cv::Mat cvP3D2c = Converter::toCvMat(eigP3D2c);
|
|
|
|
|
|
- float invz = 1/cvP3D2c.at<float>(2);
|
|
|
|
|
|
+ /*float invz = 1/cvP3D2c.at<float>(2);
|
|
float x = fx2 * cvP3D2c.at<float>(0)*invz + cx2;
|
|
float x = fx2 * cvP3D2c.at<float>(0)*invz + cx2;
|
|
float y = fy2 * cvP3D2c.at<float>(1)*invz + cy2;
|
|
float y = fy2 * cvP3D2c.at<float>(1)*invz + cy2;
|
|
|
|
|
|
@@ -4209,7 +4209,7 @@ int Optimizer::OptimizeSim3(KeyFrame *pKF1, KeyFrame *pKF2, vector<MapPoint *> &
|
|
{
|
|
{
|
|
cv::Point2f ptProjPoint(x, y);
|
|
cv::Point2f ptProjPoint(x, y);
|
|
cv::line(img2, kpUn2.pt, ptProjPoint, cv::Scalar(255, 0, 0), 1);
|
|
cv::line(img2, kpUn2.pt, ptProjPoint, cv::Scalar(255, 0, 0), 1);
|
|
- }
|
|
|
|
|
|
+ }*/
|
|
}
|
|
}
|
|
|
|
|
|
ORB_SLAM3::EdgeInverseSim3ProjectXYZ* e21 = new ORB_SLAM3::EdgeInverseSim3ProjectXYZ();
|
|
ORB_SLAM3::EdgeInverseSim3ProjectXYZ* e21 = new ORB_SLAM3::EdgeInverseSim3ProjectXYZ();
|
|
@@ -4269,13 +4269,13 @@ int Optimizer::OptimizeSim3(KeyFrame *pKF1, KeyFrame *pKF2, vector<MapPoint *> &
|
|
e12->setRobustKernel(0);
|
|
e12->setRobustKernel(0);
|
|
e21->setRobustKernel(0);
|
|
e21->setRobustKernel(0);
|
|
}
|
|
}
|
|
- if(bShowImages)
|
|
|
|
|
|
+ /*if(bShowImages)
|
|
{
|
|
{
|
|
string pathImg1 = "./test_OptSim3/KF_" + to_string(pKF1->mnId) + "_Main.jpg";
|
|
string pathImg1 = "./test_OptSim3/KF_" + to_string(pKF1->mnId) + "_Main.jpg";
|
|
cv::imwrite(pathImg1, img1);
|
|
cv::imwrite(pathImg1, img1);
|
|
string pathImg2 = "./test_OptSim3/KF_" + to_string(pKF1->mnId) + "_Matched.jpg";
|
|
string pathImg2 = "./test_OptSim3/KF_" + to_string(pKF1->mnId) + "_Matched.jpg";
|
|
cv::imwrite(pathImg2, img2);
|
|
cv::imwrite(pathImg2, img2);
|
|
- }
|
|
|
|
|
|
+ }*/
|
|
|
|
|
|
Verbose::PrintMess("Sim3: First Opt -> Correspondences: " + to_string(nCorrespondences) + "; nBad: " + to_string(nBad) + "; nBadOutKF2: " + to_string(nBadOutKF2), Verbose::VERBOSITY_DEBUG);
|
|
Verbose::PrintMess("Sim3: First Opt -> Correspondences: " + to_string(nCorrespondences) + "; nBad: " + to_string(nBad) + "; nBadOutKF2: " + to_string(nBadOutKF2), Verbose::VERBOSITY_DEBUG);
|
|
|
|
|
|
@@ -5388,6 +5388,7 @@ void Optimizer::InertialOptimization(Map *pMap, Eigen::Matrix3d &Rwg, double &sc
|
|
vpei.reserve(vpKFs.size());
|
|
vpei.reserve(vpKFs.size());
|
|
vector<pair<KeyFrame*,KeyFrame*> > vppUsedKF;
|
|
vector<pair<KeyFrame*,KeyFrame*> > vppUsedKF;
|
|
vppUsedKF.reserve(vpKFs.size());
|
|
vppUsedKF.reserve(vpKFs.size());
|
|
|
|
+ std::cout << "build optimization graph" << std::endl;
|
|
|
|
|
|
for(size_t i=0;i<vpKFs.size();i++)
|
|
for(size_t i=0;i<vpKFs.size();i++)
|
|
{
|
|
{
|
|
@@ -5397,6 +5398,8 @@ void Optimizer::InertialOptimization(Map *pMap, Eigen::Matrix3d &Rwg, double &sc
|
|
{
|
|
{
|
|
if(pKFi->isBad() || pKFi->mPrevKF->mnId>maxKFid)
|
|
if(pKFi->isBad() || pKFi->mPrevKF->mnId>maxKFid)
|
|
continue;
|
|
continue;
|
|
|
|
+ if(!pKFi->mpImuPreintegrated)
|
|
|
|
+ std::cout << "Not preintegrated measurement" << std::endl;
|
|
|
|
|
|
pKFi->mpImuPreintegrated->SetNewBias(pKFi->mPrevKF->GetImuBias());
|
|
pKFi->mpImuPreintegrated->SetNewBias(pKFi->mPrevKF->GetImuBias());
|
|
g2o::HyperGraph::Vertex* VP1 = optimizer.vertex(pKFi->mPrevKF->mnId);
|
|
g2o::HyperGraph::Vertex* VP1 = optimizer.vertex(pKFi->mPrevKF->mnId);
|
|
@@ -5434,9 +5437,13 @@ void Optimizer::InertialOptimization(Map *pMap, Eigen::Matrix3d &Rwg, double &sc
|
|
// Compute error for different scales
|
|
// Compute error for different scales
|
|
std::set<g2o::HyperGraph::Edge*> setEdges = optimizer.edges();
|
|
std::set<g2o::HyperGraph::Edge*> setEdges = optimizer.edges();
|
|
|
|
|
|
|
|
+ std::cout << "start optimization" << std::endl;
|
|
optimizer.setVerbose(false);
|
|
optimizer.setVerbose(false);
|
|
optimizer.initializeOptimization();
|
|
optimizer.initializeOptimization();
|
|
optimizer.optimize(its);
|
|
optimizer.optimize(its);
|
|
|
|
+
|
|
|
|
+ std::cout << "end optimization" << std::endl;
|
|
|
|
+
|
|
scale = VS->estimate();
|
|
scale = VS->estimate();
|
|
|
|
|
|
// Recover optimized data
|
|
// Recover optimized data
|
|
@@ -5456,6 +5463,8 @@ void Optimizer::InertialOptimization(Map *pMap, Eigen::Matrix3d &Rwg, double &sc
|
|
cv::Mat cvbg = Converter::toCvMat(bg);
|
|
cv::Mat cvbg = Converter::toCvMat(bg);
|
|
|
|
|
|
//Keyframes velocities and biases
|
|
//Keyframes velocities and biases
|
|
|
|
+ std::cout << "update Keyframes velocities and biases" << std::endl;
|
|
|
|
+
|
|
const int N = vpKFs.size();
|
|
const int N = vpKFs.size();
|
|
for(size_t i=0; i<N; i++)
|
|
for(size_t i=0; i<N; i++)
|
|
{
|
|
{
|