sensor_msgs::LaserScan雷达数据转换成pcl::PointXYZ数据类型

文章目录

    • 创建工作空间、功能包
    • 功能包文件 package.xml
    • 头文件、源码文件
      • laserscan_to_pointcloud.h
      • laserscan_to_pointcloud.cc
    • 代码解读
    • 编译文件 CMakeLists.txt
    • 运行效果 截图

创建工作空间、功能包

catkin_create_pkg laserscan_to_pointcloud sensor_msgs roscpp pcl_conversions pcl_ros 

功能包文件 package.xml

<?xml version="1.0"?>
<package format="2"><name>laserscan_to_pointcloud</name><version>0.0.0</version><description>The laserscan_to_pointcloud package</description><maintainer email="xiaoqiuslam@todo.todo">wason</maintainer><license>TODO</license><buildtool_depend>catkin</buildtool_depend><build_depend>pcl_conversions</build_depend><build_depend>pcl_ros</build_depend><build_depend>roscpp</build_depend><build_depend>sensor_msgs</build_depend><build_export_depend>pcl_conversions</build_export_depend><build_export_depend>pcl_ros</build_export_depend><build_export_depend>roscpp</build_export_depend><build_export_depend>sensor_msgs</build_export_depend><exec_depend>pcl_conversions</exec_depend><exec_depend>pcl_ros</exec_depend><exec_depend>roscpp</exec_depend><exec_depend>sensor_msgs</exec_depend><export></export>
</package>

头文件、源码文件

laserscan_to_pointcloud.h

#include <ros/ros.h>
#include <sensor_msgs/LaserScan.h>
#include <pcl_ros/point_cloud.h>    
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>class ScanToPointCloud
{private:ros::NodeHandle node_handle_;ros::Subscriber laser_scan_subscriber_;ros::Publisher pointcloud2_publisher_;pcl::PointXYZ invalid_point_;public:ScanToPointCloud();~ScanToPointCloud();void ScanCallback(const sensor_msgs::LaserScan::ConstPtr& scan_msg);
};

laserscan_to_pointcloud.cc

#include "laserscan_to_pointcloud/laserscan_to_pointcloud.h"
#include <limits>ScanToPointCloud::ScanToPointCloud() 
{laser_scan_subscriber_ = node_handle_.subscribe("laser_scan", 1, &ScanToPointCloud::ScanCallback, this);pointcloud2_publisher_ = node_handle_.advertise<pcl::PointCloud<pcl::PointXYZ>>("point_cloud", 1, this);invalid_point_.x = std::numeric_limits<float>::quiet_NaN();invalid_point_.y = std::numeric_limits<float>::quiet_NaN();invalid_point_.z = std::numeric_limits<float>::quiet_NaN();
}ScanToPointCloud::~ScanToPointCloud()
{
}void ScanToPointCloud::ScanCallback(const sensor_msgs::LaserScan::ConstPtr &scan_msg)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_msg = boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ>>(new pcl::PointCloud<pcl::PointXYZ>());cloud_msg->points.resize(scan_msg->ranges.size());for (unsigned int i = 0; i < scan_msg->ranges.size(); ++i){pcl::PointXYZ &point_tmp = cloud_msg->points[i];float range = scan_msg->ranges[i];if (!std::isfinite(range)){point_tmp = invalid_point_;continue;}if (range > scan_msg->range_min && range < scan_msg->range_max){float angle = scan_msg->angle_min + i * scan_msg->angle_increment;point_tmp.x = range * cos(angle);point_tmp.y = range * sin(angle);point_tmp.z = 0.0;}elsepoint_tmp = invalid_point_;}cloud_msg->width = scan_msg->ranges.size();cloud_msg->height = 1;cloud_msg->is_dense = false;pcl_conversions::toPCL(scan_msg->header, cloud_msg->header);pointcloud2_publisher_.publish(cloud_msg);
}int main(int argc, char **argv)
{ros::init(argc, argv, "laserscan_to_pointcloud");ScanToPointCloud laserscan_to_pointcloud;ros::spin();return 0;
}

代码解读

在这行代码中:

pcl::PointXYZ &point_tmp = cloud_msg->points[i];

cloud_msg->points[i] 表示点云中的第 i 个点,而 pcl::PointXYZ &point_tmp 则创建了一个指向这个点的引用。让我们拆分这个操作:

  1. cloud_msg->points[i]:这部分代码访问了 cloud_msg 中的点云数据。cloud_msg 是一个 pcl::PointCloud<pcl::PointXYZ> 类型的指针,而 points 是这个点云对象中存储点的容器。

  2. [i]:这是通过索引操作符访问容器中的第 i 个元素,即点云中的第 i 个点。

  3. pcl::PointXYZ &point_tmp:这部分代码创建了一个 pcl::PointXYZ 类型的引用变量 point_tmp。引用是 C++ 中的一种别名,它允许我们使用一个变量的别名来访问该变量。

