Eigen 幾何模塊深拆:Isometry3d vs Affine3d + 變換矩陣本質詳解

文章目錄

  • 0 寫在前面
  • 1 數學背景對比
  • 2 Eigen 實現差異
  • 3 `Isometry3d` 是不是 4 × 4 矩陣?
  • 4 核心 API 速查
  • 5 實戰示例
    • 5.1 SLAM 位姿鏈:相機點 → 世界點
    • 5.2 體素濾波:各向異性縮放(X/Y → 5 cm,Z → 10 cm)
    • 5.3 把通用 4×4 矩陣 M “正交化”為剛體變換
  • 6 性能與數值建議
  • 7 常見坑 · 排雷
  • 8 Cheat Sheet (貼工位)
  • 9 總結
  • 參考資料


目錄

  • 0 寫在前面
  • 1 數學背景對比
  • 2 Eigen 實現差異
  • 3 `Isometry3d` 是不是 4 × 4 矩陣?
  • 4 核心 API 速查
  • 5 實戰示例
    • 5.1 SLAM 位姿鏈:相機點 → 世界點
    • 5.2 體素濾波:各向異性縮放(X/Y → 5 cm,Z → 10 cm)
    • 5.3 把通用 4×4 矩陣 M “正交化”為剛體變換
  • 6 性能與數值建議
  • 7 常見坑 · 排雷
  • 8 Cheat Sheet (貼工位)
  • 9 總結
  • 參考資料


0 寫在前面

在 vSLAM / VIO / 機器人定位等工程實踐中,90 % 的變換只是旋轉 + 平移的剛體運動;只有不到 10 % 的場景(點云體素縮放、圖像幾何映射、CAD 變形等)才會用到帶縮放或剪切的仿射變換。Eigen 針對這兩類需求提供了

類別Eigen 類型數學對應
剛體變換Eigen::Isometry3dSE(3)
一般仿射Eigen::Affine3dA(3)

本文將從 數學原理 → 內部結構 → 常用 API → 實戰示例 → 性能建議 → 易錯排查 全方位梳理它們,并回答一個高頻疑惑Isometry3d 究竟是不是 4 × 4 矩陣?


1 數學背景對比

剛體變換 SE(3)仿射變換 A(3)
定義保持點間距離不變的變換線性變換 A + 平移 t(可帶縮放/剪切)
矩陣結構[Rt01]\displaystyle\begin{bmatrix}R&t\\0&1\end{bmatrix}[R0?t1?]R∈SO(3)R∈SO(3)RSO(3)[At01]\displaystyle\begin{bmatrix}A&t\\0&1\end{bmatrix}[A0?t1?]AAA 任意 3 × 3
自由度6 (3 旋轉 + 3 平移)≤ 12 (9 線性 + 3 平移)
典型應用傳感器外參、SLAM 位姿、TF 廣播圖像/點云縮放、CAD 模型變形

2 Eigen 實現差異

特性Isometry3dAffine3d
旋轉部分強制正交(det = 1)任意 3 × 3
存儲封裝 4 × 4 矩陣(剛體特化)封裝 4 × 4 矩陣
求逆只需 R?,?R?tR^\top,\,-R^\top tR?,?R?t通用 4 × 4 逆
內存12 double (9 R + 3 t)16 double
語義保障保證組合后仍為剛體可能引入縮放/剪切

3 Isometry3d 是不是 4 × 4 矩陣?

結論:是!
Isometry3d4 × 4 齊次剛體矩陣的封裝類

  • 數學結構

    T=[Rt01],R∈SO(3)T=\begin{bmatrix}R&t\\0&1\end{bmatrix},\;R∈SO(3) T=[R0?t1?],RSO(3)

  • 代碼驗證

    Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
    Eigen::Matrix4d  H = T.matrix();   // H 是標準 4x4
    
類型本質維度剛體約束典型用途
Matrix4d純 4×4 矩陣4×4?渲染 / 存盤
Isometry3d剛體 SE(3)4×4 (封裝)?SLAM / VIO
Affine3d仿射 A(3)4×4 (封裝)?圖像/點云縮放

4 核心 API 速查

