首页 > 编程语言 >matlab练习程序(Bundle Adjustment)

matlab练习程序(Bundle Adjustment)

时间:2024-01-13 17:22:59浏览次数:41  
标签:se3 end Bundle matlab theta SE3 100 Adjustment newP

BA作为视觉SLAM中后端优化的一个核心点还是比较重要的。

BA根据优化量的不同可以分为三种形式。

Full BA:观测点和位姿同时优化,一般是视觉SLAM后端的核心。

Motion BA:已知观测点,优化位姿,一般用来定位。之前的文章中有用到BA单做位姿计算的方法。

Struct BA:已知位姿,优化观测点,一般用来建图。

不论是哪种BA方法,一般模型和残差都是一样的,不一样的都是待优化参数和雅克比矩阵。

下面优化同样用到了李群李代数的方法,雅克比矩阵参考了之前的两篇文章([1][2])。

下面代码流程大致分三步:

1. 设置100个随机三维点,再设置两组位姿。 然后对位姿和随机点加上一些扰动,送入循环。

2. 确定优化四大步:模型,残差,待优化参数和雅克比矩阵。

3. 迭代优化出结果。

matlab代码如下:

clear all;close all;clc;
warning off;

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

R = rot(0,90,0);
R1 = rot(-0.5,89.4,-1.0);
R2 = rot(0.5,90.5,1);
T = [200;40;50];

pos1 = [R1 T+5*rand(3,1);0 0 0 1]
pos2 = [R2 T+5*rand(3,1);0 0 0 1]

newp1 = inv(pos1)*p;
newp2 = inv(pos2)*p;

uv1 =[newp1(1,:)./newp1(3,:) ; newp1(2,:)./newp1(3,:)];
uv2 =[newp2(1,:)./newp2(3,:) ; newp2(2,:)./newp2(3,:)];

initPos = [R T;0 0 0 1]

x = zeros(2*6+3*100,1);
x(1:6) = SE3_to_se3(inv(initPos))';
x(7:12) = SE3_to_se3(inv(initPos))';
x(13:end) = reshape(p(1:3,:),[300,1]) + rand(300,1);

for i=1:100
    
    J = calcJab(x);
    fx = calcCost(x,uv1,uv2);
    
    % norm(fx)
    H = J'*J;
    dx = inv(H + 0.01*eye(size(H)))*J'*fx;
    
    x1 = SE3_to_se3(se3_to_SE3(dx(1:6)')*se3_to_SE3(x(1:6)'));
    x2 = SE3_to_se3(se3_to_SE3(dx(7:12)')*se3_to_SE3(x(7:12)'));
    x = x + dx;
    x(1:6) = x1';
    x(7:12) = x2';
    
end

norm(fx)

%show result
plot(uv1(1,:),uv1(2,:),'ro');
hold on;
plot(uv2(1,:),uv2(2,:),'go');

