【计算机视觉】matlab编程实现根据PNP求解位姿(有问题版)

应人邀请帮忙推导求解最小二乘的PNP估计位姿问题, matlab编程实现根据PNP求解时解貌似有问题?




clc;clear all;

n=4;
f=1000;

pw3=zeros(n,3);%物体坐标3维
pc2=zeros(n,2);%成像坐标2维
pw3=[-1000,-100,0;1000,-100,0;-1000,100,0;-1000,100,0];
pc2=[-67.8995,-56.3607;83.138,43.324;73.6759,61.1555;-75.8558,-39.5293];
% syms r11 r12 r13 r22 r23 r33 t1 t2 t3;
syms r11 r12 r13 r21 r22 r23 r31 r32 r33 t1 t2 t3 zc;
R=zeros(3,3);
T=zeros(3,1);
M=zeros(3,3);
R=[r11,r12,r13;r21,r22,r23;r31,r32,r33];%旋转矩阵
T=[t1;t2;t3];%平移向量
M(1,1)=f;
M(2,2)=f;
M(3,3)=1;
S1=M*[R,T]*[pw3(1,:)';1]-[pc2(1,:)';1]*zc;
S2=M*[R,T]*[pw3(2,:)';1]-[pc2(2,:)';1]*zc;
S3=M*[R,T]*[pw3(1,:)';1]-[pc2(1,:)';1]*zc;
S4=M*[R,T]*[pw3(1,:)';1]-[pc2(1,:)';1]*zc;

    % solve(S1=0,S2=0,S3=0,S4=0);
    % solve('S1=0','S2=0','S3=0','S4=0');
    % [r11,r12,r13,r22,r23,r33,t1,t2,t3]=solve('S1=0','S2=0','S3=0','S4=0','','','');


% [r11,r12,r13,r22,r23,t1,t2,t3]=solve('1000*t1 - 100000*r12 - 1000000*r11 + 4778002545291297/70368744177664',...
% '0*t2 - 100000*r22 - 1000000*r12 + 7932063359948135/140737488355328',...
% 't3 - 100*r23 - 1000*r13 - 1',...
% '1000000*r11 - 100000*r12 + 1000*t1 - 41569/500','1000000*r12 - 100000*r22 + 1000*t2 - 10831/250',...
% '1000*r13 - 100*r23 + t3 - 1',...
% '1000*t1 - 100000*r12 - 1000000*r11 + 4778002545291297/70368744177664',...
% '1000*t2 - 100000*r22 - 1000000*r12 + 7932063359948135/140737488355328',...
% 't3 - 100*r23 - 1000*r13 - 1',...
% '1000*t1 - 100000*r12 - 1000000*r11 + 4778002545291297/70368744177664',...
% '1000*t2 - 100000*r22 - 1000000*r12 + 7932063359948135/140737488355328',...
% ' t3 - 100*r23 - 1000*r13 - 1');

% 
% % 二
[r11,r12,r21,r22,r31,r32,t1,t2,t3,zc]=solve(...
' 1000*t1 - 100000*r12 - 1000000*r11 + (4778002545291297*zc)/70368744177664',...  
' 1000*t2 - 100000*r22 - 1000000*r21 + (7932063359948135*zc)/140737488355328',... 
' t3 - 100*r32 - 1000*r31 - zc',... 
' 1000000*r11 - 100000*r12 + 1000*t1 - (41569*zc)/500',... 
' 1000000*r21 - 100000*r22 + 1000*t2 - (10831*zc)/250',... 
'1000*r31 - 100*r32 + t3 - zc',... 
' 1000*t1 - 100000*r12 - 1000000*r11 + (4778002545291297*zc)/70368744177664',... 
'1000*t2 - 100000*r22 - 1000000*r21 + (7932063359948135*zc)/140737488355328',... 
' t3 - 100*r32 - 1000*r31 - zc',... 
'  1000*t1 - 100000*r12 - 1000000*r11 + (4778002545291297*zc)/70368744177664',... 
' 1000*t2 - 100000*r22 - 1000000*r21 + (7932063359948135*zc)/140737488355328',... 
' t3 - 100*r32 - 1000*r31 - zc');





