00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00053
00054 static const char rcsid[] = "$Id: comp_dqp.cpp,v 1.16 2004/07/06 02:16:36 gourdeau Exp $";
00055
00056 #include "robot.h"
00057
00058 #ifdef use_namespace
00059 namespace ROBOOP {
00060 using namespace NEWMAT;
00061 #endif
00062
00063 void Robot::dqp_torque(const ColumnVector & q, const ColumnVector & qp,
00064 const ColumnVector & dqp,
00065 ColumnVector & ltorque, ColumnVector & dtorque)
00072 {
00073 int i;
00074 Matrix Rt, temp;
00075 if(q.Ncols() != 1 || q.Nrows() != dof) error("q has wrong dimension");
00076 if(qp.Ncols() != 1 || qp.Nrows() != dof) error("qp has wrong dimension");
00077 if(dqp.Ncols() != 1 || qp.Nrows() != dof) error("dqp has wrong dimension");
00078 ltorque = ColumnVector(dof);
00079 dtorque = ColumnVector(dof);
00080 set_q(q);
00081
00082 vp[0] = gravity;
00083 ColumnVector z0(3);
00084 z0(1) = 0.0; z0(2) = 0.0; z0(3) = 1.0;
00085 Matrix Q(3,3);
00086 Q = 0.0;
00087 Q(1,2) = -1.0;
00088 Q(2,1) = 1.0;
00089
00090 for(i = 1; i <= dof; i++)
00091 {
00092 Rt = links[i].R.t();
00093 p[i] = ColumnVector(3);
00094 p[i](1) = links[i].get_a();
00095 p[i](2) = links[i].get_d() * Rt(2,3);
00096 p[i](3) = links[i].get_d() * Rt(3,3);
00097 if(links[i].get_joint_type() != 0)
00098 {
00099 dp[i] = ColumnVector(3);
00100 dp[i](1) = 0.0;
00101 dp[i](2) = Rt(2,3);
00102 dp[i](3) = Rt(3,3);
00103 }
00104 if(links[i].get_joint_type() == 0)
00105 {
00106 w[i] = Rt*(w[i-1] + z0*qp(i));
00107 dw[i] = Rt*(dw[i-1] + z0*dqp(i));
00108 wp[i] = Rt*(wp[i-1] + CrossProduct(w[i-1],z0*qp(i)));
00109 dwp[i] = Rt*(dwp[i-1]
00110 + CrossProduct(dw[i-1],z0*qp(i))
00111 + CrossProduct(w[i-1],z0*dqp(i)));
00112 vp[i] = CrossProduct(wp[i],p[i])
00113 + CrossProduct(w[i],CrossProduct(w[i],p[i]))
00114 + Rt*(vp[i-1]);
00115 dvp[i] = CrossProduct(dwp[i],p[i])
00116 + CrossProduct(dw[i],CrossProduct(w[i],p[i]))
00117 + CrossProduct(w[i],CrossProduct(dw[i],p[i]))
00118 + Rt*dvp[i-1];
00119 }
00120 else
00121 {
00122 w[i] = Rt*w[i-1];
00123 dw[i] = Rt*dw[i-1];
00124 wp[i] = Rt*wp[i-1];
00125 dwp[i] = Rt*dwp[i-1];
00126 vp[i] = Rt*(vp[i-1]
00127 + 2.0*CrossProduct(w[i],Rt*z0*qp(i)))
00128 + CrossProduct(wp[i],p[i])
00129 + CrossProduct(w[i],CrossProduct(w[i],p[i]));
00130 dvp[i] = Rt*(dvp[i-1]
00131 + 2.0*(CrossProduct(dw[i-1],z0*qp(i))
00132 + CrossProduct(w[i-1],z0*dqp(i))))
00133 + CrossProduct(dwp[i],p[i])
00134 + CrossProduct(dw[i],CrossProduct(w[i],p[i]))
00135 + CrossProduct(w[i],CrossProduct(dw[i],p[i]));
00136 }
00137 a[i] = CrossProduct(wp[i],links[i].r)
00138 + CrossProduct(w[i],CrossProduct(w[i],links[i].r))
00139 + vp[i];
00140 da[i] = CrossProduct(dwp[i],links[i].r)
00141 + CrossProduct(dw[i],CrossProduct(w[i],links[i].r))
00142 + CrossProduct(w[i],CrossProduct(dw[i],links[i].r))
00143 + dvp[i];
00144 }
00145
00146 for(i = dof; i >= 1; i--)
00147 {
00148 F[i] = a[i] * links[i].m;
00149 N[i] = links[i].I*wp[i] + CrossProduct(w[i],links[i].I*w[i]);
00150 dF[i] = da[i] * links[i].m;
00151 dN[i] = links[i].I*dwp[i] + CrossProduct(dw[i],links[i].I*w[i])
00152 + CrossProduct(w[i],links[i].I*dw[i]);
00153 if(i == dof)
00154 {
00155 f[i] = F[i];
00156 n[i] = CrossProduct(p[i],f[i])
00157 + CrossProduct(links[i].r,F[i]) + N[i];
00158 df[i] = dF[i];
00159 dn[i] = CrossProduct(p[i],df[i])
00160 + CrossProduct(links[i].r,dF[i]) + dN[i];
00161 }
00162 else
00163 {
00164 f[i] = links[i+1].R*f[i+1] + F[i];
00165 df[i] = links[i+1].R*df[i+1] + dF[i];
00166 n[i] = links[i+1].R*n[i+1] + CrossProduct(p[i],f[i])
00167 + CrossProduct(links[i].r,F[i]) + N[i];
00168 dn[i] = links[i+1].R*dn[i+1] + CrossProduct(p[i],df[i])
00169 + CrossProduct(links[i].r,dF[i]) + dN[i];
00170 }
00171 if(links[i].get_joint_type() == 0)
00172 {
00173 temp = ((z0.t()*links[i].R)*n[i]);
00174 ltorque(i) = temp(1,1);
00175 temp = ((z0.t()*links[i].R)*dn[i]);
00176 dtorque(i) = temp(1,1);
00177 }
00178 else
00179 {
00180 temp = ((z0.t()*links[i].R)*f[i]);
00181 ltorque(i) = temp(1,1);
00182 temp = ((z0.t()*links[i].R)*df[i]);
00183 dtorque(i) = temp(1,1);
00184 }
00185 }
00186 }
00187
00188 void mRobot::dqp_torque(const ColumnVector & q, const ColumnVector & qp,
00189 const ColumnVector & dqp, ColumnVector & ltorque,
00190 ColumnVector & dtorque)
00197 {
00198 int i;
00199 Matrix Rt, temp;
00200 if(q.Ncols() != 1 || q.Nrows() != dof) error("q has wrong dimension");
00201 if(qp.Ncols() != 1 || qp.Nrows() != dof) error("qp has wrong dimension");
00202 if(dqp.Ncols() != 1 || dqp.Nrows() != dof) error("dqp has wrong dimension");
00203 ltorque = ColumnVector(dof);
00204 dtorque = ColumnVector(dof);
00205 set_q(q);
00206
00207 vp[0] = gravity;
00208 ColumnVector z0(3);
00209 z0(1) = 0.0; z0(2) = 0.0; z0(3) = 1.0;
00210 Matrix Q(3,3);
00211 Q = 0.0;
00212 Q(1,2) = -1.0;
00213 Q(2,1) = 1.0;
00214 for(i = 1; i <= dof; i++)
00215 {
00216 Rt = links[i].R.t();
00217 p[i] = links[i].p;
00218 if(links[i].get_joint_type() != 0)
00219 {
00220 dp[i] = ColumnVector(3);
00221 dp[i](1) = 0.0;
00222 dp[i](2) = Rt(2,3);
00223 dp[i](3) = Rt(3,3);
00224 }
00225 if(links[i].get_joint_type() == 0)
00226 {
00227 w[i] = Rt*w[i-1] + z0*qp(i);
00228 dw[i] = Rt*dw[i-1] + z0*dqp(i);
00229 wp[i] = Rt*wp[i-1] + CrossProduct(Rt*w[i-1],z0*qp(i));
00230 dwp[i] = Rt*dwp[i-1] + CrossProduct(Rt*dw[i-1],z0*qp(i))
00231 + CrossProduct(Rt*w[i-1],z0*dqp(i));
00232 vp[i] = Rt*(CrossProduct(wp[i-1],p[i])
00233 + CrossProduct(w[i-1],CrossProduct(w[i-1],p[i]))
00234 + vp[i-1]);
00235 dvp[i] = Rt*(CrossProduct(dwp[i-1],p[i])
00236 + CrossProduct(dw[i-1],CrossProduct(w[i-1],p[i]))
00237 + CrossProduct(w[i-1],CrossProduct(dw[i-1],p[i])) + dvp[i-1]);
00238 }
00239 else
00240 {
00241 w[i] = Rt*w[i-1];
00242 dw[i] = Rt*dw[i-1];
00243 wp[i] = Rt*wp[i-1];
00244 dwp[i] = Rt*dwp[i-1];
00245 vp[i] = Rt*(vp[i-1] + CrossProduct(wp[i-1],p[i])
00246 + CrossProduct(w[i-1],CrossProduct(w[i-1],p[i])))
00247 + 2.0*CrossProduct(w[i],z0*qp(i));
00248 dvp[i] = Rt*(CrossProduct(dwp[i-1],p[i])
00249 + CrossProduct(dw[i-1],CrossProduct(w[i-1],p[i]))
00250 + CrossProduct(w[i-1],CrossProduct(dw[i-1],p[i])) + dvp[i-1])
00251 + 2*(CrossProduct(dw[i],z0*qp(i)) + CrossProduct(w[i],z0*dqp(i)));
00252 }
00253 a[i] = CrossProduct(wp[i],links[i].r)
00254 + CrossProduct(w[i],CrossProduct(w[i],links[i].r))
00255 + vp[i];
00256 da[i] = CrossProduct(dwp[i],links[i].r)
00257 + CrossProduct(dw[i],CrossProduct(w[i],links[i].r))
00258 + CrossProduct(w[i],CrossProduct(dw[i],links[i].r))
00259 + dvp[i];
00260 }
00261
00262 for(i = dof; i >= 1; i--) {
00263 F[i] = a[i] * links[i].m;
00264 N[i] = links[i].I*wp[i] + CrossProduct(w[i],links[i].I*w[i]);
00265 dF[i] = da[i] * links[i].m;
00266 dN[i] = links[i].I*dwp[i] + CrossProduct(dw[i],links[i].I*w[i])
00267 + CrossProduct(w[i],links[i].I*dw[i]);
00268
00269 if(i == dof)
00270 {
00271 f[i] = F[i];
00272 df[i] = dF[i];
00273 n[i] = CrossProduct(links[i].r,F[i]) + N[i];
00274 dn[i] = dN[i] + CrossProduct(links[i].r,dF[i]);
00275 }
00276 else
00277 {
00278 f[i] = links[i+1].R*f[i+1] + F[i];
00279 df[i] = links[i+1].R*df[i+1] + dF[i];
00280 n[i] = links[i+1].R*n[i+1] + CrossProduct(p[i+1],links[i+1].R*f[i+1])
00281 + CrossProduct(links[i].r,F[i]) + N[i];
00282 dn[i] = links[i+1].R*dn[i+1] + CrossProduct(p[i+1],links[i+1].R*df[i+1])
00283 + CrossProduct(links[i].r,dF[i]) + dN[i];
00284 }
00285
00286 if(links[i].get_joint_type() == 0)
00287 {
00288 temp = z0.t()*n[i];
00289 ltorque(i) = temp(1,1);
00290 temp = z0.t()*dn[i];
00291 dtorque(i) = temp(1,1);
00292 }
00293 else
00294 {
00295 temp = z0.t()*f[i];
00296 ltorque(i) = temp(1,1);
00297 temp = z0.t()*df[i];
00298 dtorque(i) = temp(1,1);
00299 }
00300 }
00301 }
00302
00303 void mRobot_min_para::dqp_torque(const ColumnVector & q, const ColumnVector & qp,
00304 const ColumnVector & dqp, ColumnVector & ltorque,
00305 ColumnVector & dtorque)
00312 {
00313 int i;
00314 Matrix Rt, temp;
00315 if(q.Ncols() != 1 || q.Nrows() != dof) error("q has wrong dimension");
00316 if(qp.Ncols() != 1 || qp.Nrows() != dof) error("qp has wrong dimension");
00317 if(dqp.Ncols() != 1 || dqp.Nrows() != dof) error("dqp has wrong dimension");
00318 ltorque = ColumnVector(dof);
00319 dtorque = ColumnVector(dof);
00320 set_q(q);
00321
00322 vp[0] = gravity;
00323 ColumnVector z0(3);
00324 z0(1) = 0.0; z0(2) = 0.0; z0(3) = 1.0;
00325 Matrix Q(3,3);
00326 Q = 0.0;
00327 Q(1,2) = -1.0;
00328 Q(2,1) = 1.0;
00329 for(i = 1; i <= dof; i++)
00330 {
00331 Rt = links[i].R.t();
00332 p[i] = links[i].p;
00333 if(links[i].get_joint_type() != 0)
00334 {
00335 dp[i] = ColumnVector(3);
00336 dp[i](1) = 0.0;
00337 dp[i](2) = Rt(2,3);
00338 dp[i](3) = Rt(3,3);
00339 }
00340 if(links[i].get_joint_type() == 0)
00341 {
00342 w[i] = Rt*w[i-1] + z0*qp(i);
00343 dw[i] = Rt*dw[i-1] + z0*dqp(i);
00344 wp[i] = Rt*wp[i-1] + CrossProduct(Rt*w[i-1],z0*qp(i));
00345 dwp[i] = Rt*dwp[i-1] + CrossProduct(Rt*dw[i-1],z0*qp(i));
00346 vp[i] = Rt*(CrossProduct(wp[i-1],p[i])
00347 + CrossProduct(w[i-1],CrossProduct(w[i-1],p[i]))
00348 + vp[i-1]);
00349 dvp[i] = Rt*(CrossProduct(dwp[i-1],p[i])
00350 + CrossProduct(dw[i-1],CrossProduct(w[i-1],p[i]))
00351 + CrossProduct(w[i-1],CrossProduct(dw[i-1],p[i])) + dvp[i-1]);
00352 }
00353 else
00354 {
00355 w[i] = Rt*w[i-1];
00356 dw[i] = Rt*dw[i-1];
00357 wp[i] = Rt*wp[i-1];
00358 dwp[i] = Rt*dwp[i-1];
00359 vp[i] = Rt*(vp[i-1] + CrossProduct(wp[i-1],p[i])
00360 + CrossProduct(w[i-1],CrossProduct(w[i-1],p[i])))
00361 + 2.0*CrossProduct(w[i],z0*qp(i));
00362 dvp[i] = Rt*(CrossProduct(dwp[i-1],p[i])
00363 + CrossProduct(dw[i-1],CrossProduct(w[i-1],p[i]))
00364 + CrossProduct(w[i-1],CrossProduct(dw[i-1],p[i])) + dvp[i-1])
00365 + 2*(CrossProduct(dw[i],z0*qp(i)) + CrossProduct(w[i],z0*dqp(i)));
00366 }
00367 }
00368
00369 for(i = dof; i >= 1; i--) {
00370 F[i] = vp[i]*links[i].m + CrossProduct(wp[i], links[i].mc) +
00371 CrossProduct(w[i], CrossProduct(w[i], links[i].mc));
00372 dF[i] = dvp[i]*links[i].m + CrossProduct(dwp[i],links[i].mc)
00373 + CrossProduct(dw[i],CrossProduct(w[i],links[i].mc))
00374 + CrossProduct(w[i],CrossProduct(dw[i],links[i].mc));
00375 N[i] = links[i].I*wp[i] + CrossProduct(w[i],links[i].I*w[i])
00376 - CrossProduct(vp[i], links[i].mc);
00377 dN[i] = links[i].I*dwp[i] + CrossProduct(dw[i],links[i].I*w[i])
00378 + CrossProduct(w[i],links[i].I*dw[i])
00379 - CrossProduct(dvp[i],links[i].mc);
00380
00381 if(i == dof)
00382 {
00383 f[i] = F[i];
00384 df[i] = dF[i];
00385 n[i] = N[i];
00386 dn[i] = dN[i];
00387 }
00388 else
00389 {
00390 f[i] = links[i+1].R*f[i+1] + F[i];
00391 df[i] = links[i+1].R*df[i+1] + dF[i];
00392 n[i] = links[i+1].R*n[i+1] + CrossProduct(p[i+1],links[i+1].R*f[i+1]) + N[i];
00393 dn[i] = links[i+1].R*dn[i+1] + CrossProduct(p[i+1],links[i+1].R*df[i+1]) + dN[i];
00394 }
00395
00396 if(links[i].get_joint_type() == 0)
00397 {
00398 temp = z0.t()*n[i];
00399 ltorque(i) = temp(1,1);
00400 temp = z0.t()*dn[i];
00401 dtorque(i) = temp(1,1);
00402 }
00403 else
00404 {
00405 temp = z0.t()*f[i];
00406 ltorque(i) = temp(1,1);
00407 temp = z0.t()*df[i];
00408 dtorque(i) = temp(1,1);
00409 }
00410 }
00411 }
00412
00413 #ifdef use_namespace
00414 }
00415 #endif
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426