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⁻¹)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…