clc;clear all;


n=4;
f=1000;


pw3=zeros(n,3);%物体坐标3维
pc2=zeros(n,2);%成像坐标2维
pw3=[-1000,-100,0;1000,-100,0;-1000,100,0;-1000,100,0];
pc2=[-67.8995,-56.3607;83.138,43.324;73.6759,61.1555;-75.8558,-39.5293];
% syms r11 r12 r13 r22 r23 r33 t1 t2 t3;
syms r11 r12 r13 r21 r22 r23 r31 r32 r33 t1 t2 t3 zc;
R=zeros(3,3);
T=zeros(3,1);
M=zeros(3,3);
R=[r11,r12,r13;r21,r22,r23;r31,r32,r33];%旋转矩阵
T=[t1;t2;t3];%平移向量
M(1,1)=f;
M(2,2)=f;
M(3,3)=1;
S1=M*[R,T]*[pw3(1,:)';1]-[pc2(1,:)';1]*zc;
S2=M*[R,T]*[pw3(2,:)';1]-[pc2(2,:)';1]*zc;
S3=M*[R,T]*[pw3(1,:)';1]-[pc2(1,:)';1]*zc;
S4=M*[R,T]*[pw3(1,:)';1]-[pc2(1,:)';1]*zc;


    % solve(S1=0,S2=0,S3=0,S4=0);
    % solve('S1=0','S2=0','S3=0','S4=0');
    % [r11,r12,r13,r22,r23,r33,t1,t2,t3]=solve('S1=0','S2=0','S3=0','S4=0','','','');




% [r11,r12,r13,r22,r23,t1,t2,t3]=solve('1000*t1 - 100000*r12 - 1000000*r11 + 4778002545291297/70368744177664',...
% '0*t2 - 100000*r22 - 1000000*r12 + 7932063359948135/140737488355328',...
% 't3 - 100*r23 - 1000*r13 - 1',...
% '1000000*r11 - 100000*r12 + 1000*t1 - 41569/500','1000000*r12 - 100000*r22 + 1000*t2 - 10831/250',...
% '1000*r13 - 100*r23 + t3 - 1',...
% '1000*t1 - 100000*r12 - 1000000*r11 + 4778002545291297/70368744177664',...
% '1000*t2 - 100000*r22 - 1000000*r12 + 7932063359948135/140737488355328',...
% 't3 - 100*r23 - 1000*r13 - 1',...
% '1000*t1 - 100000*r12 - 1000000*r11 + 4778002545291297/70368744177664',...
% '1000*t2 - 100000*r22 - 1000000*r12 + 7932063359948135/140737488355328',...
% ' t3 - 100*r23 - 1000*r13 - 1');



% % 二
[r11,r12,r21,r22,r31,r32,t1,t2,t3,zc]=solve(...
' 1000*t1 - 100000*r12 - 1000000*r11 + (4778002545291297*zc)/70368744177664',...  
' 1000*t2 - 100000*r22 - 1000000*r21 + (7932063359948135*zc)/140737488355328',... 
' t3 - 100*r32 - 1000*r31 - zc',... 
' 1000000*r11 - 100000*r12 + 1000*t1 - (41569*zc)/500',... 
' 1000000*r21 - 100000*r22 + 1000*t2 - (10831*zc)/250',... 
'1000*r31 - 100*r32 + t3 - zc',... 
' 1000*t1 - 100000*r12 - 1000000*r11 + (4778002545291297*zc)/70368744177664',... 
'1000*t2 - 100000*r22 - 1000000*r21 + (7932063359948135*zc)/140737488355328',... 
' t3 - 100*r32 - 1000*r31 - zc',... 
'  1000*t1 - 100000*r12 - 1000000*r11 + (4778002545291297*zc)/70368744177664',... 
' 1000*t2 - 100000*r22 - 1000000*r21 + (7932063359948135*zc)/140737488355328',... 
' t3 - 100*r32 - 1000*r31 - zc');



