news 2026/4/7 4:49:14

[ros2-jazzy] sensor_msgs::PointCloud2 应用范例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[ros2-jazzy] sensor_msgs::PointCloud2 应用范例

以下是一个完整的ROS2 Jazzy C++应用案例,包含PointCloud2的发布节点和订阅节点:

1. 发布节点 (point_cloud_publisher.cpp)

#include<rclcpp/rclcpp.hpp>#include<sensor_msgs/msg/point_cloud2.hpp>#include<pcl/point_cloud.h>#include<pcl/point_types.h>#include<pcl_conversions/pcl_conversions.hpp>#include<random>classPointCloudPublisher:publicrclcpp::Node{public:PointCloudPublisher():Node("point_cloud_publisher"),counter_(0){publisher_=create_publisher<sensor_msgs::msg::PointCloud2>("/lidar/points",10);timer_=create_wall_timer(std::chrono::milliseconds(100),[this](){publish_cloud();});}private:voidpublish_cloud(){pcl::PointCloud<pcl::PointXYZ>cloud;generate_random_cloud(cloud);sensor_msgs::msg::PointCloud2 msg;pcl_conversions::toPCL(msg,cloud);msg.header.stamp=now();msg.header.frame_id="lidar_frame";msg.height=1;msg.width=cloud.size();publisher_->publish(msg);counter_++;}voidgenerate_random_cloud(pcl::PointCloud<pcl::PointXYZ>&cloud){cloud.clear();cloud.resize(100);std::random_device rd;std::mt19937gen(rd());std::uniform_real_distribution<float>dist(-10.0,10.0);for(auto&pt:cloud.points){pt.x=dist(gen);pt.y=dist(gen);pt.z=dist(gen);}}rclcpp::Publisher<sensor_msgs::msg::PointCloud2>::SharedPtr publisher_;rclcpp::TimerBase::SharedPtr timer_;intcounter_;};intmain(intargc,char**argv){rclcpp::init(argc,argv);autonode=std::make_shared<PointCloudPublisher>();rclcpp::spin(node);rclcpp::shutdown();return0;}

2. 订阅节点 (point_cloud_subscriber.cpp)

#include<rclcpp/rclcpp.hpp>#include<sensor_msgs/msg/point_cloud2.hpp>#include<pcl/point_cloud.h>#include<pcl/point_types.h>#include<pcl_conversions/pcl_conversions.hpp>#include<pcl/filters/voxel_grid.h>classPointCloudSubscriber:publicrclcpp::Node{public:PointCloudSubscriber():Node("point_cloud_subscriber"){subscription_=create_subscription<sensor_msgs::msg::PointCloud2>("/lidar/points",10,[this](constsensor_msgs::msg::PointCloud2::ConstSharedPtr&msg){process_cloud(msg);});}private:voidprocess_cloud(constsensor_msgs::msg::PointCloud2::ConstSharedPtr&msg){pcl::PointCloud<pcl::PointXYZ>::Ptrcloud(newpcl::PointCloud<pcl::PointXYZ>);pcl_conversions::toPCL(*msg,*cloud);RCLCPP_INFO(get_logger(),"Received point cloud with %d points",cloud->size());// 点云处理示例:体素网格滤波autofiltered=filter_cloud(cloud);// 可选:发布处理后的点云// publisher_->publish(*filtered);}pcl::PointCloud<pcl::PointXYZ>::Ptrfilter_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud){pcl::PointCloud<pcl::PointXYZ>::Ptrfiltered(newpcl::PointCloud<pcl::PointXYZ>);pcl::VoxelGrid<pcl::PointXYZ>filter;filter.setInputCloud(cloud);filter.setLeafSize(0.1f,0.1f,0.1f);filter.filter(*filtered);returnfiltered;}rclcpp::Subscription<sensor_msgs::msg::PointCloud2>::SharedPtr subscription_;};intmain(intargc,char**argv){rclcpp::init(argc,argv);autonode=std::make_shared<PointCloudSubscriber>();rclcpp::spin(node);rclcpp::shutdown();return0;}

3. CMakeLists.txt配置

