如何找到两个不同坐标系中对应点之间的旋转和平移(变换矩阵)
How to find rotation and translation (transformation matrix) between corresponding points in two different coorinate systens
我正在进行相机激光雷达校准,由于以下问题我被困了一段时间:
我用的是一个usb摄像头和一个二维激光雷达。我有激光雷达帧和相机帧中对应点的坐标(假设我有3个点和它们在激光雷达帧中的坐标,以及相机帧中相同3个点的坐标)
一点的示例:
lidar_pt1(xl,yl)
camera_pt1(xc,yc,zc)
已知
如果我对变换矩阵进行硬编码,我会得到一个预期的结果。现在我尝试不进行硬编码,而是使用已知的坐标值自动计算它。我在激光雷达帧中有3个2D坐标点,在相机帧中有精确的3个3D坐标点。正是在这里,我正在努力计算基于坐标值的旋转。有办法实现这种轮换吗
camera_pt1=TransformMat*lidarpt1
TransformMat=
我看到了一些使用SVD的示例(http://nghiaho.com/?page_id=671)但我认为他们需要更大的数据集,而最低3分并不能给出最好的结果。
如果你只从每个系统中获得3对坐标,那么数学计算就很简单了。这里有一个简单的例子:
|
4 | (R)
| : ',
| : ',
| : ',
3 | : (P)
| : ,'
| : ,'
| : ,'
2 | (A).....(B) (Q)
| : ,'
| : ,'
| : ,'
1 | (C)
|
|
|
0 +-------------------------------------
0 1 2 3 4
假设您有一个三角形ABC
,它映射到另一个三角形PQR
。您可以在齐次坐标中表示它们的顶点,如下所示:
.- -. .- -.
| 1 2 1 | | 4 3 1 |
ABC = | 2 2 1 | PQR = | 3 2 1 |
| 1 1 1 | | 3 4 1 |
'- -' '- -'
您需要找到一个矩阵M
,它将ABC
映射到PQR
上(即ABC × M = PQR
)。要做到这一点,只需将PQR
乘以ABC
:的倒数
if ABC × M = PQR,
then ABC⁻¹ × ABC × M = ABC⁻¹ × PQR
so M = ABC⁻¹ × PQR
关于如何反演3×3矩阵,有很多参考文献。这应该会给你以下结果:
.- -.
| -1 -1 0 |
M = | 1 -1 0 |
| 3 6 1 |
'- -'
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 与互斥锁相比,旋转锁可以保证上下文切换
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 旋转块时如何修复块之间的间距
- 如何找到两个不同坐标系中对应点之间的旋转和平移(变换矩阵)
- 两组向量之间的四元旋转
- 如何在子弹物理学中让刚体的欧拉旋转在 0 到 360 之间
- 如何使用OpenCV计算两帧之间的旋转平移矩阵
- 帧之间的 OpenCV 平移/旋转位移
- 是否有可能得到两个图像之间的旋转和缩放只有一个冲浪描述符
- OpenCV SURF -获得两个图像之间的旋转角度
- 求两个全等三角形之间的旋转
- 四个旋转顶点之间的命中测试