详解坐标变换矩阵 - 绕 x 轴旋转的旋转矩阵

在高级驾驶辅助系统(ADAS)领域,存在多种常用的坐标系:LiDAR 坐标系、车辆坐标系、相机坐标系、图像坐标系等。

在高级驾驶辅助系统(ADAS)领域,存在多种常用的坐标系:LiDAR 坐标系、车辆坐标系、相机坐标系、图像坐标系等。在笔者最近的实习过程中,和这些坐标系频繁打交道。作为第一次在 CSDN 发文,本文将详细总结坐标变换矩阵。

目录

  1. 何为坐标变换矩阵 (Transformation Matrix)

  2. 旋转变换矩阵(Rotation Matrix)

  3. 缩放变换矩阵(Scale Matrix)

  4. 平移变换矩阵(Translation Matrix)

  5. 综合变换

  6. 小结

  7. 何为坐标变换矩阵 (Transformation Matrix)

首先要回答一个问题,何为坐标变换矩阵呢?

“横看成岭侧成峰,远近高低各不同”,这说明了参照系的选取对我们观察事物的重要性。在以上所举例的坐标系变换的语境下,点是客观存在的,而坐标系则是根据不同的应用场景人为选择的。处理 pcd 点云数据时,需要三维的 LiDAR 坐标系;查看图像时,需要二维的图像坐标系(通常为 1920*1080 等尺寸)。即:

“点不变,坐标系进行变换。”

而坐标变换矩阵,就是在这种变换坐标系的前后,点的数值的变换映射关系矩阵。注意,点不动,坐标系动。下文讨论三种变换矩阵:旋转变换矩阵、缩放变换矩阵和平移变换矩阵。

  1. 旋转变换矩阵(Rotation Matrix)

2.1 二维情形

如图 1 所示,在二维平面 xoy 上,由绿色坐标系逆时针旋转θ° 到蓝色坐标系。可以看到,点 A 是没有移动的,变化的是点 A 分别在前后两个坐标系中的坐标,即从变换到了

图 1 二维平面旋转矩阵

如图 1 中黑色虚线的分解方式所示,通过矢量分解(类似于物理中力、速度等矢量的分解),将绿色坐标系中的分别分解到蓝色坐标系的 x 轴和 y 轴上,可以得到:

用矩阵表示为:

其中 R 则为二维情形下的旋转变换矩阵,它表示了 A 点在前后坐标系中的值的映射关系。

2.2 三维情形

有了上述在二维平面旋转的基础,三维空间的旋转矩阵也就不难得出了。

即绕 x 轴,y 轴,z 轴分别进行旋转。最后将这三个旋转变换矩阵相乘,就能得到在三维空间任意角度的旋转变换矩阵了。(xyz 轴满足右手系关系)

在绕 x 轴旋转的时候,可以看作在 yoz 二维平面上的旋转,此时 x 的值不变。

在绕 y 轴旋转的时候,可以看作在 zox 二维平面上的旋转,此时 y 的值不变。

在绕 z 轴旋转的时候,可以看作在 xoy 二维平面上的旋转,此时 z 的值不变。

最终的三维旋转变换矩阵就是上面三个矩阵相乘,意为三维坐标系分别绕 x 轴、y 轴和 z 轴旋转相应的角度。

2.3 顺时针?逆时针?

在笔者初次接触旋转概念之时,常常对何时顺时针,何时逆时针十分头疼。

高中就接触到点的旋转矩阵 R(rotation matrix of a point),在这种情况下是坐标系不变,点绕坐标原点顺时针旋转 θ°。

而在本文的情形下,旋转变换矩阵的形式完全一致,但是方向却相反了——变成了逆时针!究其原因,还是上文老生常谈的那点,高中的矩阵是点动系不动,而本文是系动点不动。因此方向正好相反了。

回到本文的系动点不动,此时再从两种角度推导出顺时针旋转的公式。

1)θ变为 -θ:此时就是选择了相反的旋转角度,变成顺时针。

2)求原矩阵的逆矩阵:先逆时针,再顺时针,相当于回到原系,也就是坐标和单位矩阵相乘。

可以得到,坐标系顺时针旋转θ° 的旋转变换矩阵为:

  1. 缩放变换矩阵(Scale Matrix)

除了旋转变换,还有坐标数值的纯粹放大缩小变换,即缩放变换。下面直接给出缩放变换的公式:

上式中点的 x, y, z 坐标值分别扩大(缩小)了 Scale.x, Scale.y, Scale.z 倍。

缩放矩阵同样存在 “系动点不动” 还是 “点动系不动” 的问题。如果是“点动系不动”,那么 S 矩阵中的 Scale.x, Scale.y, Scale.z 就是单纯的点 x, y, z 的扩大(缩小)倍数。

如果是本文重点探讨的 “系动点不动”,那么 S 矩阵中的 Scale.x, Scale.y, Scale.z 就是坐标系的 x, y, z 轴的单位扩大(缩小)倍数的倒数。换言之,如果坐标轴单位放大 Scale 倍,那么点 x, y, z 的值就要缩小 Scale 倍。可以用千米和米的转换来思考这个问题。如果单位是 m,一个物体长 1000m。当单位变为 km 后,这个物体就长 1km 了。单位扩大的同时,数值上从 1000 缩小为了 1。

  1. 平移变换矩阵(Translation Matrix)

坐标系的旋转和缩放可以通过 33 的变换矩阵完成,但是平移就需要将 33 扩展到 4*4,引入齐次变换矩阵。下面直接给出平移变换矩阵的公式:

具体过程即:

平移矩阵同样存在 “系动点不动” 还是 “点动系不动” 的问题。

如果是本文重点探讨的 “系动点不动”。如果系向左(x 轴负方向)/ 后(y 轴负方向)/ 下(z 轴负方向)平移,那么 T 矩阵中的 Translation.x, Translation.y, Translation.z 为正;如果系向右(x 轴正方向)/ 前(y 轴正方向)/ 上(z 轴正方向)平移,那么 T 矩阵中的 Translation.x, Translation.y, Translation.z 为负。可以借助爬楼梯来理解,小明在地面抬头看着 5 楼,五楼相当于 + 5。当小明爬到 5 楼的时候,此时五楼相当于 0 了。小明爬到 10 楼的时候,此时五楼就相当于 - 5 了。小明就是坐标系的原点,5 楼就是不动的一个点。

  1. 综合变换

将变换矩阵和点向量全部齐次化:

那么此时,对于不动点,如果按照 “旋转 - 缩放 - 平移” 的顺序变换坐标系后,此点的值产生如下变换:

  1. 小结