#include <Eigen/Geometry>// ── Isometry3d ───────────────────────────
Isometry3d T = Isometry3d::Identity();
T.rotate(q.toRotationMatrix());  // 寫入旋轉
T.pretranslate(t);               // 左乘平移
Matrix4d H = T.matrix();         // 取 4×4// 組合與逆
Isometry3d Tab  = Ta * Tb;       // 右側先執行
Isometry3d Tinv = T.inverse();   // 快速剛體逆
Vector3d  pw    = T * pc;        // 點變換// ── Affine3d ────────────────────────────
Affine3d A = Affine3d::Identity();
A.linear() <<0.5, 0,   0,0,   0.5, 0,0,   0,   1;                 // 含縮放
A.translation() = Vector3d(1,2,3);

5 實戰示例

5.1 SLAM 位姿鏈:相機點 → 世界點

// T_w_b :  body 坐標系 → world 坐標系   (車輛/IMU Pose)
Isometry3d T_w_b;     // T_b_c :  camera 坐標系 → body 坐標系   (相機外參)
Isometry3d T_b_c;     // p_c    :  相機坐標系下的點坐標(單位 m)
Vector3d  p_c(0.1, 0.2, 1.0);// 右乘先算:p_c 先映射到 body,再映射到 world
Vector3d  p_w = T_w_b * T_b_c * p_c;  

要點

  • 乘法寫成 “外層坐標系 * 內層坐標系 * 點”
  • 代碼順序 = 實際執行的坐標系級聯(最右邊先計算)

5.2 體素濾波:各向異性縮放(X/Y → 5 cm,Z → 10 cm)

Affine3d voxel = Affine3d::Identity();// 設置線性部分:對 (x,y,z) 軸分別乘以 0.05, 0.05, 0.10
voxel.linear() <<0.05, 0,    0,0,    0.05, 0,0,    0,    0.10;// 若還需平移,可再設置 voxel.translation()// 直接對點或點云做縮放
point = voxel * point;

要點

  • Affine3d,因為含 縮放 ? 非剛體
  • .linear() 修改 3 × 3 線性塊,.translation() 負責平移

5.3 把通用 4×4 矩陣 M “正交化”為剛體變換

// ① 讀進來時先用 Affine3d 保存,保留所有信息
Affine3d A(M);      // ② 提取線性部分做極分解 / 四元數歸一化,得到最接近的正交矩陣
Quaterniond q(A.linear());         // 自動正交化
Matrix3d    R = q.toRotationMatrix();// ③ 重新組裝為 Isometry3d(剛體),平移直接拷貝
Isometry3d T;
T.linear()      = R;               // 旋轉 (正交)
T.translation() = A.translation(); // 平移

要點

  1. 外部矩陣不保證正交 → 先用 Affine3d 接收
  2. 利用 Quaterniond 把 3 × 3 線性塊正交化
  3. 重新封裝成 Isometry3d,之后即可安全用于 SLAM 位姿累乘

6 性能與數值建議

場景推薦類型
大量位姿累乘 / 求逆Isometry3d
含尺度 / 剪切Affine3d
不確定線性部分是否正交Affine3d,再正交化
與 Sophus / g2o 聯合始終保持 Isometry3d

7 常見坑 · 排雷

  1. 乘法順序與注釋不符
    T_a_b * T_b_c 表示“先 c→b,再 b→a”——注釋別寫反!
  2. 誤往 Isometry3d.linear() 寫入非正交矩陣
    寫完請確保 R.col(i).norm()==1det≈1
  3. 角度單位
    Eigen 全部使用 弧度,杜絕度→弧度混用。
  4. 存盤丟語義
    T.matrix(),讀后用 Isometry3d(H) 恢復。

8 Cheat Sheet (貼工位)

#include <Eigen/Geometry>Isometry3d T = Isometry3d::Identity();
T.rotate(q);              // 寫旋轉
T.pretranslate(t);        // 寫平移
Vector3d p = T * pc;      // 變換點
Matrix4d H = T.matrix();  // 導出 4×4
T = Isometry3d(H);        // 從矩陣恢復

9 總結

類型選它的理由典型任務
Isometry3d強制剛體、逆運算 O(1)SLAM 位姿、外參、TF
Affine3d允許縮放/剪切點云/圖像幾何、CAD
Matrix4d無語義,最通用統一存盤 / 可視化

牢記 “右乘先算,左乘決定結果坐標系”,你的姿態鏈將穩固無坑。祝開發順利!


