diff options
| author | Leo Chan <leochanj@live.unc.edu> | 2020-10-22 01:53:21 -0400 |
|---|---|---|
| committer | Joshua Bakita <jbakita@cs.unc.edu> | 2020-10-22 01:56:35 -0400 |
| commit | d17b33131c14864bd1eae275f49a3f148e21cf29 (patch) | |
| tree | 0d8f77922e8d193cb0f6edab83018f057aad64a0 /SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rodrigues.m | |
| parent | 601ed25a4c5b66cb75315832c15613a727db2c26 (diff) | |
Squashed commit of the sb-vbs branch.
Includes the SD-VBS benchmarks modified to:
- Use libextra to loop as realtime jobs
- Preallocate memory before starting their main computation
- Accept input via stdin instead of via argc
Does not include the SD-VBS matlab code.
Fixes libextra execution in LITMUS^RT.
Diffstat (limited to 'SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rodrigues.m')
| -rwxr-xr-x | SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rodrigues.m | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rodrigues.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rodrigues.m new file mode 100755 index 0000000..9d55337 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rodrigues.m | |||
| @@ -0,0 +1,217 @@ | |||
| 1 | function [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; | ||
| 26 | bigeps = 10e+20*eps; | ||
| 27 | |||
| 28 | if ((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 | |||
| 173 | return; | ||
| 174 | |||
| 175 | %% test of the Jacobians: | ||
| 176 | |||
| 177 | %%%% TEST OF dRdom: | ||
| 178 | om = randn(3,1); | ||