clc;clear all;
%% 该代码为验证迭代法求解位姿的程序 2017 12 15
n=4;
f=1000;


pw3=zeros(n,3);%物体坐标3维
pc2=zeros(n,2);%成像坐标2维
pw3=[-1000,-100,0;1000,-100,0;-1000,100,0;-1000,100,0];
pc2=[-67.8995,-56.3607;83.138,43.324;73.6759,61.1555;-75.8558,-39.5293];
% syms r11 r12 r13 r22 r23 r33 t1 t2 t3;
syms r11 r12 r13 r22 r23 r33 t1 t2 t3 zc;
R=zeros(3,3);
T=zeros(3,1);
M=zeros(3,3);
R=[r11,r12,r13;r12,r22,r23;r13,r23,r33];%旋转矩阵
T=[t1;t2;t3];%平移向量
M(1,1)=f;
M(2,2)=f;
M(3,3)=1;
S1=M*[R,T]*[pw3(1,:)';1]-[pc2(1,:)';1]*zc;
S2=M*[R,T]*[pw3(2,:)';1]-[pc2(2,:)';1]*zc;
S3=M*[R,T]*[pw3(1,:)';1]-[pc2(1,:)';1]*zc;
S4=M*[R,T]*[pw3(1,:)';1]-[pc2(1,:)';1]*zc;


    % solve(S1=0,S2=0,S3=0,S4=0);
    % solve('S1=0','S2=0','S3=0','S4=0');
    % [r11,r12,r13,r22,r23,r33,t1,t2,t3]=solve('S1=0','S2=0','S3=0','S4=0','','','');




% [r11,r12,r13,r22,r23,t1,t2,t3]=solve('1000*t1 - 100000*r12 - 1000000*r11 + 4778002545291297/70368744177664',...
% '0*t2 - 100000*r22 - 1000000*r12 + 7932063359948135/140737488355328',...
% 't3 - 100*r23 - 1000*r13 - 1',...
% '1000000*r11 - 100000*r12 + 1000*t1 - 41569/500','1000000*r12 - 100000*r22 + 1000*t2 - 10831/250',...
% '1000*r13 - 100*r23 + t3 - 1',...
% '1000*t1 - 100000*r12 - 1000000*r11 + 4778002545291297/70368744177664',...
% '1000*t2 - 100000*r22 - 1000000*r12 + 7932063359948135/140737488355328',...
% 't3 - 100*r23 - 1000*r13 - 1',...
% '1000*t1 - 100000*r12 - 1000000*r11 + 4778002545291297/70368744177664',...
% '1000*t2 - 100000*r22 - 1000000*r12 + 7932063359948135/140737488355328',...
% ' t3 - 100*r23 - 1000*r13 - 1');




% % 二
[r11,r12,r13,r22,r23,r33,t1,t2,t3]=solve(...
'1000*t1 - 100000*r12 - 1000000*r11 + (4778002545291297*zc)/70368744177664',...  
'1000*t2 - 100000*r22 - 1000000*r12 + (7932063359948135*zc)/140737488355328',... 
' t3 - 100*r23 - 1000*r13 - zc',... 
' 1000000*r11 - 100000*r12 + 1000*t1 - (41569*zc)/500',... 
' 1000000*r12 - 100000*r22 + 1000*t2 - (10831*zc)/250',... 
'1000*r13 - 100*r23 + t3 - zc',... 
'1000*t1 - 100000*r12 - 1000000*r11 + (4778002545291297*zc)/70368744177664',... 
'1000*t2 - 100000*r22 - 1000000*r12 + (7932063359948135*zc)/140737488355328',... 
' t3 - 100*r23 - 1000*r13 - zc',... 
'1000*t1 - 100000*r12 - 1000000*r11 + (4778002545291297*zc)/70368744177664',... 
' 1000*t2 - 100000*r22 - 1000000*r12 + (7932063359948135*zc)/140737488355328',... 
' t3 - 100*r23 - 1000*r13 - zc');



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值