当前位置: 首页 > article >正文

点云匹配方法 NDT(正态分布变换)

1. 正态分布变换 (NDT)在点云匹配中ICP基于距离直接最优化变换矩阵的参数由于是欠定方程且旋转矩阵的约束使得结果很难优化为此在新的维度优化变换矩阵的参数被很好的提出先将参考点云目标点云转换为多维变量的正态分布匹配的点云如果采用某组变换参数后使得新的点云和目标点云的正态分布参数匹配很好那么变换点在参考系中的概率密度将会很大。因此可以考虑用优化的方法求出使得概率密度之和最大的变换参数此时两幅激光点云数据将匹配的最好。2. 多元正态分布我们知道如果随机变量X满足正态分布则其概率密度函数为对于多元正态分布而言其概率密度函数可以表示为2.1. NDT算法流程将参考点云网格化计算每个网格的概率密度函数网格的概率密度函数则为2.2. 变换参数和最大似然我们需要优化的参数就是对当前点云的坐标变换旋转平移等转换函数表示使用姿态变换来变换结合之前的一组状态密度函数那么最好的变换参数应该是最大化似然函数的姿态变换那么最大化似然也就相当于最小化负对数似然就到了我们最熟悉的最优化的部分了。现在的任务就是使用优化算法来调整变换参数来最小化这个负对数似然。NDT算法使用牛顿法进行参数优化。3.算法流程输入两帧点云数据,输出位姿变换参数 R, ta. 对计算正太分布变换 (NDT)b. 初始化需要估计的参数 R, t设置为0或者采用里程计数据c. 根据参数 R, t 将中的所有样本点投影到对应的坐标系下d. 确定每一个映射点对应的正态分布即映射点属于中的哪一个celle. 通过评估每个映射点的分布并对结果求和来确定参数的得分 scoref. 通过尝试优化分数来计算新的参数估计。这是通过执行牛顿算法非线性最小二乘中一种方法的一个步骤来实现的g. 转到c直到满足收敛条件。4. 代码#include iostream #include thread #include pcl/io/pcd_io.h #include pcl/point_types.h #include pcl/registration/ndt.h #include pcl/filters/approximate_voxel_grid.h #include pcl/visualization/pcl_visualizer.h using namespace std::chrono_literals; int main () { // Loading first scan of room. pcl::PointCloudpcl::PointXYZ::Ptr target_cloud (new pcl::PointCloudpcl::PointXYZ); if (pcl::io::loadPCDFilepcl::PointXYZ (room_scan1.pcd, *target_cloud) -1) { PCL_ERROR (Couldnt read file room_scan1.pcd \n); return (-1); } std::cout Loaded target_cloud-size () data points from room_scan1.pcd std::endl; // Loading second scan of room from new perspective. pcl::PointCloudpcl::PointXYZ::Ptr input_cloud (new pcl::PointCloudpcl::PointXYZ); if (pcl::io::loadPCDFilepcl::PointXYZ (room_scan2.pcd, *input_cloud) -1) { PCL_ERROR (Couldnt read file room_scan2.pcd \n); return (-1); } std::cout Loaded input_cloud-size () data points from room_scan2.pcd std::endl; // Filtering input scan to roughly 10% of original size to increase speed of registration. pcl::PointCloudpcl::PointXYZ::Ptr filtered_cloud (new pcl::PointCloudpcl::PointXYZ); pcl::ApproximateVoxelGridpcl::PointXYZ approximate_voxel_filter; approximate_voxel_filter.setLeafSize (0.2, 0.2, 0.2); approximate_voxel_filter.setInputCloud (input_cloud); approximate_voxel_filter.filter (*filtered_cloud); std::cout Filtered cloud contains filtered_cloud-size () data points from room_scan2.pcd std::endl; // Initializing Normal Distributions Transform (NDT). pcl::NormalDistributionsTransformpcl::PointXYZ, pcl::PointXYZ ndt; // Setting scale dependent NDT parameters // Setting minimum transformation difference for termination condition. ndt.setTransformationEpsilon (0.01); // Setting maximum step size for More-Thuente line search. ndt.setStepSize (0.1); //Setting Resolution of NDT grid structure (VoxelGridCovariance). ndt.setResolution (1.0); // Setting max number of registration iterations. ndt.setMaximumIterations (35); // Setting point cloud to be aligned. ndt.setInputSource (filtered_cloud); // Setting point cloud to be aligned to. ndt.setInputTarget (target_cloud); // Set initial alignment estimate found using robot odometry. Eigen::AngleAxisf init_rotation (0.6931, Eigen::Vector3f::UnitZ ()); Eigen::Translation3f init_translation (1.79387, 0.720047, 0); Eigen::Matrix4f init_guess (init_translation * init_rotation).matrix (); // Calculating required rigid transform to align the input cloud to the target cloud. pcl::PointCloudpcl::PointXYZ::Ptr output_cloud (new pcl::PointCloudpcl::PointXYZ); ndt.align (*output_cloud, init_guess); std::cout Normal Distributions Transform has converged: ndt.hasConverged () score: ndt.getFitnessScore () std::endl; // Transforming unfiltered, input cloud using found transform. pcl::transformPointCloud (*input_cloud, *output_cloud, ndt.getFinalTransformation ()); // Saving transformed input cloud. pcl::io::savePCDFileASCII (room_scan2_transformed.pcd, *output_cloud); // Initializing point cloud visualizer pcl::visualization::PCLVisualizer::Ptr viewer_final (new pcl::visualization::PCLVisualizer (3D Viewer)); viewer_final-setBackgroundColor (0, 0, 0); // Coloring and visualizing target cloud (red). pcl::visualization::PointCloudColorHandlerCustompcl::PointXYZ target_color (target_cloud, 255, 0, 0); viewer_final-addPointCloudpcl::PointXYZ (target_cloud, target_color, target cloud); viewer_final-setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, target cloud); // Coloring and visualizing transformed input cloud (green). pcl::visualization::PointCloudColorHandlerCustompcl::PointXYZ output_color (output_cloud, 0, 255, 0); viewer_final-addPointCloudpcl::PointXYZ (output_cloud, output_color, output cloud); viewer_final-setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, output cloud); // Starting visualizer viewer_final-addCoordinateSystem (1.0, global); viewer_final-initCameraParameters (); // Wait until visualizer window is closed. while (!viewer_final-wasStopped ()) { viewer_final-spinOnce (100); std::this_thread::sleep_for(100ms); } return (0); }参考文献自动驾驶十---------正态分布变换NDT_一实相印的博客-CSDN博客NDT点云配准_有了个相册的博客-CSDN博客_ndt点云配准3d激光雷达开发ndt匹配_嵌入式-老费的博客-CSDN博客_ndt匹配

