Точки записи / доступа в структуру PointCloud2 C / Библиотека ROS / PCL

c #file-io #ros #point-cloud-library #pcl

#c #файл-ввод-вывод #розенкранц #облако точек-библиотека #pcl

Вопрос:

В настоящее время я создаю конвейер восприятия, и у меня возникают проблемы с чтением точек моей структуры облака точек. Я читаю из облака точек в структуру PointCloud2 и хочу иметь возможность последовательно записывать точки облака точек или, по крайней мере, получать к ним доступ, чтобы позже найти способ записать их в файл. Базовый код, с которым я работаю, находится здесь:

 void cloud_cropbox_cb(const sensor_msgs::PointCloud2ConstPtr amp;cloud_msg)
{
    // Container for original amp; filtered data
    pcl::PCLPointCloud2 *cloud = new pcl::PCLPointCloud2;
    pcl::PCLPointCloud2ConstPtr cloudPtr(cloud);
    pcl::PCLPointCloud2 cloud_filtered;

    // convert given message into PCL data type
    pcl_conversions::toPCL(*cloud_msg, *cloud);
 

Я хочу иметь доступ к элементам x, y, z каждой точки в облаке и в идеале просто записать их все в текстовый файл. Я пробовал использовать pcl::io::savePCDFileASCII() , но не думаю, что это вполне применимо здесь. Дополнительным примечанием является то, что базовая программа постоянно запущена и никогда не завершается, пока не будет закрыта вручную, я не знаю, будет ли это связано с записью в файл. Любая помощь в том, какие именно функции использовать / шаги, которые мне нужно предпринять, была бы очень признательна.

Ответ №1:

Если вы буквально хотите записать содержимое сообщения в файл, вы можете просто (в файле запуска или командной строке) использовать ros topic echo [args] > my_file.txt .

Для способов, совместимых в C , я рекомендую прочитать из http://wiki.ros.org/pcl_ros , который описывает, что:

pcl_ros расширяет клиентскую библиотеку ROS C для поддержки передачи сообщений с использованием собственных типов данных PCL. Просто добавьте следующее включить в исходный код вашего узла ROS: #include <pcl_ros/point_cloud.h> Этот заголовок позволяет публиковать и подписываться на объекты pcl::PointCloud как сообщения ROS. Они отображаются в ROS как сообщения sensor_msgs / PointCloud2, обеспечивая бесперебойную совместимость с узлами ROS, не использующими PCL. Например, вы можете опубликовать pcl::PointCloud в одном из ваших узлов и визуализировать его в rviz, используя отображение Point Cloud2. Он работает путем подключения к инфраструктуре сериализации roscpp.

Это означает, что вы можете внутренне использовать PCL сколько угодно, и все это сообщение ROS PointCloud2. Но вы должны объявить тип / интерфейс PCL, который вы хотите использовать в сообщении / издателе / подписчике, с помощью которого вы получаете доступ к данным. Поэтому вместо того, чтобы использовать sensor_msgs/PointCloud2 тип везде, используйте pcl::Pointcloud<pcl::Point*> тип везде.

Публикация:

 typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;
ros::Publisher pub = nh.advertise<PointCloud> ("points2", 1);
PointCloud::Ptr msg (new PointCloud);
msg->points.push_back (pcl::PointXYZ(1.0, 2.0, 3.0));
pub.publish (msg);
 

Подписка:

 typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;
ros::Subscriber sub = nh.subscribe<PointCloud>("points2", 1, callback);
void callback(const PointCloud::ConstPtramp; msg){
  printf ("Cloud: width = %d, height = %dn", msg->width, msg->height);
  BOOST_FOREACH (const pcl::PointXYZamp; pt, msg->points)
  printf ("t(%f, %f, %f)n", pt.x, pt.y, pt.z);
}
 

Дополнительные примеры (или ссылки на исходный код узла) в http://wiki.ros.org/pcl_ros , учебные пособия по другим материалам конвейера в http://wiki.ros.org/pcl_ros/Tutorials .