任意空间平面点云旋转投影至水平面—罗德里格旋转公式

1、背景介绍

       将三维空间中位于任意平面上的点云数据,通过一系列的坐标变换(平移+旋转),使其投影到XOY平面上,同时保证点云的几何中心与XOY平面的原点重合,同时点云形状保持不变。具体效果如下,具体来说,对于原始点集(红色点集),对其进行平移+旋转处理后,得到新的点云(白色点云),该点云与水平面平行,同时保持与原始点云形状相同。

三维空间动图前视图(白色点云水平)俯视图(两点云簇形状形同)

      为什么要将点云旋转,将其与水平面平行,这样做的好处体现在以下几方面:

  • 数据简化:将三维问题简化为二维问题,便于后续处理,如数据分析、可视化、特征提取等。
  • 算法适用性:某些算法可能在二维平面上表现得更好或更高效,投影可以使得这类算法得以应用。
  • 几何一致性:确保所有点云数据在同一参考平面上,便于比较和处理。

2、点云旋转投影流程与原理

2.1 流程介绍

     一般来说,点云旋转投影至水平面,包括如下步骤:

  • 中心化点云:首先计算点云的几何中心,然后将点云相对于其几何中心平移,使中心点与全局坐标系的原点重合。
  • 确定平面法向量:找出点云所在平面的法向量,这是点云所在平面垂直于三维空间的方向。
  • 旋转对齐:根据平面法向量与Z轴的偏差,构造旋转矩阵,旋转点云使之与XOY平面平行或重合。目的是消除Z坐标的影响,使所有点落在XOY平面上。
  • 投影:完成旋转后,可以安全地忽略所有点的Z坐标,只保留X和Y坐标,从而将点云投影到XOY平面上。

      上述四个步骤中,其实最为核心的步骤是求解旋转矩阵,本文介绍基于罗德里格旋转公式方法求解旋转矩阵。