相关文章:

点云匹配方法 NDT(正态分布变换)

1. 正态分布变换 (NDT) 在点云匹配中,ICP基于距离直接最优化变换矩阵的参数,由于是欠定方程且旋转矩阵的约束,使得结果很难优化,为此在新的维度优化变换矩阵的参数,被很好的提出: 先将参考点云&#xff0…...

2026年测试工程师常用性能测试平台:高效办公与场景适配指南

测试工程师作为性能测试的核心执行者,对性能平台的需求聚焦于高效办公、功能全面、易用性强、问题定位精准四大维度。测试工程师日常工作涵盖脚本开发、场景编排、压测执行、监控分析、报告生成等多个环节,合适的性能平台,能够提升工作效率&a…...

yargs单元测试终极指南:使用mocha测试CLI命令的完整实践

yargs单元测试终极指南:使用mocha测试CLI命令的完整实践 【免费下载链接】yargs yargs the modern, pirate-themed successor to optimist. 项目地址: https://gitcode.com/gh_mirrors/ya/yargs yargs是一款功能强大的现代命令行参数解析工具,为…...

2026年中小企业性能测试平台:低成本易落地选型指南

中小企业在性能测试方面面临痛点:专业测试人员匮乏、预算有限、IT 架构相对简单、测试需求集中在基础接口与核心业务场景,无需复杂的企业级管控与大规模并发压测能力。因此,中小企业对性能测试平台的核心需求是:低成本、易落地、易…...

AGENT_OS:为AI智能体构建结构化外部记忆与任务操作系统

1. 项目概述:为AI智能体构建一个结构化的外部记忆与操作系统如果你正在使用Claude、GPT-4或者OpenClaw这类AI助手来帮你处理工作,你很可能已经发现了一个核心痛点:每次开启新对话,它都像一张白纸。你得花大量时间重新介绍你是谁、…...

MoneyPrinter监控面板搭建终极指南:实时追踪YouTube Shorts自动化生成状态

