I have 3D points from gpu::reprojectImageTo3D on a found disparity image. I would now like to display this pointcloud.
How do I Convert the found pointcloud from OpenCV
to sensor_msgs/PointCloud2
?
I do not need to publish the pointcloud this is only for debug visualization. Could it be possible to display it as is done with images from the node? e.g. using pcl
? This would be optimal since my device may not perform well with RViz
(based on readings online).
My best guess is to do like this, and just iterate through the cv::mat
and insert in the pcl
to convert to msg, since I have not found anything that does directly.
#include <ros/ros.h>
// point cloud headers
#include <pcl/point_cloud.h>
//Header which contain PCL to ROS and ROS to PCL conversion functions
#include <pcl_conversions/pcl_conversions.h>
//sensor_msgs header for point cloud2
#include <sensor_msgs/PointCloud2.h>
main (int argc, char **argv)
{
ros::init (argc, argv, "pcl_create");
ROS_INFO("Started PCL publishing node");
ros::NodeHandle nh;
//Creating publisher object for point cloud
ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2> ("pcl_output", 1);
//Creating a cloud object
pcl::PointCloud<pcl::PointXYZ> cloud;
//Creating a sensor_msg of point cloud
sensor_msgs::PointCloud2 output;
//Insert cloud data
cloud.width = 50000;
cloud.height = 2;
cloud.points.resize(cloud.width * cloud.height);
//Insert random points on the clouds
for (size_t i = 0; i < cloud.points.size (); ++i)
{
cloud.points[i].x = 512 * rand () / (RAND_MAX + 1.0f);
cloud.points[i].y = 512 * rand () / (RAND_MAX + 1.0f);
cloud.points[i].z = 512 * rand () / (RAND_MAX + 1.0f);
}
//Convert the cloud to ROS message
pcl::toROSMsg(cloud, output);
output.header.frame_id = "point_cloud";
ros::Rate loop_rate(1);
while (ros::ok())
{
//publishing point cloud data
pcl_pub.publish(output);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
This code snippet was found at apprize.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With