10 const double ZERO_THRESH = 0.00000001;
12 return (x > 0) - (x < 0);
18 const double d1 = 0.1807;
19 const double a2 = -0.4784;
20 const double a3 = -0.36;
21 const double d4 = 0.17415;
22 const double d5 = 0.11985;
23 const double d6 = 0.11655;
28 const double d1 = 0.1273;
29 const double a2 = -0.612;
30 const double a3 = -0.5723;
31 const double d4 = 0.163941;
32 const double d5 = 0.1157;
33 const double d6 = 0.0922;
38 const double d1 = 0.1807;
39 const double a2 = -0.6127;
40 const double a3 = -0.57155;
41 const double d4 = 0.17415;
42 const double d5 = 0.11985;
43 const double d6 = 0.11655;
48 const double d1 = 0.089159;
49 const double a2 = -0.42500;
50 const double a3 = -0.39225;
51 const double d4 = 0.10915;
52 const double d5 = 0.09465;
53 const double d6 = 0.0823;
58 const double d1 = 0.1625;
59 const double a2 = -0.425;
60 const double a3 = -0.3922;
61 const double d4 = 0.1333;
62 const double d5 = 0.0997;
63 const double d6 = 0.0996;
68 const double d1 = 0.1519;
69 const double a2 = -0.24365;
70 const double a3 = -0.21325;
71 const double d4 = 0.11235;
72 const double d5 = 0.08535;
73 const double d6 = 0.0819;
78 const double d1 = 0.15185;
79 const double a2 = -0.24355;
80 const double a3 = -0.2132;
81 const double d4 = 0.13105;
82 const double d5 = 0.08535;
83 const double d6 = 0.0921;
87 void forward(
const double* q,
double* T) {
88 double s1 =
sin(*q), c1 =
cos(*q); q++;
89 double q23 = *q, q234 = *q, s2 =
sin(*q), c2 =
cos(*q); q++;
90 double s3 =
sin(*q), c3 =
cos(*q); q23 += *q; q234 += *q; q++;
91 double s4 =
sin(*q), c4 =
cos(*q); q234 += *q; q++;
92 double s5 =
sin(*q), c5 =
cos(*q); q++;
93 double s6 =
sin(*q), c6 =
cos(*q);
94 double s23 =
sin(q23), c23 =
cos(q23);
95 double s234 =
sin(q234), c234 =
cos(q234);
96 *T = c234*c1*s5 - c5*s1; T++;
97 *T = c6*(s1*s5 + c234*c1*c5) - s234*c1*s6; T++;
98 *T = -s6*(s1*s5 + c234*c1*c5) - s234*c1*c6; T++;
99 *T =
d6*c234*c1*s5 - a3*c23*c1 - a2*c1*c2 -
d6*c5*s1 - d5*s234*c1 - d4*s1; T++;
100 *T = c1*c5 + c234*s1*s5; T++;
101 *T = -c6*(c1*s5 - c234*c5*s1) - s234*s1*s6; T++;
102 *T = s6*(c1*s5 - c234*c5*s1) - s234*c6*s1; T++;
103 *T =
d6*(c1*c5 + c234*s1*s5) + d4*c1 - a3*c23*s1 - a2*c2*s1 - d5*s234*s1; T++;
105 *T = -c234*s6 - s234*c5*c6; T++;
106 *T = s234*c5*s6 - c234*c6; T++;
107 *T = d1 + a3*s23 + a2*s2 - d5*(c23*c4 - s23*s4) -
d6*s5*(c23*s4 + s23*c4); T++;
108 *T = 0.0; T++; *T = 0.0; T++; *T = 0.0; T++; *T = 1.0;
111 void forward_all(
const double* q,
double* T1,
double* T2,
double* T3,
112 double* T4,
double* T5,
double* T6) {
113 double s1 =
sin(*q), c1 =
cos(*q); q++;
114 double q23 = *q, q234 = *q, s2 =
sin(*q), c2 =
cos(*q); q++;
115 double s3 =
sin(*q), c3 =
cos(*q); q23 += *q; q234 += *q; q++;
117 double s5 =
sin(*q), c5 =
cos(*q); q++;
118 double s6 =
sin(*q), c6 =
cos(*q);
119 double s23 =
sin(q23), c23 =
cos(q23);
120 double s234 =
sin(q234), c234 =
cos(q234);
153 *T2 = d1 + a2*s2; T2++;
164 *T3 =c1*(a3*c23 + a2*c2); T3++;
168 *T3 =s1*(a3*c23 + a2*c2); T3++;
172 *T3 = d1 + a3*s23 + a2*s2; T3++;
183 *T4 =c1*(a3*c23 + a2*c2) + d4*s1; T4++;
187 *T4 =s1*(a3*c23 + a2*c2) - d4*c1; T4++;
191 *T4 = d1 + a3*s23 + a2*s2; T4++;
199 *T5 = s1*s5 + c234*c1*c5; T5++;
200 *T5 = -s234*c1; T5++;
201 *T5 = c5*s1 - c234*c1*s5; T5++;
202 *T5 =c1*(a3*c23 + a2*c2) + d4*s1 + d5*s234*c1; T5++;
203 *T5 = c234*c5*s1 - c1*s5; T5++;
204 *T5 = -s234*s1; T5++;
205 *T5 = - c1*c5 - c234*s1*s5; T5++;
206 *T5 =s1*(a3*c23 + a2*c2) - d4*c1 + d5*s234*s1; T5++;
209 *T5 = -s234*s5; T5++;
210 *T5 = d1 + a3*s23 + a2*s2 - d5*c234; T5++;
218 *T6 = c6*(s1*s5 + c234*c1*c5) - s234*c1*s6; T6++;
219 *T6 = - s6*(s1*s5 + c234*c1*c5) - s234*c1*c6; T6++;
220 *T6 = c5*s1 - c234*c1*s5; T6++;
221 *T6 =
d6*(c5*s1 - c234*c1*s5) + c1*(a3*c23 + a2*c2) + d4*s1 + d5*s234*c1; T6++;
222 *T6 = - c6*(c1*s5 - c234*c5*s1) - s234*s1*s6; T6++;
223 *T6 = s6*(c1*s5 - c234*c5*s1) - s234*c6*s1; T6++;
224 *T6 = - c1*c5 - c234*s1*s5; T6++;
225 *T6 =s1*(a3*c23 + a2*c2) - d4*c1 -
d6*(c1*c5 + c234*s1*s5) + d5*s234*s1; T6++;
226 *T6 = c234*s6 + s234*c5*c6; T6++;
227 *T6 = c234*c6 - s234*c5*s6; T6++;
228 *T6 = -s234*s5; T6++;
229 *T6 = d1 + a3*s23 + a2*s2 - d5*c234 -
d6*s234*s5; T6++;
237 int inverse(
const double* T,
double* q_sols,
double q6_des) {
239 double T02 = -*T; T++;
double T00 = *T; T++;
double T01 = *T; T++;
double T03 = -*T; T++;
240 double T12 = -*T; T++;
double T10 = *T; T++;
double T11 = *T; T++;
double T13 = -*T; T++;
241 double T22 = *T; T++;
double T20 = -*T; T++;
double T21 = -*T; T++;
double T23 = *T;
246 double A =
d6*T12 - T13;
247 double B =
d6*T02 - T03;
248 double R = A*A + B*B;
249 if(fabs(A) < ZERO_THRESH) {
251 if(fabs(fabs(d4) - fabs(B)) < ZERO_THRESH)
255 double arcsin =
asin(div);
256 if(fabs(arcsin) < ZERO_THRESH)
259 q1[0] = arcsin + 2.0*
PI;
264 else if(fabs(B) < ZERO_THRESH) {
266 if(fabs(fabs(d4) - fabs(A)) < ZERO_THRESH)
270 double arccos =
acos(div);
272 q1[1] = 2.0*
PI - arccos;
278 double arccos =
acos(d4 /
sqrt(R)) ;
279 double arctan =
atan2(-B, A);
280 double pos = arccos + arctan;
281 double neg = -arccos + arctan;
282 if(fabs(pos) < ZERO_THRESH)
284 if(fabs(neg) < ZERO_THRESH)
289 q1[0] = 2.0*
PI + pos;
293 q1[1] = 2.0*
PI + neg;
301 for(
int i=0;i<2;i++) {
302 double numer = (T03*
sin(q1[i]) - T13*
cos(q1[i])-d4);
304 if(fabs(fabs(numer) - fabs(
d6)) < ZERO_THRESH)
308 double arccos =
acos(div);
310 q5[i][1] = 2.0*
PI - arccos;
316 for(
int i=0;i<2;i++) {
317 for(
int j=0;j<2;j++) {
318 double c1 =
cos(q1[i]), s1 =
sin(q1[i]);
319 double c5 =
cos(q5[i][j]), s5 =
sin(q5[i][j]);
322 if(fabs(s5) < ZERO_THRESH)
326 SIGN(s5)*(T00*s1 - T10*c1));
327 if(fabs(q6) < ZERO_THRESH)
334 double q2[2], q3[2], q4[2];
336 double c6 =
cos(q6), s6 =
sin(q6);
337 double x04x = -s5*(T02*c1 + T12*s1) - c5*(s6*(T01*c1 + T11*s1) - c6*(T00*c1 + T10*s1));
338 double x04y = c5*(T20*c6 - T21*s6) - T22*s5;
339 double p13x = d5*(s6*(T00*c1 + T10*s1) + c6*(T01*c1 + T11*s1)) -
d6*(T02*c1 + T12*s1) +
341 double p13y = T23 - d1 -
d6*T22 + d5*(T21*c6 + T20*s6);
343 double c3 = (p13x*p13x + p13y*p13y - a2*a2 - a3*a3) / (2.0*a2*a3);
344 if(fabs(fabs(c3) - 1.0) < ZERO_THRESH)
346 else if(fabs(c3) > 1.0) {
350 double arccos =
acos(c3);
352 q3[1] = 2.0*
PI - arccos;
353 double denom = a2*a2 + a3*a3 + 2*a2*a3*c3;
354 double s3 =
sin(arccos);
355 double A = (a2 + a3*c3), B = a3*s3;
356 q2[0] =
atan2((A*p13y - B*p13x) / denom, (A*p13x + B*p13y) / denom);
357 q2[1] =
atan2((A*p13y + B*p13x) / denom, (A*p13x - B*p13y) / denom);
358 double c23_0 =
cos(q2[0]+q3[0]);
359 double s23_0 =
sin(q2[0]+q3[0]);
360 double c23_1 =
cos(q2[1]+q3[1]);
361 double s23_1 =
sin(q2[1]+q3[1]);
362 q4[0] =
atan2(c23_0*x04y - s23_0*x04x, x04x*c23_0 + x04y*s23_0);
363 q4[1] =
atan2(c23_1*x04y - s23_1*x04x, x04x*c23_1 + x04y*s23_1);
365 for(
int k=0;k<2;k++) {
366 if(fabs(q2[k]) < ZERO_THRESH)
368 else if(q2[k] < 0.0) q2[k] += 2.0*
PI;
369 if(fabs(q4[k]) < ZERO_THRESH)
371 else if(q4[k] < 0.0) q4[k] += 2.0*
PI;
372 q_sols[num_sols*6+0] = q1[i]; q_sols[num_sols*6+1] = q2[k];
373 q_sols[num_sols*6+2] = q3[k]; q_sols[num_sols*6+3] = q4[k];
374 q_sols[num_sols*6+4] = q5[i][j]; q_sols[num_sols*6+5] = q6;
386 #define IKFAST_HAS_LIBRARY 391 #define IKFAST_COMPILE_ASSERT(x) extern int __dummy[(int)x] 394 #ifdef IKFAST_NAMESPACE 395 namespace IKFAST_NAMESPACE {
398 void to_mat44(
double * mat4_4,
const IkReal* eetrans,
const IkReal* eerot)
400 for(
int i=0; i< 3;++i){
401 mat4_4[i*4+0] = eerot[i*3+0];
402 mat4_4[i*4+1] = eerot[i*3+1];
403 mat4_4[i*4+2] = eerot[i*3+2];
404 mat4_4[i*4+3] = eetrans[i];
412 void from_mat44(
const double * mat4_4, IkReal* eetrans, IkReal* eerot)
414 for(
int i=0; i< 3;++i){
415 eerot[i*3+0] = mat4_4[i*4+0];
416 eerot[i*3+1] = mat4_4[i*4+1];
417 eerot[i*3+2] = mat4_4[i*4+2];
418 eetrans[i] = mat4_4[i*4+3];
424 if(!pfree)
return false;
434 std::vector<int> vfree(0);
436 for (
int i=0; i < num_sols; ++i){
437 std::vector<IkSingleDOFSolutionBase<IkReal> > vinfos(n);
438 for (
int j=0; j < n; ++j) vinfos[j].foffset = q_sols[i*n+j];
444 IKFAST_API
void ComputeFk(
const IkReal* j, IkReal* eetrans, IkReal* eerot)
457 #ifdef IKFAST_NAMESPACE 461 #ifndef IKFAST_NO_MAIN 466 int main(
int argc,
char* argv[])
468 double q[6] = {0.0, 0.0, 1.0, 0.0, 1.0, 0.0};
469 double* T =
new double[16];
471 for(
int i=0;i<4;i++) {
472 for(
int j=i*4;j<(i+1)*4;j++)
473 printf(
"%1.3f ", T[j]);
479 for(
int i=0;i<num_sols;i++)
480 printf(
"%1.6f %1.6f %1.6f %1.6f %1.6f %1.6f\n",
481 q_sols[i*6+0], q_sols[i*6+1], q_sols[i*6+2], q_sols[i*6+3], q_sols[i*6+4], q_sols[i*6+5]);
482 for(
int i=0;i<=4;i++)
483 printf(
"%f ",
PI/2.0*i);
IKFAST_API int * GetFreeParameters()
double SIGN(double a, double b)
int main(int argc, char *argv[])
void to_mat44(double *mat4_4, const IkReal *eetrans, const IkReal *eerot)
IKFAST_API void ComputeFk(const IkReal *j, IkReal *eetrans, IkReal *eerot)
virtual size_t AddSolution(const std::vector< IkSingleDOFSolutionBase< T > > &vinfos, const std::vector< int > &vfree)=0
IKFAST_API bool ComputeIk(const IkReal *eetrans, const IkReal *eerot, const IkReal *pfree, IkSolutionListBase< IkReal > &solutions)
int inverse(const double *T, double *q_sols, double q6_des=0.0)
INLINE Rall1d< T, V, S > asin(const Rall1d< T, V, S > &x)
void from_mat44(const double *mat4_4, IkReal *eetrans, IkReal *eerot)
IKFAST_API int GetNumJoints()
void forward_all(const double *q, double *T1, double *T2, double *T3, double *T4, double *T5, double *T6)
INLINE Rall1d< T, V, S > sqrt(const Rall1d< T, V, S > &arg)
INLINE Rall1d< T, V, S > acos(const Rall1d< T, V, S > &x)
IKFAST_API int GetNumFreeParameters()
IKFAST_API int GetIkRealSize()
INLINE Rall1d< T, V, S > atan2(const Rall1d< T, V, S > &y, const Rall1d< T, V, S > &x)
#define IKFAST_COMPILE_ASSERT(x)
#define IKFAST_VERSION
Header file for all ikfast c++ files/shared objects.
INLINE Rall1d< T, V, S > cos(const Rall1d< T, V, S > &arg)
void forward(const double *q, double *T)
manages all the solutions
INLINE Rall1d< T, V, S > sin(const Rall1d< T, V, S > &arg)