Eigen中Isometry3d的使用詳解和實戰示例

Eigen::Isometry3d 是 Eigen 庫中用于表示 三維空間中的剛性變換(Rigid Transformation) 的類,屬于 Eigen::Transform 模板類的一個特化版本。它結合了 旋轉和平移,廣泛應用于機器人學、SLAM、三維幾何計算等場景。


一、核心定義

#include <Eigen/Geometry>Eigen::Isometry3d T;  // 表示一個 SE(3) 類型的剛性變換

實際上:

typedef Transform<double, 3, Isometry> Isometry3d;

其中:

  • double 表示浮點數精度;
  • 3 表示三維空間;
  • Isometry 表示保持距離和角度不變的變換(旋轉 + 平移,非仿射變換)。

二、類內部數據結構

Isometry3d  ≈  3×3 旋轉矩陣 + 3×1 平移向量(共 4×4 齊次矩陣)

其內部使用的是一個 4x4 的矩陣,布局如下:

| R(3x3)  t(3x1) |
|   0     1      |

三、常用操作與代碼示例

1. 創建一個單位變換

Eigen::Isometry3d T = Eigen::Isometry3d::Identity();

2. 設置旋轉和平移

Eigen::Isometry3d T = Eigen::Isometry3d::Identity();T.translate(Eigen::Vector3d(1.0, 2.0, 3.0));  // 設置平移
T.rotate(Eigen::AngleAxisd(M_PI / 4, Eigen::Vector3d::UnitZ()));  // 繞 Z 軸旋轉 45 度

3. 構造時直接賦值旋轉和平移

Eigen::Matrix3d R = Eigen::AngleAxisd(M_PI / 4, Eigen::Vector3d::UnitZ()).toRotationMatrix();
Eigen::Vector3d t(1, 2, 3);Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
T.linear() = R;    // 設置旋轉
T.translation() = t;  // 設置平移

4. 應用變換到一個點

Eigen::Vector3d point(1, 0, 0);
Eigen::Vector3d transformed = T * point;  // 使用 operator* 自動應用 SE(3) 變換

5. 變換的逆(求 T?1)

Eigen::Isometry3d T_inv = T.inverse();

6. 與其他剛體變換相乘(組合)

Eigen::Isometry3d T2 = ...;
Eigen::Isometry3d T_composed = T * T2;

這等價于先執行 T2,再執行 T(右乘慣例)。


四、常見應用場景

場景示例
相機外參(旋轉+平移)相機從世界坐標到相機坐標系的變換矩陣
機器人關節的正向運動學 FK各連桿間剛體變換的鏈式乘法
點云變換 / 位姿優化用于把點云從一幀配準到另一幀
ORB-SLAM / GTSAM 中的位姿管理SE(3) 變換結構體

五、使用注意事項

注意點說明
.rotate().translate()左乘形式,等價于 T = T * R
.linear() 是旋轉矩陣引用,T.linear() 可直接賦值為 Eigen::Matrix3d
.matrix() 返回的是完整 4×4 齊次矩陣
不支持仿射縮放(否則應使用 Affine3d
Sophus::SE3d 有類似功能,但 Eigen::Isometry3d 適合基本計算

六、與其他類型的關系

類型用途/關系
Eigen::Matrix4dT.matrix() 可轉為 4x4 矩陣
Eigen::Quaterniond可用于構造 T.rotate()
Sophus::SE3dSophus 是基于李群實現的 SE(3),更適合優化時使用
gtsam::Pose3GTSAM 中 SE(3) 的表達,內部也是旋轉 + 平移

七、小結

  • Isometry3d 是 Eigen 中表達三維剛體變換的核心類;
  • 支持旋轉、平移組合,矩陣表示清晰;
  • 可直接作用于點、組合多個變換;
  • 是機器人、視覺 SLAM 中重要的數學工具。

八、附件示例

示例一:構建 Isometry3d 變換

#include <Eigen/Core>
#include <Eigen/Geometry>
#include <iostream>int main() {Eigen::Isometry3d T = Eigen::Isometry3d::Identity();// 設置旋轉:繞 Z 軸旋轉 90 度double angle_rad = M_PI / 2;T.rotate(Eigen::AngleAxisd(angle_rad, Eigen::Vector3d::UnitZ()));// 設置平移:向 x 方向平移 1.0T.pretranslate(Eigen::Vector3d(1.0, 0.0, 0.0));std::cout << "Isometry3d matrix:\n" << T.matrix() << std::endl;// 應用變換到一個點Eigen::Vector3d point(1, 0, 0);Eigen::Vector3d transformed = T * point;std::cout << "Original point: " << point.transpose() << std::endl;std::cout << "Transformed point: " << transformed.transpose() << std::endl;return 0;
}

示例二:從旋轉和平移構造 Isometry3d

Eigen::Matrix3d R;
R = Eigen::AngleAxisd(M_PI / 4, Eigen::Vector3d::UnitY());Eigen::Vector3d t(1, 2, 3);Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
T.linear() = R;      // 設置旋轉
T.translation() = t; // 設置平移std::cout << "Transform matrix:\n" << T.matrix() << std::endl;

