通过两组匹配好的3D点,计算相对位姿变换

通过两组匹配好的3D点,计算相对位姿变换

采用的方法为ICP,求解方式分为两种:SVD或者非线性优化方法
本文采用SVD的方法求解
在这里插入图片描述
构建最小二乘的代价函数,求得使误差平方和达到最小的Rt
在这里插入图片描述
首先定义两组点的质心
在这里插入图片描述
代入代价函数
在这里插入图片描述
上面三项中最后一项求和为零,因此代价函数变为
在这里插入图片描述
式中第一项只与R有关,因此可以先求得一个R使得第一项最小然后再求t
对第一项展开得到
在这里插入图片描述
第一项和第二项都与R无关,因此最后优化目标函数变为:
在这里插入图片描述
最后通过SVD方法求得使得上述代价函数最小的R,先定义矩阵
在这里插入图片描述
对其进行SVD分解
在这里插入图片描述
当W满秩时,R为:
在这里插入图片描述
得到R后即可求得t
在这里插入图片描述

/*给两组已经匹配好的3D点,来计算相对位姿变换,写代码*/
#include<AccCtrl.h>
#include <iostream>
#include<Eigen/Geometry>
#include <vector>
#include <math.h>
#include "Eigen/Geometry"
using namespace std;
#define PI 3.1415926
int main()
{
	/*生成旋转矩阵*/
	Eigen::Matrix3d R = Eigen::Matrix3d::Identity();
	Eigen::AngleAxisd rotationVector(PI / 4, Eigen::Vector3d(0, 0, 1));
	R = rotationVector.toRotationMatrix();
	cout << R << endl;

	//生成数据点
	Eigen::Vector3d p1 = Eigen::Vector3d(1, 2, 3);
	Eigen::Vector3d p2 = Eigen::Vector3d(6, 5, 4);
	Eigen::Vector3d p3 = Eigen::Vector3d(8, 7, 9);
	vector<Eigen::Vector3d> pA = { p1, p2, p3 };

	//生成旋转后的点
	vector<Eigen::Vector3d> pB;
	for (auto p:pA)
	{
		pB.emplace_back(R*p);
	}


	/*求两个点云的中心*/
	Eigen::Vector3d qA = Eigen::Vector3d(0, 0, 0), qB = Eigen::Vector3d(0, 0, 0);
	for (int i = 0; i < pA.size(); i++)
	{
		for (int j = 0; j < 3; j++)
		{
			qA[j] += pA[i][j];
			qB[j] += pB[i][j];
		}
	}
	qA = qA / pA.size();
	qB = qB / pB.size();

	/*求去中心的点云*/
	for (int i = 0; i < pA.size(); i++)
	{
		pA[i] = pA[i] - qA;
		pB[i] = pB[i] - qB;
	}

	/*求矩阵W*/
	Eigen::Matrix3d W = Eigen::Matrix3d::Zero();
	for (int i = 0; i < pA.size(); i++)
	{
		W += pA[i] * pB[i].transpose();
	}

	/*SVD分解*/
	Eigen::JacobiSVD<Eigen::Matrix3d> svd(W, Eigen::ComputeFullU | Eigen::ComputeFullV);
	Eigen::Matrix3d U = svd.matrixU();
	Eigen::Matrix3d V = svd.matrixV();

	Eigen::Matrix3d Rr = U * V.transpose();
	cout << Rr << endl;

}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值