參考資料

  • Eigen 官方文檔:https://eigen.tuxfamily.org/dox/group__Geometry__Module.html
  • 《視覺 SLAM 十四講》第 3 章

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914042.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914042.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914042.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python的病例管理系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具&#xff1a;Navicat/SQLyog等都可以 隨著醫療…

博客系統開發全流程解析(前端+后端+數據庫)與 AI 協作初體驗

一、前言&#xff1a;為什么選擇博客系統作為全棧入門&#xff1f; 對于初入編程世界的開發者來說&#xff0c;“全棧” 似乎是一個龐大而遙遠的概念。前端、后端、數據庫、部署運維… 知識體系繁雜&#xff0c;令人望而生畏。選擇一個目標明確、功能完整且貼近實際應用的項目…

Xavier公式的原理

數學原理&#xff1a; (1) 前向傳播的方差一致性 假設輸入 x 的均值為 0&#xff0c;方差為 σx2σ_x^2σx2?&#xff0c;權重 W的均值為 0&#xff0c;方差為 σW2σ_W^2σW2?&#xff0c;則輸出 zWxzWxzWx的方差為&#xff1a; Var(z)nin?Var(W)?Var(x) Var(z)n_{in}?Va…

pytorch學習筆記(二)-- pytorch模型開發步驟詳解

簡介&#xff1a; 本章主要是針對Pytorch神經網絡的開發步驟做一個詳細的總結&#xff0c;對每一步的前世今生做一個了解&#xff0c;下面先列一下開發需要的步驟有哪些&#xff1a; 模型構建&#xff0c;主要是前向傳遞函數的確認確認損失函數以及學習步頻&#xff08;learni…

consul 的安裝與服務發現

1. helm 安裝 consul 到 k8s 安裝放在這里了&#xff1a;https://github.com/lianan2/installation/tree/master/consul-helm consul 的常用命令&#xff1a; # 查看集群狀態 kubectl -n consul exec -it consul-server-0 -- consul operator raft list-peers kubectl -n con…

ros topic和service的使用

在做ldiar slam的時候&#xff0c;最常用的當屬topic&#xff0c;偶爾也會用一下service&#xff0c;action則很少使用。現在一塊來看一下topic的使用。一、topic的使用topic的消息訂閱和發布#include<ros/ros.h> #include<rosbag/bag.h> #include<rosbag/view.…

【TCP/IP】18. 因特網服務質量

18. 因特網服務質量18. 因特網服務質量18.1 服務質量&#xff08;QoS&#xff09;18.2 實時傳輸協議&#xff08;RTP&#xff09;18.3 實時傳輸控制協議&#xff08;RTCP&#xff09;18.4 集成業務&#xff08;IntServ&#xff09;18.5 區分業務&#xff08;DiffServ&#xff0…

數據集相關類代碼回顧理解 | StratifiedShuffleSplit\transforms.ToTensor\Counter

【PyTorch】圖像多分類項目 目錄 StratifiedShuffleSplit transforms.ToTensor Counter StratifiedShuffleSplit sss StratifiedShuffleSplit(n_splits1, test_size0.2, random_state0) 創建StratifiedShuffleSplit對象&#xff0c;用于將數據集劃分為訓練集和測試集。 …

【環境配置】KAG - Windows 安裝部署

前言 本博客將介紹如何在 Windows 系統上 部署運行 KAG 項目&#xff0c;將使用 WSL 和 Docker 和 Vscode 幫助我們之后利用 KAG 開發個人知識庫問答項目。 KAG&#xff08;Knowledge-Augmented Generation&#xff09;知識增強生成系統 是一個融合知識圖譜與大語言模型能力的…

《探索電腦麥克風聲音采集多窗口實時可視化技術》

引言在當今數字化信息飛速發展的時代&#xff0c;聲音作為一種重要的信息載體&#xff0c;其處理和分析技術日益受到廣泛關注。聲音可視化技術&#xff0c;作為聲音處理領域的關鍵技術之一&#xff0c;具有極為重要的價值。它能夠將抽象的聲音信號轉化為直觀的視覺圖像&#xf…

加工進化論:SPL 一鍵加速日志轉指標

