added computePoints functionality in smartFactorsCreator

release/4.3a0
Luca Carlone 2013-10-19 22:42:51 +00:00
parent 92f0bb64b2
commit a1402018ca
4 changed files with 34 additions and 3 deletions

View File

@ -682,7 +682,6 @@ bool writeBALfromValues(const string& filename, SfM_data &data, Values& values){
if( valuesPoints.size() != data.number_tracks()){ if( valuesPoints.size() != data.number_tracks()){
cout << "writeBALfromValues: different number of points in SfM_data (#points= " << data.number_tracks() cout << "writeBALfromValues: different number of points in SfM_data (#points= " << data.number_tracks()
<<") and values (#points " << valuesPoints.size() << ")!!" << endl; <<") and values (#points " << valuesPoints.size() << ")!!" << endl;
return false;
} }
if(valuesPoints.size() + valuesPoses.size() != values.size()){ if(valuesPoints.size() + valuesPoses.size() != values.size()){
cout << "writeBALfromValues write only poses and points values!!" << endl; cout << "writeBALfromValues write only poses and points values!!" << endl;
@ -703,8 +702,15 @@ bool writeBALfromValues(const string& filename, SfM_data &data, Values& values){
for (size_t j = 0; j < data.number_tracks(); j++){ // for each point for (size_t j = 0; j < data.number_tracks(); j++){ // for each point
Key pointKey = symbol('l',j); Key pointKey = symbol('l',j);
Point3 point = values.at<Point3>(pointKey); if(values.exists(pointKey)){
data.tracks[j].p = point; Point3 point = values.at<Point3>(pointKey);
data.tracks[j].p = point;
}else{
data.tracks[j].r = 1.0;
data.tracks[j].g = 0.0;
data.tracks[j].b = 0.0;
data.tracks[j].p = Point3();
}
} }
return writeBAL(filename, data); return writeBAL(filename, data);

View File

@ -370,6 +370,10 @@ int main(int argc, char** argv) {
cout << "===================================================" << endl; cout << "===================================================" << endl;
// --------------- WRITE OUTPUT TO BAL FILE ---------------------------------------- // --------------- WRITE OUTPUT TO BAL FILE ----------------------------------------
if(useSmartProjectionFactor){
smartCreator.computePoints(result);
}
cout << "- writing results to (BAL) file... " << endl; cout << "- writing results to (BAL) file... " << endl;
std::size_t stringCut1 = datasetFile.rfind("/"); std::size_t stringCut1 = datasetFile.rfind("/");
std::size_t stringCut2 = datasetFile.rfind(".txt"); std::size_t stringCut2 = datasetFile.rfind(".txt");

View File

@ -43,6 +43,22 @@ namespace gtsam {
linearizationThreshold_(linThreshold), body_P_sensor_(body_P_sensor), linearizationThreshold_(linThreshold), body_P_sensor_(body_P_sensor),
totalNumMeasurements(0), numLandmarks(0) {}; totalNumMeasurements(0), numLandmarks(0) {};
void computePoints(Values& values) {
typename SmartFactorMap::iterator fit;
// Check if landmark exists in mapping
for(fit = smartFactors.begin(); fit != smartFactors.end(); fit++) {
Key pointKey = (*fit).first;
Point3 currentPoint;
if((*fit).second->point() && !(*fit).second->isDegenerate()){
currentPoint = *((*fit).second->point());
}else{
currentPoint = Point3(); // if we cannot the smartFactor is degenerate
}
values.insert(pointKey, currentPoint);
}
}
void add(Key landmarkKey, void add(Key landmarkKey,
Key poseKey, Point2 measurement, NonlinearFactorGraph &graph) { Key poseKey, Point2 measurement, NonlinearFactorGraph &graph) {

View File

@ -581,6 +581,11 @@ namespace gtsam {
return K_all_; return K_all_;
} }
/** return the calibration object */
inline bool isDegenerate() const {
return (state_->cheiralityException || state_->degenerate);
}
/** return verbosity */ /** return verbosity */
inline bool verboseCheirality() const { return verboseCheirality_; } inline bool verboseCheirality() const { return verboseCheirality_; }