0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 function [X_est, est_sigma_0, est_u, est_v, f] = ...
0030 sugr_triangulate_two_spherical_cameras(...
0031 b, Rot, u, v, sigma, Tol, max_iter, k, print_option)
0032
0033
0034 E = calc_S(b)*Rot';
0035
0036
0037 sigma_c= sigma*sqrt(u'*(E*E')*u+v'*(E'*E)*v);
0038 crit_E = k*sigma_c;
0039
0040 cgl = u'*E*v;
0041 if print_option > 0
0042 cgl=cgl
0043 end
0044
0045 if abs(cgl) > crit_E
0046 X_est.h=zeros(4,1);
0047 X_est.Crr=zeros(3);
0048 X_est.type=3;
0049 est_sigma_0 = 0;
0050 f=2;
0051 est_u=u;
0052 est_v=v;
0053 return
0054 end
0055
0056
0057 f = 0;
0058 ua = u;
0059 va = v;
0060 est_sigma_0=0;
0061
0062
0063 for nu = 1:max_iter
0064 g = ua'*E*va;
0065 if print_option > 0
0066 nu=nu
0067 g=g
0068 end
0069
0070 if abs(g) < Tol*sigma
0071 break
0072 end
0073 J1 = null(ua');
0074 J2 = null(va');
0075 l = [J1'*u;J2'*v];
0076 B = [J1'*E*va;J2'*E'*ua];
0077 cg = -cgl;
0078 n = B'*B;
0079 Deltal = l + cg/n*B;
0080 ua = ua+J1*Deltal(1:2);
0081 va = va+J2*Deltal(3:4);
0082 ua = ua/norm(ua);
0083 va = va/norm(va);
0084 est_sigma_0 = abs(cgl)/sigma_c;
0085 end
0086
0087 est_u = ua;
0088 est_v = va;
0089 est_w = Rot'*est_v;
0090 if print_option > 0
0091 uvw= [est_u', est_v', est_w']
0092 end
0093 m = calc_S(calc_S(b)*est_u)*b;
0094 m = m /norm(m);
0095 D = det([b, m, calc_S(est_u)*est_w]);
0096 rs = m' * [est_w, est_u];
0097 X = [rs(1)* est_u; D];
0098
0099
0100
0101 X_est = sugr_cov_matr_X(X,sigma,est_u,est_w,rs);
0102
0103
0104
0105
0106
0107 sigma_D = 2*sigma;
0108 crit_D = k*sigma_D;
0109 if abs(D) < eps
0110 if print_option > 0
0111 disp('point at infinity')
0112 end
0113 return
0114 end
0115 d=rs/D;
0116
0117 if sign(d(1)) < 0 || sign(d(2)) < 0
0118 if abs(D) < crit_D
0119
0120 if print_option > 0
0121 disp('point at infinity')
0122 end
0123
0124 return
0125 else
0126
0127 f=1;
0128 X_est.h=zeros(4,1);
0129 X_est.Crr=zeros(3);
0130 X_est.type=3;
0131 if print_option > 0
0132 disp('backward point')
0133 end
0134
0135 return
0136 end
0137 else
0138 if print_option > 0
0139 disp('signs ok')
0140 end
0141 end
0142
0143
0144