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 #ifndef KDL_JACOBIANFRAME_H
00029 #define KDL_JACOBIANFRAME_H
00030
00031 #include <kdl/jacobianexpr.hpp>
00032 #include <kdl/frames.hpp>
00033 #include <kdl/stiffness.hpp>
00034
00035 namespace KDL {
00036
00037
00111 template <>
00112 class UnaryOp<OpInverse,Frame> {
00113 public:
00114 typedef Frame exprType;
00115 typedef Frame valueType;
00116 typedef Twist derivType;
00117 static INLINE2 Frame value(const Frame& F) {
00118 return F.Inverse();
00119 }
00120 static INLINE2 Twist deriv(const Frame& a,const Twist& da) {
00121 return Twist( a.M.Inverse( da.rot*a.p-da.vel ), -a.M.Inverse( da.rot ) );
00122 }
00123 };
00124
00125 DEFUNARY_TYPE(Inverse,OpInverse,Ref<Jacobian<Frame> >);
00126
00136 template <>
00137 class BinaryOp<OpMult,Frame,Frame> {
00138 public:
00139 typedef Frame exprType;
00140 typedef Frame valueType;
00141 typedef Twist derivType;
00142 INLINE2 static Frame value(const Frame& a,const Frame& b) {
00143 return a*b;
00144 }
00145 INLINE2 static derivType derivVV(const Frame& a,const Twist& da,const Frame& b,const Twist& db) {
00146 return Twist(
00147 da.rot*(a.M*b.p)+a.M*db.vel+da.vel,
00148 da.rot + a.M * db.rot
00149 );
00150 }
00151 INLINE2 static derivType derivCV(const Frame& a,const Frame& ,const Twist& db) {
00152 return Twist(
00153 a.M*db.vel,
00154 a.M * db.rot
00155 );
00156 }
00157 INLINE2 static derivType derivVC(const Frame& a,const Twist& da,const Frame& b) {
00158 return Twist(
00159 da.rot*(a.M*b.p)+da.vel,
00160 da.rot
00161 );
00162 }
00163 };
00164
00165 DEFBINARY_RTYPE(operator*,OpMult,Ref<Jacobian<Frame> >)
00166 DEFBINARY_LTYPE(operator*,OpMult,Ref<Jacobian<Frame> >)
00167 DEFBINARY_RLTYPE(operator*,OpMult,Ref<Jacobian<Frame> >,Ref<Jacobian<Frame> >)
00168
00169
00170
00171 template <>
00172 class BinaryOp<OpMult,Frame,Vector> {
00173 public:
00174 typedef Vector exprType;
00175 typedef Vector valueType;
00176 typedef Vector derivType;
00177 INLINE2 static Vector value(const Frame& a,const Vector& b) {
00178 return a*b;
00179 }
00180
00181 INLINE2 static derivType derivVV(const Frame& a,const Twist& da,const Vector& b,const Vector& db) {
00182 return da.rot*(a.M*b)+a.M*db+da.vel;
00183 }
00184 INLINE2 static derivType derivCV(const Frame& a,const Vector& ,const Vector& db) {
00185 return a.M*db;
00186 }
00187 INLINE2 static derivType derivVC(const Frame& a,const Twist& da,const Vector& b) {
00188 return da.rot*(a.M*b)+da.vel;
00189 }
00190 };
00191 DEFBINARY_RTYPE(operator*,OpMult,Ref<Jacobian<Vector> >)
00192 DEFBINARY_RLTYPE(operator*,OpMult,Ref<Jacobian<Frame> >,Ref<Jacobian<Vector> >)
00193
00194
00195
00196
00197
00198 template <>
00199 class UnaryOp<OpRotX,double> {
00200 public:
00201 typedef Rotation exprType;
00202 typedef Rotation valueType;
00203 typedef Vector derivType;
00204 static INLINE2 Rotation value(double angle) {
00205 return Rotation::RotX(angle);
00206 }
00207 static INLINE2 Vector deriv(double ,double da) {
00208 return Vector(da,0,0);
00209 }
00210 };
00211 DEFUNARY_TYPE(RotX,OpRotX,Ref<Jacobian<double> >);
00212
00213 template <>
00214 class UnaryOp<OpRotY,double> {
00215 public:
00216 typedef Rotation exprType;
00217 typedef Rotation valueType;
00218 typedef Vector derivType;
00219 static INLINE2 Rotation value(double angle) {
00220 return Rotation::RotY(angle);
00221 }
00222 static INLINE2 Vector deriv(double ,double da) {
00223 return Vector(0,da,0);
00224 }
00225 };
00226 DEFUNARY_TYPE(RotY,OpRotY,Ref<Jacobian<double> >);
00227
00228 template <>
00229 class UnaryOp<OpRotZ,double> {
00230 public:
00231 typedef Rotation exprType;
00232 typedef Rotation valueType;
00233 typedef Vector derivType;
00234 static INLINE2 Rotation value(double angle) {
00235 return Rotation::RotZ(angle);
00236 }
00237 static INLINE2 Vector deriv(double ,double da) {
00238 return Vector(0,0,da);
00239 }
00240 };
00241 DEFUNARY_TYPE(RotZ,OpRotZ,Ref<Jacobian<double> >);
00242
00243
00244 template <>
00245 class UnaryOp<OpInverse,Rotation> {
00246 public:
00247 typedef Rotation exprType;
00248 typedef Rotation valueType;
00249 typedef Vector derivType;
00250 static INLINE2 Rotation value(const Rotation& R) {
00251 return R.Inverse();
00252 }
00253 static INLINE2 Vector deriv(const Rotation& a,const Vector& da) {
00254 return a.Inverse(-da);
00255 }
00256 };
00257
00258 DEFUNARY_TYPE(Inverse,OpInverse,Ref<Jacobian<Rotation> >);
00259
00260 template <>
00261 class BinaryOp<OpMult,Rotation,Rotation> {
00262 public:
00263 typedef Rotation exprType;
00264 typedef Rotation valueType;
00265 typedef Vector derivType;
00266 INLINE2 static Rotation value(const Rotation& a,const Rotation& b) {
00267 return a*b;
00268 }
00269 INLINE2 static derivType derivVV(const Rotation& a,const Vector& da,const Rotation& ,const Vector& db) {
00270 return a*db+da;
00271 }
00272 INLINE2 static derivType derivCV(const Rotation& a,const Rotation& ,const Vector& db) {
00273 return a*db;
00274 }
00275 INLINE2 static derivType derivVC(const Rotation& ,const Vector& da,const Rotation& ) {
00276 return da;
00277 }
00278 };
00279
00280 DEFBINARY_RTYPE(operator*,OpMult,Ref<Jacobian<Rotation> >)
00281 DEFBINARY_LTYPE(operator*,OpMult,Ref<Jacobian<Rotation> >)
00282 DEFBINARY_RLTYPE(operator*,OpMult,Ref<Jacobian<Rotation> >,Ref<Jacobian<Rotation> >)
00283
00284 template <>
00285 class BinaryOp<OpMult,Rotation,Vector> {
00286 public:
00287 typedef Vector exprType;
00288 typedef Vector valueType;
00289 typedef Vector derivType;
00290 INLINE2 static Vector value(const Rotation& a,const Vector& b) {
00291 return a*b;
00292 }
00293 INLINE2 static derivType derivVV(const Rotation& a,const Vector& da,const Vector& b,const Vector& db) {
00294 return da*(a*b)+a*db;
00295 }
00296 INLINE2 static derivType derivCV(const Rotation& a,const Vector& ,const Vector& db) {
00297 return a*db;
00298 }
00299 INLINE2 static derivType derivVC(const Rotation& a,const Vector& da,const Vector& b) {
00300 return da*(a*b);
00301 }
00302 };
00303
00304 DEFBINARY_RLTYPE(operator*,OpMult,Ref<Jacobian<Rotation> >,Ref<Jacobian<Vector> >)
00305
00306
00307
00308
00312 template <>
00313 class BinaryOp<OpDiff,Vector,Vector> {
00314 public:
00315 typedef Vector exprType;
00316 typedef Vector valueType;
00317 typedef Vector derivType;
00318 INLINE2 static valueType value(const Vector& a,const Vector& b) {
00319 return diff(a,b);
00320 }
00321 INLINE2 static derivType derivVV(const Vector& ,const Vector& da,const Vector& ,const Vector& db) {
00322 return db-da;
00323 }
00324 INLINE2 static derivType derivCV(const Vector& ,const Vector& ,const Vector& db) {
00325 return db;
00326 }
00327 INLINE2 static derivType derivVC(const Vector& ,const Vector& da,const Vector& ) {
00328 return -da;
00329 }
00330 };
00331
00332 DEFBINARY_RTYPE(Diff,OpDiff,Ref<Jacobian<Vector> >)
00333 DEFBINARY_LTYPE(Diff,OpDiff,Ref<Jacobian<Vector> >)
00334 DEFBINARY_RLTYPE(Diff,OpDiff,Ref<Jacobian<Vector> >,Ref<Jacobian<Vector> >)
00335
00336
00337
00342 template <>
00343 class BinaryOp<OpDiff,Rotation,Rotation> {
00344 public:
00345 typedef Vector exprType;
00346 typedef Vector valueType;
00347 typedef Vector derivType;
00348 INLINE2 static valueType value(const Rotation& a,const Rotation& b) {
00349 return diff(a,b);
00350 }
00351 INLINE2 static derivType derivVV(const Rotation& ,const Vector& da,const Rotation& ,const Vector& db) {
00352 return db-da;
00353 }
00354 INLINE2 static derivType derivCV(const Rotation& ,const Rotation& ,const Vector& db) {
00355 return db;
00356 }
00357 INLINE2 static derivType derivVC(const Rotation& ,const Vector& da,const Rotation& ) {
00358 return -da;
00359 }
00360 };
00361
00362 DEFBINARY_RTYPE(Diff,OpDiff,Ref<Jacobian<Rotation> >)
00363 DEFBINARY_LTYPE(Diff,OpDiff,Ref<Jacobian<Rotation> >)
00364 DEFBINARY_RLTYPE(Diff,OpDiff,Ref<Jacobian<Rotation> >,Ref<Jacobian<Rotation> >)
00365
00370 template <>
00371 class BinaryOp<OpDiff,Frame,Frame> {
00372 public:
00373 typedef Twist exprType;
00374 typedef Twist valueType;
00375 typedef Twist derivType;
00376 INLINE2 static valueType value(const Frame& a,const Frame& b) {
00377 return diff(a,b);
00378 }
00379 INLINE2 static derivType derivVV(const Frame& ,const Twist& da,const Frame& ,const Twist& db) {
00380 return db-da;
00381 }
00382 INLINE2 static derivType derivCV(const Frame& ,const Frame& ,const Twist& db) {
00383 return db;
00384 }
00385 INLINE2 static derivType derivVC(const Frame& ,const Twist& da,const Frame& ) {
00386 return -da;
00387 }
00388 };
00389
00390 DEFBINARY_RTYPE(Diff,OpDiff,Ref<Jacobian<Frame> >)
00391 DEFBINARY_LTYPE(Diff,OpDiff,Ref<Jacobian<Frame> >)
00392 DEFBINARY_RLTYPE(Diff,OpDiff,Ref<Jacobian<Frame> >,Ref<Jacobian<Frame> >)
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408 template <>
00409 class BinaryOp<OpDot,Vector,Vector> {
00410 public:
00411 typedef double exprType;
00412 typedef double valueType;
00413 typedef double derivType;
00414 INLINE2 static valueType value(const Vector& a,const Vector& b) {
00415 return dot(a,b);
00416 }
00417 INLINE2 static derivType derivVV(const Vector& a,const Vector& da,const Vector& b,const Vector& db) {
00418 return dot(a,db)+dot(da,b);
00419 }
00420 INLINE2 static derivType derivCV(const Vector& a,const Vector& ,const Vector& db) {
00421 return dot(a,db);
00422 }
00423 INLINE2 static derivType derivVC(const Vector& ,const Vector& da,const Vector& b) {
00424 return dot(da,b);
00425 }
00426 };
00427
00428 DEFBINARY_RTYPE(dot,OpDot,Ref<Jacobian<Vector> >)
00429 DEFBINARY_LTYPE(dot,OpDot,Ref<Jacobian<Vector> >)
00430 DEFBINARY_RLTYPE(dot,OpDot,Ref<Jacobian<Vector> >,Ref<Jacobian<Vector> >)
00431
00432 template <>
00433 class BinaryOp<OpMult,Vector,Vector> {
00434 public:
00435 typedef Vector exprType;
00436 typedef Vector valueType;
00437 typedef Vector derivType;
00438 INLINE2 static valueType value(const Vector& a,const Vector& b) {
00439 return a*b;
00440 }
00441 INLINE2 static derivType derivVV(const Vector& a,const Vector& da,const Vector& b,const Vector& db) {
00442 return a*db+da*b;
00443 }
00444 INLINE2 static derivType derivCV(const Vector& a,const Vector& ,const Vector& db) {
00445 return a*db;
00446 }
00447 INLINE2 static derivType derivVC(const Vector& ,const Vector& da,const Vector& b) {
00448 return da*b;
00449 }
00450 };
00451 DEFBINARY_LTYPE(operator*,OpMult,Ref<Jacobian<Vector> >)
00452 DEFBINARY_RLTYPE(operator*,OpMult,Ref<Jacobian<Vector> >,Ref<Jacobian<Vector> >)
00453
00454 template <>
00455 class BinaryOp<OpAdd,Vector,Vector> {
00456 public:
00457 typedef Vector exprType;
00458 typedef Vector valueType;
00459 typedef Vector derivType;
00460 INLINE2 static valueType value(const valueType& a,const valueType& b) {
00461 return a+b;
00462 }
00463 INLINE2 static derivType derivVV(const valueType& ,const derivType& da,const valueType& ,const derivType& db) {
00464 return da+db;
00465 }
00466 INLINE2 static derivType derivCV(const valueType& ,const valueType& ,const derivType& db) {
00467 return db;
00468 }
00469 INLINE2 static derivType derivVC(const valueType& ,const derivType& da,const valueType& ) {
00470 return da;
00471 }
00472 };
00473 DEFBINARY_RTYPE(operator+,OpAdd,Ref<Jacobian<Vector> >)
00474 DEFBINARY_LTYPE(operator+,OpAdd,Ref<Jacobian<Vector> >)
00475 DEFBINARY_RLTYPE(operator+,OpAdd,Ref<Jacobian<Vector> >,Ref<Jacobian<Vector> >)
00476
00477
00478
00479 template <>
00480 class BinaryOp<OpSub,Vector,Vector> {
00481 public:
00482 typedef Vector exprType;
00483 typedef Vector valueType;
00484 typedef Vector derivType;
00485 INLINE2 static valueType value(const valueType& a,const valueType& b) {
00486 return a-b;
00487 }
00488 INLINE2 static derivType derivVV(const valueType& ,const derivType& da,const valueType& ,const derivType& db) {
00489 return da-db;
00490 }
00491 INLINE2 static derivType derivCV(const valueType& ,const valueType& ,const derivType& db) {
00492 return -db;
00493 }
00494 INLINE2 static derivType derivVC(const valueType& ,const derivType& da,const valueType& ) {
00495 return da;
00496 }
00497 };
00498 DEFBINARY_RTYPE(operator-,OpSub,Ref<Jacobian<Vector> >)
00499 DEFBINARY_LTYPE(operator-,OpSub,Ref<Jacobian<Vector> >)
00500 DEFBINARY_RLTYPE(operator-,OpSub,Ref<Jacobian<Vector> >,Ref<Jacobian<Vector> >)
00501
00502
00503 template <>
00504 class UnaryOp<OpNegate,Vector> {
00505 public:
00506 typedef Vector exprType;
00507 typedef Vector valueType;
00508 typedef Vector derivType;
00509 static INLINE2 valueType value(const Vector& F) {
00510 return -F;
00511 }
00512 static INLINE2 derivType deriv(const Vector& ,const Vector& da) {
00513 return -da;
00514 }
00515 };
00516 DEFUNARY_TYPE(operator-,OpNegate,Ref< Jacobian<Vector> >)
00517
00518
00519 template <>
00520 class UnaryOp<OpNorm,Vector> {
00521 public:
00522 typedef double exprType;
00523 typedef double valueType;
00524 typedef double derivType;
00525 static INLINE2 valueType value(const Vector& a) {
00526 return a.Norm();
00527 }
00528 static INLINE2 derivType deriv(const Vector& a,const Vector& da) {
00529
00530 return dot(a,da)/a.Norm();
00531
00532 }
00533 };
00534 DEFUNARY_TYPE(norm,OpNorm,Ref< Jacobian<Vector> >)
00535
00536
00537
00538
00539 template <>
00540 class BinaryOp<OpMult,Vector,double> {
00541 public:
00542 typedef Vector exprType;
00543 typedef Vector valueType;
00544 typedef Vector derivType;
00545 INLINE2 static valueType value(const Vector& a,double b) {
00546 return a*b;
00547 }
00548 INLINE2 static derivType derivVV(const Vector& a,const Vector& da,double b,double db) {
00549 return a*db+da*b;
00550 }
00551 INLINE2 static derivType derivCV(const Vector& a,double ,double db) {
00552 return a*db;
00553 }
00554 INLINE2 static derivType derivVC(const Vector& ,const Vector& da,double b) {
00555 return da*b;
00556 }
00557 };
00558
00559
00560
00561 DEFBINARY_RLTYPE(operator*,OpMult,Ref<Jacobian<Vector> >,Ref<Jacobian<double> >)
00562
00563 template <>
00564 class BinaryOp<OpMult,double,Vector> {
00565 public:
00566 typedef Vector exprType;
00567 typedef Vector valueType;
00568 typedef Vector derivType;
00569 INLINE2 static valueType value(double a,const Vector& b) {
00570 return a*b;
00571 }
00572 INLINE2 static derivType derivVV(double a,double da,const Vector& b,const Vector& db) {
00573 return a*db+da*b;
00574 }
00575 INLINE2 static derivType derivCV(double a,const Vector& ,const Vector& db) {
00576 return a*db;
00577 }
00578 INLINE2 static derivType derivVC(double ,double da,const Vector& b) {
00579 return da*b;
00580 }
00581 };
00582
00583
00584
00585 DEFBINARY_RLTYPE(operator*,OpMult,Ref<Jacobian<double> >,Ref<Jacobian<Vector> >)
00586
00587
00588
00589
00590
00591
00592
00593 template <>
00594 class UnaryOp<OpRotation,Frame> {
00595 public:
00596 typedef Rotation exprType;
00597 typedef Rotation valueType;
00598 typedef Vector derivType;
00599 static INLINE2 Rotation value(const Frame& F) {
00600 return F.M;
00601 }
00602 static INLINE2 Vector deriv(const Frame& ,const Twist& da) {
00603 return da.rot;
00604 }
00605 };
00606
00607 DEFUNARY_TYPE(RotMat,OpRotation,Ref<Jacobian<Frame> >);
00608
00609
00610
00611 template <>
00612 class UnaryOp<OpOrigin,Frame> {
00613 public:
00614 typedef Vector exprType;
00615 typedef Vector valueType;
00616 typedef Vector derivType;
00617 static INLINE2 Vector value(const Frame& F) {
00618 return F.p;
00619 }
00620 static INLINE2 Vector deriv(const Frame& ,const Twist& da) {
00621 return da.vel;
00622 }
00623 };
00624
00625 DEFUNARY_TYPE(Origin,OpOrigin,Ref<Jacobian<Frame> >);
00626
00627
00628 template <>
00629 class UnaryOp<OpUnitX,Rotation> {
00630 public:
00631 typedef Vector exprType;
00632 typedef Vector valueType;
00633 typedef Vector derivType;
00634 static INLINE2 Vector value(const Rotation& R) {
00635 return R.UnitX();
00636 }
00637 static INLINE2 Vector deriv(const Rotation& a,const Vector& da) {
00638 return da * a.UnitX();
00639 }
00640 };
00641
00642 DEFUNARY_TYPE(UnitX,OpUnitX,Ref<Jacobian<Rotation> >);
00643
00644 template <>
00645 class UnaryOp<OpUnitY,Rotation> {
00646 public:
00647 typedef Vector exprType;
00648 typedef Vector valueType;
00649 typedef Vector derivType;
00650 static INLINE2 Vector value(const Rotation& R) {
00651 return R.UnitY();
00652 }
00653 static INLINE2 Vector deriv(const Rotation& a,const Vector& da) {
00654 return da * a.UnitY();
00655 }
00656 };
00657
00658 DEFUNARY_TYPE(UnitY,OpUnitY,Ref<Jacobian<Rotation> >);
00659
00660
00661 template <>
00662 class UnaryOp<OpUnitZ,Rotation> {
00663 public:
00664 typedef Vector exprType;
00665 typedef Vector valueType;
00666 typedef Vector derivType;
00667 static INLINE2 Vector value(const Rotation& R) {
00668 return R.UnitZ();
00669 }
00670 static INLINE2 Vector deriv(const Rotation& a,const Vector& da) {
00671 return da * a.UnitZ();
00672 }
00673 };
00674
00675 DEFUNARY_TYPE(UnitZ,OpUnitZ,Ref<Jacobian<Rotation> >);
00676
00677 template <>
00678 class UnaryOp<OpCoordX,Vector> {
00679 public:
00680 typedef double exprType;
00681 typedef double valueType;
00682 typedef double derivType;
00683 static INLINE2 double value(const Vector& a) {
00684 return a[0];
00685 }
00686 static INLINE2 double deriv(const Vector& ,const Vector& da) {
00687 return da[0];
00688 }
00689 };
00690
00691 DEFUNARY_TYPE(CoordX,OpCoordX,Ref<Jacobian<Vector> >);
00692
00693 template <>
00694 class UnaryOp<OpCoordY,Vector> {
00695 public:
00696 typedef double exprType;
00697 typedef double valueType;
00698 typedef double derivType;
00699 static INLINE2 double value(const Vector& a) {
00700 return a[1];
00701 }
00702 static INLINE2 double deriv(const Vector& ,const Vector& da) {
00703 return da[1];
00704 }
00705 };
00706
00707 DEFUNARY_TYPE(CoordY,OpCoordY,Ref<Jacobian<Vector> >);
00708
00709 template <>
00710 class UnaryOp<OpCoordZ,Vector> {
00711 public:
00712 typedef double exprType;
00713 typedef double valueType;
00714 typedef double derivType;
00715 static INLINE2 double value(const Vector& a) {
00716 return a[2];
00717 }
00718 static INLINE2 double deriv(const Vector& ,const Vector& da) {
00719 return da[2];
00720 }
00721 };
00722
00723 DEFUNARY_TYPE(CoordZ,OpCoordZ,Ref<Jacobian<Vector> >);
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735 template <>
00736 class UnaryOp<OpNegate,Twist> {
00737 public:
00738 typedef Twist exprType;
00739 typedef Twist valueType;
00740 typedef Twist derivType;
00741 static INLINE2 valueType value(const Twist& F) {
00742 return -F;
00743 }
00744 static INLINE2 derivType deriv(const Twist& ,const Twist& da) {
00745 return -da;
00746 }
00747 };
00748
00749 DEFUNARY_TYPE(operator-,OpNegate,Ref< Jacobian<Twist> >)
00750
00751
00752
00753 template <>
00754 class BinaryOp<OpAdd,Twist,Twist> {
00755 public:
00756 typedef Twist exprType;
00757 typedef Twist valueType;
00758 typedef Twist derivType;
00759 INLINE2 static valueType value(const Twist& a,const Twist& b) {
00760 return a+b;
00761 }
00762
00763 INLINE2 static derivType derivVV(const Twist&,const Twist& da,const Twist&,const Twist& db) {
00764 return da+db;
00765 }
00766 INLINE2 static derivType derivCV(const Twist& ,const Twist& ,const Twist& db) {
00767 return db;
00768 }
00769 INLINE2 static derivType derivVC(const Twist& ,const Twist& da,const Twist& ) {
00770 return da;
00771 }
00772 };
00773 DEFBINARY_RTYPE(operator+,OpAdd,Ref<Jacobian<Twist> >)
00774 DEFBINARY_RLTYPE(operator+,OpAdd,Ref<Jacobian<Twist> >,Ref<Jacobian<Twist> >)
00775
00776
00777 template <>
00778 class BinaryOp<OpSub,Twist,Twist> {
00779 public:
00780 typedef Twist exprType;
00781 typedef Twist valueType;
00782 typedef Twist derivType;
00783 INLINE2 static valueType value(const Twist& a,const Twist& b) {
00784 return a-b;
00785 }
00786
00787 INLINE2 static derivType derivVV(const Twist&,const Twist& da,const Twist&,const Twist& db) {
00788 return da-db;
00789 }
00790 INLINE2 static derivType derivCV(const Twist& ,const Twist& ,const Twist& db) {
00791 return -db;
00792 }
00793 INLINE2 static derivType derivVC(const Twist& ,const Twist& da,const Twist& ) {
00794 return da;
00795 }
00796 };
00797 DEFBINARY_RTYPE(operator-,OpSub,Ref<Jacobian<Twist> >)
00798 DEFBINARY_RLTYPE(operator-,OpSub,Ref<Jacobian<Twist> >,Ref<Jacobian<Twist> >)
00799
00800 template <>
00801 class BinaryOp<OpMult,Rotation,Twist> {
00802 public:
00803 typedef Twist exprType;
00804 typedef Twist valueType;
00805 typedef Twist derivType;
00806 INLINE2 static valueType value(const Rotation& a,const Twist& b) {
00807 return a*b;
00808 }
00809
00810 INLINE2 static derivType derivVV(const Rotation& a,const Vector& da,const Twist& b,const Twist& db) {
00811 return Twist(
00812 a*db.vel+da*(a*b.vel),
00813 a*db.rot+da*(a*b.rot)
00814 );
00815 }
00816 INLINE2 static derivType derivCV(const Rotation& a,const Twist& ,const Twist& db) {
00817 return Twist(
00818 a*db.vel,
00819 a*db.rot
00820 );
00821 }
00822 INLINE2 static derivType derivVC(const Rotation& a,const Vector& da,const Twist& b) {
00823 return Twist(
00824 da*(a*b.vel),
00825 da*(a*b.rot)
00826 );
00827
00828 }
00829 };
00830 DEFBINARY_RTYPE(operator*,OpMult,Ref<Jacobian<Twist> >)
00831 DEFBINARY_RLTYPE(operator*,OpMult,Ref<Jacobian<Rotation> >,Ref<Jacobian<Twist> >)
00832
00833
00834 template <>
00835 class BinaryOp<OpMult,Twist,double> {
00836 public:
00837 typedef Twist exprType;
00838 typedef Twist valueType;
00839 typedef Twist derivType;
00840 INLINE2 static valueType value(const Twist& a,double b) {
00841 return a*b;
00842 }
00843
00844 INLINE2 static derivType derivVV(const Twist& a,const Twist& da,double b,double db) {
00845 return a*db+da*b;
00846 }
00847 INLINE2 static derivType derivCV(const Twist& a,double ,double db) {
00848 return a*db;
00849 }
00850 INLINE2 static derivType derivVC(const Twist& ,const Twist& da,double b) {
00851 return da*b;
00852 }
00853 };
00854
00855 DEFBINARY_RLTYPE(operator*,OpMult,Ref<Jacobian<Twist> >,Ref<Jacobian<double> >)
00856
00857
00858 template <>
00859 class BinaryOp<OpMult,double,Twist> {
00860 public:
00861 typedef Twist exprType;
00862 typedef Twist valueType;
00863 typedef Twist derivType;
00864 INLINE2 static valueType value(double a,const Twist& b) {
00865 return a*b;
00866 }
00867
00868 INLINE2 static derivType derivVV(double a,double da,const Twist& b,const Twist& db) {
00869 return a*db+da*b;
00870 }
00871 INLINE2 static derivType derivCV(double a,const Twist& ,const Twist& db) {
00872 return a*db;
00873 }
00874 INLINE2 static derivType derivVC(double ,double da,const Twist& b) {
00875 return da*b;
00876 }
00877 };
00878
00879 DEFBINARY_RLTYPE(operator*,OpMult,Ref<Jacobian<double> >,Ref<Jacobian<Twist> >)
00880
00881 template <>
00882 class BinaryOp<OpRefPoint,Twist,Vector> {
00883 public:
00884 typedef Twist exprType;
00885 typedef Twist valueType;
00886 typedef Twist derivType;
00887 INLINE2 static valueType value(const Twist& a,const Vector& b) {
00888
00889 return a.RefPoint(b);
00890 }
00891
00892 INLINE2 static derivType derivVV(
00893 const Twist& a,const Twist& da,
00894 const Vector& b,const Vector& db)
00895 {
00896 return Twist(
00897 da.vel + da.rot*b + a.rot*db,
00898 da.rot
00899 );
00900 }
00901 INLINE2 static derivType derivCV(const Twist& a,const Vector& ,const Vector& db) {
00902 return Twist(
00903 a.rot*db,
00904 Vector::Zero()
00905 );
00906 }
00907 INLINE2 static derivType derivVC(const Twist& ,const Twist& da,const Vector& b) {
00908 return Twist(
00909 da.vel + da.rot*b,
00910 da.rot
00911 );
00912 }
00913 };
00914
00915 DEFBINARY_LTYPE(RefPoint,OpRefPoint,Ref<Jacobian<Twist> >)
00916 DEFBINARY_RTYPE(RefPoint,OpRefPoint,Ref<Jacobian<Vector> >)
00917 DEFBINARY_RLTYPE(RefPoint,OpRefPoint,Ref<Jacobian<Twist> >,Ref<Jacobian<Vector> >)
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929 template <>
00930 class UnaryOp<OpNegate,Wrench> {
00931 public:
00932 typedef Wrench exprType;
00933 typedef Wrench valueType;
00934 typedef Wrench derivType;
00935 static INLINE2 valueType value(const Wrench& F) {
00936 return -F;
00937 }
00938 static INLINE2 derivType deriv(const Wrench& ,const Wrench& da) {
00939 return -da;
00940 }
00941 };
00942
00943 DEFUNARY_TYPE(operator-,OpNegate,Ref< Jacobian<Wrench> >)
00944
00945
00946
00947 template <>
00948 class BinaryOp<OpAdd,Wrench,Wrench> {
00949 public:
00950 typedef Wrench exprType;
00951 typedef Wrench valueType;
00952 typedef Wrench derivType;
00953 INLINE2 static valueType value(const Wrench& a,const Wrench& b) {
00954 return a+b;
00955 }
00956
00957 INLINE2 static derivType derivVV(const Wrench&,const Wrench& da,const Wrench&,const Wrench& db) {
00958 return da+db;
00959 }
00960 INLINE2 static derivType derivCV(const Wrench& ,const Wrench& ,const Wrench& db) {
00961 return db;
00962 }
00963 INLINE2 static derivType derivVC(const Wrench& ,const Wrench& da,const Wrench& ) {
00964 return da;
00965 }
00966 };
00967 DEFBINARY_RTYPE(operator+,OpAdd,Ref<Jacobian<Wrench> >)
00968 DEFBINARY_RLTYPE(operator+,OpAdd,Ref<Jacobian<Wrench> >,Ref<Jacobian<Wrench> >)
00969
00970
00971 template <>
00972 class BinaryOp<OpSub,Wrench,Wrench> {
00973 public:
00974 typedef Wrench exprType;
00975 typedef Wrench valueType;
00976 typedef Wrench derivType;
00977 INLINE2 static valueType value(const Wrench& a,const Wrench& b) {
00978 return a-b;
00979 }
00980
00981 INLINE2 static derivType derivVV(const Wrench&,const Wrench& da,const Wrench&,const Wrench& db) {
00982 return da-db;
00983 }
00984 INLINE2 static derivType derivCV(const Wrench& ,const Wrench& ,const Wrench& db) {
00985 return -db;
00986 }
00987 INLINE2 static derivType derivVC(const Wrench& ,const Wrench& da,const Wrench& ) {
00988 return da;
00989 }
00990 };
00991 DEFBINARY_RTYPE(operator-,OpSub,Ref<Jacobian<Wrench> >)
00992 DEFBINARY_RLTYPE(operator-,OpSub,Ref<Jacobian<Wrench> >,Ref<Jacobian<Wrench> >)
00993
00994 template <>
00995 class BinaryOp<OpMult,Rotation,Wrench> {
00996 public:
00997 typedef Wrench exprType;
00998 typedef Wrench valueType;
00999 typedef Wrench derivType;
01000 INLINE2 static valueType value(const Rotation& a,const Wrench& b) {
01001 return a*b;
01002 }
01003
01004 INLINE2 static derivType derivVV(const Rotation& a,const Vector& da,const Wrench& b,const Wrench& db) {
01005 return Wrench(
01006 a*db.force+da*(a*b.force),
01007 a*db.torque+da*(a*b.torque)
01008 );
01009 }
01010 INLINE2 static derivType derivCV(const Rotation& a,const Wrench& ,const Wrench& db) {
01011 return Wrench(
01012 a*db.force,
01013 a*db.torque
01014 );
01015 }
01016 INLINE2 static derivType derivVC(const Rotation& a,const Vector& da,const Wrench& b) {
01017 return Wrench(
01018 da*(a*b.force),
01019 da*(a*b.torque)
01020 );
01021
01022 }
01023 };
01024 DEFBINARY_RTYPE(operator*,OpMult,Ref<Jacobian<Wrench> >)
01025 DEFBINARY_RLTYPE(operator*,OpMult,Ref<Jacobian<Rotation> >,Ref<Jacobian<Wrench> >)
01026
01027
01028 template <>
01029 class BinaryOp<OpMult,Wrench,double> {
01030 public:
01031 typedef Wrench exprType;
01032 typedef Wrench valueType;
01033 typedef Wrench derivType;
01034 INLINE2 static valueType value(const Wrench& a,double b) {
01035 return a*b;
01036 }
01037
01038 INLINE2 static derivType derivVV(const Wrench& a,const Wrench& da,double b,double db) {
01039 return a*db+da*b;
01040 }
01041 INLINE2 static derivType derivCV(const Wrench& a,double ,double db) {
01042 return a*db;
01043 }
01044 INLINE2 static derivType derivVC(const Wrench& ,const Wrench& da,double b) {
01045 return da*b;
01046 }
01047 };
01048
01049 DEFBINARY_RLTYPE(operator*,OpMult,Ref<Jacobian<Wrench> >,Ref<Jacobian<double> >)
01050
01051
01052 template <>
01053 class BinaryOp<OpMult,double,Wrench> {
01054 public:
01055 typedef Wrench exprType;
01056 typedef Wrench valueType;
01057 typedef Wrench derivType;
01058 INLINE2 static valueType value(double a,const Wrench& b) {
01059 return a*b;
01060 }
01061
01062 INLINE2 static derivType derivVV(double a,double da,const Wrench& b,const Wrench& db) {
01063 return a*db+da*b;
01064 }
01065 INLINE2 static derivType derivCV(double a,const Wrench& ,const Wrench& db) {
01066 return a*db;
01067 }
01068 INLINE2 static derivType derivVC(double ,double da,const Wrench& b) {
01069 return da*b;
01070 }
01071 };
01072
01073 DEFBINARY_RLTYPE(operator*,OpMult,Ref<Jacobian<double> >,Ref<Jacobian<Wrench> >)
01074
01075 template <>
01076 class BinaryOp<OpRefPoint,Wrench,Vector> {
01077 public:
01078 typedef Wrench exprType;
01079 typedef Wrench valueType;
01080 typedef Wrench derivType;
01081 INLINE2 static valueType value(const Wrench& a,const Vector& b) {
01082
01083 return a.RefPoint(b);
01084 }
01085
01086 INLINE2 static derivType derivVV(
01087 const Wrench& a,const Wrench& da,
01088 const Vector& b,const Vector& db)
01089 {
01090 return Wrench(
01091 da.force,
01092 da.torque + da.force*b + a.force*db
01093 );
01094 }
01095 INLINE2 static derivType derivCV(const Wrench& a,const Vector& ,const Vector& db) {
01096 return Wrench(
01097 Vector::Zero(),
01098 a.force*db
01099 );
01100 }
01101 INLINE2 static derivType derivVC(const Wrench& ,const Wrench& da,const Vector& b) {
01102 return Wrench(
01103 da.force,
01104 da.torque + da.force*b
01105 );
01106 }
01107 };
01108
01109 DEFBINARY_LTYPE(RefPoint,OpRefPoint,Ref<Jacobian<Wrench> >)
01110
01111 DEFBINARY_RLTYPE(RefPoint,OpRefPoint,Ref<Jacobian<Wrench> >,Ref<Jacobian<Vector> >)
01112
01113
01118 template <>
01119 class BinaryOp<OpMult,Stiffness,Twist> {
01120 public:
01121 typedef Wrench exprType;
01122 typedef Wrench valueType;
01123 typedef Wrench derivType;
01124 INLINE2 static valueType value(const Stiffness& a,const Twist& b) {
01125
01126 return a*b;
01127 }
01128
01129 INLINE2 static derivType derivVV(
01130 const Stiffness& a,const Stiffness& da,
01131 const Twist& b,const Twist& db)
01132 {
01133
01134 return a*db+da*b;
01135 }
01136 INLINE2 static derivType derivCV(const Stiffness& a,const Twist& ,const Twist& db) {
01137 return a*db;
01138 }
01139 INLINE2 static derivType derivVC(const Stiffness& ,const Stiffness& da,const Twist& b) {
01140
01141 return da*b;
01142 }
01143 };
01144
01145 DEFBINARY_LTYPE(operator*,OpMult,Ref<Cnst<Stiffness> >)
01146
01147 DEFBINARY_RLTYPE(operator*,OpMult,Ref<Cnst<Stiffness> >,Ref<Jacobian<Twist> >)
01148
01149
01150
01151 template <>
01152 class BinaryOp<OpInverse,Stiffness,Wrench> {
01153 public:
01154 typedef Twist exprType;
01155 typedef Twist valueType;
01156 typedef Twist derivType;
01157 INLINE2 static valueType value(const Stiffness& a,const Wrench& b) {
01158
01159 return a.Inverse(b);
01160 }
01161
01162 INLINE2 static derivType derivVV(
01163 const Stiffness& ,const Stiffness& da,
01164 const Wrench& b,const Wrench& )
01165 {
01166
01167 return da.Inverse(b);
01168 }
01169 INLINE2 static derivType derivCV(const Stiffness& a,const Wrench& ,const Wrench& db) {
01170 return a.Inverse(db);
01171 }
01172 INLINE2 static derivType derivVC(const Stiffness& ,const Stiffness& da,const Wrench& b) {
01173
01174 return da.Inverse(b);
01175 }
01176 };
01177
01178
01179
01180 DEFBINARY_RLTYPE(Inverse,OpInverse,Ref<Cnst<Stiffness> >,Ref<Jacobian<Wrench> >)
01181
01182
01183
01184
01185
01193 int GetEulerZYX(const Jacobian<Rotation>& JR,
01194 Jacobian<double>& gamma,
01195 Jacobian<double>& beta,
01196 Jacobian<double>& alpha,
01197 double eps=epsilon);
01198
01199
01207 void SetEulerZYX(const Jacobian<double>& gamma,
01208 const Jacobian<double>& beta,
01209 const Jacobian<double>& alpha,
01210 Jacobian<Rotation>& JR);
01219 inline int GetRPY(const Jacobian<Rotation>& JR,
01220 Jacobian<double>& roll,
01221 Jacobian<double>& pitch,
01222 Jacobian<double>& yaw,
01223 double eps=epsilon) {
01224 return GetEulerZYX(JR,roll,pitch,yaw);
01225 }
01226
01227
01235 inline void SetRPY(const Jacobian<double>& roll,
01236 const Jacobian<double>& pitch,
01237 const Jacobian<double>& yaw,
01238 Jacobian<Rotation>& JR) {
01239 SetEulerZYX(roll,pitch,yaw,JR);
01240 }
01241
01242
01243 }
01244
01245 #endif
01246
01247
01248