Точность преобразования ICP зависит от первоначального перевода - PullRequest
0 голосов
/ 13 февраля 2020

Всем доброго времени суток,

Я строил конвейер восприятия облака точек для своего робота при моделировании с использованием библиотеки облаков точек (PCL) и, в частности, модуля итеративной ближайшей точки (ICP). У меня возникают трудности с получением правильной матрицы преобразования из PCL ICP. Сначала я думал, что это что-то с моими конкретными облаками точек или моим кодом, но то же самое происходит с использованием учебного кода и облака точек.

В качестве минимального рабочего примера я скопировал Интерактивный код ICP , скомпилировал и использовал файл monkey.ply , и он работает должным образом. Однако, когда я изменяю только трансляционную составляющую преобразования от начального значения в уроке от t = <0,0, 0,0, 0,4> до t = <1,0, 1,0, 0,0> матрица преобразования выходного сигнала ICP выключена как минимум на 0,2 по каждой оси, включая непереведенную ось Z.

Есть ли что-то, чего мне не хватает, когда дело доходит до первоначального перевода между облаками? Существует ли минимальный перевод между облаками для работы ICP?

См. Вывод ниже, используя файл monkey.ply , я сократил вывод, чтобы он стал более читабельным:

КОД, КОПИРОВАННЫЙ ИЗ интерактивной_icp. cpp

Applying this rigid transformation to: cloud_in -> cloud_icp
Rotation matrix :
     |  0.924 -0.383  0.000 | 
R =  |  0.383  0.924  0.000 | 
     |  0.000  0.000  1.000 | 
Translation vector :
t = <  0.000,  0.000,  0.400 >

Applied 1 ICP iteration(s) in 11 ms

ICP has converged, score is 0.0256485
ICP has converged, score is +2e-02
~
~
ICP has converged, score is +8e-06-> cloud_in
ICP has converged, score is +3e-12-> cloud_in
ICP transformation 14 : cloud_icp -> cloud_in
ICP transformation 15 : cloud_icp -> cloud_in
Rotation matrix :81 -0.036 |
     |  0.924  0.381 -0.036 |
R =  | -0.381  0.924  0.012 |
     |  0.037  0.003  0.999 |
Translation vector :, -0.402
t = <  0.016, -0.006, -0.402 >

ИЗМЕНЕННЫЙ ПЕРЕВОД С t = <0,0, 0,0, 0,4> до t = <1,0, 1,0, 0,0>

Rotation matrix :
     |  0.924 -0.383  0.000 | 
R =  |  0.383  0.924  0.000 | 
     |  0.000  0.000  1.000 | 
Translation vector :
t = <  1.000,  1.000,  0.000 >

Applied 1 ICP iteration(s) in 11 ms

ICP has converged, score is 0.157621
ICP has converged, score is +2e-01
~
~
ICP has converged, score is +8e-09-> cloud_in
ICP has converged, score is +5e-12-> cloud_in
ICP transformation 24 : cloud_icp -> cloud_in
ICP transformation 25 : cloud_icp -> cloud_in
Rotation matrix :75 -0.025 |
     |  0.927  0.375 -0.025 |
R =  | -0.375  0.927  0.029 |
     |  0.034 -0.017  0.999 |
Translation vector :,  0.265
t = < -1.391, -0.471,  0.265 >

Буду признателен за любую помощь!

Махало,

Крис Роу

1 Ответ

0 голосов
/ 14 марта 2020

Если вы новичок в ICP и регистрации в облаке точек, я рекомендую вам прочитать первую главу учебного пособия по siggraph Современные методы и приложения для нежесткой регистрации в реальном времени . Он очень короткий, но содержит полезную информацию.

Вернуться к вашему вопросу.

Есть ли что-то, чего я упускаю, когда дело доходит до первоначального перевода между облаками?

Да, Для ICP необходимо хорошее начальное преобразование, чтобы начать с . И под преобразованием Я имею в виду как перевод, так и вращение.

Основное предположение, сделанное алгоритмом ICP (итеративная ближайшая точка):
Поверхности (или облака точек) находятся в грубом начальном выравнивании. Поэтому соответствия ближайших точек приближенные соответствия истинности земли.

Существует ли минимальный перевод между облаками для работы ICP?

Я полагаю, что нет прямой ответ. Чем ближе, тем лучше.

AFAIK, это также зависит от метода связи данных. (Существует много вариантов исходного ICP. Как описано в документе Эффективные варианты алгоритма ICP ).

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

...