作者&#xff1a;勞貴泓&#xff08;泓逸&#xff09; 1. 背景 日志服務的 SPL&#xff08;Search Processing Language&#xff09;自推出以來&#xff0c;憑借其強大的數據處理能力&#xff0c;已經成為眾多開發者和企業實現高效數據分析的首選工具。隨著業務場景的不斷拓展…

Web 應用防火墻:守護應用安全的核心屏障

當你在調試 Web 應用時&#xff0c;是否遇到過這樣的情況&#xff1a;剛修復的 XSS 漏洞又被繞過&#xff0c;數據庫日志里突然出現詭異的 SQL 語句&#xff0c;或者用戶反饋登錄后信息被篡改&#xff1f;這些問題的背后&#xff0c;往往是 Web 應用面臨的持續安全威脅。據 OWA…

Python 網絡爬蟲的基本流程及 robots 協議詳解

數據驅動的時代,網絡爬蟲作為高效獲取互聯網信息的工具,其規范化開發離不開對基本流程的掌握和對 robots 協議的遵守。本文將系統梳理 Python 網絡爬蟲的核心流程,并深入解讀 robots 協議的重要性及實踐規范。 一、Python 網絡爬蟲的基本流程 Python 網絡爬蟲的工作過程可…

字節二面(狠狠拷打系列):什么是http1.1,2.0,3.0,分別在什么場景里面用的多

文章目錄從單行到新紀元&#xff1a;HTTP/0.9、1.0、1.1、2.0與3.0的核心區別HTTP/0.9&#xff1a;協議的黎明 (1991)HTTP/1.0&#xff1a;功能擴展與標準化 (1996)HTTP/1.1&#xff1a;持久連接與性能優化 (1997)HTTP/2.0&#xff1a;二進制與多路復用 (2015)HTTP/3.0&#xf…

Java教程:JavaWeb ---MySQL高級

?博客主頁&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客內容》&#xff1a;大數據開發、.NET、Java.測試開發、Python、Android、Go、Node、Android前端小程序等相關領域知識 &#x1f4e2;博客專欄&#xff1a; https://blog.csdn.net/m0_…

Audio筆試和面試題型解析

本專欄預計更新90期左右。當前第27期-音頻部分. 音頻硬件在消費電子(手機、電腦、耳機、智能音箱)、汽車、專業音響等領域是用戶體驗的關鍵組成部分。大廠(如蘋果、三星、Google、華為、小米、各種汽車Tier 1供應商等)的硬件工程師在設計和優化音頻系統時,需要對喇叭(揚…

DeepSeek俄羅斯方塊網頁版HTML5(附源碼)

用DeepSeek生成一個俄羅斯方塊游戲網頁版的&#xff0c;基于HTML5&#xff0c;效果很棒。 提示詞prompt 幫我做一個俄羅斯方塊 網頁版的 基于HTML5游戲功能說明 基本功能&#xff1a; 完整的俄羅斯方塊游戲邏輯 7種不同形狀的方塊 分數計算系統 等級提升系統(速度會隨等級提高)…

企業電商平臺搭建:ZKmall開源商城服務器部署與容災方案

企業級電商平臺最核心的訴求&#xff0c;就是得讓 “業務一直在線”—— 不管是平時運營要穩如磐石&#xff0c;還是突然出故障了能火速恢復&#xff0c;都離不開靠譜的服務器部署架構和周全的容災方案。ZKmall 開源商城攢了 6000 多家企業客戶的實戰經驗&#xff0c;琢磨出一套…

【軟件運維】前后端部署啟動的幾種方式

.sh啟動 #!/bin/bash# 解析軟鏈接&#xff0c;獲取真實腳本目錄 SOURCE"${BASH_SOURCE[0]}" while [ -L "$SOURCE" ]; doDIR"$( cd -P "$( dirname "$SOURCE" )" && pwd )"SOURCE"$(readlink "$SOURCE&q…

[爬蟲知識] DrissionPage:強大的自動化工具

相關爬蟲實戰案例&#xff1a;[爬蟲實戰] 使用 DrissionPage 自動化采集小紅書筆記 相關爬蟲專欄&#xff1a;JS逆向爬蟲實戰 爬蟲知識點合集 爬蟲實戰案例 逆向知識點合集 前言&#xff1a; 在當今數據驅動的世界里&#xff0c;網絡爬蟲和自動化測試扮演著越來越重要的角…