第 37 章 · 综合项目二:3D 点云与刚体变换

发布时间:2026/10/9 15:15:08
第 37 章 · 综合项目二:3D 点云与刚体变换 第二个实战项目处理 3D 点云做旋转和平移。这是计算机图形学、机器人、SLAM 的基础。本项目综合运用vector、几何模块、刚体变换。37.1 什么是点云点云point cloud是一堆三维点的集合。激光雷达扫描、3D 扫描仪输出的就是点云。机器人、自动驾驶靠处理点云来看世界。在 Eigen 里一个点就是一个Vector3d点云就是std::vectorVector3d。37.2 项目目标完成两个任务构造点云生成一个立方体的 8 个顶点变换点云绕 Z 轴旋转 90°再平移观察点云的变化统计点云计算质心平均点37.3 完整代码#includeEigen/Dense#includeEigen/Geometry#includeiostream#includevectorintmain(){constdoublePI3.14159265358979;// ---- 任务 1构造立方体的 8 个顶点 ----std::vectorEigen::Vector3dcloud;for(intx0;x1;x)for(inty0;y1;y)for(intz0;z1;z)cloud.push_back(Eigen::Vector3d(x,y,z));std::cout点云有 cloud.size() 个点std::endl;// ---- 任务 2变换绕 Z 转 90° 再平移----Eigen::Isometry3d TEigen::Isometry3d::Identity();T.rotate(Eigen::AngleAxisd(PI/2,Eigen::Vector3d::UnitZ()));T.pretranslate(Eigen::Vector3d(10,0,0));std::cout变换前 - 变换后std::endl;for(constautop:cloud){Eigen::Vector3d p2T*p;std::cout p.transpose() - p2.transpose()std::endl;}// ---- 任务 3计算质心 ----Eigen::Vector3d centroidEigen::Vector3d::Zero();for(constautop:cloud){centroidp;}centroid/cloud.size();std::cout质心 centroid.transpose()std::endl;// (0.5, 0.5, 0.5)return0;}编译运行存成ch37.cpp按附录 C.3 的命令g-stdc17-O2-I你的Eigen目录ch37.cpp-och37.exe ./ch37.exe实际输出点云有 8 个点 变换前 - 变换后 0 0 0 - 10 0 0 0 0 1 - 10 0 1 0 1 0 - 9 1.61554e-15 0 0 1 1 - 9 1.61554e-15 1 1 0 0 - 10 1 0 1 0 1 - 10 1 1 1 1 0 - 9 1 0 1 1 1 - 9 1 1 质心 0.5 0.5 0.51.61554e-15是 0 的浮点残渣第 21 章末尾讲过不用管它。37.4 运行结果解读立方体 8 个顶点是 (0/1, 0/1, 0/1) 的所有组合绕 Z 转 90°X 轴方向转到 Y 轴(1,0,0) → (0,1,0)平移 (10,0,0)所有点 X 坐标 10质心8 个顶点的平均 (0.5, 0.5, 0.5)37.5 拓展练习拓展 1计算点云的包围盒包围盒bounding box 各方向上的最小值和最大值用来快速判断点云占了多大空间。接着第 37.3 节的程序做把下面几行粘贴到ch37.cpp里打印质心那一行之后、return 0;之前此处的cloud就是前面构造好的 8 个顶点// 包围盒 所有坐标的最小值和最大值Eigen::Vector3d minPtcloud[0],maxPtcloud[0];for(constautop:cloud){minPtminPt.cwiseMin(p);// 逐元素取最小maxPtmaxPt.cwiseMax(p);// 逐元素取最大}std::cout包围盒minPt.transpose() 到 maxPt.transpose()std::endl;重新编译运行最后一行新增包围盒0 0 0 到 1 1 1立方体的 8 个顶点正好落在 0 和 1 上所以包围盒是 (0,0,0) 到 (1,1,1)。注意这段用的是原始点云未变换如果换成T * p的结果包围盒会跟着平移走。拓展 2两点云配准ICP 的思想机器人里常要做点云配准找变换 T 使两个点云对齐。经典算法 ICP 的核心就是对每个点找最近对应点用最小二乘求最优刚体变换迭代直到收敛这综合了本项目的刚体变换和第 36 章的最小二乘是值得深入的方向。37.6 学完这个项目你掌握了什么用vectorEigen::Vector3d表示点云用Isometry3d做刚体变换用cwiseMin/cwiseMax做逐元素运算用循环 归约做统计质心这些正是机器人、SLAM、3D 图形领域天天在用的操作。37.7 小结点云 vectorVector3d。刚体变换 旋转 平移用Isometry3d。质心、包围盒等统计都可用 Eigen 简洁实现。点云配准ICP是更深入的实战方向。练习题生成一个 2×2×2 的网格点云步长 0.5打印点数。对点云做一次刚体变换观察变化。计算点云的质心和包围盒。用cwiseMin/cwiseMax实现包围盒计算。思考怎么判断两个点云是否对齐

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询