2.2 推导过程

      假设待旋转的点云集,其拟合平面对应的法向量为vectorBefore(x1,y1,z1),经过旋转处理后,最终要得到的平面法向量为 vectorAfter(x2,y2,z2),将这两个向量转为单位向量。

  得到 va = normalize(vectorBefore), vb = normalize(vectorAfter)

  ② vs = vb × va, 叉乘得到旋转轴vs

  ③ v = normalize(vs), vs转为单位向量得到v

  ④ ca = vb · va, 点乘得到旋转角的余弦值 ca, 即cos(angle)

  ⑤ vt = v * scale, 对v进行缩放,方便后面计算, scale = 1 - ca

  ⑥ 旋转矩阵rm为 [3,3]矩阵, 计算原理为罗德里格旋转公式(Rodrigues' rotation formula)

    rm[0,0] = vt.x * v.x + ca    

    rm[1,1] = vt.y * v.y + ca

    rm[2,2] = vt.z * v.z + ca

    vt.x *= v.y

    vt.z *= v.x

    vt.y *= v.z

    rm[0,1] = vt.x - vs.z

    rm[0,2] = vt.z - vs.y

    rm[1,0] = vt.x - vs.z

    rm[1,2] = vt.y - vs.x

    rm[2,0] = vt.z - vs.y

    rm[2,1] = vt.y - vs.x

3、测试与结果

      基于上述步骤原理,使用C++进行编程,使用Eigen库进行向量点乘、叉乘。源代码下载链接:

https://download.csdn.net/download/qq_32867925/89552493

  随机生成10000个位于同一平面点集,其中可以根据需要修改平面方程,从而生成不同平面上点集。

for (int i = 0; i < numpt; i++){double x = rand() % 500;double y = rand() % 500;double z = 1 * x + 1 * y - 5;//假设平面方程类型 x+y-z-5=0Vector3d temp(x, y, z);points.push_back(temp);}

     不进行中心化处理进行旋转,即旋转中心随机,结果如下,平面方程为:x+y-z-5=0。其中,红色点集为原始点云,白色点集为旋转后点集。可以发现,白色点集均处于水平,即旋转成功,与水平面平行。通过解算参数也可以看出,z轴方向的法向量分量为-1,x轴、y轴分量为0。

未中心化旋转前视图
中心化后旋转前视图

4、总结

     介绍了三维空间内平面点云旋转平移,投影至水平面过程,并展示程序测试效果。

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

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

相关文章

深入探究理解大型语言模型参数和内存需求

概述 大型语言模型 取得了显著进步。GPT-4、谷歌的 Gemini 和 Claude 3 等模型在功能和应用方面树立了新标准。这些模型不仅增强了文本生成和翻译&#xff0c;还在多模态处理方面开辟了新天地&#xff0c;将文本、图像、音频和视频输入结合起来&#xff0c;提供更全面的 AI 解…

MySQL MVCC原理

全称Multi-Version Concurrency Control&#xff0c;即多版本并发控制&#xff0c;主要是为了提高数据库的并发性能。 1、版本链 对于使用InnoDB存储引擎的表来说&#xff0c;它的聚簇索引记录中都包含两个必要的隐藏列&#xff1a; 1、trx_id&#xff1a;每次一个事务对某条…

Harbor系列之1:介绍、架构及工作流程说明

Harbor介绍、架构及工作流程说明 Harbor 是一个用于存储、签名和扫描内容的企业级容器镜像注册表项目。由 VMware 开发并于 2016 年开源。Harbor 提供了一些关键特性&#xff0c;使其成为企业使用的理想选择。 1. Harbor 介绍 1.1 什么是 Harbor Harbor 是一个开源的云原生…

UDP网口(1)概述

文章目录 1.计算机网络知识在互联网中的应用2.认识FPGA实现UDP网口通信3.FPGA实现UDP网口通信的方案4.FPGA实现UDP网口文章安排5.传送门 1.计算机网络知识在互联网中的应用 以在浏览器中输入淘宝网为例&#xff0c;介绍数据在互联网是如何传输的。我们将要发送的数据包称作A&a…

在 ROS 2 中创建一个节点的过程

在 ROS 2 中创建一个节点的过程包括几个关键步骤。以下是一般的步骤流程&#xff0c;使用 C 和 ament_cmake 构建系统为例&#xff1a; 步骤 1: 创建工作空间 如果还没有工作空间&#xff0c;首先创建一个&#xff1a; mkdir -p ~/my_ros2_ws/src cd ~/my_ros2_ws colcon bu…

Java学习Day10:总结帖

学习第十天&#xff0c;发一个总结帖&#xff01; 1.基本数据类型&#xff0c;变量 基本数据类型不用过多赘述&#xff0c;其在后面不论是面型对象还有其他知识等都会经常使用&#xff1b; 变量最重要的就是其定义&#xff1a; 这对于我们之后理解自定义类型变量有很大的用处…

【从零开始实现stm32无刷电机FOC】【实践】【5/7 stm32 adc外设的高级用法】

目录 采样时刻触发采样同步采样 点击查看本文开源的完整FOC工程 本节介绍的adc外设高级用法用于电机电流控制。 从前面几节可知&#xff0c;电机力矩来自于转子的q轴受磁力&#xff0c;而磁场强度与电流成正比&#xff0c;也就是说电机力矩与q轴电流成正相关&#xff0c;控制了…

通信网络机房服务器搬迁流程方案

数据中心机房搬迁是一项负责高难度的工程。整个搬迁过程充满挑战&#xff0c;伴随着各种风险。如何顺利的完成服务器的迁移&#xff0c;需要专业的数据中心服务商全程提供保障。友力科技&#xff08;广州&#xff09;有限公司&#xff0c;作为华南地区主流的数据中心服务商&…

Leetcode3208. 交替组 II

Every day a Leetcode 题目来源&#xff1a;3208. 交替组 II 解法1&#xff1a;环形数组 把数组复制一份拼接起来&#xff0c;和 3101 题一样&#xff0c;遍历数组的同时&#xff0c;维护以 i 为右端点的交替子数组的长度 cnt。 如果 i ≥ n 且 cnt ≥ k&#xff0c;那么 i…

【java】力扣 跳跃游戏

文章目录 题目链接题目描述代码1.动态规划2.贪心 题目链接 55.跳跃游戏 题目描述 代码 1.动态规划 1.1 dp数组的含义 dp[i]&#xff1a;从[0,i]的任意一点处出发&#xff0c;你最大可以跳跃到的位置。 例如nums[2,3,1,1,4]中: dp[0]2 dp[1]4 dp[2]4 dp[3]4 dp[4]8&#xff…

【思科】链路聚合实验配置和背景

【思科】链路聚合实验配置和背景 背景链路聚合基本概念链路聚合聚合接口 思科链路聚合协议01.PAgP协议02.LACP协议 思科链路聚合模式LACP协议模式PAgP协议模式ON模式 实验准备配置二层链路聚合LACP协议模式SW1SW2PC1PC2查看LACP聚合组建立情况查看LACP聚合端口情况查看逻辑聚合…

「实战应用」如何用DHTMLX将上下文菜单集成到JavaScript甘特图中(三)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 DHTMLX Gantt是一个高度可定制的工具&#xff0c;可以与项目管理应用程序所需的其他功能相补充。在本文中您将学习如何使用自定义上…

设计模式——模版方法和策略模式

前言 作为一名资深CV工程师&#xff0c;学会为自己减少工作量乃重中之重。但只是一味地CV&#xff0c;只会因为劣质代码而让自己的工作量加倍&#xff0c;为了将来不被繁重的维护工作而打扰自己的休息日&#xff0c;为了更好的节能&#xff0c;学习设计模式&#xff0c;刻不容缓…

数据结构_Map和Set

目录 一、搜索模型 二、Map 2.1 Map.Entry 2.2 Map 方法 2.3 Map 注意事项 三、Set 3.1 Set 方法 3.2 Set 注意事项 四、哈希表 4.1 哈希表 4.2 冲突 4.3 哈希函数设计 4.4 闭散列 4.5 开散列/哈希桶 总结 【搜索树】 二叉搜索树又称二叉排序树&#xff0c;它或…

spring-boot 整合 redisson 实现延时队列(文末有彩蛋)

应用场景 通常在一些需要经历一段时间或者到达某个指定时间节点才会执行的功能&#xff0c;比如以下这些场景&#xff1a; 订单超时提醒收货自动确认会议提醒代办事项提醒 为什么使用延时队列 对于数据量小且实时性要求不高的需求来说&#xff0c;最简单的方法就是定时扫描数据…

语音合成-TTS文字转语音(专业版)

语音合成-TTS文字转语音(专业版) 一、工具简介 *使用强大的智能AI语音库&#xff0c;合成独具特色接近真人语音的朗读音频。 *使用极具表现力和类似人类的声音&#xff0c;使文本阅读器和已启用语音的助理等方案栩栩如生。 *用途&#xff1a;这个语音工具&#xff0c;不仅可…

【C语言初阶】C语言数组基础:从定义到遍历的全面指南

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C语言 “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C语言函数 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀数组 &#x1f4d2;1. 什么是数组…

【C++】学习笔记——AVL树

文章目录 十六、AVL树1. AVL树的概念2. AVL树节点的定义3. AVL树的插入4. AVL树的旋转5. AVL树的验证6. 完整代码测试7. AVL树的性能 未完待续 十六、AVL树 1. AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&…

前端基础之JavaScript学习——函数的使用

大家好我是来自CSDN的前端寄术区博主PleaSure乐事&#xff0c;今天我们继续有关JavaScript的学习&#xff0c;使用的编译器为vscode&#xff0c;浏览器为谷歌浏览器。 函数的声明与使用 声明 在JavaScript当中函数的声明和其他语言类似&#xff0c;使用如下格式即可声明&…

实战篇(十):使用Processing创建可爱花朵:实现随机位置、大小和颜色的花朵

使用Processing创建可爱花朵 0.效果预览1. 引言2. 设置Processing环境3. 创建花朵类4. 实现花瓣绘制5. 绘制可爱的笑脸6. 鼠标点击生成花朵7. 完整代码8. 总结与扩展0.效果预览 在本教程中,我们将使用Processing编程语言来创建一个可爱的花朵生成器。通过封装花朵为一个类,并…