ORBSLAM2 학습노트(2)-입구와 Tracking

9189 단어 slam
ORBSLAM2 학습노트(2)-입구와 Tracking
앞에 쓰다
이 노트는 논리적인 순서에 따라 쓰는 것이고, 생각나는 대로 쓰는 것이며, 학습할 때의 사고 과정에 따라 쓰는 것이며, 다른 블로그의 함수와 기능에 따라 분류하여 소개하는 것과 다르다.이것은 블로거 개인이 생각하는 가장 유창한 방법이다.
프로그램 입구
github의readme에 따라monokitti라는 실행 가능한 파일이 slam을 실행하기 시작했기 때문에monoeuroc은 ORBSLAM의 입구입니다.Mono 열기euroc.cc,main 함수에서 다음과 같은 일을 한 것을 볼 수 있습니다. 먼저 LoadImages 함수를 통해 모든 그림을 불러온 다음에 다음과 같은 명령을 통해 슬램 대상을 실례화했습니다.
 ORB_SLAM2::System SLAM(argv[1],argv[2],ORB_SLAM2::System::MONOCULAR,true);

주의해야 할 것은 이 대상은 실례화할 때도 새로운 사전 대상인 ORBVocabulary를 실례화하였으며, 이후에 Btow를 진행할 때 사용될 것이다.다음에 for 순환을 통해 그림마다 실행
SLAM.TrackMonocular(im,tframe);

SLAM 프로세스가 시작됩니다.이 함수는 먼저 순수 포지셔닝 모드인지 판단합니다. (이 모드에서는 국부 지도를 업데이트하지 않고 기존 그림을 이용하여 포지셔닝만 합니다.)이후
return mpTracker->GrabImageMonocular(im,timestamp);

