/** * This file is part of ORB-SLAM3 * * Copyright (C) 2017-2020 Carlos Campos, Richard Elvira, Juan J. Gómez Rodríguez, José M.M. Montiel and Juan D. Tardós, University of Zaragoza. * Copyright (C) 2014-2016 Raúl Mur-Artal, José M.M. Montiel and Juan D. Tardós, University of Zaragoza. * * ORB-SLAM3 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public * License as published by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ORB-SLAM3 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with ORB-SLAM3. * If not, see . */ #ifndef TRACKING_H #define TRACKING_H #include #include #include #include"Viewer.h" #include"FrameDrawer.h" #include"Atlas.h" #include"LocalMapping.h" #include"LoopClosing.h" #include"Frame.h" #include "ORBVocabulary.h" #include"KeyFrameDatabase.h" #include"ORBextractor.h" #include "Initializer.h" #include "MapDrawer.h" #include "System.h" #include "ImuTypes.h" #include "GeometricCamera.h" #include #include namespace ORB_SLAM3 { class Viewer; class FrameDrawer; class Atlas; class LocalMapping; class LoopClosing; class System; class Tracking { public: Tracking(System* pSys, ORBVocabulary* pVoc, FrameDrawer* pFrameDrawer, MapDrawer* pMapDrawer, Atlas* pAtlas, KeyFrameDatabase* pKFDB, const string &strSettingPath, const int sensor, const string &_nameSeq=std::string()); ~Tracking(); // Parse the config file bool ParseCamParamFile(cv::FileStorage &fSettings); bool ParseORBParamFile(cv::FileStorage &fSettings); bool ParseIMUParamFile(cv::FileStorage &fSettings); // Preprocess the input and call Track(). Extract features and performs stereo matching. cv::Mat GrabImageStereo(const cv::Mat &imRectLeft,const cv::Mat &imRectRight, const double ×tamp, string filename); cv::Mat GrabImageRGBD(const cv::Mat &imRGB,const cv::Mat &imD, const double ×tamp, string filename); cv::Mat GrabImageMonocular(const cv::Mat &im, const double ×tamp, string filename); // cv::Mat GrabImageImuMonocular(const cv::Mat &im, const double ×tamp); void GrabImuData(const IMU::Point &imuMeasurement); void SetLocalMapper(LocalMapping* pLocalMapper); void SetLoopClosing(LoopClosing* pLoopClosing); void SetViewer(Viewer* pViewer); void SetStepByStep(bool bSet); // Load new settings // The focal lenght should be similar or scale prediction will fail when projecting points void ChangeCalibration(const string &strSettingPath); // Use this function if you have deactivated local mapping and you only want to localize the camera. void InformOnlyTracking(const bool &flag); void UpdateFrameIMU(const float s, const IMU::Bias &b, KeyFrame* pCurrentKeyFrame); KeyFrame* GetLastKeyFrame() { return mpLastKeyFrame; } void CreateMapInAtlas(); std::mutex mMutexTracks; //-- void NewDataset(); int GetNumberDataset(); int GetMatchesInliers(); public: // Tracking states // 跟踪状态 enum eTrackingState{ SYSTEM_NOT_READY=-1, //系统没有准备好的状态,一般就是在启动后加载配置文件和词典文件时候的状态 NO_IMAGES_YET=0, //当前无图像 NOT_INITIALIZED=1, //有图像但是没有完成初始化 OK=2, //正常跟踪状态 RECENTLY_LOST=3, //IMU模式:当前地图中的KF>10,且丢失时间<5秒。纯视觉模式没有该状态 LOST=4, //IMU模式:当前帧跟丢超过5s。纯视觉模式:重定位失败 OK_KLT=5 }; eTrackingState mState; eTrackingState mLastProcessedState; // Input sensor int mSensor; // Current Frame Frame mCurrentFrame; Frame mLastFrame; cv::Mat mImGray; // Initialization Variables (Monocular) std::vector mvIniLastMatches; std::vector mvIniMatches; std::vector mvbPrevMatched; std::vector mvIniP3D; Frame mInitialFrame; // Lists used to recover the full camera trajectory at the end of the execution. // Basically we store the reference keyframe for each frame and its relative transformation list mlRelativeFramePoses; list mlpReferences; list mlFrameTimes; list mlbLost; // frames with estimated pose int mTrackedFr; bool mbStep; // True if local mapping is deactivated and we are performing only localization bool mbOnlyTracking; void Reset(bool bLocMap = false); void ResetActiveMap(bool bLocMap = false); float mMeanTrack; bool mbInitWith3KFs; double t0; // time-stamp of first read frame double t0vis; // time-stamp of first inserted keyframe double t0IMU; // time-stamp of IMU initialization vector GetLocalMapMPS(); //TEST-- bool mbNeedRectify; //cv::Mat M1l, M2l; //cv::Mat M1r, M2r; bool mbWriteStats; protected: // Main tracking function. It is independent of the input sensor. void Track(); // Map initialization for stereo and RGB-D void StereoInitialization(); // Map initialization for monocular void MonocularInitialization(); void CreateNewMapPoints(); cv::Mat ComputeF12(KeyFrame *&pKF1, KeyFrame *&pKF2); void CreateInitialMapMonocular(); void CheckReplacedInLastFrame(); bool TrackReferenceKeyFrame(); void UpdateLastFrame(); bool TrackWithMotionModel(); bool PredictStateIMU(); bool Relocalization(); void UpdateLocalMap(); void UpdateLocalPoints(); void UpdateLocalKeyFrames(); bool TrackLocalMap(); bool TrackLocalMap_old(); void SearchLocalPoints(); bool NeedNewKeyFrame(); void CreateNewKeyFrame(); // Perform preintegration from last frame void PreintegrateIMU(); // Reset IMU biases and compute frame velocity void ResetFrameIMU(); void ComputeGyroBias(const vector &vpFs, float &bwx, float &bwy, float &bwz); void ComputeVelocitiesAccBias(const vector &vpFs, float &bax, float &bay, float &baz); bool mbMapUpdated; // Imu preintegration from last frame IMU::Preintegrated *mpImuPreintegratedFromLastKF; // Queue of IMU measurements between frames std::list mlQueueImuData; // Vector of IMU measurements from previous to current frame (to be filled by PreintegrateIMU) std::vector mvImuFromLastFrame; std::mutex mMutexImuQueue; // Imu calibration parameters IMU::Calib *mpImuCalib; // Last Bias Estimation (at keyframe creation) IMU::Bias mLastBias; // In case of performing only localization, this flag is true when there are no matches to // points in the map. Still tracking will continue if there are enough matches with temporal points. // In that case we are doing visual odometry. The system will try to do relocalization to recover // "zero-drift" localization to the map. bool mbVO; //Other Thread Pointers LocalMapping* mpLocalMapper; LoopClosing* mpLoopClosing; //ORB ORBextractor* mpORBextractorLeft, *mpORBextractorRight; ORBextractor* mpIniORBextractor; //BoW ORBVocabulary* mpORBVocabulary; KeyFrameDatabase* mpKeyFrameDB; // Initalization (only for monocular) Initializer* mpInitializer; bool mbSetInit; //Local Map KeyFrame* mpReferenceKF; std::vector mvpLocalKeyFrames; std::vector mvpLocalMapPoints; // System System* mpSystem; //Drawers Viewer* mpViewer; FrameDrawer* mpFrameDrawer; MapDrawer* mpMapDrawer; bool bStepByStep; //Atlas Atlas* mpAtlas; //Calibration matrix cv::Mat mK; cv::Mat mDistCoef; float mbf; //New KeyFrame rules (according to fps) int mMinFrames; int mMaxFrames; int mnFirstImuFrameId; // 经过多少帧后可以重置IMU,一般设置为和帧率相同,对应的时间是1s int mnFramesToResetIMU; // Threshold close/far points // Points seen as close by the stereo/RGBD sensor are considered reliable // and inserted from just one frame. Far points requiere a match in two keyframes. float mThDepth; // For RGB-D inputs only. For some datasets (e.g. TUM) the depthmap values are scaled. float mDepthMapFactor; //Current matches in frame int mnMatchesInliers; //Last Frame, KeyFrame and Relocalisation Info KeyFrame* mpLastKeyFrame; unsigned int mnLastKeyFrameId; unsigned int mnLastRelocFrameId; double mTimeStampLost; double time_recently_lost; unsigned int mnFirstFrameId; unsigned int mnInitialFrameId; unsigned int mnLastInitFrameId; bool mbCreatedMap; //Motion Model cv::Mat mVelocity; //Color order (true RGB, false BGR, ignored if grayscale) bool mbRGB; list mlpTemporalPoints; //int nMapChangeIndex; int mnNumDataset; ofstream f_track_stats; ofstream f_track_times; double mTime_PreIntIMU; double mTime_PosePred; double mTime_LocalMapTrack; double mTime_NewKF_Dec; GeometricCamera* mpCamera, *mpCamera2; int initID, lastID; cv::Mat mTlr; public: cv::Mat mImRight; }; } //namespace ORB_SLAM #endif // TRACKING_H