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 .