示例三:組合多個變換

Eigen::Isometry3d T1 = Eigen::Isometry3d::Identity();
T1.pretranslate(Eigen::Vector3d(1, 0, 0));Eigen::Isometry3d T2 = Eigen::Isometry3d::Identity();
T2.rotate(Eigen::AngleAxisd(M_PI/2, Eigen::Vector3d::UnitZ()));Eigen::Isometry3d T_combined = T2 * T1;std::cout << "Combined transform:\n" << T_combined.matrix() << std::endl;

示例四:從 SE(3) 位姿向量構造 Isometry3d

假設有一個六維位姿向量 [tx, ty, tz, rx, ry, rz],其中旋轉為軸角向量:

Eigen::VectorXd pose(6);
pose << 1, 2, 3, 0.1, 0.2, 0.3; // 平移 + 軸角旋轉Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
T.pretranslate(pose.head<3>());
T.rotate(Eigen::AngleAxisd(pose.tail<3>().norm(), pose.tail<3>().normalized()));std::cout << "SE(3) transformation:\n" << T.matrix() << std::endl;

其他常用操作

操作示例代碼
獲取平移向量T.translation()
獲取旋轉矩陣T.rotation()T.linear()
獲取變換矩陣T.matrix()
點變換T * point
逆變換T.inverse()
向量變換(不含平移)T.linear() * direction

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

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

相關文章

《未來已來:當人類智慧遇上AI智能體》

在這個充滿奇跡的時代,人類的智慧與科技的力量正以前所未有的速度交織在一起。 我們站在一個新時代的門檻上,一邊是古老而深邃的自然規律,另一邊是充滿可能性的未來世界。 今天,就讓我們一起走進這場關于人類智慧與AI智能體Kimi的對話,看看未來究竟會帶給我們怎樣的驚喜…

【三維生成】FlashDreamer:基于擴散模型的單目圖像到3D場景

標題&#xff1a;<Enhancing Monocular 3D Scene Completion with Diffusion Model> 代碼&#xff1a;https://github.com/CharlieSong1999/FlashDreamer 來源&#xff1a;澳大利亞國立大學 文章目錄摘要一、前言二、相關工作2.1 場景重建2.2 擴散模型2.3 Vision languag…

CANFD記錄儀設備在無人駕駛快遞車的應用

隨著物流行業的快速發展&#xff0c;無人駕駛快遞車因其高效、低成本的優勢&#xff0c;逐漸成為“最后一公里”配送的重要解決方案。然而&#xff0c;無人駕駛系統的穩定性和安全性高度依賴車輛總線數據的精準采集與分析。南金研CANFDlog4 4路記錄儀憑借其多通道、高帶寬、高可…

Kubernetes存儲入門

目錄 前言 一、Volume 的概念 二、Volume 的類型 常見的卷類型 Kubernetes 獨有的卷類型 三、通過 emptyDir 共享數據 1. 編寫 emptyDir 的 Deployment 文件 2. 部署該 Deployment 3. 查看部署結果 4. 登錄 Pod 中的第一個容器 5. 登錄 Pod 中的第二個容器查看/mnt下…

10.Docker安裝mysql

(1)docker pull mysql:版本號eg&#xff1a;docker pull mysql(默認安裝最新版本)docker pull mysql:5.7(2)啟動并設置mysql鏡像docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 --name mysql1 mysql其他參數都不多講&#xff0c;下面這個參數指的是設置數據庫用戶ro…

Debian-10編譯安裝Mysql-5.7.44 筆記250706

Debian-10編譯安裝Mysql-5.7.44 筆記250706 單一腳本安裝 ### 1. 安裝編譯依賴 sudo apt install -y cmake gcc g build-essential libncurses5-dev libssl-dev \ pkg-config libreadline-dev zlib1g-dev bison curl wget libaio-dev \ libjson-perl libnuma-dev libsystemd-d…

HarmonyOS 中狀態管理 V2和 V1 的區別

鴻蒙ArkUI框架中的ComponentV2與V1在狀態管理、組件開發模式、性能優化等方面存在顯著差異。以下是兩者的核心區別及技術解析&#xff1a;一、狀態管理機制V1的局限性V1的Observed裝飾器只能觀察對象的第一層屬性變化&#xff0c;需配合ObjectLink手動拆解嵌套對象。例如&#…

centos7 安裝jenkins

文章目錄前言一、pandas是什么&#xff1f;二、安裝依賴環境1.前提準備2.安裝git3.安裝jdk&#xff0c;以及jdk版本選擇4.安裝maven5.安裝NodeJS6.驗證三、安裝Jenkins四、驗證Jenkins總結前言 正在學習jenkinsdocker部署前后端分離項目&#xff0c;安裝jenkins的時候遇到了一…

Leetcode刷題營第二十題:刪除鏈表中的重復節點

面試題 02.01. 移除重復節點 編寫代碼&#xff0c;移除未排序鏈表中的重復節點。保留最開始出現的節點。 示例1&#xff1a; 輸入&#xff1a;[1, 2, 3, 3, 2, 1]輸出&#xff1a;[1, 2, 3]示例2&#xff1a; 輸入&#xff1a;[1, 1, 1, 1, 2]輸出&#xff1a;[1, 2]提示&…