pos1 = se3_to_SE3(x(1:6)');
pos2 = se3_to_SE3(x(7:12)');

P = [reshape(x(13:end),[3,100]);ones(1,100)];

p1 = pos1 * P;
p2 = pos2 * P;

uv1 =[p1(1,:)./p1(3,:) ; p1(2,:)./p1(3,:)];
uv2 =[p2(1,:)./p2(3,:) ; p2(2,:)./p2(3,:)];

plot(uv1(1,:),uv1(2,:),'r*');
hold on;
plot(uv2(1,:),uv2(2,:),'g*');

inv(pos1)
inv(pos2)
figure;
spy(H)

function J = calcJab(x)

newP = x(13:end);
newP = reshape(newP,[3,100]);
newP = [newP;ones(1,100)];

pos1 = se3_to_SE3(x(1:6)');
pos2 = se3_to_SE3(x(7:12)');
P1 = pos1 * newP;
P2 = pos2 * newP;

J = zeros(400,6*2+100*3);
for i=1:100
    X = P1(1,i);
    Y = P1(2,i);
    Z = P1(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,1:6) = Jabep*Jab;
    J((i-1)*2+1:i*2,12+(i-1)*3+1:12+i*3) = Jabep*pos1(1:3,1:3);
end

for i=1:100
    X = P2(1,i);
    Y = P2(2,i);
    Z = P2(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(200+(i-1)*2+1:200+i*2,7:12) = Jabep*Jab;
    J(200+(i-1)*2+1:200+i*2,12+(i-1)*3+1:12+i*3) = Jabep*pos2(1:3,1:3);
end

end

function fx = calcCost(x,uv1,uv2)

newP = x(13:end);
newP = reshape(newP,[3,100]);
newP = [newP;ones(1,100)];

pos1 = se3_to_SE3(x(1:6)');
pos2 = se3_to_SE3(x(7:12)');
P1 = pos1 * newP;
P2 = pos2 * newP;

fx = zeros(400,1);
for i=1:100
    X = P1(1,i);
    Y = P1(2,i);
    Z = P1(3,i);
    u = uv1(1,i);
    v = uv1(2,i);
    fx((i-1)*2+1:i*2) = [u - X/Z;v - Y/Z];
end

for i=1:100
    X = P2(1,i);
    Y = P2(2,i);
    Z = P2(3,i);
    u = uv2(1,i);
    v = uv2(2,i);
    fx(200+(i-1)*2+1:200+i*2) = [u - X/Z;v - Y/Z];
end

end

function R=rot(i,j,k)
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;
end

function se3 = SE3_to_se3( SE3 )

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 )

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

结果如下:

经典的箭头矩阵:

用优化后位姿将优化后的点云反投影到归一化图像坐标系结果:

圈圈是真值,星星是结果。

标签:se3,end,Bundle,matlab,theta,SE3,100,Adjustment,newP
From: https://www.cnblogs.com/tiandsp/p/17737930.html

相关文章

  • matlab练习程序(正交分解)
    正交分解可以将多个向量分解为互相正交的多个向量。可以用QR分解方法或施密特正交化方法,施密特正交化方法一般数值不稳定。假设有{V1...Vn}向量组,施密特正交化算法原理如下:结果中{β1...βn}为一组正交基,{η1...ηn}为其标准正交基。matlab代码如下:clearall;closeall;clc......
  • ★教程4:FPGA/MATLAB/Simulink联合应用开发入门与进阶X例——前言★教程3:simulink学
        专业即算法,算法即数学,数学即万物。从事MATLAB算法仿真工作15年,从事FPGA系统开发工作12多年。擅长解决各种算法仿真、建模、通信、图像处理、AI、智能控制等。 1.无线基带,无线图传,编解码2.机器视觉,图像处理,三维重建3.人工智能,深度学习4.智能控制,智能优化目录1.FPG......
  • ★教程4:FPGA/MATLAB/Simulink联合应用开发入门与进阶X例——目录
    1.订阅本教程用户可以免费获得本博任意1个博文对应代码;2.本课程的所有案例(部分理论知识点除外)均由博主编写而成,供有兴趣的朋友们自己订阅学习使用。未经本人允许,禁止任何形式的商业用途;3.本课程我们更侧重于各种实例的完整设计介绍。更全面的介绍FPGA,MATLAB,Simulink的联合开发应......
  • MATLAB的Simulink使用及实例
    MATLAB的Simulink使用及实例今天我们来新建一个如图所示的simulink文件新建一个Simulink有两种方法第一种在命令行直接输入similink,然后回车键就好了(注意simulink第一个S是小写哦)第二种我们可以直接在MATLAB上面找到simulink,如下图所示点进去就可以了点进去之后会出现......
  • Matlab中常用快捷键:注释、自动对齐、跳转指定行、设置标签等
    Matlab中有11个常用快捷键,可以大大提高编程效率,并且可以节省时间。 1.注释:注释是指在程序中添加注释,以便于以后更好地理解程序的含义。快捷键为Ctrl+R,点击后可以将当前行变为注释,再次点击可以取消注释。2.自动对齐:自动对齐是指将程序中的代码按照一定的格式进行排列,使得......
  • matlab读写pgm文件
    读文件1@4l#|,g3m/X$g$p+t%functiondisp_pgm(pgm_image_name)%不支持文件中有注释pgm_image_name='tmp.pgm';f=fopen(pgm_image_name,'r');iff==-1error(['Couldnotopenfile',pgm_image_name]);end/t2V;a(c$l1A$C'j......
  • matlab中函数的句柄是什么意思
    比定义f(x)=x^2写f=@(x)(x.^2)其@(x)(x.^2)匿名函数第括号面自变量第二括号面表达式@函数指针f=@(x)(x.^2)表示匿名函数@(x)(x.^2)赋值给f于f表示该函数于f(2)=2.^2=4;f(1:3)=[1:3].^2=[149]等等定义匿名函数调用别匿名函数比f1=@(x,y)(x.^2+y.^2)定义函数x^2+y^2f2=@(......
  • MATLAB 的字符串分析
    MATLAB的字符串分析。字符串实际上是指1Xn的字符数组。MATLAB软件具有强大的字符串处理功能,提供了很多的字符或字符串处理函数,包括字符串的创建、字符串的属性、比较、查找以及字符串的转换和执行等。由于MATLAB语言是用C语言进行开发的,因此它的字符串操作与C语言的相应操作非......
  • Matlab与线性代数
    %判断一个矩阵是否可以对角化并求解其对角化矩阵%定义矩阵AA=[4,2,-2;2,1,-1;-2,-1,1];%定义矩阵A%A=[4,-2;1,1];%计算特征向量和特征值[V,D]=eig(A);%判断是否存在足够数量的线性无关特征向量ifrank(V)==size(A,1)%构造对角矩阵D=d......
  • MATLAB 实现sobol参数敏感性分析
    1%sobol参数敏感性分析2%参考:3%csdn:https://blog.csdn.net/xiaosebi1111/article/details/465174094%wiki:https://en.wikipedia.org/wiki/Variance-based_sensitivity_analysis5%运行环境matlab2016b6%作者[email protected]年6月7日7%%初始......