目录
1. 题目
2. 使用欧式变换
3. 使用四元素
1. 题目
已知
(1) 世界坐标系到相机1坐标系变换关系为,即相机1的位姿q1=[0.35,0.2,0.3,0.1]^T, t1=[0.3,0.1,0.1]^T.
(2) 世界坐标系到相机2坐标系变换关系为,即相机2的位姿q1=[-0.5,0.4,-0.1,0.2]^T, t2=[-0.1,0.5,0.3]^T.
(3) 相机1下的某点观测坐标是
求该点在相机2坐标系下的坐标。假设该点的世界坐标是,则有
2. 使用欧式变换
世界坐标系下的坐标到相机1坐标系下的坐标变换(利用欧式变换公式)
世界坐标系下的坐标到相机2坐标系下的坐标变换
第一个公式两边左乘以T的逆,求得P_W再带入第二个公式,求得该点在相机2坐标系下的坐标
书上的公式如下。
注:在SLAM中,位姿是世界坐标系到相机坐标系的变换,包括旋转与平移。
3. 使用四元素
同样,假设该点的世界坐标是
世界坐标系下的坐标到相机1坐标系下的坐标变换(四元素变换公式)
---------------公式1
世界坐标系下的坐标到相机2坐标系下的坐标变换
---------------公式2
变换第一个公式,两边左乘q_1逆,如下。
再两边右乘q_1,如下。
P_W带入公式2中,数学公式如下。
eigen特点是 写成qp,即省了后面取逆操作,所以上面的公式eigen形式如下。
#include <iostream>
#include <vector>
#include <algorithm>
#include <eigen3/Eigen/Core>
#include <eigen3/Eigen/Geometry>
using namespace std;
using namespace Eigen;
int main(int argc, char** argv) {
// 已知两个相机的位姿
// 即p1的位姿是q1 = [0.35,0.2,0.3,0.1]^T, t1 = [0.3,0.1,0.1]^T
// 即p2的位姿是q2 = [-0.5,0.4,-0.1,0.2]^T, t2 = [-0.1,0.5,0.3]^T
Quaterniond q1(0.35, 0.2, 0.3, 0.1), q2(-0.5, 0.4, -0.1, 0.2); // 旋转。coeffs的顺序是(x,y,z,w),w为实部,前三者为虚部
q1.normalize(); // 注意,四元素使用之前需要归一化。
q2.normalize();
Vector3d t1(0.3, 0.1, 0.1), t2(-0.1, 0.5, 0.3); // 平移
// 已知p1在相机1坐标系下的坐标
Vector3d p1(0.5, 0, 0.2);
// 1, 利用四元素变换
Vector3d p2;
p2 = q2 * q1.inverse() * (p1 - t1) + t2;
cout << endl << p2.transpose() << endl;
// 2, 利用欧式变换矩阵
Isometry3d T1w(q1), T2w(q2); // 用四元素,初始化欧式变换矩阵
T1w.pretranslate(t1);
T2w.pretranslate(t2);
// 求p1在相机2坐标系下的坐标
p2 = T2w * T1w.inverse() * p1; // 公式
cout << endl << p2.transpose() << endl;
return 0;
}
-0.0309731 0.73499 0.296108
-0.0309731 0.73499 0.296108