Program Listing for File OptimizationThread.h

Return to documentation for file (lib/SlamSystem/OptimizationThread.h)

#pragma once

#include <mutex>
#include <memory>

#include "active_object/active.h"

#include "util/MovingAverage.h"
#include "util/ThreadMutexObject.h"

namespace lsd_slam {

    class KeyFrameGraph;
    class SlamSystem;

class OptimizationThread {
public:

    // TODO.  Don't like passing reference to Mutex.  Another way to do it?

    OptimizationThread( SlamSystem &system, bool threaded );
    ~OptimizationThread();

    // == Public interfaces to kick off events ==
    void doNewConstraint( void )
    { if( _thread ) _thread->send( std::bind(&OptimizationThread::newConstraintImpl, this) ); }

    void doFinalOptimization( void )
    { finalOptimizationComplete.reset();
        if( _thread ) _thread->send( std::bind(&OptimizationThread::finalOptimizationImpl, this) ); }


    ThreadSynchronizer finalOptimizationComplete;

    // bool haveUnmergedOptimizationOffset( void ) { return _haveUnmergedOptimizationOffset; }
    // void clearUnmergedOptimizationOffset( void )
    // { if( _thread ) _thread->send( std::bind(&OptimizationThread::callbackClearUnmergedOptimizationOffset, this) ); }

    // std::mutex g2oGraphAccessMutex;
    // std::mutex newConstraintMutex;   // Not necessary because doNewConstraint is now imperative?

    MsRateAverage perf;

private:

    std::mutex optimizationThreadMutex;


    void idleImpl( void );
    void newConstraintImpl( void );
    void finalOptimizationImpl( void );
    // void callbackClearUnmergedOptimizationOffset( void ) { _haveUnmergedOptimizationOffset = false; }


    bool optimizationIteration(int itsPerTry, float minChange);

    // Function didn't appear to be called ... (?)
    // void OptimizationThread::optimizeGraph( void );

    // optimization merging. SET in Optimization, merged in Mapping.
    // bool _haveUnmergedOptimizationOffset;

    SlamSystem &_system;

    std::unique_ptr<active_object::ActiveIdle> _thread;

};


}