17 #include <abstract-robot-dynamics/robot-dynamics-object-constructor.hh>
20 using namespace dynamicsJRLJapan;
47 MatrixInertia::MatrixInertia(CjrlHumanoidDynamicRobot* aHDR)
48 : aHDR_(aHDR), aHDMB_(0
x0) {
50 if (aHDR != NULL)
init(aHDR);
57 aHDMB_ =
dynamic_cast<dynamicsJRLJapan::HumanoidDynamicMultiBody*
>(
aHDR_);
81 std::map<CjrlJoint*, int>
m;
84 sotDEBUG(15) <<
"Parent Indexes:" << std::endl;
88 sotDEBUG(15) <<
"parent of\t" <<
i <<
"\t("
93 sotDEBUG(15) <<
"parent of\t" <<
i <<
":\t("
108 vector3d z = j->axe();
112 for (
int n = 0;
n < 3; ++
n) phi_i(
n + 3) = z(
n);
125 const vectorN& currentConf =
aHDMB_->currentConfiguration();
126 sotDEBUG(45) <<
"q = [ " << currentConf << endl;
128 sotDEBUG(15) <<
"Spatial transforms:" << std::endl;
129 const size_t SIZE =
joints_.size();
130 for (
size_t i = 0;
i < SIZE; ++
i) {
132 <<
": rank = " <<
joints_[
i]->rankInConfiguration() << endl;
140 j->getStaticRotation(Ri);
141 vector3d axeJ = Ri * j->axe();
142 const double&
q = currentConf(
joints_[
i]->rankInConfiguration());
143 sotDEBUG(45) <<
"q" <<
i <<
" = " <<
q << endl;
145 j->RodriguesRotation(axeJ,
q, piRi_tmp);
146 for (
unsigned int loopi = 0; loopi < 3; ++loopi)
147 for (
unsigned int loopj = 0; loopj < 3; ++loopj)
148 piRi(loopi, loopj) = piRi_tmp(loopi, loopj);
153 j->getStaticTranslation(piTi_tmp);
154 for (
unsigned int loopi = 0; loopi < 3; ++loopi)
155 piTi(loopi) = piTi_tmp(loopi);
161 piMi.buildFrom(piRi, piTi);
164 sotDEBUG(45) <<
"piMi = " << piMi << endl;
165 sotDEBUG(45) <<
"iMpi = " << iMpi << endl;
167 iVpi[
i].buildFrom(iMpi);
178 const size_t SIZE =
joints_.size();
181 for (
size_t i = 0;
i < SIZE; ++
i) {
183 vector3d
com =
joints_[
i]->linkedBody()->localCenterOfMass();
186 matrix3d Icm =
joints_[
i]->linkedBody()->inertiaMatrix();
188 double m =
joints_[
i]->linkedBody()->mass();
194 sotDEBUG(45) <<
"com" <<
i <<
" = [ " <<
com <<
"]" << endl;
195 sotDEBUG(45) <<
"Sc" <<
i <<
" = [ " << Sc <<
"]" << endl;
196 sotDEBUG(45) <<
"Icm" <<
i <<
" = [ " << Icm <<
"]" << endl;
197 matrix3d Sct = Sc.Transpose();
198 matrix3d Irr = Sc * Sct;
201 for (
unsigned int loopi = 0; loopi < 3; ++loopi)
202 for (
unsigned int loopj = 0; loopj < 3; ++loopj) {
204 Ici(loopi, loopj) =
m;
206 Ici(loopi, loopj) = 0.;
207 Ici(loopi, loopj + 3) =
m * Sct(loopi, loopj);
208 Ici(loopi + 3, loopj) =
m * Sc(loopi, loopj);
209 Ici(loopi + 3, loopj + 3) =
210 m * Irr(loopi, loopj) + Icm(loopi, loopj);
213 sotDEBUG(25) <<
"Ic" <<
i <<
" = " << Ici;
220 for (
int i = SIZE - 1;
i >= 1; --
i) {
221 const unsigned int iRank =
joints_[
i]->rankInConfiguration();
224 sotMatrixTwist& iVpii =
iVpi[
i];
232 inertia_(iRank, iRank) = phii.scalarProduct(Fi);
233 sotDEBUG(30) <<
"phi" <<
i <<
" = " << phii;
234 sotDEBUG(35) <<
"Fi" <<
i <<
" = " << Fi << endl;
235 sotDEBUG(25) <<
"IcA" <<
i <<
" = " << Ici << endl;
236 sotDEBUG(45) <<
"Joint " <<
i <<
" in " << iRank << endl;
239 iVpiiT.multiply(Ici, iVpiT_Ici);
240 iVpiT_Ici.multiply(iVpii, iVpiT_Ici_iVpi);
247 sotDEBUG(45) <<
"Vpi" <<
i <<
" = " << iVpii;
257 joints_[j]->rankInConfiguration(), iRank) = Fi.scalarProduct(
phi[j]);
258 sotDEBUG(35) <<
"Fi = " << Fi << endl;
264 for (
size_t k = 0; k < 6; ++k) {
271 for (
size_t i = 0;
i < 6; ++
i)
272 for (
size_t j = 0; j < 6; ++j) {
284 for (
size_t i = 0;
i < (
joints_.size() + 5); ++
i)
285 for (
size_t j = 0; j < (
joints_.size() + 5); ++j)