이 구절은 실제적인 처리를 진행한다.이 함수에 들어가면 이 함수는 그림을 그레이스케일로 바꾸고 프레임을 구성한 다음 트랙 함수에 들어갑니다.이 함수는 mCurrentFrame을 반환합니다.mTcw.clone (), 즉 이 카메라의 위치, 그러나 이 반환 값은 사용되지 않습니다.
Tracking 스레드
초기화
이 스레드는 먼저 초기화됩니다. 두 눈과 RGBD는StereoInitialization 함수를 사용하여 초기화됩니다. 이 스레드는 1.초기 비트(단위 행렬) 설정하기;2. 프레임을 키프레임으로 초기화합니다.3. 피쳐 점을 Mappoint로 구성합니다.그렇다면 특징점은 어디에서 왔을까?프레임을 실례화할 때 ExtractorB 함수를 통해 그림의 특징점을 추출합니다.4. 새로 추가된 Mappoint에 AddObservation(이 점이 어떤 프레임에 관측되었는지 표징하고ComputedistinctiveDescriptors(계산이 가장 좋은 설명자), UpdateNormalAndDepth(평균 관측 방향과 관측 거리의 범위를 계산), 그리고 지도에 이 점을 추가하고 이 프레임에도 이 점을 추가하여 프레임과 점 사이의 인덱스를 만든다.마지막으로localmap에도 이 프레임을 추가하면 초기화가 완료됩니다.단일 목적의 초기화는 다르다. 우선, 안정적인 초기 값을 선택하기 위해 단일 목적의 초기화는 실패할 수 있다.그 다음으로 심도 있는 정보를 얻기 위해 한 항목의 초기화는 두 프레임이 필요하다. 구체적인 절차는 다음과 같다.연속 두 프레임의 특징 포인트>100을 확인하고 초기화에 사용되는 두 프레임을 얻어 초기화기를 구축합니다.2. 두 프레임 사이의 정합점을 찾아 정합점<100을 찾으면 다시 초기화하고 옆으로 이동하여Initialize 함수에 들어가 기초 매트릭스와 단응성 매트릭스를 계산하고 그 중에서 효과가 좋은 것을 선택하여 이 두 프레임의 상대적인 자세와 점운을 회복한다.3. CreateInitialMapMonocular() 함수를 통해 이 두 프레임을 관건적인 프레임으로 지도에 삽입하고 이전에 복원된 점구름을 관건적인 프레임으로 포장하여 지도에 삽입한다.위와 같이 초기화가 완료되었습니다.
프레임 - 프레임 일치
초기화되면 정상적인 추적이 시작됩니다.RBSLAM2는 두 가지 추적 모드가 있는데 그것이 바로 TrackWithMotionModel과 TrackReferenceKeyFrame이다. 전자는 고른 속도 운동 모델을 사용하고 앞의 프레임을 바탕으로 한 거리를 운동하여 이 프레임의 위치에 초치를 설정하고 앞의 프레임과 일치하는 것이다.후자는 키프레임과 일치하도록 이전 프레임의 초기 값을 직접 설정합니다.분명히 전자의 정밀도가 더 높다.따라서 속도모델이 비어 있거나 방금 위치를 다시 정한 경우를 제외하고는 모두 첫 번째 상황을 채택한다.TrackWithMotionModel: 우선, 일치하는 것을 편리하게 하기 위해 이전 프레임에 지도점을 추가하고, 깊이가 비교적 작은 특징점에서 임시 지도점으로 바꾸는 방법입니다. (이 점들은 나중에 삭제됩니다.)이후
mCurrentFrame.SetPose(mVelocity*mLastFrame.mTcw);


현재 프레임의 초기 값을 설정합니다.이후
int nmatches = matcher.SearchByProjection(mCurrentFrame,mLastFrame,th,mSensor==System::MONOCULAR);


다음에 호출할 수 있도록 특징점을 검색하여 현재 프레임에 지도점을 추가합니다
Optimizer::PoseOptimization(&mCurrentFrame);


순위 자세의 최적화를 진행하다.최적화된 후 outlier의 맵을 삭제합니다.이런 방법이 실패하면(예를 들어 지도점이 부족하면) TrackReferenceKeyFrame 방법인 TrackReferenceKeyFrame에 들어갑니다. 우선bow의 방식으로 이 프레임과 참고 프레임을 굵게 일치시켜 둘 사이의 공통된 지도점과 대응하는 특징점을 얻습니다. 그 다음에 상기 프레임의 위치는 초기 위치이고 똑같이 호출됩니다.
Optimizer::PoseOptimization(&mCurrentFrame);


순수한 위치 최적화를 진행하고 현재 프레임의 위치를 얻은 다음outlier의 지도점을 삭제합니다.물론 포지셔닝을 잃어버리면 Relocalization에 들어가 다시 포지셔닝을 하기 시작하는 경우도 있다.
재배치
대체로 재정립과 폐환 검측은 약간 비슷하다.먼저 해야 할 것은 현재 프레임과 비슷한 관건적인 프레임을 검출하는 것이다. 어떻게 검출합니까?여기에도 단어봉투 모형을 썼다.DetectRelocalizationCandidates 함수에서 현재 프레임과 공통 단어가 가장 많은 프레임을 먼저 찾아냅니다. 이 수량은×0.8 임계값으로 임계값보다 높은 후보 프레임 통과
float si = mpVoc->score(F->mBowVec,pKFi->mBowVec);

정합 득점을 계산할 때 가장 높은 득점을 받은 프레임을 재정립할 수 있는 정합 프레임으로 생각할 수 있습니까?ORBSLAM2는 이렇게 하지 않았습니다. 한 프레임의 득점이 불안정하기 때문에 모든 프레임이 공통 보기에서 연결된 권한이 가장 큰 10 프레임을 얻었고 그것을 하나의 전체로 삼아 전체적인 일치 점수를 얻었습니다.마지막으로 그룹의 득점이 일정치보다 크고 그룹 내 득점이 가장 높은 프레임을 DetectRelocalizationCandidates 함수로 되돌려줍니다.후보 프레임을 찾은 후, 우리는 모든 후보 프레임을 현재 프레임과 빠르게 bow 일치시켜 불합격한 프레임을 삭제합니다.이후 각 프레임에 pnp로 자세의 초기값을 가져오고PoseOptimization으로 최적화합니다.만약 내점 수량이 너무 적다면,SearchByProjection을 통해 지도점과 현재 프레임의 일치점을 찾아 내점을 증가시킨 다음 다시 일치시킵니다.일단 일치 품질이 목표에 도달하면 내점수가 50보다 크면 일치에서 물러나 다시 위치를 정했다.
프레임-맵 일치
프레임과 프레임의 일치가 완료되면 참조 프레임을 최신 키프레임으로 업데이트한 후 프레임과 맵의 일치 TrackLocalMap()이 시작됩니다.1. 우선 국지도의 키프레임(현재 프레임과 공통된 지도점이 있는 프레임)을 업데이트하고, 그 다음에 국지도의 키프레임(모든 국지도의 지도점)을 업데이트한다.2. 위에서 얻은 부분적인 지도의 관건을 두루 훑어보고 이때 카메라의 시야에 있는 모든 것을 찾아내지만 이 프레임의 지도점이 되지 않은 점을 찾아내면 다음에SearchByProjection을 사용하여 현재 프레임과 지도점의 일치를 할 수 있다.3. 이전과 마찬가지로 일치 후 위치 자세를 최적화한다.4. 마지막으로 지도점의 정보를 업데이트한다. 주로 그들의 관측 횟수를 늘려 끝을 맺어도 된다.
속도 모델 업데이트
전편까지 우리는 현재 프레임의 위치 최적화 결과를 얻어 이전 프레임의 위치와 비교하면 이때의 속도를 얻을 수 있다.
키프레임 식별 및 삽입
속도 모형을 업데이트한 후, 이전에 도입한 임시 지도점과 일치하기 위해
            if(NeedNewKeyFrame())
                CreateNewKeyFrame();

에서 두 행은 키프레임을 삽입해야 하는지 여부와 키프레임을 실제로 삽입해야 하는지를 각각 판단합니다.순수 포지셔닝 모드나 지도가 폐쇄 검측에 사용되고 있으면 종료합니다.키 프레임 수에 임계값이 있거나 프로그램이 방금 재부팅된 경우 종료합니다.그 다음에 그것은 네 가지 조건으로 판단한다.한동안 키프레임을 삽입하지 않았습니다.맵이 비어 있습니다 3.내점의 수량은 참고 관건 프레임 수량의 일정치보다 작거나 현재 프레임에서 관측한 지도점과 특징점의 비례가 비교적 작다(현재 프레임은 다른 프레임에서 보지 못한 많은 것을 보았다는 것을 의미한다).4 내점이 적고 맞춤형이며 지도점과 특징점의 비례가 정치(3의 약화판)보다 적다는 네 가지 조건 중 123이 하나를 만족시키면 되고 4가 만족해야 하며 계속 판단할 수 있다. 삽입된 관건 프레임 수가 3보다 적으면 판단이 완성되고 삽입된다!삽입
KeyFrame* pKF = new KeyFrame(mCurrentFrame,mpMap,mpKeyFrameDB);

현재 프레임을 관건 프레임으로 구축하고 비단목 상황에 대해 새로운 지도점을 삽입하려면 한도값보다 깊이가 적은 특징점만 지도점으로 삽입됩니다.이후
    mpLocalMapper->InsertKeyFrame(pKF);

부분 지도에 관건 프레임을 삽입합니다.만약 이 때 위치를 정하고 잃어버렸다면,reset입니다.
이상은 트랙킹 라인의 전체 내용입니다. 조리가 뚜렷하다는 것을 알 수 있습니다!

좋은 웹페이지 즐겨찾기