Если вы когда-либо имели дело с данными облака точек либо в ROS, либо в PCL, вы могли заметить, что существует два разных типа данных; это PointCloud и PointCloud2. Хотя название можно рассматривать так, как будто оно подразумевает, что PointCloud2 вышел позже, поэтому всем следует прекратить использовать другой. Что ж, это не совсем неверно, но это не очень мудрый способ их восприятия.

О PointCloud

Он упоминается как sensor_msgs::PointCloud в ROS и PointCloud с типом точки в PCL. Они аналогичны друг другу тем, что оба представлены в виде массива (в частности, std::vector) точечных данных. То есть облако точек представляет собой список точек, и каждая точка имеет значения x, y, z (+ возможные необязательные компоненты).

В ROS, как задокументировано здесь, позиция точки имеет тип геометрии_msgs::Point32. Да, это очень ориентированный на ROS тип облака точек, разработчики которого, вероятно, старались соответствовать соглашениям ROS. Если пользователям нужны дополнительные компоненты, кроме xyz (т. е. нормали), они могут использовать поле канала. В PCL пользователям сначала нужно определить тип точечных данных, например, PointXYZ, где точка имеет только значения xyz, PointNormal, где точка имеет xyz и нормали и т. д. После этого они работают практически одинаково.

О PointCloud2

Честно говоря, я не видел необходимости в другом типе данных облака точек, поскольку «список точек» кажется интуитивно понятным и достаточно разумным, чтобы иметь дело с ним в первую очередь. Но судя по всему, PointCloud2 чаще виден в онлайн-сообществах ROS. Должна же быть причина.

Документация PointCloud2 информирует о тех компонентах, которых не было в документации PointCloud. (т. е. row_step, данные и т. д.). По сути, он состоит из метаданных, описывающих структуру данных и данных, короче говоря, данных и всего остального. data — это тип массива, но это НЕ массив данных типа point, а массив 8-битного целого числа, который по размеру будет эквивалентен 1 байту char. Таким образом, data[3] НЕ означает данные точки с индексом 3. Даже один байт не может вместить всю эту информацию! Означает ли это, что мы не можем получить доступ к точечным данным по точечным индексам? Мы по-прежнему можем это сделать, но для этого нам потребуются некоторые хитрости, такие как восстановление данных с плавающими числами из нескольких однобайтовых данных. Серьезно, было так трудно понять, почему более новый тип сложнее использовать. Простая иллюстрация приведена ниже: (обратите внимание, порядок указан в

Наши запрошенные данные все еще находятся в «данных» упорядоченным образом. Разница в том, что в то время как у нас были наши данные в двумерном массиве в PointCloud (массив данных в массиве типа точки), все они хранятся в одномерном массиве «данных» размером 1 байт int в PointCloud2.

Зачем кому-то использовать PointCLoud2

Зная, что управлять типом данных PointCloud на самом деле более интуитивно понятно, может показаться, что PointCloud2 бесполезен. Правда в том, что сообщество инженеров никогда не попытается нарушить устоявшиеся соглашения без крайней необходимости, и ДА, я верю, что должна быть причина для использования PointCloud2. Я не эксперт в области компьютерных наук, поэтому вместо того, чтобы записывать свои неопытные догадки, я буду ссылаться на эти основные вводные слайды, представленные исследователем Willow Garage. К сожалению, на основных слайдах не так много деталей. Моя интерпретация заключается в том, что ключевое слово — эффективность. Я мог бы, однако, попытаться предположить. Если PointCloud2 будет перебрасываться общими указателями, имеет смысл, что пользователи захотят хранить громоздкие данные, упакованные в один массив, поскольку было бы намного сложнее передать их через TCP/IP, если все данные разбросаны по всему физическая память, связанная какими-то связанными списками или чем-то еще. Может поэтому? Я буду держать его в курсе, как только узнаю об этом больше.