242 const bool &verbose)
const
246 for (
unsigned int i = 0; i < 8; i++)
249 double c1[8] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
250 double s1[8] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
251 double c3[8] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
252 double s3[8] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
253 double c23[8] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
254 double s23[8] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
255 double c4[8] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
256 double s4[8] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
257 double c5[8] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
258 double s5[8] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
259 double c6[8] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
260 double s6[8] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
267 for (
unsigned int i = 0; i < 8; i++)
270 double px = fMw[0][3];
271 double py = fMw[1][3];
272 double pz = fMw[2][3];
275 double a_2 = px * px + py * py;
277 if (std::fabs(a_2) <= std::numeric_limits<double>::epsilon()) {
280 c1[4] = cos(q[0] + M_PI);
281 s1[4] = sin(q[0] + M_PI);
284 double a = sqrt(a_2);
292 for (
unsigned int i = 0; i < 8; i += 4) {
293 q_sol[i][0] = atan2(s1[i], c1[i]);
294 if (convertJointPositionInLimits(0, q_sol[i][0], q1_mod, verbose) ==
true) {
295 q_sol[i][0] = q1_mod;
296 for (
unsigned int j = 1; j < 4; j++) {
299 q_sol[i + j][0] = q_sol[i][0];
303 for (
unsigned int j = 1; j < 4; j++)
310 for (
unsigned int i = 0; i < 8; i += 4) {
313 2 * (
a1 * c1[i] * px +
a1 * s1[i] * py +
d1 * pz)) /
315 double d4_a3_K =
d4 *
d4 +
a3 *
a3 - K * K;
317 q_sol[i][2] = atan2(
a3,
d4) + atan2(K, sqrt(d4_a3_K));
318 q_sol[i + 2][2] = atan2(
a3,
d4) + atan2(K, -sqrt(d4_a3_K));
320 for (
unsigned int j = 0; j < 4; j += 2) {
322 for (
unsigned int k = 0; k < 2; k++)
323 ok[i + j + k] =
false;
326 if (convertJointPositionInLimits(2, q_sol[i + j][2], q3_mod, verbose) ==
true) {
327 for (
unsigned int k = 0; k < 2; k++) {
328 q_sol[i + j + k][2] = q3_mod;
329 c3[i + j + k] = cos(q3_mod);
330 s3[i + j + k] = sin(q3_mod);
334 for (
unsigned int k = 0; k < 2; k++)
335 ok[i + j + k] =
false;
347 double q23[8], q2_mod;
348 for (
unsigned int i = 0; i < 8; i += 2) {
351 c23[i] = (-(
a3 -
a2 * c3[i]) * (c1[i] * px + s1[i] * py -
a1) - (
d1 - pz) * (
d4 +
a2 * s3[i])) /
352 ((c1[i] * px + s1[i] * py -
a1) * (c1[i] * px + s1[i] * py -
a1) + (
d1 - pz) * (
d1 - pz));
353 s23[i] = ((
d4 +
a2 * s3[i]) * (c1[i] * px + s1[i] * py -
a1) - (
d1 - pz) * (
a3 -
a2 * c3[i])) /
354 ((c1[i] * px + s1[i] * py -
a1) * (c1[i] * px + s1[i] * py -
a1) + (
d1 - pz) * (
d1 - pz));
355 q23[i] = atan2(s23[i], c23[i]);
359 q_sol[i][1] = q23[i] - q_sol[i][2];
361 if (convertJointPositionInLimits(1, q_sol[i][1], q2_mod, verbose) ==
true) {
362 for (
unsigned int j = 0; j < 2; j++) {
363 q_sol[i + j][1] = q2_mod;
369 for (
unsigned int j = 0; j < 2; j++)
380 double r13 = fMw[0][2];
381 double r23 = fMw[1][2];
382 double r33 = fMw[2][2];
383 double s4s5, c4s5, q4_mod, q5_mod;
384 for (
unsigned int i = 0; i < 8; i += 2) {
386 s4s5 = -s1[i] * r13 + c1[i] * r23;
387 c4s5 = c1[i] * c23[i] * r13 + s1[i] * c23[i] * r23 - s23[i] * r33;
390 c5[i] = c1[i] * s23[i] * r13 + s1[i] * s23[i] * r23 + c23[i] * r33;
397 if (convertJointPositionInLimits(4, q_sol[i][4], q5_mod, verbose) ==
true) {
398 for (
unsigned int j = 0; j < 2; j++) {
399 q_sol[i + j][3] = q[3];
400 q_sol[i + j][4] = q5_mod;
401 c4[i] = cos(q_sol[i + j][3]);
402 s4[i] = sin(q_sol[i + j][3]);
406 for (
unsigned int j = 0; j < 2; j++)
414 if (std::fabs(c4s5) <= std::numeric_limits<double>::epsilon()) {
418 q_sol[i][3] = atan2(s4s5, c4s5);
421 q_sol[i][3] = atan2(s4s5, c4s5);
424 q_sol[i][3] = atan2(s4s5, c4s5);
426 if (convertJointPositionInLimits(3, q_sol[i][3], q4_mod, verbose) ==
true) {
427 q_sol[i][3] = q4_mod;
434 if (q_sol[i][3] > 0.)
435 q_sol[i + 1][3] = q_sol[i][3] + M_PI;
437 q_sol[i + 1][3] = q_sol[i][3] - M_PI;
438 if (convertJointPositionInLimits(3, q_sol[i + 1][3], q4_mod, verbose) ==
true) {
439 q_sol[i + 1][3] = q4_mod;
440 c4[i + 1] = cos(q4_mod);
441 s4[i + 1] = sin(q4_mod);
448 for (
unsigned int j = 0; j < 2; j++) {
449 if (ok[i + j] ==
true) {
450 c5[i + j] = c1[i + j] * s23[i + j] * r13 + s1[i + j] * s23[i + j] * r23 + c23[i + j] * r33;
451 s5[i + j] = (c1[i + j] * c23[i + j] * c4[i + j] - s1[i + j] * s4[i + j]) * r13 +
452 (s1[i + j] * c23[i + j] * c4[i + j] + c1[i + j] * s4[i + j]) * r23 -
453 s23[i + j] * c4[i + j] * r33;
455 q_sol[i + j][4] = atan2(s5[i + j], c5[i + j]);
456 if (convertJointPositionInLimits(4, q_sol[i + j][4], q5_mod, verbose) ==
true) {
457 q_sol[i + j][4] = q5_mod;
471 double r12 = fMw[0][1];
472 double r22 = fMw[1][1];
473 double r32 = fMw[2][1];
475 for (
unsigned int i = 0; i < 8; i++) {
476 c6[i] = -(c1[i] * c23[i] * s4[i] + s1[i] * c4[i]) * r12 + (c1[i] * c4[i] - s1[i] * c23[i] * s4[i]) * r22 +
477 s23[i] * s4[i] * r32;
478 s6[i] = -(c1[i] * c23[i] * c4[i] * c5[i] - c1[i] * s23[i] * s5[i] - s1[i] * s4[i] * c5[i]) * r12 -
479 (s1[i] * c23[i] * c4[i] * c5[i] - s1[i] * s23[i] * s5[i] + c1[i] * s4[i] * c5[i]) * r22 +
480 (c23[i] * s5[i] + s23[i] * c4[i] * c5[i]) * r32;
482 q_sol[i][5] = atan2(s6[i], c6[i]);
483 if (convertJointPositionInLimits(5, q_sol[i][5], q6_mod, verbose) ==
true) {
484 q_sol[i][5] = q6_mod;
492 unsigned int nbsol = 0;
493 unsigned int sol = 0;
495 for (
unsigned int i = 0; i < 8; i++) {
502 weight[1] = weight[2] = 4;
504 for (
unsigned int j = 0; j < 6; j++) {
505 double rought_dist = q[j] - q_sol[i][j];
506 double modulo_dist = rought_dist;
507 if (rought_dist > 0) {
508 if (fabs(rought_dist - 2 * M_PI) < fabs(rought_dist))
509 modulo_dist = rought_dist - 2 * M_PI;
512 if (fabs(rought_dist + 2 * M_PI) < fabs(rought_dist))
513 modulo_dist = rought_dist + 2 * M_PI;
523 for (
unsigned int i = 0; i < 8; i++) {
525 if (dist[i] < dist[sol])