首页 > 编程语言 >matlab练习程序(PnP-BA)

matlab练习程序(PnP-BA)

时间:2023-12-02 23:23:35浏览次数:47  
标签:SE3 BA PnP end new matlab theta se3 wx

通过3D-2D匹配点计算位姿,除了用上篇的DLT来求解,还可以用非线性优化方式求解。

这篇就用BA的方法求解PnP问题。

使用非线性优化通常要先确定下面四个要素:

1. 待优化模型,模型和上一篇是一样的,三维点通过旋转平移矩阵变换到像空间,然后通过内参投影到二维归一化平面上,可以用下面几个方程表示:

其中XYZ为三维空间点;Rt为相机位姿,也是待求参数;xyz为像空间点;fx,fy,cx,cy为内参;uv为归一化像平面点。

2. 待优化参数,这里就是待求位姿了Rt了,由于使用了李代数并且只有一个相机,因此一共6个参数。

3. 残差,三维点通过模型投影到归一化平面上的二维点和检测到的二维特征点的差值。

其中f就是残差,u'v'为检测到的二维特征点,uv为通过模型投影到二维平面上的点。

4. 雅克比矩阵。

雅克比矩阵就是对f求Rt的偏导数,不过这里用到了李代数,因此推导不是很简单。

基本思想就是uv首先对xyz求导,然后xyz再对Rt求导,Rt作为李群,其切平面用李代数表示,然后就可以用李代数表示这个导数了,后一步用到的方法在这篇文章中有实践。

公式如下:

d(xyz)/d(Rt)这里是一个我简化的示意形式,表示Rt的李代数。

上面四个要素都集齐后就可以做BA优化迭代求解位姿了。

matlab程序如下:

clear all;close all;clc;

p = [rand(100,3)*100 ones(100,1)]';

i=1.2*pi/180.0;
j=88*pi/180.0;
k=-2.1*pi/180.0;
Rx=[1 0 0;0 cos(i) -sin(i); 0 sin(i) cos(i)];
Ry=[cos(j) 0 sin(j);0 1 0;-sin(j) 0 cos(j)];
Rz=[cos(k) -sin(k) 0;sin(k) cos(k) 0;0 0 1];
R=Rz*Ry*Rx;
T = [200;40;50];
srcR = [R T;0 0 0 1]

newp = inv(srcR)*p;
uv =[newp(1,:)./newp(3,:) ; newp(2,:)./newp(3,:)];

initR = [R+rand(3,3)*0.1 T+10*rand(3,1);0 0 0 1]
x = SE3_to_se3(inv(initR));

for i=1:30  
    J = calcJab(x,p);
    fx = calcCost(x,p,uv);    
    dx = inv(J'*J)*J'*fx;
    % x = x + dx';
    x = SE3_to_se3(se3_to_SE3(dx')*se3_to_SE3(x));   
end
inv(se3_to_SE3(x))

function J = calcJab(x,p)
R = se3_to_SE3(x);
new_P = R * p;

num = size(p,2);
J = zeros(2*num,6);
for i=1:num
    
    X = new_P(1,i);
    Y = new_P(2,i);
    Z = new_P(3,i);
    
    Jabep = [1/Z 0 -X/(Z*Z);0 1/Z -Y/(Z*Z)];
    Jab = zeros(3,6);
    Jab(1:3,1:3) = eye(3,3);
    Jab(1:3,4:6) = -[0 -Z Y;Z 0 -X;-Y X 0];
    
    J((i-1)*2+1:i*2,:) = Jabep*Jab;
end
end

function fx = calcCost(x,p,uv)
R = se3_to_SE3(x);
new_P = R * p;

num = size(p,2);
fx = zeros(2*num,1);
for i=1:num
    
    u = uv(1,i);
    v = uv(2,i);
    
    X = new_P(1,i) / new_P(3,i);
    Y = new_P(2,i) / new_P(3,i);
    
    fx((i-1)*2+1:i*2) = [u - X;v - Y];
end
end

function se3 = SE3_to_se3( SE3 )
% UNTITLED Summary of this function goes here
% Detailed explanation goes here

R=SE3(1:3,1:3);
theta=acos((trace(R)-1)/2);
lnR=(theta/(2*sin(theta)))*(R-R');
w=[-lnR(2,3) lnR(1,3) -lnR(1,2)];
wx=[0 -w(3) w(2);w(3) 0 -w(1);-w(2) w(1) 0];
if(theta==0)
    Vin=eye(3);
else
    A=sin(theta)/theta;
    B=(1-cos(theta))/(theta^2);
    Vin=eye(3)-(1/2)*wx+(1/(theta^2))*(1-(A/(2*B)))*(wx*wx);
end
u=Vin*SE3(1:3,4);
se3=[u' w];
end

function SE3 = se3_to_SE3( se3 )
% se3_SE3 Exponential Mapping from Lie Algebra to Lie Group
% se3 is a 1x6 Column Vector of the form=[v1 v2 v3 w1 w2 w3] which is
% defined using 6 Generator Matrices(4x4)
% each of the six elements on multiplication with the generator matrices
% as follows give the complete matrix:
% se3 = v1*G1 + v2*G2 + v3*G3 + w1*G4 + w2*G5 + w3*G6
% To map se3 to SE3 we need to perform e^(se3)
% This can be done by following the algorithm:
% Algorithm

w=se3(4:6)';
u=se3(1:3)';
wx=[0 -w(3) w(2);w(3) 0 -w(1);-w(2) w(1) 0];
theta=sqrt(w'*w);
if(theta~=0)
    A=sin(theta)/theta;
    B=(1-cos(theta))/(theta^2);
    C=(1-A)/(theta^2);
else
    A=0;
    B=0;
    C=0;
end
R=eye(3)+(A*wx)+(B*(wx*wx));
V=eye(3)+B*wx+C*(wx*wx);
Vp=V*u;
SE3=zeros(4);
SE3(1:3,1:3)=R;
SE3(1:3,4)=Vp;
SE3(4,4)=1;
end

这种方法计算出来的R是符合旋转矩阵定义的,不会出现DLT可能出现的求解出的矩阵不符合定义的情况。

标签:SE3,BA,PnP,end,new,matlab,theta,se3,wx
From: https://www.cnblogs.com/tiandsp/p/17852233.html

相关文章

  • 答知识星球朋友疑问:执行 ABAP 代码出现超时的原因,背后的理论和解决方案试读版
    有朋友在我的知识星球里提问:我在bw执行一个fm的时候,出现了运行超时的问题,请问这时候要如何优化这个fm因为这位朋友没有提供具体的FunctionModule名称,所以只能泛泛而谈一下ABAP代码的超时问题。我们首先要认识一点,为什么ABAP代码运行后,理论上会出现超时(timeout)问题......
  • SAP ABAP RZ11 事务码里 Instance Profile 和 Current Value 等参数值的解读
    首先,让我们了解在SAPABAP系统中通过事务码RZ11查看参数时,涉及的四个重要组件:KernelDefault、DefaultProfile、InstanceProfile和CurrentValue。KernelDefault:含义:KernelDefault表示系统中SAP内核(Kernel)的默认配置参数值。这是SAP系统内核的全局默认设置,通常在SAP系统......
  • SAP ABAP 系统里事务码 SMICM 的作用
    "SMICM"是SAP系统中的一个事务码,用于管理和监控SAP系统的通信管理。这个事务码的全名是"ICMMonitor",其中"ICM"代表"InternetCommunicationManager"。SMICM提供了一系列功能,帮助管理员监视和维护SAP系统的通信基础设施。SMICM的主要作用:监控服务和端口:SMICM......
  • SAP ABAP 系统里的事务码 SMICM keep Alive 参数的作用
    SMICM截图如下:SAPABAP系统中的事务码SMICM是用来访问InternetCommunicationManager(ICM)的监视。ICM是SAP系统中负责HTTP、SMTP、或者HTTPS通信的组件。在SMICM事务中,你可以看到关于ICM的各种信息,例如线程信息、服务信息、连接信息和缓存信息等。在服务列......
  • 本地 SAP UI5 应用部署到远端 ABAP 系统,幕后英雄 ABAP_REPOSITORY_SRV
    SAPODataService是一种基于HTTP的数据访问协议,它支持全功能的CRUD操作(创建、读取、更新和删除),并且支持查询和导航。OData协议的主要优势是其基于标准的HTTP协议,并且使用标准的HTTP动词,如GET、POST、PUT、DELETE等进行数据操作。这意味着任何支持HTTP的平台或设备......
  • SAP ABAP 里如何高效找到修改某个数据库表字段的 ABAP 程序的三种思路介绍试读版
    我的知识星球里,有朋友提问:公司的SAP中,总部开发了一个功能去更新采购订单行上的收货地址字段EKPO-ADRN2,我尝试着去Debug,但找不到最终是哪段程序更新了这一个字段。SAT也用了,也发现不了。不过我对SAT也不熟。有什么思路可以快速Debug找到那段更新程序不?其实这种需......
  • 事务码 RZ11 对 SAP ABAP 系统管理员( Basis )的作用
    SAPABAP系统中的事务码RZ11是一个非常重要的工具,它主要用于显示和维护SAP系统的参数。这些参数影响了SAP系统的运行,包括内存管理,数据库交互,安全性设置等。RZ11提供了一种方法,允许管理员或开发者查看和修改这些参数,以便调整系统的运行方式,以满足特定的需求或优化性能。例......
  • SAP ABAP 系统事务码 RZ11 的作用
    事务码"RZ11"在SAPABAP系统中是一个非常重要的工具,它主要用于动态参数的维护和查询。通过"RZ11",用户可以查看系统中所有的动态参数及其相关信息,同时也可以修改这些参数的取值。在SAP系统中,动态参数是一种能够在运行时调整的系统参数,这些参数的修改无需停机,可以在系统运行......
  • SAP 标准 OData 服务 ABAP_REPOSITORY_SRV 的作用介绍
    "SAP标准OData服务/sap/opu/odata/UI5/ABAP_REPOSITORY_SRV是SAPNetWeaverGateway框架提供的一个重要服务,用于与ABAP(AdvancedBusinessApplicationProgramming)仓库进行交互。该服务的作用涵盖了许多关键方面,包括ABAP仓库对象(如程序、函数模块、数据元素等)的检索和管理。通过该......
  • SAP ABAP 系统里的事务码 SMICM keep Alive 参数的含义和配置
    在SAPABAP系统中,事务码SMICM(SystemManagementInterfaceforCommunicationManagement)是一个用于管理通信的工具,通过它可以监视和配置与SAP系统相关的通信参数。SMICM提供了对SAP实例通信管理的集中控制,用户可以通过该事务码查看和配置多个通信参数,确保系统的正常运行。在SMIC......