關于市場主流自動化測試工具和框架的簡要介紹

下面我會分別講解 Selenium、Appium、Playwright 等主流自動化框架的區別、聯系、適用場景和歸屬范疇&#xff0c;幫助你更系統地理解它們。&#x1f527; 一、它們都屬于哪一類工具&#xff1f;Selenium、Appium、Playwright、Cypress 等都屬于&#xff1a;?? 自動化測試框架…

基于cornerstone3D的dicom影像瀏覽器 第三十二章 文件夾做pacs服務端,fake-pacs-server

文章目錄 前言一、實現思路二、項目與代碼三、dicom瀏覽器調用1. view2d.vue前言 本系列最后一章,提供一個模擬pacs服務,供訪問dicom圖像測試。 修改nodejs本地目錄做為http服務根目錄,提供一個根目錄,其中的每個子目錄代表一個檢查。在dicom瀏覽器url中帶入參數studyId=目…

【Python 核心概念】深入理解可變與不可變類型

文章目錄一、故事從變量賦值說起二、不可變類型 (Immutable Types)三、可變類型 (Mutable Types)四、一個常見的陷阱&#xff1a;當元組遇到列表五、為什么這個區別如此重要&#xff1f;1. 函數參數的傳遞2. 字典的鍵 (Dictionary Keys)3. 函數的默認參數陷阱六、進階話題與擴展…

wpf使用webview2顯示網頁內容(最低兼容.net framework4.5.2)

wpf使用webview2顯示網頁內容(最低兼容.net framework4.5.2 一、核心功能與架構混合開發支持?進程隔離模型?通信機制?二、核心優勢性能與兼容性?跨平臺部署?開發效率?安全機制?三、適用場景四、開發部署要點WebView2 是微軟推出的現代瀏覽器控件,基于 Chromium 內核的 …

MySQL斷開連接后無法正常啟動解決記錄

問題現象 夜里23點MySQL在還原備份的時候斷開連接&#xff0c;嘗試重啟&#xff0c;表面上是運行中實際上無法通過命令端連接&#xff0c;無法正常啟動。 問題檢查 可以使用 systemctl start mysql 但是沒有監聽 3306端口 mysql -ucosmic -p 提示無法找到socket文件 刪除原先的…

隧道安全監測系統的應用意義

隨著我國交通基礎設施建設的快速發展&#xff0c;公路、鐵路及城市地鐵隧道數量不斷增加&#xff0c;隧道安全問題日益凸顯。隧道作為地下封閉空間&#xff0c;受地質條件、施工質量、運營環境等多因素影響&#xff0c;易出現結構變形、滲漏水、襯砌開裂等安全隱患。一旦發生事…

前端UI邏輯復雜可以用什么設計模式

中介者模式 當UI組件間存在復雜交互或多個組件需共享狀態時&#xff0c;中介者模式能集中管理事件分發和狀態更新&#xff0c;減少組件間的直接依賴&#xff0c;提升解耦性。 vue實現中介者模式 在Vue中實現中介者模式&#xff0c;你可以通過創建一個全局的事件中心&#xff08…

WIFI協議全解析05:WiFi的安全機制:IoT設備如何實現安全連接?

&#x1f510; WiFi的安全機制&#xff1a;IoT設備如何實現安全連接&#xff1f;“我的設備明明連上WiFi了&#xff0c;為什么還是能被‘蹭網’&#xff1f;” “WPA3 是什么&#xff1f;ESP32 支持嗎&#xff1f;” “我做了MQTT加密就算安全了嗎&#xff1f;”IoT設備連接WiF…

HTTP 請求體類型詳解:選擇最適合的數據提交格式

HTTP 請求體類型詳解&#xff1a;選擇最適合的數據提交格式 &#x1f680; 本文全面解析 HTTP 請求中不同 Content-Type 的適用場景、數據結構與優劣勢&#xff0c;幫助開發者高效選擇數據傳輸方案。 &#x1f4cc; 目錄 核心請求體類型對比詳細類型解析最佳實踐指南總結 &am…

C語言 | 函數核心機制深度解構:從底層架構到工程化實踐

個人主頁-愛因斯晨 文章專欄-C語言 引言 最近偷懶了&#xff0c;迷上了三國和李賀。給大家分享一下最喜歡的一句詩&#xff1a;吾不識青天高黃地厚&#xff0c;唯見月寒日暖來煎人壽。我還不是很理解27歲的李賀&#xff0c;如何寫出如此絕筆。 正文開始&#xff0c;今天我們…

uniapp真機調試“沒有檢測到設備,請插入設備或啟動模擬器后點擊刷新再試”

當真機調試&#xff0c;運行到安卓 APP基座 時&#xff0c;有時會檢測不到設備&#xff0c;顯示下面的問題&#xff1a;此時&#xff0c;可以通過下面的幾種方法進行排查&#xff1a;1.在手機中找到“開發者選項”選項&#xff08;可在設置中搜索&#xff0c;如搜索不到&#x…