Program Listing for File MappingThread.cpp¶
↰ Return to documentation for file (lib/SlamSystem/MappingThread.cpp)
#include "MappingThread.h"
#include <g3log/g3log.hpp>
#include <boost/thread/shared_lock_guard.hpp>
#include "GlobalMapping/KeyFrameGraph.h"
#include "Tracking/TrackingReference.h"
#include "SlamSystem/ConstraintSearchThread.h"
#include "SlamSystem/TrackingThread.h"
#include "SlamSystem.h"
#include "util/settings.h"
namespace lsd_slam {
using active_object::Active;
MappingThread::MappingThread( SlamSystem &system, bool threaded )
: relocalizer(),
_system(system ),
_thread( threaded ? Active::createActive() : NULL )
{
LOG(INFO) << "Started Mapping thread";
}
MappingThread::~MappingThread()
{
if( _thread ) delete _thread.release();
// unmappedTrackedFrames.clear();
}
void MappingThread::mapSetImpl( const KeyFrame::SharedPtr &kf, const ImageSet::SharedPtr &set )
{
// TODO. Need code to handle when the queue is growing out of control...
LOG(INFO) << "Mapping set " << set->id() << " onto KeyFrame " << kf->id();
kf->updateDepthFrom( set->refFrame() );
_system.updateDisplayDepthMap();
_system.publishCurrentKeyframe();
}
void MappingThread::createFirstKeyFrame( const Frame::SharedPtr &frame )
{
LOG(WARNING) << "Making " << frame->id() << " into new keyframe!";
KeyFrame::SharedPtr kf( KeyFrame::Create( frame ) );
_system.keyFrameGraph()->addKeyFrame( kf );
_system.trackingThread()->doUseNewKeyFrame( kf );
}
void MappingThread::createNewKeyFrameImpl( const KeyFrame::SharedPtr ¤tKeyFrame, const Frame::SharedPtr &frame )
{
LOG(WARNING) << "Making " << frame->id() << " into new keyframe!";
CHECK( frame->isTrackingParent( currentKeyFrame ) ) << "New keyframe does not track on current keyframe!";
KeyFrame::SharedPtr kf( KeyFrame::PropagateAndCreate( currentKeyFrame, frame ) );
_system.keyFrameGraph()->addKeyFrame( kf );
_system.trackingThread()->doUseNewKeyFrame( kf );
_system.constraintThread()->doCheckNewKeyFrame( kf );
}
// TODO. Not updated post-move_current_keyframe
void MappingThread::mergeOptimizationOffsetImpl()
{
LOG(DEBUG) << "Merging optimization offset";
// lets us put the publishKeyframeGraph outside the mutex lock
bool didUpdate = false;
// if(_optThread->haveUnmergedOptimizationOffset())
{
boost::shared_lock_guard< boost::shared_mutex > pose_lock(_system.poseConsistencyMutex);
boost::shared_lock_guard< boost::shared_mutex > kfLock( _system.keyFrameGraph()->keyframesAllMutex);
for(unsigned int i=0;i<_system.keyFrameGraph()->keyframesAll.size(); i++)
_system.keyFrameGraph()->keyframesAll[i]->frame()->pose->applyPoseGraphOptResult();
// _optThread->clearUnmergedOptimizationOffset();
didUpdate = true;
}
if ( didUpdate ) {
_system.publishKeyframeGraph();
}
optimizationUpdateMerged.notify();
}
//==== Actual meat ====
/* REDUNDANT
bool MappingThread::doMappingIteration()
{
// If there's no keyframe, then give up
if( !(bool)_system.currentKeyFrame() ) {
LOG(INFO) << "Nothing to map: no keyframe";
return false;
}
// TODO: Don't know what circumstances cause this to happens
// if(!doMapping && currentKeyFrame()->idxInKeyframes < 0)
// {
// if(currentKeyFrame()->numMappedOnThisTotal >= MIN_NUM_MAPPED)
// finishCurrentKeyframe();
// else
// discardCurrentKeyframe();
//
// map->invalidate();
// LOGF(INFO, "Finished KF %d as Mapping got disabled!\n",currentKeyFrame()->id());
//
// changeKeyframe(true, true, 1.0f);
// }
//callbackMergeOptimizationOffset();
//addTimingSamples();
// if(dumpMap)
// {
// keyFrameGraph()->dumpMap(packagePath+"/save");
// dumpMap = false;
// }
bool didSomething = true;
// set mappingFrame
if( _system.trackingThread->trackingIsGood() )
{
// TODO: Don't know under what circumstances doMapping = false
// if(!doMapping)
// {
// //printf("tryToChange refframe, lastScore %f!\n", lastTrackingClosenessScore);
// if(_system.trackingThread->lastTrackingClosenessScore > 1)
// changeKeyframe(true, false, _system.trackingThread->lastTrackingClosenessScore * 0.75);
//
// if (displayDepthMap || depthMapScreenshotFlag)
// debugDisplayDepthMap();
//
// return false;
// }
std::shared_ptr< Frame > frame( _newKeyFrame.const_ref() );
if( frame ) {
LOG(INFO) << "Set " << frame->id() << " as new key frame";
finishCurrentKeyframe();
_system.changeKeyframe(frame, false, true, 1.0f);
_newKeyFrame().reset();
} else {
didSomething = updateKeyframe();
}
_system.updateDisplayDepthMap();
LOG(DEBUG) << "Tracking is good, updating key frame, " << (didSomething ? "DID" : "DIDN'T") << " do something";
}
//TODO have not seen this entered before?
else
{
LOG(INFO) << "Tracking is bad";
// invalidate map if it was valid.
if(_system.depthMap()->isValid())
{
if( _system.currentKeyFrame()->numMappedOnThisTotal >= MIN_NUM_MAPPED)
finishCurrentKeyframe();
else
discardCurrentKeyframe();
_system.depthMap()->invalidate();
}
// start relocalizer if it isnt running already
if(!relocalizer.isRunning)
relocalizer.start(_system.keyFrameGraph()->keyframesAll);
// did we find a frame to relocalize with?
if(relocalizer.waitResult(50)) {
// Frame* keyframe;
// int succFrameID;
// SE3 succFrameToKF_init;
// std::shared_ptr<Frame> succFrame;
//
// relocalizer.stop();
// relocalizer.getResult(keyframe, succFrame, succFrameID, succFrameToKF_init);
relocalizer.stop();
RelocalizerResult result( relocalizer.getResult() );
_system.loadNewCurrentKeyframe(result.keyframe);
_system.trackingThread->takeRelocalizeResult( result );
}
}
return didSomething;
}
*/
//
// bool MappingThread::doMappingIterationSet()
// {
//
// // If there's no keyframe, then give up
// if( !(bool)_system.currentKeyFrame() ) {
// LOG(INFO) << "Nothing to map: no keyframe";
// return false;
// }
//
// // TODO: Don't know what circumstances cause this to happens
// // if(!doMapping && currentKeyFrame()->idxInKeyframes < 0)
// // {
// // if(currentKeyFrame()->numMappedOnThisTotal >= MIN_NUM_MAPPED)
// // finishCurrentKeyframe();
// // else
// // discardCurrentKeyframe();
// //
// // map->invalidate();
// // LOGF(INFO, "Finished KF %d as Mapping got disabled!\n",currentKeyFrame()->id());
// //
// // changeKeyframe(true, true, 1.0f);
// // }
//
// //callbackMergeOptimizationOffset();
// //addTimingSamples();
//
// // if(dumpMap)
// // {
// // keyFrameGraph()->dumpMap(packagePath+"/save");
// // dumpMap = false;
// // }
//
// bool didSomething = true;
//
// // set mappingFrame
// if( _system.trackingThread->trackingIsGood() )
// {
// // TODO: Don't know under what circumstances doMapping = false
// // if(!doMapping)
// // {
// // //printf("tryToChange refframe, lastScore %f!\n", lastTrackingClosenessScore);
// // if(_system.trackingThread->lastTrackingClosenessScore > 1)
// // changeKeyframe(true, false, _system.trackingThread->lastTrackingClosenessScore * 0.75);
// //
// // if (displayDepthMap || depthMapScreenshotFlag)
// // debugDisplayDepthMap();
// //
// // return false;
// // }
//
// std::shared_ptr< ImageSet > set( _newImageSet.const_ref() );
// if( set ) {
// LOG(INFO) << "Set " << set->id() << " as new key frame";
// finishCurrentKeyframe();
// _system.changeKeyframe(set->refFrame(), false, true, 1.0f);
//
// _newImageSet().reset();
// } else {
// didSomething = updateImageSet();
// }
//
// _system.updateDisplayDepthMap();
//
// LOG(DEBUG) << "Tracking is good, updating image set frame, " << (didSomething ? "DID" : "DIDN'T") << " do something";
// }
//
// //TODO have not seen this entered before?
//
// else
// {
// LOG(INFO) << "Tracking is bad";
//
// // invalidate map if it was valid.
// if(_system.depthMap()->isValid())
// {
// if( _system.currentKeyFrame()->numMappedOnThisTotal >= MIN_NUM_MAPPED)
// finishCurrentKeyframe();
// else
// discardCurrentKeyframe();
//
// _system.depthMap()->invalidate();
// }
//
// // start relocalizer if it isnt running already
// if(!relocalizer.isRunning)
// relocalizer.start(_system.keyFrameGraph()->keyframesAll);
//
// // did we find a frame to relocalize with?
// if(relocalizer.waitResult(50)) {
//
// // Frame* keyframe;
// // int succFrameID;
// // SE3 succFrameToKF_init;
// // std::shared_ptr<Frame> succFrame;
// //
// // relocalizer.stop();
// // relocalizer.getResult(keyframe, succFrame, succFrameID, succFrameToKF_init);
//
// relocalizer.stop();
// RelocalizerResult result( relocalizer.getResult() );
//
// _system.loadNewCurrentKeyframe(result.keyframe);
//
// _system.trackingThread->takeRelocalizeResult( result, _newImageSet.const_ref() );
// }
// }
//
// return didSomething;
// }
} // namespace lsd_slam