Как оптимизировать функцию с несколькими ограничениями с помощью g2o

В настоящее время я пытаюсь оптимизировать функцию нескольких ограничений для SLAM. Классическая функция оптимизации минимизирует ошибки перепроецирования с помощью g2o, как предложено в https://fzheng.me/2016/03/15/g2o-demo/.

Моя проблема в том, что я не знаю, как изменить этот пример кода g2o для совместной оптимизации двух ограничений (например: 1 ограничение для ошибки перепроецирования и 1 ограничение для инерционной ошибки).

С Уважением,

1 ответ

Решение

Чтобы включить настраиваемое ограничение, вы должны реализовать спецификацию одного подкласса BaseEdge<>.

Существует 3 подкласса BaseEdge<>, которые: BaseUnaryEdge<> (для собственных ограничений), BaseBinaryEdge<> (между 2 узлами) и BaseMultiEdge<> (произвольное количество узлов).

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

В вашем пользовательском классе обязательно реализовать только метод computeError(), но вы также можете реализовать linearizeOplus(), чтобы установить якобиан вручную.

Затем вы можете следовать опубликованному вами образцу кода. Создайте экземпляр оптимизатора, создайте вершины, добавьте ограничения перепроецирования и добавьте свои собственные инерционные ограничения.

Другие вопросы по тегам