diff --git a/src/processor/processor_visual_odometry.cpp b/src/processor/processor_visual_odometry.cpp index 5db79afa9bde2d410897f2c79b626e0cfb64c532..54c0812e6dccdcf5f5d7ab11ef9ae35e1602a885 100644 --- a/src/processor/processor_visual_odometry.cpp +++ b/src/processor/processor_visual_odometry.cpp @@ -98,7 +98,7 @@ void ProcessorVisualOdometry::preProcess() capture_image_incoming_->setTracksPrev(tracks_init); auto dt_preprocess = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - t1).count(); - std::cout << "dt_preprocess (ms): " << dt_preprocess << std::endl; + WOLF_TRACE( "dt_preprocess (ms): " , dt_preprocess ); return; } @@ -162,13 +162,16 @@ void ProcessorVisualOdometry::preProcess() // detect new KeyPoints in last and track them to incoming //////////////////////////////// size_t n_tracks_origin = tracks_origin_incoming.size(); + WOLF_TRACE("# of tracks: ", n_tracks_origin, "; min # of tracks: ", params_visual_odometry_->min_features_for_keyframe); if (n_tracks_origin < params_visual_odometry_->min_features_for_keyframe){ - std::cout << " Too Few Tracks" << std::endl; + + WOLF_TRACE( "Too Few Tracks. Detecting more keypoints..." ); // Detect new KeyPoints std::vector<cv::KeyPoint> kps_last_new; detector_->detect(img_last, kps_last_new); cv::KeyPointsFilter::retainBest(kps_last_new, params_visual_odometry_->max_new_features); + WOLF_TRACE("Detected ", kps_last_new.size(), " raw keypoints"); // Create a map of wolf KeyPoints to track only the new ones KeyPointsMap mwkps_last_new, mwkps_incoming_new; @@ -176,6 +179,7 @@ void ProcessorVisualOdometry::preProcess() WKeyPoint wkp(cvkp); mwkps_last_new[wkp.getId()] = wkp; } + WOLF_TRACE("Found ", mwkps_last_new.size(), " new keypoints in last"); TracksMap tracks_last_incoming_new = kltTrack(img_last, img_incoming, mwkps_last_new, mwkps_incoming_new); @@ -183,6 +187,7 @@ void ProcessorVisualOdometry::preProcess() // tracks that are not geometrically consistent are removed from tracks_last_incoming_new cv::Mat E; filterWithEssential(mwkps_last_new, mwkps_incoming_new, tracks_last_incoming_new, E); + WOLF_TRACE("Tracked ", mwkps_incoming_new.size(), " new keypoints to incoming"); // Concatenation of old tracks and new tracks // Only keep tracks until it reaches a max nb of tracks @@ -196,6 +201,7 @@ void ProcessorVisualOdometry::preProcess() tracks_last_incoming_filtered[track.first] = track.second; count_new_tracks++; } + WOLF_TRACE("New total : ", n_tracks_origin, " + ", mwkps_incoming_new.size(), " = ", tracks_last_incoming_filtered.size(), " tracks"); // Update captures capture_image_last_->addKeyPoints(mwkps_last_new); @@ -208,7 +214,7 @@ void ProcessorVisualOdometry::preProcess() } auto dt_preprocess = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - t1).count(); - std::cout << "dt_preprocess (ms): " << dt_preprocess << std::endl; + WOLF_TRACE( "dt_preprocess (ms): " , dt_preprocess ); } @@ -221,6 +227,7 @@ unsigned int ProcessorVisualOdometry::processKnown() // Get tracks present at the last capture time (should be the most recent snapshot at this moment) std::list<FeatureBasePtr> tracks_snapshot_last = track_matrix_.snapshotAsList(last_ptr_); + TracksMap tracks_map_li = capture_image_incoming_->getTracksPrev(); for (auto feature_tracked_last: tracks_snapshot_last){ // check if the keypoint in the last capture is in the last->incoming TracksMap stored in the incoming capture FeaturePointImagePtr feat_pi_last = std::dynamic_pointer_cast<FeaturePointImage>(feature_tracked_last); @@ -230,7 +237,7 @@ unsigned int ProcessorVisualOdometry::processKnown() // otherwise we store the pair as a newly detected track (for processNew) TracksMap tracks_map_li = capture_image_incoming_->getTracksPrev(); if (tracks_map_li.count(id_feat_last)){ - // std::cout << "A corresponding track has been found for id_feat_last " << id_feat_last << std::endl; + // WOLF_TRACE("A corresponding track has been found for id_feat_last ", id_feat_last ); auto kp_track_li = tracks_map_li.find(id_feat_last); // create a feature using the corresponding WKeyPoint contained in incoming (hence the "second") auto feat_inco = FeatureBase::emplace<FeaturePointImage>( @@ -246,7 +253,7 @@ unsigned int ProcessorVisualOdometry::processKnown() } } auto dt_processKnown = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - t1).count(); - std::cout << "dt_processKnown (ms): " << dt_processKnown << std::endl; + WOLF_TRACE( "dt_processKnown (ms): " , dt_processKnown ); // return number of successful tracks until incoming return tracks_map_li_matched_.size(); @@ -286,7 +293,7 @@ unsigned int ProcessorVisualOdometry::processNew(const int& _max_features) } auto dt_processNew = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - t1).count(); - std::cout << "dt_processNew (ms): " << dt_processNew << std::endl; + WOLF_TRACE( "dt_processNew (ms): " , dt_processNew ); return counter_new_tracks; } @@ -397,6 +404,9 @@ bool ProcessorVisualOdometry::voteForKeyFrame() const // simple vote based on frame count, should be changed to something that takes into account number of tracks alive, parallax, etc. // vote = vote || ((frame_count_ % 5) == 0); + + vote = vote || incoming_ptr_->getFeatureList().size() < params_visual_odometry_->min_features_for_keyframe; + std::cout << "vote " << vote << std::endl; return vote; } @@ -506,7 +516,7 @@ bool ProcessorVisualOdometry::filterWithEssential(const KeyPointsMap _mwkps_prev p2f_curr, Kcv_, cv::RANSAC, - 0.99, + 0.999, 1.0, cvMask);