ROS-PCL读取pcd点云数据并在rviz中进行显示

环境:
Ubuntu18.04
ROS melodic
C++
创建工作空间和功能包

cd Downloads/ROS
mkdir -p pcdreadshow_ws/src
cd src
catkin_init_workspace
catkin_create_pkg read_pcd pcl_conversions pcl_ros roscpp sensor_msgs

进入到功能包的src文件夹下面新建.cpp文件read_pcd.cpp

#include<ros/ros.h>
#include<pcl/point_cloud.h>
#include<pcl_conversions/pcl_conversions.h>
#include<sensor_msgs/PointCloud2.h>
#include<pcl/io/pcd_io.h>//which contains the required definitions to load and store point clouds to PCD and other file formats.

int 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/wyh/Downloads/ROS/pcdreadshow_ws/src/read_pcd/src/data/pcd/data_1/0000000001.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())
    {
        /* code for loop body */
        pcl_pub.publish(output);
        ros::spinOnce();
        loop_rate.sleep();
    }
    return 0;
}

 

将下面的编译规则写入功能包下面的CMAKE.list文件中

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

 

在这里插入图片描述
回到工作空间路径下在终端中输入catkin_make进行编译.
分别依次打开多个终端分别输入下面的命令:

roscore
rosrun read_pcd read_pcd
rviz

打开rviz后add一个pointcloud2,topic话题选择pcl_outputm,然后FixedFrame填入odom即可看到图像
在这里插入图片描述

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ROS机器人操作系统,可以使用PCL库pcl_ros的transform节点来进行点云地图的旋转操作。具体步骤如下: 1. 将原始的pcd点云地图读取ROS,可以使用pcl_ros的PointCloud2节点或者自定义节点。 2. 定义旋转矩阵,可以使用Eigen库来定义旋转矩阵。 3. 调用pcl_ros的transform节点,使用旋转矩阵对点云地图进行旋转操作。 4. 将旋转后的点云地图保存到PCD文件,可以使用pcl_rosPCDWriter节点或者自定义节点。 下面是一个示例代码,可以将点云地图绕Z轴旋转45度: ``` #include <ros/ros.h> #include <sensor_msgs/PointCloud2.h> #include <pcl_ros/point_cloud.h> #include <pcl_conversions/pcl_conversions.h> #include <pcl_ros/transforms.h> #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <Eigen/Dense> int main(int argc, char** argv) { // 初始化ROS节点 ros::init(argc, argv, "transform_pcd_node"); ros::NodeHandle nh; // 定义点云地图的路径和文件名 std::string pcd_path = "/home/user/point_cloud.pcd"; // 读取点云地图 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile(pcd_path, *cloud); // 定义旋转矩阵 Eigen::Matrix4f transform_matrix = Eigen::Matrix4f::Identity(); float theta = M_PI / 4; // 旋转角度为45度 transform_matrix(0, 0) = cos(theta); transform_matrix(0, 1) = -sin(theta); transform_matrix(1, 0) = sin(theta); transform_matrix(1, 1) = cos(theta); // 将点云地图绕Z轴旋转45度 pcl::PointCloud<pcl::PointXYZ>::Ptr transformed_cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl_ros::transformPointCloud(*cloud, *transformed_cloud, transform_matrix); // 将旋转后的点云地图保存到PCD文件 pcl::io::savePCDFileBinary("transformed_point_cloud.pcd", *transformed_cloud); return 0; } ``` 需要注意的是,这个示例代码只实现了绕Z轴旋转45度的操作,如果需要实现其他的旋转操作,需要修改旋转矩阵的定义和赋值操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值