Я вижу, что проблема в том, как вы используете итераторы.Октро имеет структуру дерева, а используемый вами итератор перемещается по дереву без учета глубины ячеек.
Глубина отсчитывается от корня дерева, поэтому ячейки, которые вы используетев качестве выходных данных отображаются ячейки высокого уровня, которые, как правило, не следует использовать для проверки столкновения из-за их размера (глубина = 1 - это корень дерева, которое содержит 4 ячейки глубиной 2 ... и это продолжаетсярекурсивно до max_depth
, что обычно составляет 16).
Я понимаю, что вы хотите знать, какие листовые ячейки (более мелкие) заняты, и у вас есть один итератор, который может помочь вам сделать это.Вот как я это делаю:
for(OcTree::leaf_iterator it = octree->begin_leafs(), end = octree->end_leafs(); it != end; ++it){
// Fetching the coordinates in octomap-space
std::cout << " x = " << it.getX() << std::endl;
std::cout << " y = " << it.getY() << std::endl;
std::cout << " z = " << it.getZ() << std::endl;
std::cout << " size = " << it.getSize() << std::endl;
std::cout << " depth = " << it.getDepth() << std::endl;
}
}
Преобразование не требуется, xyz уже находятся в глобальных координатах карты.
Примечание: если вам нужно перемещаться только по ячейкам, которые находятся внутриограничивающий прямоугольник, взгляните на методы octree->begin_leafs_bbx()
и end_leafs_bbx()
, чтобы создать свой итератор.Если вам нужно ограничить глубину листьев, я думаю, вы можете сделать это и с помощью этих методов.
Надеюсь, это поможет.С уважением,
Adrián
РЕДАКТИРОВАТЬ: изменил код в ответе из-за ошибки в типе возврата begin_leafs()
.Также отмечено, что begin_leafs()
и end_leafs()
ведут себя так же, как begin()
и end()
в соответствии с API Octomap.