MoneyPrinter监控面板搭建终极指南:实时追踪YouTube Shorts自动化生成状态 【免费下载链接】MoneyPrinter Automate Creation of YouTube Shorts using MoviePy. 项目地址: https://gitcode.com/gh_mirrors/mo/MoneyPrinter 想要实时掌握YouTube Shorts自动化…...

光耦LED寿命评估与可靠性设计实践

1. 光耦LED寿命评估的核心价值 在工业自动化控制系统中,我曾亲眼目睹一个价值数百万的生产线因为光耦器件失效导致整个控制系统误动作。故障排查时发现,正是光耦内部的LED光源经过5年连续工作后出现严重光衰,使得信号传输出现错误。这个教训让…...

TinyML中的数据感知NAS技术解析与应用

1. TinyML与神经网络架构搜索概述在嵌入式设备和物联网终端上部署机器学习模型(TinyML)面临着严峻的资源约束问题。典型的微控制器(MCU)仅有几十KB内存和几百MHz主频,这迫使开发者必须在模型精度与资源消耗之间寻找平衡…...

Sutton《苦涩的教训》早已预言:一切**人工精巧设计的专用智能系统**,终将被算力与数据驱动的通用范式无情取代

《The Bitter Lesson》《苦涩的教训》3条极简核心背诵版 人类总爱把领域知识、手工设计、精巧架构塞进AI,短期有用,长远全没用。AI 历史规律:通用规模化(算力数据大模型)永远碾压 人工定制智能小系统。未来趋势&#x…...

提升boardgame.io游戏加载速度的终极指南:客户端缓存策略全解析

提升boardgame.io游戏加载速度的终极指南:客户端缓存策略全解析 【免费下载链接】boardgame.io State Management and Multiplayer Networking for Turn-Based Games 项目地址: https://gitcode.com/gh_mirrors/bo/boardgame.io boardgame.io是一款专注于回合…...

联发科与威睿电通合作:深度解析全球模式SoC如何实现CDMA与LTE融合

1. 项目概述:一次芯片设计领域的“握手”每年的国际消费电子展(CES)总是热闹非凡,各种炫目的消费电子产品占据着舞台中央。但作为从业者,我们更关注的是那些隐藏在光鲜产品背后、驱动一切的技术基石。2014年的CES上&am…...

【花雕学编程】Arduino动手做(252)---ESP32-S3-RGB-LED矩阵开发板之全屏循环显示七种颜色

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的…...

【花雕学编程】Arduino动手做(252)---ESP32S3矩阵Matrix开发板之搭建开发环境

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的…...

jdk1.8.0_05 在 SpringBootTest Debug模式下奔溃

之前好好的项目,最近换了之前的电脑,但是在使用SpringBootTest 启动debug模式时,虚拟机就会奔溃,通过修改如果把 junit5 import org.junit.jupiter.api.Test; 修改为 junit4 ,就不奔溃了 import org.junit.Test; 但是这样的话就得在测试类上加上 @RunWith(SpringRunn…...

ARM错误恢复中断机制与ERRERICR2寄存器详解

1. ARM错误恢复中断机制概述在ARM架构的可靠性、可用性和可维护性(RAS)系统中,错误恢复中断是实现硬件容错的关键机制。当处理器检测到可恢复的错误条件时,通过这套机制能够快速通知系统进行错误处理,而ERRERICR2寄存器…...

Git冲突解决终极指南:5步掌握hello-git实战视频中的冲突处理技巧

Git冲突解决终极指南:5步掌握hello-git实战视频中的冲突处理技巧 【免费下载链接】hello-git Curso para aprender a trabajar con el sistema de control de versiones Git y la plataforma GitHub desde cero y para principiantes. 项目地址: https://gitcode.…...

苹果果梗检测数据集VOC+YOLO格式1141张2类别有增强

注意数据集大约450张是原图剩余均为增强生成图片数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):1141标注数量(xml文件个数):1141…...

LLM长上下文建模技术全景:从高效注意力到RAG与评测实践

1. 项目概述:一份关于长上下文建模的“藏宝图”如果你正在研究大语言模型(LLM)的长上下文处理能力,无论是为了优化推理速度、降低内存消耗,还是为了构建能理解超长文档、视频或多轮对话的智能体,那么你大概…...

告别JSON臃肿:手把手教你用MessagePack为C++微服务瘦身(附性能对比)

告别JSON臃肿:手把手教你用MessagePack为C微服务瘦身(附性能对比) 在当今高性能后端服务开发中,微服务架构已成为主流选择。然而,随着服务规模的扩大,服务间通信的数据量急剧增长,传统的JSON序列…...

