@@ -188,23 +188,35 @@ namespace pinocchio
188188 data.M .rotation () << c1c2, -c1s2, s1,
189189 c0 * s2 + c2 * s0 * s1, c0 * c2 - s0 * s1 * s2, -c1 * s0,
190190 -c0 * c2 * s1 + s0 * s2, c0 * s1 * s2 + c2 * s0, c0 * c1;
191-
191+
192192 Scalar nx, ny, nz;
193193 nx = s1;
194194 ny = -s0 * c1;
195195 nz = c0 * c1;
196196
197197 data.M .translation () << radius_a * nx, radius_b * ny, radius_c * nz;
198+
199+ Scalar dndotx_dqdot1, dndoty_dqdot0, dndoty_dqdot1, dndotz_dqdot0, dndotz_dqdot1;
200+ dndotx_dqdot1 = c1;
201+ dndoty_dqdot0 = - c0 * c1;
202+ dndoty_dqdot1 = s0 * s1;
203+ dndotz_dqdot0 = - c1 * s0;
204+ dndotz_dqdot1 = - c0 * s1;
198205
199206 Scalar S_11, S_21, S_31, S_12, S_22, S_32;
200- S_11 = c1 * (-radius_b * c0 * (c0 * s2 + c2 * s0 * s1) - radius_c * s0 * (- c0 * c2 * s1 + s0 * s2));
201- S_21 = c1 * (radius_b * c0 * (- c0 * c2 + s0 * s1 * s2) - radius_c * s0 * (c0 * s1 * s2 + c2 * s0));
202- S_31 = c0 * c1 * c1 * s0 * (radius_b - radius_c);
203-
204- S_12 = radius_a * c1c2 * c1 + radius_b * s0 * s1 * (c0 * s2 + c2 * s0 * s1) - radius_c * c0 * s1 * (- c0 * c2 * s1 + s0 * s2);
205- S_22 = - radius_a * c1s2 * c1 - radius_b * s0 * s1 * (- c0 * c2 + s0 * s1 * s2) - radius_c * c0 * s1 * (c0 * s1 * s2 + c2 * s0);
206- S_32 = c1 * s1 * (radius_a - radius_b * s0 * s0 - radius_c * c0 * c0);
207-
207+ // S_11 = c1 * (-radius_b * c0 * (c0 * s2 + c2 * s0 * s1) - radius_c * s0 * (- c0 * c2 * s1 + s0 * s2));
208+ S_11 = dndoty_dqdot0 * radius_b * (c0 *s2 + c2 * s0 * s1) + dndotz_dqdot0 * radius_c * (- c0 * c2 * s1 + s0 * s2);
209+ // S_21 = c1 * (radius_b * c0 * (- c0 * c2 + s0 * s1 * s2) - radius_c * s0 * (c0 * s1 * s2 + c2 * s0));
210+ S_21 = - dndoty_dqdot0 * radius_b * (- c0 * c2 + s0 * s1 * s2) + dndotz_dqdot0 * radius_c * (c0 * s1 * s2 + c2 * s0);
211+ // S_31 = c0 * c1 * c1 * s0 * (radius_b - radius_c);
212+ S_31 = c1 * (- dndoty_dqdot0 * radius_b * s0 + dndotz_dqdot0 * radius_c * c0);
213+
214+ // S_12 = radius_a * c1c2 * c1 + radius_b * s0 * s1 * (c0 * s2 + c2 * s0 * s1) - radius_c * c0 * s1 * (- c0 * c2 * s1 + s0 * s2);
215+ S_12 = dndotx_dqdot1 * radius_a * c1 * c2 + dndoty_dqdot1 * radius_b * (c0 * s2 + c2 * s0 * s1) + dndotz_dqdot1 * radius_c * (- c0 * c2 * s1 + s0 * s2);
216+ // S_22 = - radius_a * c1s2 * c1 - radius_b * s0 * s1 * (- c0 * c2 + s0 * s1 * s2) - radius_c * c0 * s1 * (c0 * s1 * s2 + c2 * s0);
217+ S_22 = - dndotx_dqdot1 * radius_a * c1 * s2 - dndoty_dqdot1 * radius_b * (- c0 * c2 + s0 * s1 * s2) + dndotz_dqdot1 * radius_c * (c0 * s1 * s2 + c2 * s0);
218+ // S_32 = c1 * s1 * (radius_a - radius_b * s0 * s0 - radius_c * c0 * c0);
219+ S_32 = dndotx_dqdot1 * radius_a * s1 - dndoty_dqdot1 * radius_b * c1 * s0 + dndotz_dqdot1 * radius_c * c0 * c1;
208220
209221 data.S .matrix () << S_11, S_12, Scalar (0 ),
210222 S_21, S_22, Scalar (0 ),
@@ -315,28 +327,50 @@ namespace pinocchio
315327 Scalar c2, s2;
316328 SINCOS (data.joint_q (2 ), &s2, &c2);
317329
318- // Common operations
330+ // common operations
319331 Scalar c1c2, c1s2;
320332 c1c2 = c1 * c2;
321333 c1s2 = c1 * s2;
322334
323335 data.M .rotation () << c1c2, -c1s2, s1,
324- c0 * s2 + c2 * s0 * s1, c0 * c2 - s0 * s1 * s2, -c1 * s0,
325- -c0 * c2 * s1 + s0 * s2, c0 * s1 * s2 + c2 * s0, c0 * c1;
336+ c0 * s2 + c2 * s0 * s1, c0 * c2 - s0 * s1 * s2, -c1 * s0,
337+ -c0 * c2 * s1 + s0 * s2, c0 * s1 * s2 + c2 * s0, c0 * c1;
326338
327339 Scalar nx, ny, nz;
328340 nx = s1;
329341 ny = -s0 * c1;
330342 nz = c0 * c1;
331343
332- data.M .translation () << Scalar (0.01 ) * nx, radius_b * ny, radius_c * nz;
344+ data.M .translation () << radius_a * nx, radius_b * ny, radius_c * nz;
345+
346+ Scalar dndotx_dqdot1, dndoty_dqdot0, dndoty_dqdot1, dndotz_dqdot0, dndotz_dqdot1;
347+ dndotx_dqdot1 = c1;
348+ dndoty_dqdot0 = - c0 * c1;
349+ dndoty_dqdot1 = s0 * s1;
350+ dndotz_dqdot0 = - c1 * s0;
351+ dndotz_dqdot1 = - c0 * s1;
333352
334- data.S .matrix () << c1c2, s2, Scalar (0 ),
353+ Scalar S_11, S_21, S_31, S_12, S_22, S_32;
354+ // S_11 = c1 * (-radius_b * c0 * (c0 * s2 + c2 * s0 * s1) - radius_c * s0 * (- c0 * c2 * s1 + s0 * s2));
355+ S_11 = dndoty_dqdot0 * radius_b * (c0 *s2 + c2 * s0 * s1) + dndotz_dqdot0 * radius_c * (- c0 * c2 * s1 + s0 * s2);
356+ // S_21 = c1 * (radius_b * c0 * (- c0 * c2 + s0 * s1 * s2) - radius_c * s0 * (c0 * s1 * s2 + c2 * s0));
357+ S_21 = - dndoty_dqdot0 * radius_b * (- c0 * c2 + s0 * s1 * s2) + dndotz_dqdot0 * radius_c * (c0 * s1 * s2 + c2 * s0);
358+ // S_31 = c0 * c1 * c1 * s0 * (radius_b - radius_c);
359+ S_31 = c1 * (- dndoty_dqdot0 * radius_b * s0 + dndotz_dqdot0 * radius_c * c0);
360+
361+ // S_12 = radius_a * c1c2 * c1 + radius_b * s0 * s1 * (c0 * s2 + c2 * s0 * s1) - radius_c * c0 * s1 * (- c0 * c2 * s1 + s0 * s2);
362+ S_12 = dndotx_dqdot1 * radius_a * c1 * c2 + dndoty_dqdot1 * radius_b * (c0 * s2 + c2 * s0 * s1) + dndotz_dqdot1 * radius_c * (- c0 * c2 * s1 + s0 * s2);
363+ // S_22 = - radius_a * c1s2 * c1 - radius_b * s0 * s1 * (- c0 * c2 + s0 * s1 * s2) - radius_c * c0 * s1 * (c0 * s1 * s2 + c2 * s0);
364+ S_22 = - dndotx_dqdot1 * radius_a * c1 * s2 - dndoty_dqdot1 * radius_b * (- c0 * c2 + s0 * s1 * s2) + dndotz_dqdot1 * radius_c * (c0 * s1 * s2 + c2 * s0);
365+ // S_32 = c1 * s1 * (radius_a - radius_b * s0 * s0 - radius_c * c0 * c0);
366+ S_32 = dndotx_dqdot1 * radius_a * s1 - dndoty_dqdot1 * radius_b * c1 * s0 + dndotz_dqdot1 * radius_c * c0 * c1;
367+
368+ data.S .matrix () << S_11, S_12, Scalar (0 ),
369+ S_21, S_22, Scalar (0 ),
370+ S_31, S_32, Scalar (0 ),
371+ c1c2, s2, Scalar (0 ),
335372 -c1s2, c2, Scalar (0 ),
336- s1, Scalar (0 ), Scalar (1 ),
337- c1 * (-radius_b * s0 * s1 + radius_c * c0 * c1 * s2), c1 * (radius_a - radius_c * c0 * c2), -radius_b * c1 * s0,
338- -radius_a * s1 * s1 - radius_b * c0 * c1 + radius_c * c0 * c1 * c1 * c2, radius_b * s0 * s1 + radius_c * c0 * c1 * s2, radius_a * s1,
339- c1 * (radius_a * s1 * s2 + radius_b * c1 * c2 * s0 - radius_c * s0), radius_a * c2 * s1 + radius_b * c1 * s0 * s2 + radius_c * c0 * s1, Scalar (0 );
373+ s1, Scalar (0 ), Scalar (1 );
340374
341375 // Velocity part
342376 data.joint_v = vs.template segment <NV>(idx_v ());
0 commit comments