Как получить матрицу проекции из данных одометрии/tf?

Я хотел бы сравнить мои результаты визуальной одометрии с достоверностью, предоставленной набором данных KITTI. Для каждого кадра в земной коре у меня есть проекционная матрица. Например:

1.000000e+00 9.043683e-12 2.326809e-11 1.110223e-16 9.043683e-12 1.000000e+00 2.392370e-10 2.220446e-16 2.326810e-11 2.392370e-10 9.999999e-01 -2.220446e-16

Вот инструкции, предоставленные readme:

Строка i представляет i-е положение системы координат левой камеры (т. е. z, указывающее вперед) с помощью матрицы преобразования 3x4. Матрицы хранятся в порядке выравнивания по строкам (первые записи соответствуют первой строке) и берут точку в i-й системе координат и проецируют ее в первую (=0-ю) систему координат. Следовательно, поступательная часть (вектор 3x1 столбца 4) соответствует положению системы координат левой камеры в i-м кадре по отношению к первому (=0-му) кадру.

Но я не знаю, как получить такие же данные для себя. Что у меня есть для каждого кадра в моем случае:

  • Преобразование Tf из init_camera (фиксированное из (0,0,0)) в левую камеру, которая движется. Итак, у меня есть вектор перевода и вращение кватерниона.
  • Данные одометрии: поза и поворот
  • Параметры калибровки камеры

С этими данными, как я сравниваю с правдой? Поэтому мне нужно найти матрицу проекции из приведенных выше данных, но я не знаю, как это сделать.

В большой картине я хотел бы получить матрицу проекций или узнать, как разложить матрицу проекций, предоставленную земной истиной, чтобы сравнить преобразование с моими данными.

Кто-нибудь может мне помочь ?

Благодарить


person lilouch    schedule 17.04.2015    source источник


Ответы (2)


Вы уверены, что вам нужна проекционная матрица? Проекционная матрица камеры обычно представляет собой матрицу 3x4, которая проецирует (однородные) точки в R3 в (однородные) точки в R2 на изображении. плоскости до некоторого масштаба (см. запись в Википедии). Похоже, вы заинтересованы в сравнении вычисленной визуальной одометрии с истинной одометрией, представленной на веб-сайте KITTI; в этом случае вы будете сравнивать жесткие матрицы преобразования из вашей оценки VO с преобразованием истинности KITTI.

Если вы используете «сырые» наборы данных, «наземная правда» предоставляется в виде записей данных OXTS, то есть объединенных данных IMU и GPS. Эти данные находятся в глобальном фрейме, и потребуется немного больше работы, чтобы сравнить их с вашими данными. Однако похоже, что вы используете данные эталона одометрии; трансформация земли уже находится в кадре левой камеры, что должно немного облегчить задачу (и это то, что я буду обсуждать).

Поскольку вы не указали язык, я буду говорить здесь более широко, но ROS предоставляет инструменты на C++ (tf и Eigen) и Python (transformations.py) для выполнения таких задач, как преобразование из кватерниона в матрицы вращения...

У вас есть t и q, перевод и вращение представлены в виде кватерниона. Вы можете преобразовать кватернион в матрицу вращения (обычно в форме «sxyz») и наоборот. Данные KITTI указаны в виде матрицы 3x4, и это матрица вращения, объединенная с вектором перевода (т.е. 4-й столбец — tgt).

r11 r12 r13 t1
r21 r< sub>22 r23 t2
r31 r32 r 33 т3

Вы можете просто вычислить ошибку перевода, вычислив норму L2: ||t - tgt||. Вычисление ошибки вращения немного сложнее; один из способов сделать это — использовать такую ​​функцию, как QuaternionBase::angularDistance() из Eigen, поскольку оба измерения должны быть в одной и той же системе координат. Для этого вам нужно преобразовать матрицу вращения наземной истины в кватернион, используя либо Eigen, либо библиотеку transforms.py.

Имейте в виду, что это ошибка в кадре одометрии, т. е. ошибка вашей i-й расчетной позы относительно i-й наземной истинной позы в кадре исходной позы. Иногда также полезно сравнивать среднюю ошибку от кадра к кадру, особенно потому, что одометрия имеет тенденцию значительно дрейфовать со временем, даже если алгоритм в среднем относительно точен между кадрами.

В итоге:

  • преобразовать матрицы вращения в кватернионы для вычисления угловой ошибки (обратите внимание на системы координат),
  • и используйте формулу ||t - tgt|| вычислить ошибку перевода.
  • опять же, обратите внимание на свои системы координат.
person grumpy_robot    schedule 24.04.2015
comment
Спасибо @grumpy_robot за этот хороший ответ. Это немного более ясно в моем уме теперь. Итак, если я все понял, мне не нужно преобразовывать результат одометрии в матрицу проекции? Просто нужно преобразовать наземную правду в вращение и перевод, чтобы я мог вычислить ошибку обоих? На самом деле, почему я хотел проекционную матрицу, потому что они предоставляют инструмент в CPP для выполнения оценки с достоверностью, и они говорят в файле readme. Результаты вашей отправки должны быть предоставлены с использованием того же формата данных. - person lilouch; 27.04.2015
comment
Я плохо понимаю это. Имейте в виду, что это ошибка в кадре одометрии, т.е. ошибка вашей i-й предполагаемой позы относительно i-й позы истинной земли в кадре исходной позы. Иногда также полезно сравнивать среднюю ошибку между кадрами. Можешь попытаться объяснить мне еще раз? Вы просто имеете в виду, что ошибка в сравнении с первым кадром, верно? Еще раз спасибо! - person lilouch; 27.04.2015
comment
@lilouch, да, вам просто нужно вывести информацию об одометрии в том же формате (т.е. в виде матрицы 3x4, где передний блок 3x3 — это вращение, а последний столбец — это перевод). Взглянув на исходный код для devkit, если вы предоставите свой вывод в этой форме (т. е. файл с N строками (1 на кадр) и 12 числами в строке), он правильно вычислит ошибку. Что касается второго вопроса, то да, я по существу имею в виду, что ошибка в сравнении с первым кадром, как вы говорите. Я просто сам сделал много ошибок, когда не обратил внимания на правильную систему координат. - person grumpy_robot; 27.04.2015
comment
Спасибо за точность @grumpy_robot. Что касается того, что вы сказали, да, это немного сложно, потому что, по правде говоря, они предоставляют информацию для каждого кадра, но когда я запускаю алгоритм, у меня нет данных для всего кадра. У меня есть отметка времени, но я не уверен в достоверности. Я постараюсь держать вас в курсе! - person lilouch; 28.04.2015

Я не очень разбираюсь в компьютерном зрении, но взгляните на Sensor_msgs/CameraInfo Message и image_geometry::PinholeCameraModel Class< /a> ссылка.

Это должно быть что-то вроде этого:

void imageCallback([...], const sensor_msgs::CameraInfoConstPtr& info_msg) {
  // initialize cam_model with sensor_msgs::CameraInfo
  image_geometry::PinholeCameraModel cam_model_;
  cam_model_.fromCameraInfo(info_msg);

  // get the projection matrix
  cv::Matx34d projection_matrix;
  projection_matrix = cam_model_.projectionMatrix();
}
person alextoind    schedule 18.04.2015