通过将 point_tmp 初始化为 cloud_msg->points[i] 的引用,现在 point_tmpcloud_msg->points[i] 指向相同的点。这就意味着,对 point_tmp 的任何更改都会反映在原始点云数据中。

为什么这有用呢?使用引用可以简化代码并提高可读性。以后在代码中引用 point_tmp 就相当于引用了点云中的第 i 个点,这样可以更方便地进行操作,而不必每次都使用较长的 cloud_msg->points[i]

编译文件 CMakeLists.txt

cmake_minimum_required(VERSION 3.0.2)
project(laserscan_to_pointcloud)find_package(catkin REQUIRED COMPONENTSpcl_conversionspcl_rosroscppsensor_msgs
)find_package(PCL REQUIRED QUIET)catkin_package(
)include_directories(include${catkin_INCLUDE_DIRS}${PCL_INCLUDE_DIRS}
)add_executable(laserscan_to_pointcloud src/laserscan_to_pointcloud.cc)
target_link_libraries(laserscan_to_pointcloud ${catkin_LIBRARIES})

运行效果 截图

roscore
rosrun laserscan_to_pointcloud laserscan_to_pointcloud
rosbag play x.bag这里播放一个数据包,数据包中雷达的话题名字/laser_scan要和代码中的订阅的名字/laser_scan一致rostopic list 
/laser_scan
/point_cloudrostopic echo /point_cloud

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/727488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享关于如何解决系统设计问题的逐步框架

公司广泛采用系统设计面试&#xff0c;因为在这些面试中测试的沟通和解决问题的技能与软件工程师日常工作所需的技能相似。面试官的评估基于她如何分析一个模糊的问题以及如何逐步解决问题。测试的能力还包括她如何解释这个想法&#xff0c;与他人讨论&#xff0c;以及评估和优…

回溯算法07-子集(Java/子集问题)