ADAS 中涉及多种坐标系的变换,点的坐标会随着坐标系的变换而变化。坐标变换矩阵就是在坐标系变换前后,点的数值的映射关系矩阵。主要有旋转变换矩阵、缩放变换矩阵和平移变换矩阵等。极其重要和容易混淆的是,在具体的应用场景中,是什么在变,什么不变,是系还是点。矩阵的具体实现可以采用 python 中的 numpy 模块。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
第1章 Android体系与系统架构 1 1.1 Google生态系统 2 1.2 Android系统架构 2 1.2.1 Linux 3 1.2.2 Dalvik与ART 3 1.2.3 Framework 3 1.2.4 Standard libraries 4 1.2.5 Application 4 1.3 Android App组件架构 4 1.3.1 Android四大组件如何协同工作 5 1.3.2 应用运行上下文对象 5 1.4 Android系统源代码目录与系统目录 6 1.4.1 Android系统源代码目录 6 1.4.2 Android系统目录 8 1.4.3 Android App文件目录 11 第2章 Android开发工具新接触 13 2.1 Android开发IDE介绍 14 2.1.1 Android Studio初体验 14 2.1.2 Android Studio配置 15 2.2 Android Studio高级使用技巧 19 2.2.1 更新SDK 20 2.2.2 Android Studio常用界面 21 2.2.3 导入Android Studio工程 23 2.3 ADB命令使用技巧 24 2.3.1 ADB基础 24 2.3.2 ADB常用命令 25 2.3.3 ADB命令来源 29 2.4 模拟器使用与配置 29 第3章 Android控件架构与自定义控件详解 32 3.1 Android控件架构 33 3.2 View的测量 34 3.3 View的绘制 37 3.4 View Group的测量 38 3.5 View Group的绘制 39 3.6 自定义View 39 3.6.1 对现有控件进行拓展 40 3.6.2 创建复合控件 43 3.6.3 重写View来实现全新的控件 51 3.7 自定义View Group 54 3.8 事件拦截机制分析 59 第4章 List View使用技巧 65 4.1 List View常用优化技巧 66 4.1.1 使用View Holder模式提高效率 66 4.1.2 设置项目间分隔线 68 4.1.3 隐藏List View的滚动条 68 4.1.4 取消List View的Item点击效果 68 4.1.5 设置List View需要显示在第几项 69 4.1.6 动态修改List View 69 4.1.7 遍历List View中的所有Item 71 4.1.8 处理空List View 71 4.1.9 List View滑动监听 72 4.2 List View常用拓展 74 4.2.1 具有弹性的List View 75 4.2.2 自动显示、隐藏布局的ListV iew 76 4.2.3 聊天List View 79 4.2.4 动态改变List View布局 85 第5章 Android Scroll分析 87 5.1 滑动效果是如何产生的 88 5.1.1 Android坐标系 88 5.1.2 视图坐标系 88 5.1.3 触控事件——MotionEvent 89 5.2 实现滑动的七种方法 91 5.2.1 layout方法 92 5.2.2 offset Left And Right()与offset Top And Bottom() 93 5.2.3 Layout Params 93 5.2.4 scroll To与scrollBy 94 5.2.5 Scroller 96 5.2.6 属性动画 98 5.2.7 View Drag Helper 98 第6章 Android绘图机制与处理技巧 106 6.1 屏幕的尺寸信息 107 6.1.1 屏幕参数 107 6.1.2 系统屏幕密度 107 6.1.3 独立像素密度dp 107 6.1.4 单位转换 108 6.22D绘图基础 110 6.3 Android XML绘图 113 6.3.1 Bitmap 113 6.3.2 Shape 113 6.3.3 Layer 115 6.3.4 Selector 116 6.4 Android绘图技巧 117 6.4.1 Canvas 117 6.4.2 Layer图层 121 6.5 Android图像处理之色彩特效处理 122 6.5.1 色彩矩阵分析 122 6.5.2 Android颜色矩阵——ColorMatrix 128 6.5.3 常用图像颜色矩阵处理效果 131 6.5.4 像素点分析 134 6.5.5 常用图像像素点处理效果 135 6.6 Android图像处理之图形特效处理 137 6.6.1 Android变形矩阵——Matrix 137 6.6.2 像素块分析 142 6.7 Android图像处理之画笔特效处理 145 6.7.1 Porter Duff Xfermode 145 6.7.2 Shader 149 6.7.3 Path Effect 153 6.8 View之孪生兄弟——SurfaceView 155 6.8.1 Surface View与View的区别 155 6.8.2 Surface View的使用 156 6.8.3 Surface View实例 159 第7章 Android动画机制与使用技巧 162 7.1 Android View动画框架 163 7.1.1 透明度动画 163 7.1.2 旋转动画 163 7.1.3 位移动画 164 7.1.4 缩放动画 164 7.1.5 动画集合 164 7.2 Android属性动画分析 165 7.2.1 ObjectAnimator 166 7.2.2 PropertyValuesHolder 168 7.2.3 ValueAnimator 168 7.2.4 动画事件的监听 168 7.2.5 Animator Set 169 7.2.6 在XML中使用属性动画 170 7.2.7 View的animate方法 170 7.3 Android布局动画 171 7.4 Interpolators(插值器) 171 7.5 自定义动画 172 7.6 Android 5.X SVG矢量动画机制 175 7.6.1 <path>标签 175 7.6.2 SVG常用指令 176 7.6.3 SVG编辑器 177 7.6.4 Android中使用SVG 177 7.6.5 SVG动画实例 181 7.7 Android动画特效 188 7.7.1 灵动菜单 188 7.7.2 计时器动画 190 7.7.3 下拉展开动画 191 第8章 Activity与Activity调用栈分析 195 8.1 Activity 196 8.1.1 起源 196 8.1.2 Activity形态 196 8.1.3 生命周期 196 8.2 Android任务栈简介 200 8.3 Android Mainifest启动模式 200 8.3.1 standard 201 8.3.2 single Top 201 8.3.3 single Task 201 8.3.4 single Instance 202 8.4 Intent Flag启动模式 203 8.5 清空任务栈 203 8.6 Activity任务栈使用 204 第9章 Android系统信息与安全机制 205 9.1 Android系统信息获取 206 9.1.1 android.os.Build 206 9.1.2 System Property 207 9.1.3 Android系统信息实例 208 9.2 Android Apk应用信息获取之Package Manager 209 9.2.1 Package Manager 210 9.3 Android Apk应用信息获取之Activity Manager 215 9.4 解析Packages.xml获取系统信息 218 9.5 Android安全机制 220 9.5.1 Android安全机制简介 220 9.5.2 Android系统安全隐患 222 9.5.3 Android Apk反编译 223 9.5.4 Android Apk加密 226 第10章 Android性能优化 227 10.1 布局优化 228 10.1.1 Android UI渲染机制 228 10.1.2 避免Overdraw 229 10.1.3 优化布局层级 229 10.1.4 避免嵌套过多无用布局 229 10.1.5 Hierarchy Viewer 234 10.2 内存优化 236 10.2.1 什么是内存 236 10.2.2 获取Android系统内存信息 237 10.2.3 内存回收 238 10.2.4 内存优化实例 238 10.3 Lint工具 240 10.4 使用Android Studio的Memory Monitor工具 240 10.5 使用Trace View工具优化App性能 241 10.5.1 生成Trace View日志的两种方法 241 10.5.2 打开Trace View日志 242 10.5.3 分析Trace View日志 242 10.6 使用MAT工具分析App内存状态 244 10.6.1 生成HPROF文件 244 10.6.2 分析HPROF文件 245 10.7 使用Dumpsys命令分析系统状态 247 第11章 搭建云端服务器 248 11.1 移动后端服务介绍 249 11.2 使用Bmob创建移动后端服务 250 11.2.1 数据服务 251 11.2.2 推送服务 254 第12章 Android 5.X新特性详解 257 12.1 Android 5.X UI设计初步 258 12.1.1 材料的形态模拟 258 12.1.2 更加真实的动画 258 12.1.3 大色块的使用 259 12.2 Material Design主题 260 12.3 Palette 261 12.4 视图与阴影 263 12.5 Tinting和Clipping 265 12.5.1 Tinting(着色) 265 12.5.2 Clipping(裁剪) 267 12.6 列表与卡片 269 12.6.1 Recycler View 269 12.6.2 Card View 275 12.7 Activity过渡动画 276 12.8 Material Design 动画效果 283 12.8.1 Ripple效果 283 12.8.2 Circular Reveal 285 12.8.3 View state changes Animation 288 12.9 Toolbar 293 12.10 Notification 296 12.10.1 基本的Notification 297 12.10.2 折叠式Notification 298 12.10.3 悬挂式Notification 300 12.10.4 显示等级的Notification 301 第13章 Android实例提高 303 13.1 移动迷宫——拼图游戏 304 13.1.1 准备工作 305 13.1.2 初始界面 307 13.1.3 拼图界面 312 13.1.4 效果预览与功能进阶 324 13.2 魔幻矩阵——2048325 13.2.12048概述 325 13.2.22048游戏分析 326 13.2.32048初始化工作 327 13.2.4 小方块设计 328 13.2.5 全局设置 330 13.2.6 游戏面板设计 332 13.2.7 主程序设计 340 13.2.8 功能进阶 341 13.3 实战经验总结 342
内容简介 对于Origin软件的学习,根据笔者多年的使用和教学的经验,认为可以分成三大功能模块,即电子表格和数据管理、科技作图和输出、数据分析和处理,每部分功能又可以分成若干子模块。分成模块的原因是因为不同的人使用Origin的目的不同,事实上没有必要花大量的时间全面地掌握Origin软件。为了提高实用性和学习效率,可将Origin的操作分为基本操作和功能模块两个层次。基本操作是每个人所必须掌握的,而功能模块可以等到有需要才加以学习。基于以上思路,本书的写作框架如下:第一部分为数据管理,包括第1章Origin基础和第2章电子表格与数据管理;第二部分为科技作图,包括第3章~第6章,第3和第4章系统地讨论了二维作图及其设置,第5章讨论了三维作图,第6章讨论了图形的输出和利用;第三部分为数据分析,包括第7章~第12章对应不同的分析功能,即第7章曲线拟合,第8章数学运算,第9章信号处理,第10章光谱分析,第11章统计分析和第12章图像处理;最后一部分为技术扩展,包括第13章编程与自动化。 前言 第一篇数据管理 第1章Origin基础 1.1Origin概述 1.1.1Origin简介 1.1.2Origin8.0新特性 1.1.3Origin的系统框架 1.1.4Origin帮助系统 1.1.5Origin的安装 1.2Origin工作环境 1.2.1子窗口 1.2.2菜单栏 1.2.3工具栏 1.3Origin基本操作 1.3.1子窗口基本操作 1.3.2文件类型 1.3.3命名规则 1.3.4项目管理 1.3.5编程窗口 1.4定制Origin软件 1.4.1TextFonts选项卡 1.4.2Page选项卡 1.4.3Miscellaneous选项卡 1.4.4Excel选项卡 1.4.5Open/Close选项卡 1.4.6NumericFormat选项卡 1.4.7FileLocations选项卡 1.4.8Axis选项卡 1.4.9Graph选项卡 第2章电子表格与数据管理 2.1电子表格 2.1.1工作簿 2.1.2工作表 2.1.3列操作 2.1.4行编辑 2.1.5单元格操作 2.1.6数据变换 2.2数据导入 2.2.1导入ASCII格式 2.2.2导入向导详解 2.2.3数据库格式导入 2.2.4其他格式导入 2.2.5拖放式导入 2.3Excel集成 2.3.1在0rigint辛使用Excel 2.3.2整合Excel与Origin功能 第二篇科技作图 第3章二维作图基础 3.1基本操作 3.1.1基本概念 3.1.2作图操作 3.2图形设置 3.2.1图形设置 3.2.2坐标设置 3.3图例和文本 3.3.1图例设置 3.3.2添加文本 3.4多曲线图形 第4章二维作图进阶 4.1绘制多层图形 4.1.1多层图形实例 4.1.2图层的添加 4.2图层管理 4.2.1调整图层 4.2.2图层的数据管理 4.2.3图层形式的转换 4.2.4链接图层 4.3插入和隐藏图形元素 4.3.1插入图形和数据表 4.3.2隐藏或删除图形元素 4.4图形工具 4.4.1使用Graph工具栏 4.4.2使用Tools工具栏 4.4.3使用Mask工具栏 4.4.4对象管理 4.5各类二维图形简介 4.5.1函数作图 4.5.2其他二维图形 第5章三维图形绘制 5.1矩阵数据窗口 5.1.1创建Matrix窗口 5.1.2SetProperties属性 5.1.3SetDimensions规格 5.1.4SetValues设值 5.1.5MaUjx窗口常用操作 5.2三维数据转换 5.2.1将Worksheet转换为Matrix(Direct方法) 5.2.2扩展MatriX(Expand方法) 5.2.3XYZGridding(网格化) 5.3三维作图 5.3.1从矩阵窗口建立三维图形 5.3.2通过数据转换建立三维图形 5.3.3三维图形设置 5.3.4三维图形旋转 5.4三维图形类型介绍 5.4.13DXYYGraph......

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值