ROS中读取pcd点云数据并在RVIZ中显示

ROS中读取pcd点云文件并在显示

我的环境:ubuntu14+ros indigo

1.ros下创建一个功能包(read_pcd)

在catkin_ws下创建一个名为read_pcd的功能包;

catkin_create_pkg read_pcd pcd_conversions pcl_ros roscpp sensor_msgs

后面几项是添加的依赖,可能并不是都必须,加上也没错。
这之后就会在catkin_ws/src下生成一个新文件夹read_pcd,在里面的src目录下新建一个read_pcd.cpp文件,并把以下代码复制进去:

#include
#include
#include
#include
#include//which contains the required definitions to load and store point clouds to PCD and other file formats.
 
main (int argc, char **argv)
{
  ros::init (argc, argv, "UandBdetect");
  ros::NodeHandle nh;
  ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2> ("pcl_output", 1);
  pcl::PointCloud<pcl::PointXYZ> cloud;
  sensor_msgs::PointCloud2 output;
  pcl::io::loadPCDFile ("/home.....name.pcd", cloud); //修改自己pcd文件所在路径
  //Convert the cloud to ROS message
  pcl::toROSMsg(cloud, output);
  output.header.frame_id = "odom";//this has been done in order to be able to visualize our PointCloud2 message on the RViz visualizer    
//!!!这一步需要注意,是后面rviz的 fixed_frame  !!!敲黑板,画重点。
  ros::Rate loop_rate(1);
  while (ros::ok())
  {
    pcl_pub.publish(output);
    ros::spinOnce();
    loop_rate.sleep();
  }
  return 0;
}

注意别忘记修改pcd文件的路径
代码的大概思路就是pcl先从路径读取pcd文件到cloud,再把cloud转化成一条msg:output发布出去。

下一步要在read_pcd功能包里修改一下cmakelists和package.xml
cmakelists里添加:

add_executable(read_pcd src/read_pcd.cpp)
(read_pcd ${catkin_LIBRARIES})

第一行的意思是会从src/read_pcd.cpp这个源文件生成名为read_pcd的目标文件(名字可以不一样);
第二行的意思是将目标文件与指定库文件进行链接;
package.xml中添加:

<build_depend>libpcl-all-dev</build_depend>
<exec_depend>libpcl-all</exec_depend>

这两行的意思是,在编译功能包是编译依赖项和执行依赖项。

2构建功能包

终端进入catkin_ws目录:

catkin_make

编译成功后就OK了。

3在RVIZ里显示

分别在各自终端:

roscore
rosrun read_pcd read_pcd

可以rostopic list看一下output这个消息有没有发布出来

rosrun rviz rviz

打开rviz后add一个pointcloud2,话题选择pcl_output即可看到图像。
ROS中读取pcd点云数据并在RVIZ中显示_第1张图片有可能在打开rviz后status报tf相关错,这时开个终端执行以下命令即可:

rosrun tf static_transform_publisher 0.0 0.0 0.0 0.0 0.0 0.0 map odom 100

你可能感兴趣的:(3D-ros-读取pcd点云)