.子集 题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[…

ChatGPT高效提问——说明提示技巧

ChatGPT高效提问——说明提示技巧 现在&#xff0c;让我们开始体验“说明提示技巧”&#xff08;IPT, Instructions Prompt Technique&#xff09;和如何用它生成来自ChatGPT的高质量的文本。说明提示技巧是一个通过向ChatGPT提供需要依据的具体的模型的说明来指导ChatGPT输出…

不伤耳朵的蓝牙耳机推荐,骨传导耳机选购前必知的几大要点

在目前的蓝牙耳机市场上&#xff0c;骨传导蓝牙耳机以其独特的设计和不伤耳朵的好处而受到广泛关注。骨传导蓝牙耳机通过骨头传导声音&#xff0c;无需进入耳道&#xff0c;从而减少了耳朵的不适和潜在伤害。 骨传导蓝牙耳机这种开放式的设计允许用户在享受音乐的同时&#xf…

lvs+keepalive

虚拟路由冗余协议(Virtual Router Redundancy Protocol&#xff0c;简称VRRP) VRRP能够在不改变组网的情况下&#xff0c;将多台路由器虚拟成一个虚拟路由器&#xff0c;通过配置虚拟路由器的IP地址为默认网关&#xff0c;实现网关的备份。 协议版本: VRRPv2&#xff08;常用&…

双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的应用

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会议上讲到&#xff0c;要把“双碳”纳入经济社会发展和生态文明建设整体布局。同时&#xff0c;提到要把减污降碳协同增效作为促…

一文掌握:电力管理系统该的功能和界面设计

一、什么电力管理系统 电力管理系统是一个用于监控、控制和优化电力系统运行的软件系统。它集成了实时数据采集、数据分析、决策支持和远程控制等功能&#xff0c;旨在提高电力系统的运行效率、可靠性和安全性。 电力管理系统是一个集成了数据采集、监控、分析和控制等功能的软…

vue面试--9, 1 ObjectProperty与vue3Proxy区别。2 MVVM的理解 3 双向绑定原理?

1 ObjectProperty与vue3Proxy区别 2 MVVM的理解 3 双向绑定原理&#xff1f;

如何在小程序中绑定身份证

在小程序中绑定身份证信息是一项常见的需求&#xff0c;特别是在需要进行实名认证或者身份验证的场景下。通过绑定身份证信息&#xff0c;可以提高用户身份的真实性和安全性&#xff0c;同时也为小程序提供了更多的个性化服务和功能。下面就介绍一下怎么在小程序中绑定居民身份…

Unity性能优化篇(四) GPU Instancing

使用GPU Instancing可以在一个Draw Call中同时渲染多个相同或类似的物体&#xff0c;从而减少CPU和GPU的开销。 官方文档&#xff1a;https://docs.unity3d.com/Manual/GPUInstancing.html 启用GPU Instancing&#xff0c;我们可以选中一个材质&#xff0c;然后在Inspector窗口…

Java EE之线程安全问题

一.啥是线程安全问题 有些代码&#xff0c;在单个线程执行时完全正确&#xff0c;但同样的代码让多个线程同时执行&#xff0c;就会出现bug。例如以下代码&#xff1a; 给定一个变量count&#xff0c;让线程t1 t2分别自增5000次&#xff0c;然后进行打印&#xff0c;按理说co…

如何将中科方德桌面操作系统加入Windows域

往期文章&#xff1a;自定义SSH客户端连接时的显示信息 | 统信UOS | 麒麟KYLINOS Hello&#xff0c;大家好啊&#xff0c;今天我非常高兴地给大家带来一篇关于如何将中科方德桌面操作系统加入Windows域的教程文章。对于使用中科方德桌面操作系统的用户来说&#xff0c;将其加入…

记一次简单的获取虚拟机|伪终端shell权限

场景描述 某个系统是ova文件&#xff0c;导入虚拟机启动&#xff0c;但是启动后只有一个伪终端权限&#xff0c;即权限很小&#xff0c;如何拿到这个虚拟机的shell权限呢&#xff1f; 实际操作 这次运气比较好&#xff0c;所遇到的系统磁盘并没有被加密&#xff0c;所以直接…

Java中String类型的变量为什么是不可变的

想相信很多小伙伴在学Java的时候都学到了&#xff1a;Java中的字符串即 String 变量是不可变的&#xff0c;但是为什么呢&#xff1f;我们看 String 的源码&#xff1a; 通过源码可以看到&#xff0c;其实 String 类型的变量&#xff0c;内部是一个 byte 数组 value&#xff0c…

GCN 翻译 - 2

2 FAST APROXIMATE CONVOLUTIONS ON GRAPHS 在这一章节&#xff0c;我们为这种特殊的的图基础的神经网络模型f(X, A)提供理论上的支持。我们考虑一个多层的图卷积网络&#xff08;GCN&#xff09;&#xff0c;它通过以下方式进行层间的传播&#xff1a; 这里&#xff0c;是无…

Mac 安装JDK,并通过命令切换不同版本jdk

mac电脑安装了jdk8、jdk11、jdk21 三个版本的jdk&#xff0c;在环境变量中配置命令&#xff0c;动态切换不同jdk 1.下载JDK&#xff0c;Mac建议下载xxxxx/jdk-21_macos-x64_bin.dmg https://download.oracle.com/java/21/latest/jdk-21_macos-x64_bin.dmg&#xff0c; 2.双击安…

SAR ADC学习笔记(4)

CDAC电容阵列 一、电容失配 二、电容失配对CDAC线性度的影响 1.电容失配对DNL的影响 2.电容失配对INL的影响 三、分段结构的CDAC 四、CDAC开关切换方案&#xff1a;传统开关切换策略 第一次比较阶段&#xff1a;如果VP(1)-VN(1)<0 第一次比较阶段&#xff1a;如果VP(1)-VN…

社区店选址案例研究:成功与失败的经验教训

大家好&#xff0c;我是一名鲜奶吧5年的创业者&#xff0c;在社区店经营方面有着丰富的经验。 今天&#xff0c;我将分享一些关于社区店选址的成功与失败案例&#xff0c;希望能给想开实体店或创业的朋友们提供有价值的干货信息。 首先&#xff0c;让我们来看看成功的社区店选…

【MobaXterm】Execute command 的问题;Linux环境变量配置;

引言 记录一次使用MobaXterm工具连接数据库时出现的问题。 现象是这样的&#xff1a;通过MobaXterm使用账户A以SSH方式连接登录测试服务器&#xff0c;尝试重启服务。服务启动时提示JDK版本不一致&#xff1a;Unsupported major.minor version 52.0 查询一下java版本 开发环境…

当CV遇上transformer(一)ViT模型

当CV遇上transformer(一)ViT模型 我们知道计算机视觉(Computer Vision)&#xff0c;主要包括图像分类、目标检测、图像分割等子任务。 自AlexNet被提出以来&#xff0c;CNN成为了计算机视觉领域的主流架构。CNN网络结构主要由卷积层、池化层以及全连接层3部分组成&#xff0c;其…