fixed issues
parent
01f6ee56e4
commit
45e1fe832d
|
|
@ -203,6 +203,8 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
// Set to true to use SmartProjectionFactor. Otherwise GenericProjectionFactor will be used
|
// Set to true to use SmartProjectionFactor. Otherwise GenericProjectionFactor will be used
|
||||||
bool useSmartProjectionFactor = true;
|
bool useSmartProjectionFactor = true;
|
||||||
|
bool doTriangulation = true; // we read points initial guess from file or we triangulate
|
||||||
|
|
||||||
bool useLM = true;
|
bool useLM = true;
|
||||||
bool addNoise = false;
|
bool addNoise = false;
|
||||||
|
|
||||||
|
|
@ -221,8 +223,14 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
// Get home directory and dataset
|
// Get home directory and dataset
|
||||||
string HOME = getenv("HOME");
|
string HOME = getenv("HOME");
|
||||||
string input_dir = HOME + "/data/SfM/BAL/Ladybug/";
|
string datasetFile = HOME + "/data/SfM/BAL/Ladybug/problem-1031-110968-pre.txt";
|
||||||
string datasetName = "problem-1031-110968-pre.txt";
|
// string datasetFile = HOME + "/data/SfM/BAL/Ladybug/problem-1723-156502-pre.txt";
|
||||||
|
// string datasetFile = HOME + "/data/SfM/BAL/final/problem-1936-649673-pre.txt";
|
||||||
|
|
||||||
|
// 1936 649673 5213733 problem-1936-649673-pre.txt.bz2
|
||||||
|
// 3068 310854 1653812 problem-3068-310854-pre.txt.bz2
|
||||||
|
// 4585 1324582 9125125 problem-4585-1324582-pre.txt.bz2
|
||||||
|
// 13682 4456117 28987644 problem-13682-4456117-pre.txt.bz2
|
||||||
|
|
||||||
static SharedNoiseModel pixel_sigma(noiseModel::Unit::Create(2));
|
static SharedNoiseModel pixel_sigma(noiseModel::Unit::Create(2));
|
||||||
NonlinearFactorGraph graphSmart, graphProjection;
|
NonlinearFactorGraph graphSmart, graphProjection;
|
||||||
|
|
@ -234,7 +242,7 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
// Read in kitti dataset
|
// Read in kitti dataset
|
||||||
ifstream fin;
|
ifstream fin;
|
||||||
fin.open((input_dir+datasetName).c_str());
|
fin.open((datasetFile).c_str());
|
||||||
if(!fin) {
|
if(!fin) {
|
||||||
cerr << "Could not open dataset" << endl;
|
cerr << "Could not open dataset" << endl;
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
@ -252,7 +260,6 @@ int main(int argc, char** argv) {
|
||||||
boost::shared_ptr<Ordering> ordering(new Ordering());
|
boost::shared_ptr<Ordering> ordering(new Ordering());
|
||||||
|
|
||||||
// std::vector< boost::shared_ptr<Cal3Bundler> > K_cameras; // TODO: uncomment
|
// std::vector< boost::shared_ptr<Cal3Bundler> > K_cameras; // TODO: uncomment
|
||||||
std::vector< boost::shared_ptr<Cal3_S2> > K_cameras;
|
|
||||||
|
|
||||||
// boost::shared_ptr<Cal3Bundler> K(new Cal3Bundler()); // TODO: uncomment
|
// boost::shared_ptr<Cal3Bundler> K(new Cal3Bundler()); // TODO: uncomment
|
||||||
Cal3_S2::shared_ptr K(new Cal3_S2());
|
Cal3_S2::shared_ptr K(new Cal3_S2());
|
||||||
|
|
@ -285,6 +292,8 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
cout << "last measurement: " << r << " " << l << " " << u << " " << v << endl;
|
cout << "last measurement: " << r << " " << l << " " << u << " " << v << endl;
|
||||||
|
|
||||||
|
std::vector< boost::shared_ptr<Cal3_S2> > K_cameras;
|
||||||
|
|
||||||
// create values
|
// create values
|
||||||
for(unsigned int i = 0; i < totNumPoses; i++){
|
for(unsigned int i = 0; i < totNumPoses; i++){
|
||||||
// R,t,f,k1 and k2.
|
// R,t,f,k1 and k2.
|
||||||
|
|
@ -292,6 +301,7 @@ int main(int argc, char** argv) {
|
||||||
// boost::shared_ptr<Cal3Bundler> Kbundler(new Cal3Bundler(f, k1, k2, 0.0, 0.0)); //TODO: uncomment
|
// boost::shared_ptr<Cal3Bundler> Kbundler(new Cal3Bundler(f, k1, k2, 0.0, 0.0)); //TODO: uncomment
|
||||||
// K_cameras.push_back(Kbundler); //TODO: uncomment
|
// K_cameras.push_back(Kbundler); //TODO: uncomment
|
||||||
boost::shared_ptr<Cal3_S2> K_S2(new Cal3_S2(f, f, 0.0, 0.0, 0.0));
|
boost::shared_ptr<Cal3_S2> K_S2(new Cal3_S2(f, f, 0.0, 0.0, 0.0));
|
||||||
|
// cout << "f "<< f << endl;
|
||||||
K_cameras.push_back(K_S2);
|
K_cameras.push_back(K_S2);
|
||||||
Vector3 rotVect(rotx,roty,rotz);
|
Vector3 rotVect(rotx,roty,rotz);
|
||||||
// FORMAT CONVERSION!! R -> R'
|
// FORMAT CONVERSION!! R -> R'
|
||||||
|
|
@ -336,7 +346,7 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
if (useSmartProjectionFactor) {
|
if (useSmartProjectionFactor) {
|
||||||
|
|
||||||
smartCreator.add(L(l), X(r), Point2(u,v), graphSmart);
|
smartCreator.add(L(l), X(r), Point2(u,v), pixel_sigma, K_cameras.at(r), graphSmart);
|
||||||
numLandmarks = smartCreator.getNumLandmarks();
|
numLandmarks = smartCreator.getNumLandmarks();
|
||||||
|
|
||||||
// Add initial pose value if pose does not exist
|
// Add initial pose value if pose does not exist
|
||||||
|
|
@ -363,10 +373,8 @@ int main(int argc, char** argv) {
|
||||||
cout << "---------------------------------------------------------- " << endl;
|
cout << "---------------------------------------------------------- " << endl;
|
||||||
|
|
||||||
if (!useSmartProjectionFactor) {
|
if (!useSmartProjectionFactor) {
|
||||||
bool doTriangulation = false; // we read points initial guess from file
|
|
||||||
projectionCreator.update(graphProjection, loadedValues, graphProjectionValues, doTriangulation);
|
projectionCreator.update(graphProjection, loadedValues, graphProjectionValues, doTriangulation);
|
||||||
|
// graphProjectionValues = loadedValues;
|
||||||
graphProjectionValues = loadedValues;
|
|
||||||
ordering = projectionCreator.getOrdering();
|
ordering = projectionCreator.getOrdering();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -383,13 +391,16 @@ int main(int argc, char** argv) {
|
||||||
optimizeGraphLM(graphSmart, graphSmartValues, result, ordering);
|
optimizeGraphLM(graphSmart, graphSmartValues, result, ordering);
|
||||||
else
|
else
|
||||||
optimizeGraphISAM2(graphSmart, graphSmartValues, result);
|
optimizeGraphISAM2(graphSmart, graphSmartValues, result);
|
||||||
|
|
||||||
|
cout << "Final reprojection error (smart): " << graphSmart.error(result);
|
||||||
} else {
|
} else {
|
||||||
if (useLM)
|
if (useLM)
|
||||||
optimizeGraphLM(graphProjection, graphProjectionValues, result, ordering);
|
optimizeGraphLM(graphProjection, graphProjectionValues, result, ordering);
|
||||||
else
|
else
|
||||||
optimizeGraphISAM2(graphSmart, graphSmartValues, result); // ?
|
optimizeGraphISAM2(graphProjection, graphProjectionValues, result); // ?
|
||||||
|
|
||||||
|
cout << "Final reprojection error (standard): " << graphProjection.error(result);
|
||||||
}
|
}
|
||||||
// *graphSmartValues = result; // we use optimized solution as initial guess for the next one
|
|
||||||
|
|
||||||
optimized = true;
|
optimized = true;
|
||||||
|
|
||||||
|
|
@ -398,6 +409,7 @@ int main(int argc, char** argv) {
|
||||||
cout << "===================================================" << endl;
|
cout << "===================================================" << endl;
|
||||||
writeValues("./", result);
|
writeValues("./", result);
|
||||||
|
|
||||||
// if (1||debug) fprintf(stderr,"%d: %d > %d, %d > %d\n", count, numLandmarks, maxNumLandmarks, numPoses, maxNumPoses);
|
if (debug) cout << numLandmarks << " " << numPoses << " " << optimized << endl;
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -73,8 +73,11 @@ GTSAM_UNSTABLE_EXPORT Point3 triangulatePoint3(const std::vector<Pose3>& poses,
|
||||||
std::vector<Matrix> projection_matrices;
|
std::vector<Matrix> projection_matrices;
|
||||||
|
|
||||||
// construct projection matrices from poses & calibration
|
// construct projection matrices from poses & calibration
|
||||||
BOOST_FOREACH(const Pose3& pose, poses)
|
BOOST_FOREACH(const Pose3& pose, poses){
|
||||||
projection_matrices.push_back( K.K() * sub(pose.inverse().matrix(),0,3,0,4) );
|
projection_matrices.push_back( K.K() * sub(pose.inverse().matrix(),0,3,0,4) );
|
||||||
|
// std::cout << "Calibration i \n" << K.K() << std::endl;
|
||||||
|
// std::cout << "rank_tol i \n" << rank_tol << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
Point3 triangulated_point = triangulateDLT(projection_matrices, measurements, rank_tol);
|
Point3 triangulated_point = triangulateDLT(projection_matrices, measurements, rank_tol);
|
||||||
|
|
||||||
|
|
@ -104,6 +107,8 @@ Point3 triangulatePoint3(const std::vector<Pose3>& poses,
|
||||||
// construct projection matrices from poses & calibration
|
// construct projection matrices from poses & calibration
|
||||||
for(size_t i = 0; i<poses.size(); i++){
|
for(size_t i = 0; i<poses.size(); i++){
|
||||||
projection_matrices.push_back( Ks.at(i)->K() * sub(poses.at(i).inverse().matrix(),0,3,0,4) );
|
projection_matrices.push_back( Ks.at(i)->K() * sub(poses.at(i).inverse().matrix(),0,3,0,4) );
|
||||||
|
// std::cout << "2Calibration i \n" << Ks.at(i)->K() << std::endl;
|
||||||
|
// std::cout << "2rank_tol i \n" << rank_tol << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
Point3 triangulated_point = triangulateDLT(projection_matrices, measurements, rank_tol);
|
Point3 triangulated_point = triangulateDLT(projection_matrices, measurements, rank_tol);
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ namespace gtsam {
|
||||||
|
|
||||||
typedef GenericProjectionFactor<Pose3, Point3, CALIBRATION> ProjectionFactor;
|
typedef GenericProjectionFactor<Pose3, Point3, CALIBRATION> ProjectionFactor;
|
||||||
typedef FastMap<Key, std::vector<boost::shared_ptr<ProjectionFactor> > > ProjectionFactorMap;
|
typedef FastMap<Key, std::vector<boost::shared_ptr<ProjectionFactor> > > ProjectionFactorMap;
|
||||||
|
typedef FastMap<Key, boost::shared_ptr<CALIBRATION> > CalibrationMap;
|
||||||
typedef FastMap<Key, int> OrderingMap;
|
typedef FastMap<Key, int> OrderingMap;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
@ -90,6 +91,12 @@ namespace gtsam {
|
||||||
NonlinearFactorGraph &graph) {
|
NonlinearFactorGraph &graph) {
|
||||||
bool debug = false;
|
bool debug = false;
|
||||||
|
|
||||||
|
// Check if landmark exists in mapping
|
||||||
|
typename CalibrationMap::iterator calfit = keyCalibrationMap.find(poseKey);
|
||||||
|
if (calfit == keyCalibrationMap.end()){
|
||||||
|
keyCalibrationMap.insert( std::make_pair(poseKey, K) );
|
||||||
|
}
|
||||||
|
|
||||||
// Create projection factor
|
// Create projection factor
|
||||||
typename ProjectionFactor::shared_ptr projectionFactor(new ProjectionFactor(measurement, model, poseKey, landmarkKey, K));
|
typename ProjectionFactor::shared_ptr projectionFactor(new ProjectionFactor(measurement, model, poseKey, landmarkKey, K));
|
||||||
|
|
||||||
|
|
@ -167,6 +174,10 @@ namespace gtsam {
|
||||||
else
|
else
|
||||||
std::cout << "Reading initial guess for 3D points from file" << std::endl;
|
std::cout << "Reading initial guess for 3D points from file" << std::endl;
|
||||||
|
|
||||||
|
double rankTolerance=1;
|
||||||
|
|
||||||
|
std::cout << "rankTolerance " << rankTolerance << std::endl;
|
||||||
|
|
||||||
std::vector<boost::shared_ptr<ProjectionFactor> > projectionFactorVector;
|
std::vector<boost::shared_ptr<ProjectionFactor> > projectionFactorVector;
|
||||||
typename std::vector<boost::shared_ptr<ProjectionFactor> >::iterator vfit;
|
typename std::vector<boost::shared_ptr<ProjectionFactor> >::iterator vfit;
|
||||||
Point3 point;
|
Point3 point;
|
||||||
|
|
@ -188,6 +199,7 @@ namespace gtsam {
|
||||||
|
|
||||||
std::vector<Pose3> cameraPoses;
|
std::vector<Pose3> cameraPoses;
|
||||||
std::vector<Point2> measured;
|
std::vector<Point2> measured;
|
||||||
|
typename std::vector< boost::shared_ptr<CALIBRATION> > Ks;
|
||||||
|
|
||||||
// Iterate through projection factors
|
// Iterate through projection factors
|
||||||
for (vfit = projectionFactorVector.begin(); vfit != projectionFactorVector.end(); vfit++) { // for each factors connected to the landmark
|
for (vfit = projectionFactorVector.begin(); vfit != projectionFactorVector.end(); vfit++) { // for each factors connected to the landmark
|
||||||
|
|
@ -196,8 +208,16 @@ namespace gtsam {
|
||||||
if (debug) std::cout << "ProjectionFactor: " << std::endl;
|
if (debug) std::cout << "ProjectionFactor: " << std::endl;
|
||||||
if (debug) (*vfit)->print("ProjectionFactor");
|
if (debug) (*vfit)->print("ProjectionFactor");
|
||||||
|
|
||||||
// Iterate through poses
|
// Iterate through poses // find calibration
|
||||||
cameraPoses.push_back( loadedValues->at<Pose3>((*vfit)->key1() ) ); // get poses connected to the landmark
|
Key poseKey = (*vfit)->key1();
|
||||||
|
typename CalibrationMap::iterator calfit = keyCalibrationMap.find(poseKey);
|
||||||
|
if (calfit == keyCalibrationMap.end()){ // the pose is not there
|
||||||
|
std::cout << "ProjectionFactor: " << std::endl;
|
||||||
|
}else{
|
||||||
|
Ks.push_back(calfit->second);
|
||||||
|
}
|
||||||
|
|
||||||
|
cameraPoses.push_back( loadedValues->at<Pose3>(poseKey) ); // get poses connected to the landmark
|
||||||
measured.push_back( (*vfit)->measured() ); // get measurements of the landmark
|
measured.push_back( (*vfit)->measured() ); // get measurements of the landmark
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -205,7 +225,7 @@ namespace gtsam {
|
||||||
if (doTriangualatePoints){
|
if (doTriangualatePoints){
|
||||||
// std::cout << "Triangulating points " << std::endl;
|
// std::cout << "Triangulating points " << std::endl;
|
||||||
try {
|
try {
|
||||||
point = triangulatePoint3(cameraPoses, measured, *K_);
|
point = triangulatePoint3(cameraPoses, measured, Ks, rankTolerance);
|
||||||
if (debug) std::cout << "Triangulation succeeded: " << point << std::endl;
|
if (debug) std::cout << "Triangulation succeeded: " << point << std::endl;
|
||||||
} catch( TriangulationUnderconstrainedException& e) {
|
} catch( TriangulationUnderconstrainedException& e) {
|
||||||
if (debug) std::cout << "Triangulation failed because of unconstrained exception" << std::endl;
|
if (debug) std::cout << "Triangulation failed because of unconstrained exception" << std::endl;
|
||||||
|
|
@ -272,6 +292,7 @@ namespace gtsam {
|
||||||
std::vector<Key> cameraPoseKeys;
|
std::vector<Key> cameraPoseKeys;
|
||||||
std::vector<Key> landmarkKeys;
|
std::vector<Key> landmarkKeys;
|
||||||
ProjectionFactorMap projectionFactors;
|
ProjectionFactorMap projectionFactors;
|
||||||
|
CalibrationMap keyCalibrationMap;
|
||||||
boost::shared_ptr<Ordering> ordering;
|
boost::shared_ptr<Ordering> ordering;
|
||||||
// orderingMethod: 0 - COLAMD, 1 - landmark first, then COLAMD on poses (constrained ordering)
|
// orderingMethod: 0 - COLAMD, 1 - landmark first, then COLAMD on poses (constrained ordering)
|
||||||
int orderingMethod;
|
int orderingMethod;
|
||||||
|
|
|
||||||
|
|
@ -89,12 +89,14 @@ namespace gtsam {
|
||||||
void add(Key landmarkKey, Key poseKey,
|
void add(Key landmarkKey, Key poseKey,
|
||||||
Point2 measurement,
|
Point2 measurement,
|
||||||
const SharedNoiseModel& model,
|
const SharedNoiseModel& model,
|
||||||
const boost::shared_ptr<CALIBRATION>& K,
|
const boost::shared_ptr<CALIBRATION>& Ki,
|
||||||
NonlinearFactorGraph &graph) {
|
NonlinearFactorGraph &graph) {
|
||||||
|
|
||||||
std::vector<Key> views;
|
std::vector<Key> views;
|
||||||
std::vector<Point2> measurements;
|
std::vector<Point2> measurements;
|
||||||
|
|
||||||
|
// std::cout << "matrix : " << K->K() << std::endl;
|
||||||
|
|
||||||
bool debug = false;
|
bool debug = false;
|
||||||
|
|
||||||
// Check if landmark exists in mapping
|
// Check if landmark exists in mapping
|
||||||
|
|
@ -102,24 +104,31 @@ namespace gtsam {
|
||||||
typename SmartFactorMap::iterator fit = smartFactors.find(landmarkKey);
|
typename SmartFactorMap::iterator fit = smartFactors.find(landmarkKey);
|
||||||
if (fsit != smartFactorStates.end() && fit != smartFactors.end()) {
|
if (fsit != smartFactorStates.end() && fit != smartFactors.end()) {
|
||||||
if (debug) fprintf(stderr,"Adding measurement to existing landmark\n");
|
if (debug) fprintf(stderr,"Adding measurement to existing landmark\n");
|
||||||
|
// (*fit).second->print("before: ");
|
||||||
// Add measurement to smart factor
|
// Add measurement to smart factor
|
||||||
(*fit).second->add(measurement, poseKey, model, K);
|
(*fit).second->add(measurement, poseKey, model, Ki);
|
||||||
|
// (*fit).second->print("after: ");
|
||||||
totalNumMeasurements++;
|
totalNumMeasurements++;
|
||||||
if (debug) (*fit).second->print();
|
if (debug) (*fit).second->print();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (debug) fprintf(stderr,"New landmark (%d,%d)\n", fsit != smartFactorStates.end(), fit != smartFactors.end());
|
if (debug) std::cout <<"landmark " << DefaultKeyFormatter(landmarkKey) << "pose " << DefaultKeyFormatter(poseKey) << std::endl;
|
||||||
|
|
||||||
|
// if (debug) fprintf(stderr,"landmarkKey %d poseKey %d measurement\n", landmarkKey, fit != smartFactors.end());
|
||||||
|
|
||||||
// This is a new landmark, create a new factor and add to mapping
|
// This is a new landmark, create a new factor and add to mapping
|
||||||
boost::shared_ptr<SmartProjectionHessianFactorState> smartFactorState(new SmartProjectionHessianFactorState());
|
boost::shared_ptr<SmartProjectionHessianFactorState> smartFactorState(new SmartProjectionHessianFactorState());
|
||||||
boost::shared_ptr<SmartFactor> smartFactor(new SmartFactor(rankTolerance_, linearizationThreshold_));
|
boost::shared_ptr<SmartFactor> smartFactor(new SmartFactor(rankTolerance_, linearizationThreshold_));
|
||||||
smartFactor->add(measurement, poseKey, model, K);
|
smartFactor->add(measurement, poseKey, model, Ki);
|
||||||
|
// smartFactor->print("created: ");
|
||||||
|
// smartFactor->print(" ");
|
||||||
smartFactorStates.insert( std::make_pair(landmarkKey, smartFactorState) );
|
smartFactorStates.insert( std::make_pair(landmarkKey, smartFactorState) );
|
||||||
smartFactors.insert( std::make_pair(landmarkKey, smartFactor) );
|
smartFactors.insert( std::make_pair(landmarkKey, smartFactor) );
|
||||||
graph.push_back(smartFactor);
|
graph.push_back(smartFactor);
|
||||||
|
|
||||||
|
if (debug) std::cout <<" graph size " << graph.size() << std::endl;
|
||||||
|
|
||||||
numLandmarks++;
|
numLandmarks++;
|
||||||
totalNumMeasurements++;
|
totalNumMeasurements++;
|
||||||
|
|
||||||
|
|
@ -144,6 +153,7 @@ namespace gtsam {
|
||||||
SmartFactorMap smartFactors;
|
SmartFactorMap smartFactors;
|
||||||
|
|
||||||
unsigned int totalNumMeasurements;
|
unsigned int totalNumMeasurements;
|
||||||
|
//landmarkKeys.push_back( L(l) );
|
||||||
unsigned int numLandmarks;
|
unsigned int numLandmarks;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ namespace gtsam {
|
||||||
// default threshold for rank deficient triangulation
|
// default threshold for rank deficient triangulation
|
||||||
static double defaultRankTolerance = 1; // this value may be scenario-dependent and has to be larger in presence of larger noise
|
static double defaultRankTolerance = 1; // this value may be scenario-dependent and has to be larger in presence of larger noise
|
||||||
// if set to true will use the rotation-only version for degenerate cases
|
// if set to true will use the rotation-only version for degenerate cases
|
||||||
static bool manageDegeneracy = true;
|
static bool manageDegeneracy = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Structure for storing some state memory, used to speed up optimization
|
* Structure for storing some state memory, used to speed up optimization
|
||||||
|
|
@ -250,6 +250,10 @@ namespace gtsam {
|
||||||
BOOST_FOREACH(const SharedNoiseModel& noise_i, noise_) {
|
BOOST_FOREACH(const SharedNoiseModel& noise_i, noise_) {
|
||||||
noise_i->print("noise model = ");
|
noise_i->print("noise model = ");
|
||||||
}
|
}
|
||||||
|
BOOST_FOREACH(const boost::shared_ptr<CALIBRATION>& K, K_all_) {
|
||||||
|
K->print("calibration = ");
|
||||||
|
}
|
||||||
|
|
||||||
if(this->body_P_sensor_){
|
if(this->body_P_sensor_){
|
||||||
this->body_P_sensor_->print(" sensor pose in body frame: ");
|
this->body_P_sensor_->print(" sensor pose in body frame: ");
|
||||||
}
|
}
|
||||||
|
|
@ -318,6 +322,7 @@ namespace gtsam {
|
||||||
if (retriangulate) {
|
if (retriangulate) {
|
||||||
// We triangulate the 3D position of the landmark
|
// We triangulate the 3D position of the landmark
|
||||||
try {
|
try {
|
||||||
|
std::cout << "triangulatePoint3 i \n" << rankTolerance << std::endl;
|
||||||
state_->point = triangulatePoint3(cameraPoses, measured_, K_all_, rankTolerance);
|
state_->point = triangulatePoint3(cameraPoses, measured_, K_all_, rankTolerance);
|
||||||
state_->degenerate = false;
|
state_->degenerate = false;
|
||||||
state_->cheiralityException = false;
|
state_->cheiralityException = false;
|
||||||
|
|
@ -521,6 +526,7 @@ namespace gtsam {
|
||||||
}
|
}
|
||||||
|
|
||||||
if(state_->degenerate){
|
if(state_->degenerate){
|
||||||
|
// return 0.0; // TODO: this maybe should be zero?
|
||||||
for(size_t i = 0; i < measured_.size(); i++) {
|
for(size_t i = 0; i < measured_.size(); i++) {
|
||||||
Pose3 pose = cameraPoses.at(i);
|
Pose3 pose = cameraPoses.at(i);
|
||||||
PinholeCamera<CALIBRATION> camera(pose, *K_all_.at(i));
|
PinholeCamera<CALIBRATION> camera(pose, *K_all_.at(i));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue