激光雷达标定(坐标系转换)

news2024/11/17 11:32:09

文章目录

  • 1. 旋转矩阵
  • 2. 平移矩阵
  • 3. 坐标系的转换
  • 4. 坐标转换代码

1. 旋转矩阵

  • 由于激光雷达获取的点云数据的坐标是相对于激光雷达坐标系的,为了使车最终得到的点云数据坐标是在车坐标系下的,我们需要对点云中每一个点的坐标进行坐标转换。
  • 首先是需要对坐标系进行旋转变换,先以二维平面的单位向量坐标转换为例,假设两坐标系中的旋转矩阵为R,旋转角度为 θ \theta θ,点P在 x 1 o y 1 x_1oy_1 x1oy1坐标(车坐标系)下的坐标为 ( x 1 , y 1 ) (x_1,y_1) (x1,y1);点P在 x 2 o y 2 x_2oy_2 x2oy2坐标(激光雷达坐标系)下的坐标为 ( x 2 , y 2 ) (x_2,y_2) (x2,y2),已知点在激光雷达坐标系下的坐标 ( x 2 , y 2 ) (x_2,y_2) (x2,y2),可以由以下的坐标系的转换关系得到 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)

旋转矩阵R:将点P在旋转后的坐标系下的坐标转换为旋转前的坐标系下的坐标

[ x 1 y 1 ] = R [ x 2 y 2 ] (1) \begin{bmatrix} x_1\\y_1 \end{bmatrix} =R\begin{bmatrix} x_2\\y_2 \end{bmatrix} \tag{1} [x1y1]=R[x2y2](1)
在这里插入图片描述

图1 二维坐标系转换
  • 根据旋转角度 θ \theta θ,由上图1可得 x 1 x_1 x1 y 1 y_1 y1为:
    x 1 = x 2 c o s θ − y 2 s i n θ y 1 = x 2 s i n θ + y 2 c o s θ (2) x_1=x_2cos\theta-y_2sin\theta\\ y_1=x_2sin\theta+y_2cos\theta \tag{2} x1=x2cosθy2sinθy1=x2sinθ+y2cosθ(2)
  • 由此可以得出以下的坐标转换矩阵等式:
    [ x 1 y 1 ] = [ c o s θ , − s i n θ s i n θ , c o s θ ] [ x 2 y 2 ] (3) \begin{bmatrix} x_1\\y_1 \end{bmatrix} =\begin{bmatrix} cos\theta,-sin\theta\\ sin\theta,cos\theta\\ \end{bmatrix} \begin{bmatrix} x_2\\y_2 \end{bmatrix} \tag{3} [x1y1]=[cosθ,sinθsinθ,cosθ][x2y2](3)
  • 旋转矩阵R即为:
    R = [ c o s θ , − s i n θ s i n θ , c o s θ ] (4) R =\begin{bmatrix} cos\theta,-sin\theta\\ sin\theta,cos\theta\\ \end{bmatrix} \tag{4} R=[cosθ,sinθsinθ,cosθ](4)
  • 由二维推广至三维,由右手定则可以想象在上图1中的O点处有一条垂直于XOY平面指向屏幕的的Z轴:
    在这里插入图片描述
图2 航向角转换
  • 那么上述的二维空间内的坐标旋转便可推广至三维空间中绕z轴的旋转,旋转角度 θ \theta θ便是欧拉角中的航向角(也称偏航角yaw),由于旋转前后z轴没有发生变换,上述公式(3)可以写为以下形式:
    [ x 1 y 1 z 1 ] = [ c o s θ − s i n θ 0 s i n θ c o s θ 0 0 0 1 ] [ x 2 y 2 z 2 ] (5) \begin{bmatrix} x_1\\y_1\\z_1 \end{bmatrix} =\begin{bmatrix} cos\theta&-sin\theta&0\\ sin\theta&cos\theta&0\\ 0&0&1\\ \end{bmatrix} \begin{bmatrix} x_2\\y_2\\z_2 \end{bmatrix} \tag{5} x1y1z1=cosθsinθ0sinθcosθ0001x2y2z2(5)
  • 由此可得航向角(也称偏航角yaw)旋转矩阵 R y a w R_{yaw} Ryaw为:
    R y a w = [ c o s θ − s i n θ 0 s i n θ c o s θ 0 0 0 1 ] (6) R_{yaw}=\begin{bmatrix} cos\theta&-sin\theta&0\\ sin\theta&cos\theta&0\\ 0&0&1\\ \end{bmatrix} \tag{6} Ryaw=cosθsinθ0sinθcosθ0001(6)
    在这里插入图片描述
图3 俯仰角转换
  • 由上述公式(6)同理可以推导出绕坐标轴y轴旋转 β \beta β(俯仰角pictch)的公式如下:
    [ x 1 y 1 z 1 ] = [ c o s β 0 s i n β 0 1 0 − s i n β 0 c o s β ] [ x 2 y 2 z 2 ] (7) \begin{bmatrix} x_1\\y_1\\z_1 \end{bmatrix} =\begin{bmatrix} cos\beta&0&sin\beta\\ 0&1&0\\ -sin\beta&0&cos\beta\\ \end{bmatrix} \begin{bmatrix} x_2\\y_2\\z_2 \end{bmatrix} \tag{7} x1y1z1=cosβ0sinβ010sinβ0cosβx2y2z2(7)
  • 由此可得俯仰角pictch旋转矩阵 R p i c t c h R_{pictch} Rpictch为:
    R p i t c h = [ c o s β 0 s i n β 0 1 0 − s i n β 0 c o s β ] (8) R_{pitch}=\begin{bmatrix} cos\beta&0&sin\beta\\ 0&1&0\\ -sin\beta&0&cos\beta\\ \end{bmatrix} \tag{8} Rpitch=cosβ0sinβ010sinβ0cosβ(8)
    在这里插入图片描述
图4 横滚角转换
  • 也可以推导出绕坐标轴x轴旋转 γ \gamma γ(横滚角roll)的公式如下:
    [ x 1 y 1 z 1 ] = [ 1 0 0 0 c o s γ − s i n γ 0 s i n γ c o s γ ] [ x 2 y 2 z 2 ] (9) \begin{bmatrix} x_1\\y_1\\z_1 \end{bmatrix} =\begin{bmatrix} 1&0&0\\ 0&cos\gamma&-sin\gamma\\ 0&sin\gamma&cos\gamma\\ \end{bmatrix} \begin{bmatrix} x_2\\y_2\\z_2 \end{bmatrix} \tag{9} x1y1z1=1000cosγsinγ0sinγcosγx2y2z2(9)
  • 由此可得横滚角roll旋转矩阵 R r o l l R_{roll} Rroll为:
    R r o l l = [ 1 0 0 0 c o s γ − s i n γ 0 s i n γ c o s γ ] (10) R_{roll}=\begin{bmatrix} 1&0&0\\ 0&cos\gamma&-sin\gamma\\ 0&sin\gamma&cos\gamma\\ \end{bmatrix} \tag{10} Rroll=1000cosγsinγ0sinγcosγ(10)
  • 按照不同的顺序对坐标轴进行旋转可以得到不同的旋转矩阵R,R共有六种形式,分别为
    R = R y a w R p i t c h R r o l l   R = R y a w R r o l l R p i t c h R = R p i t c h R y a w R r o l l   R = R p i t c h R y a w R r o l l R = R r o l l R p i t c h R y a w   R = R r o l l R y a w R p i t c h (11) R=R_{yaw}R_{pitch}R_{roll} \ R=R_{yaw}R_{roll}R_{pitch}\\ R=R_{pitch}R_{yaw}R_{roll} \ R=R_{pitch}R_{yaw}R_{roll}\\ R=R_{roll}R_{pitch}R_{yaw} \ R=R_{roll}R_{yaw}R_{pitch} \tag{11} R=RyawRpitchRroll R=RyawRrollRpitchR=RpitchRyawRroll R=RpitchRyawRrollR=RrollRpitchRyaw R=RrollRyawRpitch(11)
  • 按照欧拉角的测量方式,每次旋转按照车底盘坐标系的坐标轴进行旋转(即外旋),外旋旋转矩阵是左乘矩阵,即按照X-Y-Z的顺序进行旋转的话,得到的旋转矩阵是,通过测量的得到的欧拉角的角度值就可以计算出对应的旋转矩阵。

外旋(左乘):每次旋转绕固定轴旋转
内旋(右乘):每次旋转绕自身旋转后的轴旋转


2. 平移矩阵

已知激光雷达相对于车坐标原点的三维坐标x,y,z,可以得到激光雷达与车坐标系的平移矩阵为:
T = [ x y z ] (12) T=\begin{bmatrix} x\\y\\z \end{bmatrix} \tag{12} T=xyz(12)
在这里插入图片描述

图5 三维坐标系转换

3. 坐标系的转换

根据上述计算得到的旋转矩阵R和平移矩阵T。设车坐标下点的坐标为 ( x c , y c , z c ) (x_c,y_c,z_c) (xc,yc,zc)激光雷达下点的坐标为 ( x l , y l , z l ) (x_l,y_l,z_l) (xl,yl,zl)即最终的变换形式为:
[ x c y c z c ] = R [ x l y l z l ] + T (13) \begin{bmatrix} x_c \\ y_c\\ z_c \end{bmatrix} =R\begin{bmatrix} x_l \\ y_l\\ z_l \end{bmatrix} +T \tag{13} xcyczc=Rxlylzl+T(13)


4. 坐标转换代码

  • 构造旋转平移矩阵对点云中的点进行转换
//坐标变换将激光雷达坐标系下的点转换到小车坐标系下
void MainWindow::changePoint(pcl::PointCloud<pcl::PointXYZ>::Ptr lidarCloud,
                 pcl::PointCloud<pcl::PointXYZ>::Ptr carCloud,
                 double yaw,double pitch,double roll,double x,double y,double z)
{
    Eigen::Matrix4f transform=Eigen::Matrix4f::Identity();
    Eigen::Matrix4f transformYaw;
    Eigen::Matrix4f transformPitch;
    Eigen::Matrix4f transformRoll;
    
    //航向角
    transformYaw<<cos(yaw),-sin(yaw),0,0,\
            sin(yaw),cos(yaw),0,0,\
            0,0,1,0,\
            0,0,0,1;
    //俯仰角
    transformPitch<<cos(pitch),0,sin(pitch),0,\
            0,1,0,0,\
            -sin(pitch),0,cos(pitch),0,\
            0,0,0,1;
    //横滚角
    transformRoll<<1,0,0,0,\
            0,cos(roll),-sin(roll),0,\
            0,sin(roll),cos(roll),0,\
            0,0,0,1;
            
    //旋转矩阵
    transform=transformRoll*transformPitch*transformYaw;
    
    //平移矩阵
    transform(0,3)=x;
    transform(1,3)=y;
    transform(2,3)=z;
    
    //坐标转换
    pcl::transformPointCloud(*lidarCloud,*carCloud,transform);
}

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

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

相关文章

Docker笔记--创建容器、退出容器、查看容器、进入容器、停止容器、启动容器、删除容器、查看容器详细信息

目录 1--docker run创建容器 2--exit退出容器 3--docker ps查看容器 4--docker exec进入容器 5--docker stop停止容器 6--docker start启动容器 7--docker rm删除容器 8--docker inspect查看容器详细信息 1--docker run创建容器 sudo docker run -it --nametest redis…

Python 可迭代对象(Iterable)、迭代器(Iterator)与生成器(generator)之间的相互关系

1、迭代 通过重复执行的代码处理相似的数据集的过程&#xff0c;并且本次迭代的处理数据要依赖上一次的结果继续往下做&#xff0c;上一次产生的结果为下一次产生结果的初始状态&#xff0c;如果中途有任何停顿&#xff0c;都不能算是迭代。 # 非迭代例子 n 0 while n < …

SSM如何

目录 1、整合Mybatis 1.1.新建项目 1.2.添加pom依赖 1.3.application.yml 1.4.generatorConfig.xml 1.5.设置逆向生成 1.6.编写controller层 1.7.测试 2、整合 Mybatis-plus 2.1Mybatis-plus简介 2.2.创建项目 2.3.添加pom依赖 2.4.application.yml 2.5.MPGenerator 2.6.生成…

Stm32旧版库函数1——adxl335 模拟输出量 usart2

主函数&#xff1a; /******************************************************************************* // // 使用单片机STM32F103C8T6 // 晶振&#xff1a;8.00M // 编译环境 Keil uVision4 // 在3.3V的供电环境下&#xff0c;就能运行 // 波特率 19200 串口2 PA2(Tx) P…

equals方法:黑马版

目录 Object类的equals方法 Student类 测试类 第一步&#xff1a;使用比较 第二步&#xff1a;使用equals比较 第三步&#xff1a;在子类-Student类中重写equals方法 代码逐句分析 运行 Object类的equals方法 首先写一个类Student&#xff0c;属性有name和age&#xf…

UE5笔记【十二】蓝图函数BluePrint Function

上一篇讲了蓝图变量&#xff0c;这一篇说蓝图函数。BluePrint Function 函数&#xff0c;一般是为了将一段功能的代码提取出来&#xff0c;然后方便我们反复使用。重复的代码可以提取一个函数。类似的&#xff0c;相同的蓝图&#xff0c;我们也可以提取出一个蓝图函数来。 如…

青龙面板 香蕉

香蕉角本教程 介绍 香蕉视频 app —【多用户版】 一个账户每天稳定1元&#xff0c;可以自己提现&#xff0c;也可以兑换会员&#xff0c;脚本不停会员也不停&#xff01;可注册多个账户&#xff01;&#xff08;多账户福利自行看文章底部&#xff01;&#xff09; 拉取文件 …

【微服务】springboot 整合javassist详解

一、前言 Javassist 是一个开源&#xff0c;用于分析、编辑和创建Java字节码的类库&#xff0c;由东京工业大学数学和计算机科学系的 Shigeru Chiba &#xff08;千叶滋&#xff09;所创建。目前已加入了开放源代码JBoss 应用服务器项目&#xff0c;通过使用Javassist对字节码操…

linux redhat 8 创建逻辑卷

LVM与直接使用物理存储相比,有以下优点: 1. 灵活的容量. 当使用逻辑卷时,文件系统可以扩展到多个磁盘上,你可以聚合多个磁盘或磁盘分区成单一的逻辑卷. 2. 方便的设备命名 逻辑卷可以按你觉得方便的方式来起任何名称. 3.磁盘条块化. 你可以生成一个逻辑盘,它的数据可以被…

记录一次Mac本地启动nacos遇到的问题

nacos 官网&#xff1a;https://nacos.io/zh-cn/docs/quick-start.html 我这里下载的是2.0.3稳定的版本 本地启动&#xff1a;sh startup.sh -m standalone 问题1&#xff1a;Caused by: java.lang.IllegalStateException: No DataSource set 这里是数据源连接有问题&#xff…

Linux网络原理及编程(6)——第十六节 TCP可靠性保证的原理

目录 1、确认应答机制 2、超时重传机制 3、滑动窗口 4、流量控制 5、拥塞控制 6、延迟应答 &#xff08;各位好&#xff0c;博主新建了个公众号《自学编程村》&#xff0c;拉到底部即可看到&#xff0c;有情趣可以关注看看哈哈&#xff0c;关注后还可以加博主wx呦~~~&am…

Apache Flink 水印的工作机制详解与源码阅读

一、时间长河谁能解 在人类生存的地球上&#xff0c;存在着一种很神秘的东西&#xff1a;时间&#xff0c;它看不见摸不着&#xff0c;但速度恒定&#xff0c;单调递增且永无止境的往前推进&#xff0c;人类的历史被淹没在茫茫的时间长河中。同时在地球附近&#xff0c;一个星…

【自动化测试】如何平衡手工和自动化测试

作为一名测试人员&#xff0c;如何平衡手工和自动化测试&#xff0c;是一道绕不过去的课题。不可否认&#xff0c;自动化测试具有提高效率&#xff0c;加快回归速度并因此有助于及时交付项目的好处。但是&#xff0c;在考虑自动化之前&#xff0c;我们应该评估一些要点&#xf…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java毕业生就业管理系统243xa

首先选择计算机题目的时候先看定什么主题&#xff0c;一般的话都选择当年最热门的话题进行组题&#xff0c;就比如说&#xff0c;今年的热门话题有奥运会&#xff0c;全运会&#xff0c;残运会&#xff0c;或者疫情相关的&#xff0c;这些都是热门话题&#xff0c;所以你就可以…

vscode 关闭/忽略/ignore 单个/指定 git 仓库/repository 提示

文章目录1. 问题2. 解决方法2.1 只追踪 打开文件 所在的仓库2.2 忽略指定的仓库3. 参考1. 问题 vscode 当打开的项目中有多个 git 仓库时&#xff0c;默认会显示所有仓库的 status。 有些已经不再使用的仓库可能有多处更改&#xff0c;但我们并不想去处理它。 如果直接关闭 vs…

gcc 4.8.5 的string问题

gcc 4.8.5及一下版本 的string 因为内部内存管理采用了COW的方式&#xff0c;导致了string在多线程的状态下容易崩溃。崩的很没有规律&#xff0c;表现就是string在赋值的时候就莫名其妙的崩了&#xff0c;查看堆栈&#xff0c;你也看不出啥。崩溃的很随机。 为了避免崩溃&…

文本纠错--文本分割N-gram--Macbert模型的调用以及对返回结果的处理

文本根据词典进行纠错 输入一段可能带有错误信息的文字&#xff0c; 通过词典来检测其中可能错误的词。 例如&#xff1a;有句子如下&#xff1a;中央人民政府驻澳门特别行政区联络办公室1日在机关大楼设灵堂    有词典如下&#xff1a;中国人民&#xff0c;中央人民&#x…

漏斗分析 - AARRR模型案例分析

漏斗分析是一套流程式的数据分析方法&#xff0c;能够科学地反映各阶段用户转化情况。漏斗分析模型已经广泛应用于用户行为分析类产品&#xff0c;且功能十分强大&#xff1a;它可以评估总体或各个环节的转化情况、促销活动效果&#xff1b;也可以与其他数据分析模型结合进行深…

【三维目标检测】SSN(二)

SSN数据和源码配置调试过程请参考上一篇博文&#xff1a;【三维目标检测】SSN&#xff08;一&#xff09;_Coding的叶子的博客-CSDN博客。本文主要详细介绍SSN网络结构及其运行中间状态。 1 模型总体过程 SSN主要结构如下图所示&#xff0c;其核心在于提出了shape-aware heads…

认识分布式锁、使用分布式锁 Redission、实现秒杀案例

分布式锁 基本原理 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;那么我们就能锁住线程&#xff0c;不让线程进行&#xff0c;让程序串行执行&…