23 #include <robottestingframework/TestAssert.h>
24 #include <robottestingframework/dll/Plugin.h>
25 #include "iKiniDynConsistencyTest.h"
28 #include <yarp/math/api.h>
29 #include <yarp/math/Math.h>
30 #include <yarp/os/Random.h>
31 #include <yarp/os/Time.h>
34 #include <iCub/iKin/iKinFwd.h>
37 #include <iCub/iDyn/iDyn.h>
38 #include <iCub/iDyn/iDynBody.h>
41 using namespace robottestingframework;
42 using namespace yarp::os;
43 using namespace yarp::sig;
44 using namespace yarp::math;
45 using namespace iCub::iKin;
46 using namespace iCub::iDyn;
50 void set_random_vector(yarp::sig::Vector & vec, yarp::os::Random & rng,
double coeff=0.0)
52 for(
int i=0; i < (int)vec.size(); i++ ) {
53 vec[i] = coeff*M_PI*rng.uniform();
59 ROBOTTESTINGFRAMEWORK_PREPARE_PLUGIN(iKiniDynConsistencyTest)
61 iKiniDynConsistencyTest::iKiniDynConsistencyTest() : TestCase(
"iKiniDynConsistencyTest") {
64 void iKiniDynConsistencyTest::check_matrix_are_equal(
const yarp::sig::Matrix & mat1,
65 const yarp::sig::Matrix & mat2,
68 ROBOTTESTINGFRAMEWORK_TEST_REPORT(Asserter::format(
"Comparing mat1: \n %s \n",mat1.toString().c_str()));
69 ROBOTTESTINGFRAMEWORK_TEST_REPORT(Asserter::format(
"with mat2: \n %s \n",mat2.toString().c_str()));
70 ROBOTTESTINGFRAMEWORK_TEST_FAIL_IF_FALSE(mat1.rows()==mat2.rows(),
"matrix rows do not match");
71 ROBOTTESTINGFRAMEWORK_TEST_FAIL_IF_FALSE(mat1.cols()==mat2.cols(),
"matrix cols do not match");
72 for(
int row=0; row < mat1.rows(); row++ )
74 for(
int col=0; col < mat1.cols(); col++ )
76 ROBOTTESTINGFRAMEWORK_TEST_FAIL_IF_FALSE(std::fabs(mat1(row,col)-mat2(row,col)) < tol,
77 Asserter::format(
"Element %d %d don't match",row,col));
84 iKiniDynConsistencyTest::~iKiniDynConsistencyTest() { }
86 bool iKiniDynConsistencyTest::setup(
int argc,
char** argv) {
91 void iKiniDynConsistencyTest::tearDown() {
96 Matrix iKiniDynConsistencyTest::getiKinTransform(
const string part,
int index)
98 if( part ==
"left_leg" )
100 return ikin_lleg.getH(index);
102 if( part ==
"right_leg" )
104 return ikin_rleg.getH(index);
106 if( part ==
"left_arm" )
108 return ikin_larm.getH(index);
110 if( part ==
"right_arm" )
112 return ikin_rarm.getH(index);
117 Matrix iKiniDynConsistencyTest::getiDynTransform(
const string part,
int index)
119 if( part ==
"left_leg" )
121 return icub->lowerTorso->HLeft*
122 icub->lowerTorso->left->getH();
124 if( part ==
"right_leg" )
126 return icub->lowerTorso->HRight*
127 icub->lowerTorso->right->getH();
129 if( part ==
"left_arm" )
133 if( part ==
"right_arm" )
140 void iKiniDynConsistencyTest::run() {
142 ROBOTTESTINGFRAMEWORK_TEST_REPORT(
"Creating iCubWholeBody object");
144 ver.head_version = 1;
145 ver.legs_version = 1;
146 ROBOTTESTINGFRAMEWORK_TEST_REPORT(Asserter::format(
"Creating iCubWholeBody object with head version %d and legs version %d", ver.head_version, ver.legs_version));
147 icub =
new iCubWholeBody(ver);
151 q_head.resize(icub->upperTorso->getNLinks(
"head"));
152 q_larm.resize(icub->upperTorso->getNLinks(
"left_arm"));
153 q_rarm.resize(icub->upperTorso->getNLinks(
"right_arm"));
154 q_torso.resize(icub->lowerTorso->getNLinks(
"torso"));
155 q_lleg.resize(icub->lowerTorso->getNLinks(
"left_leg"));
156 q_rleg.resize(icub->lowerTorso->getNLinks(
"right_leg"));
160 yarp::os::Random rng;
163 set_random_vector(q_head,rng,coeff);
164 set_random_vector(q_larm,rng,coeff);
165 set_random_vector(q_rarm,rng,coeff);
166 set_random_vector(q_torso,rng,coeff);
167 set_random_vector(q_lleg,rng,coeff);
168 set_random_vector(q_rleg,rng,coeff);
172 ROBOTTESTINGFRAMEWORK_TEST_REPORT(
"Setting positions in iCubWholeBody");
173 q_head = icub->upperTorso->setAng(
"head",q_head);
174 q_rarm = icub->upperTorso->setAng(
"right_arm",q_rarm);
175 q_larm = icub->upperTorso->setAng(
"left_arm",q_larm);
176 q_torso = icub->lowerTorso->setAng(
"torso",q_torso);
177 q_rleg = icub->lowerTorso->setAng(
"right_leg",q_rleg);
178 q_lleg = icub->lowerTorso->setAng(
"left_leg",q_lleg);
180 yarp::sig::Matrix transform_ikin(4,4), transform_idyn(4,4);
183 ROBOTTESTINGFRAMEWORK_TEST_REPORT(
"Checking left hand position");
184 new(&ikin_larm) iCubArm(
"left");
186 Vector q_torso_larm = cat(q_torso,q_larm);
187 ikin_larm.setAllConstraints(
false);
188 ikin_larm.releaseLink(0);
189 ikin_larm.releaseLink(1);
190 ikin_larm.releaseLink(2);
191 ROBOTTESTINGFRAMEWORK_TEST_REPORT(Asserter::format(
"q_torso_larm : %d ikin_larm : %d",q_torso_larm.size(),ikin_larm.getDOF()));
192 ROBOTTESTINGFRAMEWORK_ASSERT_ERROR_IF_FALSE(q_torso_larm.size() == ikin_larm.getDOF(),
"unexpected chain size");
193 ikin_larm.setAng(q_torso_larm);
195 transform_ikin = ikin_larm.getH();
196 transform_idyn = icub->lowerTorso->HUp*
197 icub->lowerTorso->up->getH(2,
true)*
198 icub->upperTorso->HLeft*
199 icub->upperTorso->left->getH();
201 check_matrix_are_equal(transform_ikin,transform_idyn);
205 ROBOTTESTINGFRAMEWORK_TEST_REPORT(
"Checking right hand position");
206 new(&ikin_rarm) iCubArm(
"right");
207 Vector q_torso_rarm = cat(q_torso,q_rarm);
208 ikin_rarm.setAllConstraints(
false);
209 ikin_rarm.releaseLink(0);
210 ikin_rarm.releaseLink(1);
211 ikin_rarm.releaseLink(2);
212 ROBOTTESTINGFRAMEWORK_ASSERT_ERROR_IF_FALSE(q_torso_rarm.size() == ikin_rarm.getDOF(),
"unexpected chain size");
213 ikin_rarm.setAng(q_torso_rarm);
215 transform_ikin = ikin_rarm.getH();
216 transform_idyn = icub->lowerTorso->HUp*
217 icub->lowerTorso->up->getH(2,
true)*
218 icub->upperTorso->HRight*
219 icub->upperTorso->right->getH();
221 check_matrix_are_equal(transform_ikin,transform_idyn);
225 ROBOTTESTINGFRAMEWORK_TEST_REPORT(
"Checking left leg end effector positions");
226 new(&ikin_lleg) iCubLeg(
"left");
227 ikin_lleg.setAllConstraints(
false);
228 ROBOTTESTINGFRAMEWORK_TEST_REPORT(Asserter::format(
"q_lleg : %d ikin_lleg : %d",q_lleg.size(),ikin_lleg.getDOF()));
229 ROBOTTESTINGFRAMEWORK_ASSERT_ERROR_IF_FALSE(q_lleg.size() == ikin_lleg.getDOF(),
"unexpected chain size");
230 ikin_lleg.setAng(q_lleg);
232 transform_ikin = ikin_lleg.getH();
233 transform_idyn = icub->lowerTorso->HLeft*
234 icub->lowerTorso->left->getH();
236 check_matrix_are_equal(transform_ikin,transform_idyn);
247 ROBOTTESTINGFRAMEWORK_TEST_REPORT(
"Checking right leg end effector positions");
248 new(&ikin_rleg) iCubLeg(
"right");
249 ikin_rleg.setAllConstraints(
false);
250 ROBOTTESTINGFRAMEWORK_ASSERT_ERROR_IF_FALSE(q_rleg.size() == ikin_rleg.getDOF(),
"unexpected chain size");
251 ikin_rleg.setAng(q_rleg);
253 transform_ikin = ikin_rleg.getH();
254 transform_idyn = icub->lowerTorso->HRight*
255 icub->lowerTorso->right->getH();
257 check_matrix_are_equal(transform_ikin,transform_idyn);