Ubuntu18.04 + ROS 下学习点云库PCL的使用(二)

本文介绍了在Ubuntu18.04上使用ROS和PCL库进行点云数据的读写操作,包括编写`pcd_write.cpp`和`pcd_read.cpp`程序,以及如何在ROS环境中订阅、发布点云消息和使用rviz进行可视化。

序言

本文是延续Ubuntu18.04 + ROS 下学习点云库PCL的使用(一)的续篇,在上一篇中,我们配置好ROS下PCL的编程环境并成功创建100个无序点云,最后在可视化工具RVIZ成功查看。

今天我们继续PCL的基础学习,通过订阅和发布ros话题,对上面创建的点云进行读写处理。

 一、程序文件

1、 “pcd_write.cpp”文件

在之前创建的“pcl_01”功能包的src目录下,新建一个“pcd_write.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>
 
void cloudCB(const sensor_msgs::PointCloud2 &input)
{
    pcl::PointCloud<pcl::PointXYZ> cloud;
    pcl::fromROSMsg(input, cloud);
    pcl::io::savePCDFileASCII ("write_pcd_test.pcd", cloud);
}
 
main (int argc, char **argv)
{
    ros::init (argc, argv, "pcl_write");
    ros::NodeHandle nh;
    ros::Subscriber bat_sub = nh.subscribe("pcl_output", 10, cloudCB);
    ros::spin();
 
    return 0;
}

2、“pcd_read.cpp”文件

再新建“pcd_read.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>
 
main(int argc, char **argv)
{
    ros::init (argc, argv, "pcl_read");
 
    ros::NodeHandle nh;
    ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2> ("pcl_output", 1);
 
    sensor_msgs::PointCloud2 output;
    pcl::PointCloud<pcl::PointXYZ> cloud;
 
    pcl::io::loadPCDFile ("write_pcd_test.pcd", cloud);
 
    pcl::toROSMsg(cloud, output);
    output.header.frame_id = "odom";
 
    ros::Rate loop_rate(1);
    while (ros::ok())
    {
        pcl_pub.publish(output);
        ros::spinOnce();
        loop_rate.sleep();
    }
 
    return 0;
}

3、修改CmakeLists.txt文件

add_executable(pcd_read src/pcd_read.cpp)
add_executable(pcd_write src/pcd_write.cpp)

add_dependencies(pcd_read ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_dependencies(pcd_write ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})


target_link_libraries(pcd_read
  ${catkin_LIBRARIES}
)
target_link_libraries(pcd_write
  ${catkin_LIBRARIES}
)

二、运行程序

首先,开启一个终端启动roscore

roscore

 然后启动上次的发布点云节点

rosrun pcl_01 pcl_create

启动保存点云为pcd文件的节点

rosrun pcl_01 pcd_create

这时候会发现,工作空间下多了一个“write_pcd_test.pcd”文件,就是将创建的点云进行保存。

我们可以用PCL tools中的pcl_viewer来查看文件信息,指令为:

pcl_viewer write_pcd_test.pcd

结果如下: 

这样即为成功。

 这时候,我们关闭pcl_create节点,用pcd_read节点读取pcd文件

rosrun pcl_01 pcd_read

功能是把pcd文件的点云信息读取并发布出来,这时我们可以启动rviz来查看,该步骤省略。

总结

今天我们进行的是在ROS下保存和读取点云消息,我们在入门之后,可以利用官方教程进阶,这样学习速度会大大提升。具体每行代码的分析,大家在跑通之后再逐句分析效率会更高。

Ubuntu 18.04ROS (Robot Operating System) 环境中,调用点云库通常涉及到使用像`pcl` (Point Cloud Library) 或 `libpointcloud` 这样的开源库。以下是一个简单的步骤: 1. 安装依赖:首先确保已经安装了ROS的基础包,包括`roscpp`, `message_generation`, 和 `rviz`等。然后安装点云处理所需的库,例如通过终端运行: ``` sudo apt-get update && sudo apt-get install ros-${rosdistro}-pcl-msgs ros-${rosdistro}-pcl-tools ros-${rosdistro}-pcl-conversions ``` 2. 包管理:在`catkin_ws` (如果使用catkin工作空间) 中,编辑`package.xml`文件并添加对所需点云库的依赖。例如,对于`pcl`: ```xml <build_depend>message_generation</build_depend> <run_depend>message_runtime</run_depend> <depend>pcl_ros</depend> ``` 3. 编写代码:在`src`目录下创建一个新的C++节点,导入所需的头文件,并实例化点云数据结构。示例代码片段: ```cpp #include <sensor_msgs/PointCloud2.h> #include <pcl_conversions/pcl_to_ros.h> #include <pcl_ros/publisher.h> // 在node类中声明订阅者和发布者 ros::Publisher cloud_pub; // 发布者 ros::Subscriber point_cloud_sub; // 订阅者 void onPointCloud(const sensor_msgs::PointCloud2::ConstPtr& msg) { pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::fromROSMsg(*msg, *cloud); // ... 对点云进行处理 ... cloud_pub.publish(cloud); } int main(int argc, char **argv) { // 初始化 ROS 节点 ros::init(argc, argv, "point_cloud_node"); // ... 加载其他必要的初始化操作 ... } ``` 4. 启动节点:在`main()`函数中启动订阅者、发布者,并调用`onPointCloud()`函数。 5. 使用点云:你可以从ROS主题中订阅点云消息,如`/camera/depth_registered/points`,并在接收到时调用上述代码处理。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值