Linaria与Bun集成:极速JavaScript运行时的样式处理终极指南 [特殊字符]

Linaria与Bun集成:极速JavaScript运行时的样式处理终极指南 🚀 【免费下载链接】linaria Zero-runtime CSS in JS library 项目地址: https://gitcode.com/gh_mirrors/li/linaria 在现代前端开发中,CSS-in-JS技术已经成为构建可维护、…...

基于MCP协议与WebDAV构建AI智能体统一数据访问层

1. 项目概述与核心价值最近在折腾个人知识库和自动化工作流时,我又一次被“数据孤岛”问题绊住了脚。手头的信息散落在各种地方:Notion里的项目规划、Obsidian的零散笔记、Google Calendar的日程、甚至是一些本地文件夹里的PDF和图片。想要让这些数据联动…...

PyTorch深度学习资源大全:如何快速找到最佳教程和项目库的终极指南

PyTorch深度学习资源大全:如何快速找到最佳教程和项目库的终极指南 【免费下载链接】the-incredible-pytorch The Incredible PyTorch: a curated list of tutorials, papers, projects, communities and more relating to PyTorch. 项目地址: https://gitcode.c…...

147.YOLOv8 vs YOLOv5 核心差异 + 缺陷检测完整代码,从原理到落地一步到位

摘要 YOLO(You Only Look Once)系列算法是目标检测领域最具影响力的单阶段检测模型。本文从零开始,系统讲解YOLOv8的核心原理与完整实践流程。通过一个工业级缺陷检测案例,覆盖从数据准备、模型训练、评估到部署的全链路。所有代码均基于Ultralytics官方库实现,确保可复现…...

【紧急通告】DeepSeek-R1毒性分类器存在语境盲区?3小时内验证并热修复的4种API级补丁

更多请点击: https://intelliparadigm.com 第一章:【紧急通告】DeepSeek-R1毒性分类器存在语境盲区?3小时内验证并热修复的4种API级补丁 近期社区报告指出,DeepSeek-R1毒性分类器在处理嵌套反讽、多轮对话上下文拼接及跨语言混合…...

146.轻量化部署口罩检测!YOLOv8 模型导出(ONNX/TensorRT)实战教程

摘要 YOLO(You Only Look Once)作为目标检测领域里程碑式的算法,以其端到端、单阶段、高实时性的特点,成为工业界最广泛应用的检测框架。本文从YOLO的进化脉络出发,深入剖析其核心原理,包括网格划分、边界框回归、损失函数设计与非极大值抑制。通过一个完整的可运行案例…...

开发者效率革命:用dotfiles打造可移植的个性化开发环境

1. 项目概述:dotfiles,开发者效率的基石 如果你在终端里敲命令时,总觉得默认的配置不够顺手,或者每次在新机器上都要花半天时间重新配置一遍开发环境,那“dotfiles”这个概念对你来说就是救星。jesuserro/dotfiles 这个…...

如何利用co与Web Workers实现前端多线程异步编程:完整指南

如何利用co与Web Workers实现前端多线程异步编程:完整指南 【免费下载链接】co The ultimate generator based flow-control goodness for nodejs (supports thunks, promises, etc) 项目地址: https://gitcode.com/gh_mirrors/co/co co是一个基于生成器的No…...

AI代理如何通过MCP协议实现DeFi自动化操作与安全交互

1. 项目概述:当DeFi遇上AI代理,一场链上金融的自动化革命如果你和我一样,在DeFi(去中心化金融)世界里摸爬滚打了好几年,从早期的流动性挖矿到后来的各种收益聚合器,一个深刻的体会是&#xff1a…...

告别Appium!用Python+uiautomator2搞定Android自动化测试(保姆级环境搭建指南)

告别Appium!用Pythonuiautomator2搞定Android自动化测试(保姆级环境搭建指南) 如果你正在为Appium的复杂配置、缓慢执行速度而头疼,或者厌倦了那些莫名其妙的连接问题,那么是时候尝试更轻量高效的解决方案了。uiautoma…...

如何快速掌握co:异步代码复用与模块化终极指南

如何快速掌握co:异步代码复用与模块化终极指南 【免费下载链接】co The ultimate generator based flow-control goodness for nodejs (supports thunks, promises, etc) 项目地址: https://gitcode.com/gh_mirrors/co/co co是Node.js生态中一款强大的基于生…...