繁体   English   中英

在Matlab中用Levenberg-Marquardt算法求解纯旋转绝对方向

[英]solving rotation-only absolute orientation by Levenberg-Marquardt algorithm in matlab

我正在做迭代最近点项目。 有点集称为“ a”和“ b”。我想找到适合“ a”和“ b”的变换矩阵。 SVD可以完美求解,并获得旋转和平移矩阵。 现在,我考虑制作一些仅旋转的关节,拟合“ a”和“ b”点集而没有任何平移,而只有旋转。 我搜索了互联网,并进行了讨论,说Levenberg-Marquardt算法可以解决该问题。

我将代码复制到此处,并将代码修改为绝对定向问题的成本函数https://engineering.purdue.edu/kak/computervision/ECE661/HW5_LM_handout.pdf

成本函数是

E =Σ|| Ra-bt || ^ 2

R是旋转矩阵,t是平移矩阵

下面是matlab代码,它将返回最佳旋转弧度“ R”和转换结果“ t”:

a=[0 1 2 3 4 5 6 7 8 9;0 0 0 0 0 0 0 0 0 0];    
b=[0 0.7074 1.4148 2.1222 2.8296 3.5369 4.2443 4.9517 5.6591 6.3665;0 -0.7068 -1.4137 -2.1205 -2.8273 -3.5341 -4.2410 -4.9478 -5.6546 -6.3614];    
r0=0.0;    
tx0=0;    
ty0=0;    
y_init = [cos(r0) -sin(r0);sin(r0) cos(r0)]*a-[tx0;ty0]*[1 1 1 1 1 1 1 1 1 1];
Ndata=length(b);    
Nparams=3;    
n_iters=50;    
lamda=0.01;
updateJ=1;
r_est=r0;
tx_est=tx0;
ty_est=ty0;    
for it=1:n_iters    
    if updateJ==1    
        J=zeros(Ndata*2,Nparams);   
        for i=0:length(a)-1

            J(2*i+1,:)= [- a(2,i+1)*cos(r_est) - a(1,i+1)*sin(r_est), -1,  0];    
            J(2*i+2,:)= [  a(1,i+1)*cos(r_est) - a(2,i+1)*sin(r_est),  0, -1];    
        end   
        y_est = [cos(r_est) -sin(r_est);sin(r_est) cos(r_est)]*a-[tx_est;ty_est]*[1 1 1 1 1 1 1 1 1 1];
        d=b-y_est;

        H=J'*J;
        if it==1
            e=dot(d,d);
        end
    end

    H_lm=H+(lamda*eye(Nparams,Nparams)); 
    dp=inv(H_lm)*(J'*d(:));
    H_lm;
    inv(H_lm);
    J'*d(:);
    g = J'*d(:);
    r_lm=r_est+dp(1);
    tx_lm=tx_est+dp(2);
    ty_lm=ty_est+dp(3);
    y_est_lm = [cos(r_lm) -sin(r_lm);sin(r_lm) cos(r_lm)]*a-[tx_lm;ty_lm]*[1 1 1 1 1 1 1 1 1 1];
    d_lm=b-y_est_lm;
    e_lm=dot(d_lm,d_lm);
    if e_lm<e
        lamda=lamda/10;
        r_est=r_lm;
        tx_est=tx_lm;
        ty_est=ty_lm;
        e=e_lm;
         updateJ=1;
    else
        updateJ=0;
        lamda=lamda*10;
      end

end

r_est

它和SVD等封闭形式的解决方案一样有效。现在我不需要翻译,我认为公式是

E =Σ|| Ra-b || ^ 2

这意味着我只旋转“ a”并使“ b”适合原点。

代码将在下面,它将返回最佳旋转弧度“ R”:

a=[0 1 2 3 4 5 6 7 8 9;1 1 1 1 1 1 1 1 1 1];
b=[-1 -2 -3 -4 -5 -6 -7 -8 -9 -10;0 0 0 0 0 0 0 0 0 0];

%initial guess
r0=0; 
y_init = [cos(r0) -sin(r0);sin(r0) cos(r0)]*a;
Ndata=length(b);
Nparams=1;
n_iters=50;
lamda=0.01;
updateJ=1;
r_est=r0;
for it=1:n_iters
    if updateJ==1
        J=zeros(Ndata,Nparams);
        for i=0:length(a)-1
            J(2*i+1,:)= [-a(2,i+1)*cos(r_est)-a(1,i+1)*sin(r_est)];
            J(2*i+2,:)= [ a(1,i+1)*cos(r_est)-a(2,i+1)*sin(r_est)];
        end
        y_est = [cos(r_est) -sin(r_est);sin(r_est) cos(r_est)]*a;
        d=b-y_est;
        H=J'*J;
        if it==1
            e=dot(d,d);
        end
    end

    H_lm=H+(lamda*eye(Nparams,Nparams));
    dp=inv(H_lm)*(J'*d(:));
    H_lm;
    inv(H_lm);
    J'*d(:);
    g = J'*d(:);
    r_lm=r_est+dp(1);
    y_est_lm = [cos(r_lm) -sin(r_lm);sin(r_lm) cos(r_lm)]*a;
    d_lm=b-y_est_lm;
    e_lm=dot(d_lm,d_lm);
    if e_lm<e
        lamda=lamda/10;
        r_est=r_lm;
        e=e_lm;
        updateJ=1;
    else

        updateJ=0;
        lamda=lamda*10;
    end
end

r_est

在此代码中,我删除了成本函数的转换矩阵,然后执行Levenberg-Marquardt算法,希望它能返回适合“ a”和“ b”点集的最佳旋转矩阵。 但是,它总是返回初始猜测值r0。 看来我不能简单地删除成本函数中的转换矩阵以获得最佳旋转。

我应该怎么做才能解决这个仅旋转的绝对方向问题? 感谢您的任何想法!

您也可以通过SVD执行此操作。 如果要旋转和平移,第一步是从a和b中减去均值。 如果只需要旋转,则可以省略此步骤,与以前一样计算旋转,而错过计算平移的最后一步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM