10 #include <yarp/os/Time.h> 11 #include <yarp/os/ResourceFinder.h> 12 #include <yarp/sig/all.h> 13 #include <iCub/ctrl/math.h> 22 std::vector<yarp::sig::Vector> combinations;
23 std::vector<yarp::sig::Vector> contacts_o;
24 std::vector<yarp::sig::Vector> normals_o;
27 void vectorFromBottle(Bottle* b, Vector &v)
29 for (
unsigned int i=0; i<b->size(); i++)
30 v[i]=b->get(i).asDouble();
33 void readGrasp(ResourceFinder &rf, Vector ¢er, Vector &dim, std::vector<yarp::sig::Vector> &contacts_r, std::vector<yarp::sig::Vector> &normals_r)
35 Bottle* centerB=rf.find(
"center").asList();
36 vectorFromBottle(centerB,center);
38 Bottle* dimB=rf.find(
"dim").asList();
39 vectorFromBottle(dimB,dim);
41 Bottle* contact1=rf.find(
"contact1").asList();
43 vectorFromBottle(contact1,c1);
45 Bottle* contact2=rf.find(
"contact2").asList();
47 vectorFromBottle(contact2,c2);
49 Bottle* contact3=rf.find(
"contact3").asList();
51 vectorFromBottle(contact3,c3);
53 Bottle* normal1=rf.find(
"normal1").asList();
55 vectorFromBottle(normal1,n1);
57 Bottle* normal2=rf.find(
"normal2").asList();
59 vectorFromBottle(normal2,n2);
61 Bottle* normal3=rf.find(
"normal3").asList();
63 vectorFromBottle(normal3,n3);
65 contacts_r.push_back(c1);
66 contacts_r.push_back(c2);
67 contacts_r.push_back(c3);
69 normals_r.push_back(n1);
70 normals_r.push_back(n2);
71 normals_r.push_back(n3);
74 double evaluateFingers(
const HandIK_Variables &solution,
const int id)
76 yarp::sig::Vector encoders(9,0.0);
77 encoders[0]=solution.joints[3];
78 encoders[1]=solution.joints[0];
79 encoders[2]=solution.joints[1];
80 encoders[3]=solution.joints[2];
81 encoders[4]=solution.joints[4];
82 encoders[5]=solution.joints[5];
83 encoders[6]=solution.joints[6];
84 encoders[7]=solution.joints[7];
86 iCub::iKin::iCubFinger thumb(hand+
"_thumb");
87 iCub::iKin::iCubFinger index(hand+
"_index");
88 iCub::iKin::iCubFinger middle(hand+
"_middle");
90 yarp::sig::Vector joints_thumb;
91 thumb.getChainJoints(encoders,joints_thumb);
92 yarp::sig::Matrix thumbH=thumb.getH(joints_thumb);
93 yarp::sig::Vector thumbH_col3=thumbH.getCol(3);
95 yarp::sig::Vector joints_index;
96 index.getChainJoints(encoders,joints_index);
97 yarp::sig::Matrix indexH=index.getH(joints_index);
98 yarp::sig::Vector indexH_col3=indexH.getCol(3);
100 yarp::sig::Vector joints_middle;
101 middle.getChainJoints(encoders,joints_middle);
102 yarp::sig::Matrix middleH=middle.getH(joints_middle);
103 yarp::sig::Vector middleH_col3=middleH.getCol(3);
105 yarp::sig::Matrix Hc=rpy2dcm(solution.rpy_ee);
106 Hc(0,3)=solution.xyz_ee[0];
107 Hc(1,3)=solution.xyz_ee[1];
108 Hc(2,3)=solution.xyz_ee[2];
111 res+=norm2(contacts_o.at(combinations.at(
id)[0])-(Hc*thumbH_col3));
112 res+=norm2(contacts_o.at(combinations.at(
id)[1])-(Hc*indexH_col3));
113 res+=norm2(contacts_o.at(combinations.at(
id)[2])-(Hc*middleH_col3));
115 printf(
"res %g\n", res);
120 int test(
int argc,
char *argv[])
122 yarp::os::ResourceFinder rf;
124 rf.setDefaultContext(
"handIK");
125 rf.setDefaultConfigFile(
"contactPoints_fitness1.ini");
126 rf.configure(argc,argv);
128 Vector center(3),dim(3);
129 std::vector<yarp::sig::Vector> contacts_r;
130 std::vector<yarp::sig::Vector> normals_r;
132 readGrasp(rf,center,dim,contacts_r,normals_r);
140 Matrix tmp=zeros(4,4);
150 Matrix rotmat=SE3inv(tmp);
152 Vector c1=rotmat*contacts_r.at(0);
153 Vector c2=rotmat*contacts_r.at(1);
154 Vector c3=rotmat*contacts_r.at(2);
156 Vector n1=rotmat.submatrix(0,2,0,2)*normals_r.at(0).subVector(0,2);
159 Vector n2=rotmat.submatrix(0,2,0,2)*normals_r.at(1).subVector(0,2);
162 Vector n3=rotmat.submatrix(0,2,0,2)*normals_r.at(2).subVector(0,2);
165 contacts_o.push_back(c1);
166 contacts_o.push_back(c2);
167 contacts_o.push_back(c3);
169 normals_o.push_back(n1);
170 normals_o.push_back(n2);
171 normals_o.push_back(n3);
173 Vector v1(3); v1[0]=0; v1[1]=1; v1[2]=2;
174 Vector v2(3); v2[0]=0; v2[1]=2; v2[2]=1;
175 Vector v3(3); v3[0]=1; v3[1]=0; v3[2]=2;
176 Vector v4(3); v4[0]=1; v4[1]=2; v4[2]=0;
177 Vector v5(3); v5[0]=2; v5[1]=1; v5[2]=0;
178 Vector v6(3); v6[0]=2; v6[1]=0; v6[2]=1;
179 combinations.push_back(v1);
180 combinations.push_back(v2);
181 combinations.push_back(v3);
182 combinations.push_back(v4);
183 combinations.push_back(v5);
184 combinations.push_back(v6);
186 HandIK_Variables bestSolution;
187 double bestObjValue=10000;
190 for (
unsigned int i=0; i<combinations.size(); i++)
193 HandIK_Problem problem(hand,3);
195 problem.dimensions[0]=dim[1];
196 problem.dimensions[1]=dim[0];
197 problem.dimensions[2]=dim[2];
199 problem.contactPoints.push_back(contacts_o.at(combinations.at(i)[0]));
200 problem.contactPoints.push_back(contacts_o.at(combinations.at(i)[1]));
201 problem.contactPoints.push_back(contacts_o.at(combinations.at(i)[2]));
203 problem.normalDirs.push_back(normals_o.at(combinations.at(i)[0]));
204 problem.normalDirs.push_back(normals_o.at(combinations.at(i)[1]));
205 problem.normalDirs.push_back(normals_o.at(combinations.at(i)[2]));
207 HandIK_Solver solver(problem);
210 HandIK_Variables guess(problem.nFingers);
219 guess.rpy_ee[0]=-M_PI;
221 guess.rpy_ee[2]=M_PI/2.0;
227 guess.rpy_ee[2]=M_PI;
230 solver.setInitialGuess(guess);
234 HandIK_Variables solution;
235 double t0=Time::now();
236 bool found=solver.solve(solution);
237 double t1=Time::now();
240 printf(
"#### %d solution found in %g [s] ...\n", i, t1-t0);
242 double objFunc=solution.cost_fun;
243 printf(
"Cost %g\n", objFunc);
244 objFunc+=evaluateFingers(solution,i);
245 printf(
"Global cost %g\n", objFunc);
246 if (objFunc<bestObjValue)
248 bestObjValue=objFunc;
250 bestSolution=solution;
259 printf(
"\n\nWinner index %d\n", index);
260 bestSolution.print();
261 printf(
"axis-angle_ee = (%s) [rad]\n",dcm2axis(rpy2dcm(bestSolution.rpy_ee)).toString(3,3).c_str());
263 Vector joints=bestSolution.joints;
265 Vector ee=bestSolution.xyz_ee;
268 ee=ee.subVector(0,2);
270 Matrix r=rpy2dcm(bestSolution.rpy_ee);
271 Vector axsangle=dcm2axis(tmp*r);
273 std::string filename=
"C:/Users/Utente/Desktop/IKresult.txt";
275 file.open(filename.c_str());
278 for (
unsigned int i=0; i<joints.size(); i++)
279 file << joints[i] <<
" ";
282 file <<
"ee=[" << ee[0] <<
" " << ee[1] <<
" " << ee[2] <<
"];\n";
283 file <<
"axisangle=[" << axsangle[0] <<
" " << axsangle[1] <<
" " << axsangle[2] <<
" " << axsangle[3] <<
"];\n";
284 file <<
"center=[" << center[0] <<
" " << center[1] <<
" " << center[2] <<
"];\n";
285 file <<
"dim=[" << dim[0] <<
" " << dim[1] <<
" " << dim[2] <<
"];\n";
286 file <<
"c1=[" << contacts_r.at(combinations.at(index)[0])[0] <<
" " << contacts_r.at(combinations.at(index)[0])[1] <<
" " << contacts_r.at(combinations.at(index)[0])[2] <<
"];\n";
287 file <<
"c2=[" << contacts_r.at(combinations.at(index)[1])[0] <<
" " << contacts_r.at(combinations.at(index)[1])[1] <<
" " << contacts_r.at(combinations.at(index)[1])[2] <<
"];\n";
288 file <<
"c3=[" << contacts_r.at(combinations.at(index)[2])[0] <<
" " << contacts_r.at(combinations.at(index)[2])[1] <<
" " << contacts_r.at(combinations.at(index)[2])[2] <<
"];\n";
289 file <<
"n1=[" << normals_r.at(combinations.at(index)[0])[0] <<
" " << normals_r.at(combinations.at(index)[0])[1] <<
" " << normals_r.at(combinations.at(index)[0])[2] <<
"];\n";
290 file <<
"n2=[" << normals_r.at(combinations.at(index)[1])[0] <<
" " << normals_r.at(combinations.at(index)[1])[1] <<
" " << normals_r.at(combinations.at(index)[1])[2] <<
"];\n";
291 file <<
"n3=[" << normals_r.at(combinations.at(index)[2])[0] <<
" " << normals_r.at(combinations.at(index)[2])[1] <<
" " << normals_r.at(combinations.at(index)[2])[2] <<
"];\n";