summaryrefslogtreecommitdiffstats
path: root/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rodrigues.m
diff options
context:
space:
mode:
Diffstat (limited to 'SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rodrigues.m')
-rwxr-xr-xSD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rodrigues.m217
1 files changed, 217 insertions, 0 deletions
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rodrigues.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rodrigues.m
new file mode 100755
index 0000000..9d55337
--- /dev/null
+++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rodrigues.m
@@ -0,0 +1,217 @@
1function [out,dout]=rodrigues(in)
2
3% RODRIGUES Transform rotation matrix into rotation vector and viceversa.
4%
5% Sintax: [OUT]=RODRIGUES(IN)
6% If IN is a 3x3 rotation matrix then OUT is the
7% corresponding 3x1 rotation vector
8% if IN is a rotation 3-vector then OUT is the
9% corresponding 3x3 rotation matrix
10%
11
12%%
13%% Copyright (c) March 1993 -- Pietro Perona
14%% California Institute of Technology
15%%
16
17%% ALL CHECKED BY JEAN-YVES BOUGUET, October 1995.
18%% FOR ALL JACOBIAN MATRICES !!! LOOK AT THE TEST AT THE END !!
19
20%% BUG when norm(om)=pi fixed -- April 6th, 1997;
21%% Jean-Yves Bouguet
22
23
24[m,n] = size(in);
25%bigeps = 10e+4*eps;
26bigeps = 10e+20*eps;
27
28if ((m==1) & (n==3)) | ((m==3) & (n==1)) %% it is a rotation vector
29 theta = norm(in);
30 if theta < eps
31 R = eye(3);
32
33 %if nargout > 1,
34
35 dRdin = [0 0 0;
36 0 0 1;
37 0 -1 0;
38 0 0 -1;
39 0 0 0;
40 1 0 0;
41 0 1 0;
42 -1 0 0;
43 0 0 0];
44
45 %end;
46
47 else
48 if n==length(in) in=in'; end; %% make it a column vec. if necess.
49
50 %m3 = [in,theta]
51
52 dm3din = [eye(3);in'/theta];
53
54 omega = in/theta;
55
56 %m2 = [omega;theta]
57
58 dm2dm3 = [eye(3)/theta -in/theta^2; zeros(1,3) 1];
59
60 alpha = cos(theta);
61 beta = sin(theta);
62 gamma = 1-cos(theta);
63 omegav=[[0 -omega(3) omega(2)];[omega(3) 0 -omega(1)];[-omega(2) omega(1) 0 ]];
64 A = omega*omega';
65
66 %m1 = [alpha;beta;gamma;omegav;A];
67
68 dm1dm2 = zeros(21,4);
69 dm1dm2(1,4) = -sin(theta);
70 dm1dm2(2,4) = cos(theta);
71 dm1dm2(3,4) = sin(theta);
72 dm1dm2(4:12,1:3) = [0 0 0 0 0 1 0 -1 0;
73 0 0 -1 0 0 0 1 0 0;
74 0 1 0 -1 0 0 0 0 0]';
75
76 w1 = omega(1);
77 w2 = omega(2);
78 w3 = omega(3);
79
80 dm1dm2(13:21,1) = [2*w1;w2;w3;w2;0;0;w3;0;0];
81 dm1dm2(13: 21,2) = [0;w1;0;w1;2*w2;w3;0;w3;0];
82 dm1dm2(13:21,3) = [0;0;w1;0;0;w2;w1;w2;2*w3];
83
84 R = eye(3)*alpha + omegav*beta + A*gamma;
85
86 dRdm1 = zeros(9,21);
87
88 dRdm1([1 5 9],1) = ones(3,1);
89 dRdm1(:,2) = omegav(:);
90 dRdm1(:,4:12) = beta*eye(9);
91 dRdm1(:,3) = A(:);
92 dRdm1(:,13:21) = gamma*eye(9);
93
94 dRdin = dRdm1 * dm1dm2 * dm2dm3 * dm3din;
95
96
97 end;
98 out = R;
99 dout = dRdin;
100
101 %% it is prob. a rot matr.
102 elseif ((m==n) & (m==3) & (norm(in' * in - eye(3)) < bigeps)...
103 & (abs(det(in)-1) < bigeps))
104 R = in;
105
106
107
108 tr = (trace(R)-1)/2;
109 dtrdR = [1 0 0 0 1 0 0 0 1]/2;
110 theta = real(acos(tr));
111
112
113 if sin(theta) >= 1e-5,
114
115 dthetadtr = -1/sqrt(1-tr^2);
116
117 dthetadR = dthetadtr * dtrdR;
118 % var1 = [vth;theta];
119 vth = 1/(2*sin(theta));
120 dvthdtheta = -vth*cos(theta)/sin(theta);
121 dvar1dtheta = [dvthdtheta;1];
122
123 dvar1dR = dvar1dtheta * dthetadR;
124
125
126 om1 = [R(3,2)-R(2,3), R(1,3)-R(3,1), R(2,1)-R(1,2)]';
127
128 dom1dR = [0 0 0 0 0 1 0 -1 0;
129 0 0 -1 0 0 0 1 0 0;
130 0 1 0 -1 0 0 0 0 0];
131
132 % var = [om1;vth;theta];
133 dvardR = [dom1dR;dvar1dR];
134
135 % var2 = [om;theta];
136 om = vth*om1;
137 domdvar = [vth*eye(3) om1 zeros(3,1)];
138 dthetadvar = [0 0 0 0 1];
139 dvar2dvar = [domdvar;dthetadvar];
140
141
142 out = om*theta;
143 domegadvar2 = [theta*eye(3) om];
144
145 dout = domegadvar2 * dvar2dvar * dvardR;
146
147
148 else
149 if tr > 0; % case norm(om)=0;
150
151 out = [0 0 0]';
152
153 dout = [0 0 0 0 0 1/2 0 -1/2 0;
154 0 0 -1/2 0 0 0 1/2 0 0;
155 0 1/2 0 -1/2 0 0 0 0 0];
156 else % case norm(om)=pi; %% fixed April 6th
157
158
159 out = theta * (sqrt((diag(R)+1)/2).*[1;2*(R(1,2:3)>=0)'-1]);
160 %keyboard;
161
162 if nargout > 1,
163 fprintf(1,'WARNING!!!! Jacobian domdR undefined!!!\n');
164 dout = NaN*ones(3,9);
165 end;
166 end;
167 end;
168
169 else
170 error('Neither a rotation matrix nor a rotation vector were provided');
171 end;
172
173return;
174
175%% test of the Jacobians:
176
177%%%% TEST OF dRdom:
178om = randn(3,1);
179dom = randn(3,1)/1000000;
180
181[R1,dR1] = rodrigues(om);
182R2 = rodrigues(om+dom);
183
184R2a = R1 + reshape(dR1 * dom,3,3);
185
186gain = norm(R2 - R1)/norm(R2 - R2a)
187
188%%% TEST OF dOmdR:
189om = randn(3,1);
190R = rodrigues(om);
191dom = randn(3,1)/10000;
192dR = rodrigues(om+dom) - R;
193
194[omc,domdR] = rodrigues(R);
195[om2] = rodrigues(R+dR);
196
197om_app = omc + domdR*dR(:);
198
199gain = norm(om2 - omc)/norm(om2 - om_app)
200
201
202%%% OTHER BUG: (FIXED NOW!!!)
203
204omu = randn(3,1);
205omu = omu/norm(omu)
206om = pi*omu;
207[R,dR]= rodrigues(om);
208[om2] = rodrigues(R);
209[om om2]
210
211%%% NORMAL OPERATION
212
213om = randn(3,1);
214[R,dR]= rodrigues(om);
215[om2] = rodrigues(R);
216[om om2]
217