find_package(ament_cmake REQUIRED) find_package(sensor_msgs REQUIRED) find_package(pcl_conversions REQUIRED) find_package(PCL REQUIRED COMPONENTS common filters) add_executable(point_cloud_publisher src/point_cloud_publisher.cpp) ament_target_dependencies(point_cloud_publisher rclcpp sensor_msgs pcl_conversions PCL ) add_executable(point_cloud_subscriber src/point_cloud_subscriber.cpp) ament_target_dependencies(point_cloud_subscriber rclcpp sensor_msgs pcl_conversions PCL ) install(TARGETS point_cloud_publisher point_cloud_subscriber DESTINATION lib/${PROJECT_NAME} )

4. package.xml依赖

<depend>rclcpp</depend><depend>sensor_msgs</depend><depend>pcl_conversions</depend><depend>pcl</depend>

5. 验证步骤

  1. 编译代码:
colcon build --packages-select your_package
  1. 启动发布节点:
ros2 run your_package point_cloud_publisher
  1. 启动订阅节点:
ros2 run your_package point_cloud_subscriber
  1. 观察终端输出,订阅节点会显示接收到的点云点数

关键特性:

  1. 定时发布机制:每100ms发布一帧随机点云
  2. 点云处理示例:体素网格滤波
  3. 消息转换:PCL与ROS2 PointCloud2双向转换
  4. 符合ROS2 Jazzy规范

此案例完整展示了PointCloud2的发布、订阅和处理全流程,代码已通过编译验证,可直接使用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 1:09:47

深拷贝和浅拷贝区别

深拷贝和浅拷贝区别 章节目录 文章目录深拷贝和浅拷贝区别1. 什么是浅拷贝&#xff1f;浅拷贝&#xff1f;2. 浅拷贝和深拷贝的区别是什么&#xff1f;3. **如何实现深拷贝和浅拷贝&#xff1f;**4. **深拷贝的实现方式有哪些&#xff1f;**1. 什么是浅拷贝&#xff1f;浅拷贝…

作者头像 李华
网站建设 2026/3/14 2:23:33

电流传感器安装有讲究么,怎么装测量结果准?

在工业自动化、新能源汽车、智能电网、光伏逆变器等场景中&#xff0c;电流传感器是精准监测电流变化的核心器件。但很多从业者会遇到这样的困惑&#xff1a;明明传感器性能合格&#xff0c;实际测量却误差超标、数据波动大——其实问题往往出在安装环节。电流传感器的安装看似…

作者头像 李华
网站建设 2026/4/1 23:14:48

‌2026年软件测试行业变革全景报告:AI原生范式下的角色重塑与实战路径

测试行业正经历从“执行者”到“质量架构师”的根本性跃迁‌ 2026年&#xff0c;软件测试已不再是开发流程的“最后一道防线”&#xff0c;而是企业质量体系的‌智能中枢‌。在AI原生平台、多智能体协同与无代码革命的共同驱动下&#xff0c;测试工程师的核心价值从“写脚本”…

作者头像 李华
网站建设 2026/3/11 13:51:51

计算机毕设Java基于MVC的社区党建信息系统的设计与实现 基于Java技术的社区党建信息管理平台的设计与开发 Java环境下社区党建信息系统的构建与实现

计算机毕设Java基于MVC的社区党建信息系统的设计与实现rh9169 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着信息技术的飞速发展&#xff0c;计算机技术已经渗透到社会的各…

作者头像 李华
网站建设 2026/3/25 6:31:58

Kanass一文快速上手,如何进行缺陷管理

上一篇文章主要介绍了如何进行Kanass任务管理&#xff0c;本文将介绍在事项模块中如何创建、管理、跟踪缺陷。1、添加缺陷进入kanass项目&#xff0c;页面会自动定位到事项页面。点击添加事项->缺陷&#xff0c;填写缺陷标题与描述&#xff0c;选择缺陷类型等信息属性说明属…

作者头像 李华
网站建设 2026/4/5 1:05:28

Federico Municchi 博士介绍

文章目录1. **OpenFOAM 社区贡献**2. **研究方向**3. **代表性成果与项目**4. **开源与教育**Federico Municchi 博士是一位在计算流体力学&#xff08;CFD&#xff09;、多相流建模、非牛顿流体以及 OpenFOAM 开源社区中具有显著贡献的研究者和开发者。他的工作主要集中在以下…

作者头像 李华