Можно ли получить масштабирование расстояния в монокуляре ORB-SLAM2?

Я пытаюсь найти реальное расстояние от камеры до характерных точек ORB с помощью монокуляра ORB SLAM2.

Я вычислил евклидово расстояние между мировыми координатами каждой характерной точки ORB и мировой координатой местоположения камеры текущего ключевого кадра. Этот процесс повторяется для всех кадров. Таким образом, расстояние получается для каждой точки ORB в текущем кадре.

В Viewer.cc

std::vector<MapPoint*> MP = mpTracker->mCurrentFrame.mvpMapPoints;
cv::Mat CC = mpTracker->mCurrentFrame.GetCameraCenter();
mpFrameDrawer->DrawFrame(MP,CC);

В FrameDrawer.cc

cv::Mat FrameDrawer::DrawFrame(std::vector<MapPoint*> DistMapPt, cv::Mat CameraPt)
{
   .
   .
   .

    else if(state==Tracking::OK) //TRACKING
    {
        mnTracked=0;
        mnTrackedVO=0;
        const float r = 5;

        for(int i=0;i<n;i++)
        {
            if(vbVO[i] || vbMap[i])
            {
                cv::Point2f pt1,pt2;
                pt1.x=vCurrentKeys[i].pt.x-r;
                pt1.y=vCurrentKeys[i].pt.y-r;
                pt2.x=vCurrentKeys[i].pt.x+r;
                pt2.y=vCurrentKeys[i].pt.y+r;

                float MapPointDist;
                 MapPointDist = sqrt(pow((DistMapPt[i]->GetWorldPos().at<float>(0)-CameraPt.at<float>(0)),2)+pow((DistMapPt[i]->GetWorldPos().at<float>(1)-CameraPt.at<float>(1)),2)+pow((DistMapPt[i]->GetWorldPos().at<float>(2)-CameraPt.at<float>(2)),2));               

                }
   .
   .
   .

            }


        }
    }

Однако это рассчитанное расстояние не равно и не может быть масштабировано на реальное расстояние. Тот же метод дает относительно точные расстояния в RGBD ORB SLAM2.

Есть ли способ масштабирования расстояний в монокуляре ORB SLAM?


person Swathy    schedule 26.07.2019    source источник
comment
Я не знаком с ORB-SLAM2 и в настоящее время не работаю с SLAM в целом, но из прошлого опыта это должно быть возможно. Вы уверены, что калибровка камеры и IMU в порядке? Потому что обычно это основная проблема, которая приводит к неправильным координатам.   -  person sklott    schedule 26.07.2019
comment
@sklott Параметры камеры и калибровки верны. Я пробовал с последовательностями и параметрами, предоставленными наборами данных KITTI и TUM, также   -  person Swathy    schedule 26.07.2019


Ответы (1)


См. Это сообщение: «ORB-SLAM2 произвольно определяет масштаб при инициализации, поскольку средняя глубина сцены. На практике масштаб меняется каждый раз, когда вы инициализируете orb-slam2. " Невозможно получить правильный масштаб в монокуляре SLAM, так как вы не можете оценить реальную глубину мира по последовательности изображений. Вам нужен другой источник данных, такой как вторая камера, IMU, лидар, одометрия робота или маркер с известными реальными размерами. В случае RGBD глубина известна по датчику глубины, поэтому координаты масштабируются правильно.

person Piotr Siekański    schedule 26.07.2019
comment
В нем говорится, что на практике масштаб меняется каждый раз, когда вы инициализируете orb-slam2. Но когда я попробовал для каждого из кадров в одном исполнении, масштабирование было другим. Так масштаб фиксирован при инициализации или меняется с каждым кадром? - person Swathy; 26.07.2019