RNA wrapping of Action Groups:
[blender.git] / intern / iksolver / intern / IK_QJacobian.cpp
1 /**
2  * $Id$
3  * ***** BEGIN GPL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software Foundation,
17  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18  *
19  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
20  * All rights reserved.
21  *
22  * The Original Code is: all of this file.
23  *
24  * Original Author: Laurence
25  * Contributor(s): Brecht
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 #include "IK_QJacobian.h"
31 #include "TNT/svd.h"
32
33 IK_QJacobian::IK_QJacobian()
34 : m_sdls(true), m_min_damp(1.0)
35 {
36 }
37
38 IK_QJacobian::~IK_QJacobian()
39 {
40 }
41
42 void IK_QJacobian::ArmMatrices(int dof, int task_size)
43 {
44         m_dof = dof;
45         m_task_size = task_size;
46
47         m_jacobian.newsize(task_size, dof);
48         m_jacobian = 0;
49
50         m_alpha.newsize(dof);
51         m_alpha = 0;
52
53         m_null.newsize(dof, dof);
54
55         m_d_theta.newsize(dof);
56         m_d_theta_tmp.newsize(dof);
57
58         m_norm.newsize(dof);
59         m_norm = 0.0;
60
61         m_beta.newsize(task_size);
62
63         m_weight.newsize(dof);
64         m_weight_sqrt.newsize(dof);
65         m_weight = 1.0;
66         m_weight_sqrt = 1.0;
67
68         if (task_size >= dof) {
69                 m_transpose = false;
70
71                 m_jacobian_tmp.newsize(task_size, dof);
72
73                 m_svd_u.newsize(task_size, dof);
74                 m_svd_v.newsize(dof, dof);
75                 m_svd_w.newsize(dof);
76
77                 m_work1.newsize(task_size);
78                 m_work2.newsize(dof);
79
80                 m_svd_u_t.newsize(dof, task_size);
81                 m_svd_u_beta.newsize(dof);
82         }
83         else {
84                 // use the SVD of the transpose jacobian, it works just as well
85                 // as the original, and often allows using smaller matrices.
86                 m_transpose = true;
87
88                 m_jacobian_tmp.newsize(dof, task_size);
89
90                 m_svd_u.newsize(task_size, task_size);
91                 m_svd_v.newsize(dof, task_size);
92                 m_svd_w.newsize(task_size);
93
94                 m_work1.newsize(dof);
95                 m_work2.newsize(task_size);
96
97                 m_svd_u_t.newsize(task_size, task_size);
98                 m_svd_u_beta.newsize(task_size);
99         }
100 }
101
102 void IK_QJacobian::SetBetas(int id, int, const MT_Vector3& v)
103 {
104         m_beta[id] = v.x();
105         m_beta[id+1] = v.y();
106         m_beta[id+2] = v.z();
107 }
108
109 void IK_QJacobian::SetDerivatives(int id, int dof_id, const MT_Vector3& v)
110 {
111         m_jacobian[id][dof_id] = v.x()*m_weight_sqrt[dof_id];
112         m_jacobian[id+1][dof_id] = v.y()*m_weight_sqrt[dof_id];
113         m_jacobian[id+2][dof_id] = v.z()*m_weight_sqrt[dof_id];
114 }
115
116 void IK_QJacobian::Invert()
117 {
118         if (m_transpose) {
119                 // SVD will decompose Jt into V*W*Ut with U,V orthogonal and W diagonal,
120                 // so J = U*W*Vt and Jinv = V*Winv*Ut
121                 TNT::transpose(m_jacobian, m_jacobian_tmp);
122                 TNT::SVD(m_jacobian_tmp, m_svd_v, m_svd_w, m_svd_u, m_work1, m_work2);
123         }
124         else {
125                 // SVD will decompose J into U*W*Vt with U,V orthogonal and W diagonal,
126                 // so Jinv = V*Winv*Ut
127                 m_jacobian_tmp = m_jacobian;
128                 TNT::SVD(m_jacobian_tmp, m_svd_u, m_svd_w, m_svd_v, m_work1, m_work2);
129         }
130
131         if (m_sdls)
132                 InvertSDLS();
133         else
134                 InvertDLS();
135 }
136
137 bool IK_QJacobian::ComputeNullProjection()
138 {
139         MT_Scalar epsilon = 1e-10;
140         
141         // compute null space projection based on V
142         int i, j, rank = 0;
143         for (i = 0; i < m_svd_w.size(); i++)
144                 if (m_svd_w[i] > epsilon)
145                         rank++;
146
147         if (rank < m_task_size)
148                 return false;
149
150         TMatrix basis(m_svd_v.num_rows(), rank);
151         TMatrix basis_t(rank, m_svd_v.num_rows());
152         int b = 0;
153
154         for (i = 0; i < m_svd_w.size(); i++)
155                 if (m_svd_w[i] > epsilon) {
156                         for (j = 0; j < m_svd_v.num_rows(); j++)
157                                 basis[j][b] = m_svd_v[j][i];
158                         b++;
159                 }
160         
161         TNT::transpose(basis, basis_t);
162         TNT::matmult(m_null, basis, basis_t);
163
164         for (i = 0; i < m_null.num_rows(); i++)
165                 for (j = 0; j < m_null.num_cols(); j++)
166                         if (i == j)
167                                 m_null[i][j] = 1.0 - m_null[i][j];
168                         else
169                                 m_null[i][j] = -m_null[i][j];
170         
171         return true;
172 }
173
174 void IK_QJacobian::SubTask(IK_QJacobian& jacobian)
175 {
176         if (!ComputeNullProjection())
177                 return;
178
179         // restrict lower priority jacobian
180         jacobian.Restrict(m_d_theta, m_null);
181
182         // add angle update from lower priority
183         jacobian.Invert();
184
185         // note: now damps secondary angles with minimum damping value from
186         // SDLS, to avoid shaking when the primary task is near singularities,
187         // doesn't work well at all
188         int i;
189         for (i = 0; i < m_d_theta.size(); i++)
190                 m_d_theta[i] = m_d_theta[i] + /*m_min_damp**/jacobian.AngleUpdate(i);
191 }
192
193 void IK_QJacobian::Restrict(TVector& d_theta, TMatrix& null)
194 {
195         // subtract part already moved by higher task from beta
196         TVector beta_sub(m_beta.size());
197
198         TNT::matmult(beta_sub, m_jacobian, d_theta);
199         m_beta = m_beta - beta_sub;
200
201         // note: should we be using the norm of the unrestricted jacobian for SDLS?
202         
203         // project jacobian on to null space of higher priority task
204         TMatrix jacobian_copy(m_jacobian);
205         TNT::matmult(m_jacobian, jacobian_copy, null);
206 }
207
208 void IK_QJacobian::InvertSDLS()
209 {
210         // Compute the dampeds least squeares pseudo inverse of J.
211         //
212         // Since J is usually not invertible (most of the times it's not even
213         // square), the psuedo inverse is used. This gives us a least squares
214         // solution.
215         //
216         // This is fine when the J*Jt is of full rank. When J*Jt is near to
217         // singular the least squares inverse tries to minimize |J(dtheta) - dX)|
218         // and doesn't try to minimize  dTheta. This results in eratic changes in
219         // angle. The damped least squares minimizes |dtheta| to try and reduce this
220         // erratic behaviour.
221         //
222         // The selectively damped least squares (SDLS) is used here instead of the
223         // DLS. The SDLS damps individual singular values, instead of using a single
224         // damping term.
225
226         MT_Scalar max_angle_change = MT_PI/4.0;
227         MT_Scalar epsilon = 1e-10;
228         int i, j;
229
230         m_d_theta = 0;
231         m_min_damp = 1.0;
232
233         for (i = 0; i < m_dof; i++) {
234                 m_norm[i] = 0.0;
235                 for (j = 0; j < m_task_size; j+=3) {
236                         MT_Scalar n = 0.0;
237                         n += m_jacobian[j][i]*m_jacobian[j][i];
238                         n += m_jacobian[j+1][i]*m_jacobian[j+1][i];
239                         n += m_jacobian[j+2][i]*m_jacobian[j+2][i];
240                         m_norm[i] += sqrt(n);
241                 }
242         }
243
244         for (i = 0; i<m_svd_w.size(); i++) {
245                 if (m_svd_w[i] <= epsilon)
246                         continue;
247
248                 MT_Scalar wInv = 1.0/m_svd_w[i];
249                 MT_Scalar alpha = 0.0;
250                 MT_Scalar N = 0.0;
251
252                 // compute alpha and N
253                 for (j=0; j<m_svd_u.num_rows(); j+=3) {
254                         alpha += m_svd_u[j][i]*m_beta[j];
255                         alpha += m_svd_u[j+1][i]*m_beta[j+1];
256                         alpha += m_svd_u[j+2][i]*m_beta[j+2];
257
258                         // note: for 1 end effector, N will always be 1, since U is
259                         // orthogonal, .. so could be optimized
260                         MT_Scalar tmp;
261                         tmp = m_svd_u[j][i]*m_svd_u[j][i];
262                         tmp += m_svd_u[j+1][i]*m_svd_u[j+1][i];
263                         tmp += m_svd_u[j+2][i]*m_svd_u[j+2][i];
264                         N += sqrt(tmp);
265                 }
266                 alpha *= wInv;
267
268                 // compute M, dTheta and max_dtheta
269                 MT_Scalar M = 0.0;
270                 MT_Scalar max_dtheta = 0.0, abs_dtheta;
271
272                 for (j = 0; j < m_d_theta.size(); j++) {
273                         MT_Scalar v = m_svd_v[j][i];
274                         M += MT_abs(v)*m_norm[j];
275
276                         // compute tmporary dTheta's
277                         m_d_theta_tmp[j] = v*alpha;
278
279                         // find largest absolute dTheta
280                         // multiply with weight to prevent unnecessary damping
281                         abs_dtheta = MT_abs(m_d_theta_tmp[j])*m_weight_sqrt[j];
282                         if (abs_dtheta > max_dtheta)
283                                 max_dtheta = abs_dtheta;
284                 }
285
286                 M *= wInv;
287
288                 // compute damping term and damp the dTheta's
289                 MT_Scalar gamma = max_angle_change;
290                 if (N < M)
291                         gamma *= N/M;
292
293                 MT_Scalar damp = (gamma < max_dtheta)? gamma/max_dtheta: 1.0;
294
295                 for (j = 0; j < m_d_theta.size(); j++) {
296                         // slight hack: we do 0.80*, so that if there is some oscillation,
297                         // the system can still converge (for joint limits). also, it's
298                         // better to go a little to slow than to far
299                         
300                         MT_Scalar dofdamp = damp/m_weight[j];
301                         if (dofdamp > 1.0) dofdamp = 1.0;
302                         
303                         m_d_theta[j] += 0.80*dofdamp*m_d_theta_tmp[j];
304                 }
305
306                 if (damp < m_min_damp)
307                         m_min_damp = damp;
308         }
309
310         // weight + prevent from doing angle updates with angles > max_angle_change
311         MT_Scalar max_angle = 0.0, abs_angle;
312
313         for (j = 0; j<m_dof; j++) {
314                 m_d_theta[j] *= m_weight[j];
315
316                 abs_angle = MT_abs(m_d_theta[j]);
317
318                 if (abs_angle > max_angle)
319                         max_angle = abs_angle;
320         }
321         
322         if (max_angle > max_angle_change) {
323                 MT_Scalar damp = (max_angle_change)/(max_angle_change + max_angle);
324
325                 for (j = 0; j<m_dof; j++)
326                         m_d_theta[j] *= damp;
327         }
328 }
329
330 void IK_QJacobian::InvertDLS()
331 {
332         // Compute damped least squares inverse of pseudo inverse
333         // Compute damping term lambda
334
335         // Note when lambda is zero this is equivalent to the
336         // least squares solution. This is fine when the m_jjt is
337         // of full rank. When m_jjt is near to singular the least squares
338         // inverse tries to minimize |J(dtheta) - dX)| and doesn't 
339         // try to minimize  dTheta. This results in eratic changes in angle.
340         // Damped least squares minimizes |dtheta| to try and reduce this
341         // erratic behaviour.
342
343         // We don't want to use the damped solution everywhere so we
344         // only increase lamda from zero as we approach a singularity.
345
346         // find the smallest non-zero W value, anything below epsilon is
347         // treated as zero
348
349         MT_Scalar epsilon = 1e-10;
350         MT_Scalar max_angle_change = 0.1;
351         MT_Scalar x_length = sqrt(TNT::dot_prod(m_beta, m_beta));
352
353         int i, j;
354         MT_Scalar w_min = MT_INFINITY;
355
356         for (i = 0; i <m_svd_w.size() ; i++) {
357                 if (m_svd_w[i] > epsilon && m_svd_w[i] < w_min)
358                         w_min = m_svd_w[i];
359         }
360         
361         // compute lambda damping term
362
363         MT_Scalar d = x_length/max_angle_change;
364         MT_Scalar lambda;
365
366         if (w_min <= d/2)
367                 lambda = d/2;
368         else if (w_min < d)
369                 lambda = sqrt(w_min*(d - w_min));
370         else
371                 lambda = 0.0;
372
373         lambda *= lambda;
374
375         if (lambda > 10)
376                 lambda = 10;
377
378         // immediately multiply with Beta, so we can do matrix*vector products
379         // rather than matrix*matrix products
380
381         // compute Ut*Beta
382         TNT::transpose(m_svd_u, m_svd_u_t);
383         TNT::matmult(m_svd_u_beta, m_svd_u_t, m_beta);
384
385         m_d_theta = 0.0;
386
387         for (i = 0; i < m_svd_w.size(); i++) {
388                 if (m_svd_w[i] > epsilon) {
389                         MT_Scalar wInv = m_svd_w[i]/(m_svd_w[i]*m_svd_w[i] + lambda);
390
391                         // compute V*Winv*Ut*Beta
392                         m_svd_u_beta[i] *= wInv;
393
394                         for (j = 0; j<m_d_theta.size(); j++)
395                                 m_d_theta[j] += m_svd_v[j][i]*m_svd_u_beta[i];
396                 }
397         }
398
399         for (j = 0; j<m_d_theta.size(); j++)
400                 m_d_theta[j] *= m_weight[j];
401 }
402
403 void IK_QJacobian::Lock(int dof_id, MT_Scalar delta)
404 {
405         int i;
406
407         for (i = 0; i < m_task_size; i++) {
408                 m_beta[i] -= m_jacobian[i][dof_id]*delta;
409                 m_jacobian[i][dof_id] = 0.0;
410         }
411
412         m_norm[dof_id] = 0.0; // unneeded
413         m_d_theta[dof_id] = 0.0;
414 }
415
416 MT_Scalar IK_QJacobian::AngleUpdate(int dof_id) const
417 {
418         return m_d_theta[dof_id];
419 }
420
421 MT_Scalar IK_QJacobian::AngleUpdateNorm() const
422 {
423         int i;
424         MT_Scalar mx = 0.0, dtheta_abs;
425
426         for (i = 0; i < m_d_theta.size(); i++) {
427                 dtheta_abs = MT_abs(m_d_theta[i]);
428                 if (dtheta_abs > mx)
429                         mx = dtheta_abs;
430         }
431         
432         return mx;
433 }
434
435 void IK_QJacobian::SetDoFWeight(int dof, MT_Scalar weight)
436 {
437         m_weight[dof] = weight;
438         m_weight_sqrt[dof] = sqrt(weight);
439 }
440