ros (二) 使用消息传递点云+rviz显示
一、创建环境
catkin_create_pkg pclros roscpp std_msgs sensor_msgs pcl_ros pcl_conversions
cd pclros/src
catkin_make
touch pcl_pub.cpp
touch pcl_sub.cpp
二、发布点云消息
#include<ros/ros.h>
#include<sensor_msgs/PointCloud2.h>
#include<pcl_conversions/pcl_conversions.h>
#include<pcl/point_types.h>
#include<pcl/point_cloud.h>int main(int argc, char** argv)
{ros::init(argc, argv, "ros_pub");ros::NodeHandle nh_("~");pcl::PointCloud<pcl::PointXYZ> cloud;cloud.width = 100;cloud.height = 1;cloud.points.resize(100);for(size_t i =0; i< cloud.points.size();i++){cloud.points[i].x = i * 0.5;cloud.points[i].y = i * 0.5;cloud.points[i].z = i * 0.5;}ros::Publisher pcl_pub = nh_.advertise<sensor_msgs::PointCloud2>("/point2", 1);sensor_msgs::PointCloud2 pcl_msg;ros::Rate rate_loop(5);while(nh_.ok()){pcl::toROSMsg(cloud, pcl_msg);pcl_msg.header.frame_id = "map";pcl_msg.header.stamp = ros::Time::now();pcl_pub.publish(pcl_msg);ros::spinOnce();rate_loop.sleep();}return 0;}
三、接收点云消息
#include<ros/ros.h>
#include<pcl/point_cloud.h>
#include<pcl/point_types.h>
#include<pcl_ros/point_cloud.h>
#include<pcl_conversions/pcl_conversions.h>
#include<sensor_msgs/PointCloud2.h>void callBack(const sensor_msgs::PointCloud2ConstPtr& msg)
{pcl::PointCloud<pcl::PointXYZ> cloud;pcl::fromROSMsg(*msg, cloud);ROS_INFO("cv_bridge exception: %d %d\n", cloud.width , cloud.height);
}int main(int argc, char** argv)
{ros::init(argc, argv, "pcl_sub");ros::NodeHandle nh_;ros::Subscriber sub_ = nh_.subscribe<sensor_msgs::PointCloud2>("/point2", 1, callBack);ros::spin();}
四、使用rviz接收消息
点击rviz左下角的add按钮,选择pointcloud2,显示点云,如果发现点云没有显示,则更改pub中的frame_id = “map”,就可以显示出来了。