Я выяснил проблему с моим вопросом некоторое время назад, но хотел бы поделиться им на тот случай, если у кого-то возникнет такая же проблема.
Таким образом, одновременно возникли две проблемы, которые заставили меня думать, что это была проблема CMake
:
1) catkin_make
неправильно компилировался не из-за CMake
, как я думал в течение длительного времени, а из-за того, что файл кэша catkin_ws.workspace
вызывал проблемы у самого CMake
. Таким образом, первое решение этой проблемы состояло в том, чтобы стереть файл кэша catkin_ws.workspace
и выполнить новую компиляцию. Все CMake
проблемы исчезли.
2) Вторая проблема: правильный псевдокод для чтения point-cloud
это было похоже на:
main()
{
init node
create pointcloud publisher
create rate object with 1 second duration
load point cloud from file
while(ros::ok())
{
rate.sleep
publish point cloud message
}
}
И я понял, что ничего не публикуется на входе, и обратный вызов был выполнен.
Ниже приведен полный код, который читает point-cloud
из файла и выводит все точки в файл .txt. Я надеюсь, что это может быть полезно всем, кто может столкнуться с этой проблемой:
test.cpp
#include <ros/ros.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl/io/pcd_io.h>
#include <pcl_conversions/pcl_conversions.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
void loadFromFile(std::string filename)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if(pcl::io::loadPCDFile<pcl::PointXYZ> (filename, *cloud) == -1) // load point cloud file
{
PCL_ERROR("Could not read the file");
return;
}
std::cout<<"Loaded"<<cloud->width * cloud->height
<<"data points from /home/to/Desktop/point_cloud/yourFile.pcd with the following fields: "
<<std::endl;
// Write entire point clouds to a .txt file
std::ofstream myfile;
myfile.open ("/home/to/Desktop/exampleCloud.txt");
if (myfile.is_open()) {
for(size_t i = 0; i < cloud->points.size(); ++i)
myfile << " " << cloud->points[i].x
<< " " << cloud->points[i].y
<< " " << cloud->points[i].z << std::endl;
myfile.close();
}
}
int main (int argc, char** argv)
{
// Initialize ROS
ros::init (argc, argv, "pcl_tutorial_cloud");
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<sensor_msgs::PointCloud2>("output", 1000);
ros::Rate loop_rate(1);
loadFromFile("/home/to/Desktop/yourFile.pcd");
int count = 0;
while(ros::ok())
{
sensor_msgs::PointCloud2 pcloud2;
pub.publish(pcloud2);
ros::spinOnce();
loop_rate.sleep();
count ++;
}
return 0;
}
Вот результат после запуска:
1) catkin_make
2) rosrun yourProject test
![pcl_read](https://i.imgur.com/5AoOXSy.png)