00001 #ifndef SimTK_SIMBODY_CONSTRAINT_H_
00002 #define SimTK_SIMBODY_CONSTRAINT_H_
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
00045 #include "SimTKmath.h"
00046 #include "simbody/internal/common.h"
00047
00048 #include <cassert>
00049
00050 namespace SimTK {
00051
00052 class SimbodyMatterSubsystem;
00053 class SimbodyMatterSubtree;
00054 class MobilizedBody;
00055 class Constraint;
00056 class ConstraintImpl;
00057
00058
00059
00060
00061 #ifndef SimTK_SIMBODY_DEFINING_CONSTRAINT
00062 extern template class PIMPLHandle<Constraint, ConstraintImpl, true>;
00063 #endif
00064
00066
00068
00074 class SimTK_SIMBODY_EXPORT Constraint : public PIMPLHandle<Constraint, ConstraintImpl, true> {
00075 public:
00076 Constraint() { }
00077 explicit Constraint(ConstraintImpl* r) : HandleBase(r) { }
00078
00082 void disable(State&) const;
00089 void enable(State&) const;
00091 bool isDisabled(const State&) const;
00095 bool isDisabledByDefault() const;
00096
00100 void setDisabledByDefault(bool shouldBeDisabled);
00101
00102
00103 operator ConstraintIndex() const {return getConstraintIndex();}
00104
00105
00106 ConstraintIndex getConstraintIndex() const;
00107 const SimbodyMatterSubsystem& getMatterSubsystem() const;
00108 SimbodyMatterSubsystem& updMatterSubsystem();
00109
00110 bool isInSubsystem() const;
00111 bool isInSameSubsystem(const MobilizedBody&) const;
00112
00113
00114
00120 int getNumConstrainedBodies() const;
00121
00124 const MobilizedBody&
00125 getMobilizedBodyFromConstrainedBody(ConstrainedBodyIndex) const;
00126
00131 const MobilizedBody& getAncestorMobilizedBody() const;
00132
00137 int getNumConstrainedMobilizers() const;
00138
00142 const MobilizedBody&
00143 getMobilizedBodyFromConstrainedMobilizer(ConstrainedMobilizerIndex) const;
00144
00145 const SimbodyMatterSubtree& getSubtree() const;
00146
00147
00148
00153 int getNumConstrainedQ(const State&, ConstrainedMobilizerIndex) const;
00158 int getNumConstrainedU(const State&, ConstrainedMobilizerIndex) const;
00159
00166 ConstrainedUIndex getConstrainedUIndex
00167 (const State&, ConstrainedMobilizerIndex, MobilizerUIndex which) const;
00174 ConstrainedQIndex getConstrainedQIndex
00175 (const State&, ConstrainedMobilizerIndex, MobilizerQIndex which) const;
00176
00179 int getNumConstrainedQ(const State&) const;
00180
00185 int getNumConstrainedU(const State&) const;
00186
00190 void getNumConstraintEquationsInUse(const State&, int& mp, int& mv, int& ma) const;
00191
00192
00193
00194
00195
00198 Vector getPositionErrorsAsVector(const State&) const;
00199 Vector calcPositionErrorFromQ(const State&, const Vector& q) const;
00200
00201
00202 Matrix calcPositionConstraintMatrixP(const State&) const;
00203 Matrix calcPositionConstraintMatrixPt(const State&) const;
00204
00205
00206 Matrix calcPositionConstraintMatrixPNInv(const State&) const;
00207
00221 void calcConstraintForcesFromMultipliers(const State&,
00222 const Vector& lambda,
00223 Vector_<SpatialVec>& bodyForcesInA,
00224 Vector& mobilityForces) const;
00225
00226
00229 Vector getVelocityErrorsAsVector(const State&) const;
00230 Vector calcVelocityErrorFromU(const State&,
00231 const Vector& u) const;
00232
00233
00234
00235 Matrix calcVelocityConstraintMatrixV(const State&) const;
00236 Matrix calcVelocityConstraintMatrixVt(const State&) const;
00237
00238
00239
00240
00241
00245 Vector getAccelerationErrorsAsVector(const State&) const;
00246 Vector calcAccelerationErrorFromUDot(const State&,
00247 const Vector& udot) const;
00248
00252 Vector getMultipliersAsVector(const State&) const;
00253
00254
00255
00256 Matrix calcAccelerationConstraintMatrixA(const State&) const;
00257 Matrix calcAccelerationConstraintMatrixAt(const State&) const;
00258
00259
00260
00261 class Rod; typedef Rod ConstantDistance;
00262 class Ball; typedef Ball CoincidentPoints;
00263 class Weld; typedef Weld CoincidentFrames;
00264 class PointInPlane;
00265 class PointOnLine;
00266 class ConstantAngle;
00267 class ConstantOrientation;
00268 class NoSlip1D;
00269 class ConstantSpeed;
00270 class ConstantAcceleration;
00271 class Custom;
00272 class CoordinateCoupler;
00273 class SpeedCoupler;
00274 class PrescribedMotion;
00275
00276 class RodImpl;
00277 class BallImpl;
00278 class WeldImpl;
00279 class PointInPlaneImpl;
00280 class PointOnLineImpl;
00281 class ConstantAngleImpl;
00282 class ConstantOrientationImpl;
00283 class NoSlip1DImpl;
00284 class ConstantSpeedImpl;
00285 class ConstantAccelerationImpl;
00286 class CustomImpl;
00287 class CoordinateCouplerImpl;
00288 class SpeedCouplerImpl;
00289 class PrescribedMotionImpl;
00290 };
00291
00293
00295
00311 class SimTK_SIMBODY_EXPORT Constraint::Rod : public Constraint {
00312 public:
00313
00314 Rod(MobilizedBody& body1, MobilizedBody& body2,
00315 Real defaultLength=1);
00316 Rod(MobilizedBody& body1, const Vec3& defaultPoint1,
00317 MobilizedBody& body2, const Vec3& defaultPoint2,
00318 Real defaultLength=1);
00319
00320
00321 Rod& setDefaultPointOnBody1(const Vec3&);
00322 Rod& setDefaultPointOnBody2(const Vec3&);
00323 Rod& setDefaultRodLength(Real);
00324
00325
00326 MobilizedBodyIndex getBody1MobilizedBodyIndex() const;
00327 MobilizedBodyIndex getBody2MobilizedBodyIndex() const;
00328 const Vec3& getDefaultPointOnBody1() const;
00329 const Vec3& getDefaultPointOnBody2() const;
00330 Real getDefaultRodLength() const;
00331
00332
00333 const Vec3& getPointOnBody1(const State&) const;
00334 const Vec3& getPointOnBody2(const State&) const;
00335 Real getRodLength (const State&) const;
00336
00337
00338 Real getPositionError(const State&) const;
00339 Real getVelocityError(const State&) const;
00340
00341
00342 Real getAccelerationError(const State&) const;
00343 Real getMultiplier(const State&) const;
00344 Real getRodTension(const State&) const;
00345 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(Rod, RodImpl, Constraint);
00346 };
00347
00349
00351
00362 class SimTK_SIMBODY_EXPORT Constraint::PointInPlane : public Constraint {
00363 public:
00364
00365 PointInPlane(MobilizedBody& planeBody_B, const UnitVec3& defaultPlaneNormal_B, Real defaultHeight,
00366 MobilizedBody& followerBody_F, const Vec3& defaultFollowerPoint_F);
00367
00368
00369
00370
00371 PointInPlane& setPlaneDisplayHalfWidth(Real);
00372 PointInPlane& setPointDisplayRadius(Real);
00373 Real getPlaneDisplayHalfWidth() const;
00374 Real getPointDisplayRadius() const;
00375
00376
00377 PointInPlane& setDefaultPlaneNormal(const UnitVec3&);
00378 PointInPlane& setDefaultPlaneHeight(Real);
00379 PointInPlane& setDefaultFollowerPoint(const Vec3&);
00380
00381
00382 MobilizedBodyIndex getPlaneMobilizedBodyIndex() const;
00383 MobilizedBodyIndex getFollowerMobilizedBodyIndex() const;
00384
00385 const UnitVec3& getDefaultPlaneNormal() const;
00386 Real getDefaultPlaneHeight() const;
00387 const Vec3& getDefaultFollowerPoint() const;
00388
00389
00390 const UnitVec3& getPlaneNormal(const State&) const;
00391 Real getPlaneHeight(const State&) const;
00392 const Vec3& getFollowerPoint(const State&) const;
00393
00394
00395 Real getPositionError(const State&) const;
00396 Real getVelocityError(const State&) const;
00397
00398
00399 Real getAccelerationError(const State&) const;
00400 Real getMultiplier(const State&) const;
00401 Real getForceOnFollowerPoint(const State&) const;
00402 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(PointInPlane, PointInPlaneImpl, Constraint);
00403 };
00404
00406
00408
00419 class SimTK_SIMBODY_EXPORT Constraint::PointOnLine : public Constraint {
00420 public:
00421
00422 PointOnLine(MobilizedBody& lineBody_B, const UnitVec3& defaultLineDirection_B, const Vec3& defaultPointOnLine_B,
00423 MobilizedBody& followerBody_F, const Vec3& defaultFollowerPoint_F);
00424
00425
00426
00427
00428 PointOnLine& setLineDisplayHalfLength(Real);
00429 PointOnLine& setPointDisplayRadius(Real);
00430 Real getLineDisplayHalfLength() const;
00431 Real getPointDisplayRadius() const;
00432
00433
00434 PointOnLine& setDefaultLineDirection(const UnitVec3&);
00435 PointOnLine& setDefaultPointOnLine(const Vec3&);
00436 PointOnLine& setDefaultFollowerPoint(const Vec3&);
00437
00438
00439 MobilizedBodyIndex getLineMobilizedBodyIndex() const;
00440 MobilizedBodyIndex getFollowerMobilizedBodyIndex() const;
00441
00442 const UnitVec3& getDefaultLineDirection() const;
00443 const Vec3& getDefaultPointOnLine() const;
00444 const Vec3& getDefaultFollowerPoint() const;
00445
00446
00447 const UnitVec3& getLineDirection(const State&) const;
00448 const Vec3& getPointOnLine(const State&) const;
00449 const Vec3& getFollowerPoint(const State&) const;
00450
00451
00452 Vec2 getPositionErrors(const State&) const;
00453 Vec2 getVelocityErrors(const State&) const;
00454
00455
00456 Vec2 getAccelerationErrors(const State&) const;
00457 Vec2 getMultipliers(const State&) const;
00458 const Vec2& getForceOnFollowerPoint(const State&) const;
00459 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(PointOnLine, PointOnLineImpl, Constraint);
00460 };
00461
00463
00465
00494 class SimTK_SIMBODY_EXPORT Constraint::ConstantAngle : public Constraint {
00495 public:
00496
00497 ConstantAngle(MobilizedBody& baseBody_B, const UnitVec3& defaultAxis_B,
00498 MobilizedBody& followerBody_F, const UnitVec3& defaultAxis_F,
00499 Real angle = Pi/2);
00500
00501
00502 ConstantAngle& setAxisDisplayLength(Real);
00503 ConstantAngle& setAxisDisplayWidth(Real);
00504 Real getAxisDisplayLength() const;
00505 Real getAxisDisplayWidth() const;
00506
00507
00508 ConstantAngle& setDefaultBaseAxis(const UnitVec3&);
00509 ConstantAngle& setDefaultFollowerAxis(const UnitVec3&);
00510 ConstantAngle& setDefaultAngle(Real);
00511
00512
00513 MobilizedBodyIndex getBaseMobilizedBodyIndex() const;
00514 MobilizedBodyIndex getFollowerMobilizedBodyIndex() const;
00515
00516 const UnitVec3& getDefaultBaseAxis() const;
00517 const UnitVec3& getDefaultFollowerAxis() const;
00518 Real getDefaultAngle() const;
00519
00520
00521 const UnitVec3& getBaseAxis(const State&) const;
00522 const UnitVec3& getFollowerAxis(const State&) const;
00523 Real getAngle(const State&) const;
00524
00525
00526 Real getPositionError(const State&) const;
00527 Real getVelocityError(const State&) const;
00528
00529
00530 Real getAccelerationError(const State&) const;
00531 Real getMultiplier(const State&) const;
00532 Real getTorqueOnFollowerBody(const State&) const;
00533 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(ConstantAngle, ConstantAngleImpl, Constraint);
00534 };
00535
00537
00539
00553 class SimTK_SIMBODY_EXPORT Constraint::Ball : public Constraint {
00554 public:
00555
00556 Ball(MobilizedBody& body1, MobilizedBody& body2);
00557 Ball(MobilizedBody& body1, const Vec3& defaultPoint1,
00558 MobilizedBody& body2, const Vec3& defaultPoint2);
00559
00560
00561 Ball& setDefaultPointOnBody1(const Vec3&);
00562 Ball& setDefaultPointOnBody2(const Vec3&);
00563
00564
00565 Ball& setDefaultRadius(Real r);
00566 Real getDefaultRadius() const;
00567
00568
00569 MobilizedBodyIndex getBody1MobilizedBodyIndex() const;
00570 MobilizedBodyIndex getBody2MobilizedBodyIndex() const;
00571 const Vec3& getDefaultPointOnBody1() const;
00572 const Vec3& getDefaultPointOnBody2() const;
00573
00574
00575 const Vec3& getPointOnBody1(const State&) const;
00576 const Vec3& getPointOnBody2(const State&) const;
00577
00578
00579 Vec3 getPositionErrors(const State&) const;
00580 Vec3 getVelocityErrors(const State&) const;
00581
00582
00583 Vec3 getAccelerationErrors(const State&) const;
00584 Vec3 getMultipliers(const State&) const;
00585
00586
00587 const Vec3& getBallReactionForceOnBody1(const State&) const;
00588 const Vec3& getBallReactionForceOnBody2(const State&) const;
00589 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(Ball, BallImpl, Constraint);
00590 };
00591
00593
00595
00612 class SimTK_SIMBODY_EXPORT Constraint::ConstantOrientation : public Constraint
00613 {
00614 public:
00615
00616 ConstantOrientation(MobilizedBody& baseBody_B, const Rotation& defaultRB,
00617 MobilizedBody& followerBody_F, const Rotation& defaultRF);
00618
00619
00620
00621
00622 ConstantOrientation& setDefaultBaseRotation(const Rotation&);
00623 ConstantOrientation& setDefaultFollowerRotation(const Rotation&);
00624
00625
00626 MobilizedBodyIndex getBaseMobilizedBodyIndex() const;
00627 MobilizedBodyIndex getFollowerMobilizedBodyIndex() const;
00628
00629 const Rotation& getDefaultBaseRotation() const;
00630 const Rotation& getDefaultFollowerRotation() const;
00631
00632
00633 const Rotation& getBaseRotation(const State&) const;
00634 const Rotation& getFollowerRotation(const State&) const;
00635
00636
00637 Vec3 getPositionErrors(const State&) const;
00638 Vec3 getVelocityErrors(const State&) const;
00639
00640
00641 Vec3 getAccelerationErrors(const State&) const;
00642 Vec3 getMultipliers(const State&) const;
00643 Vec3 getTorqueOnFollowerBody(const State&) const;
00644 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(ConstantOrientation, ConstantOrientationImpl, Constraint);
00645 };
00646
00648
00650
00674 class SimTK_SIMBODY_EXPORT Constraint::Weld : public Constraint {
00675 public:
00676
00677
00680 Weld(MobilizedBody& body1, MobilizedBody& body2);
00681
00686 Weld(MobilizedBody& body1, const Transform& frame1,
00687 MobilizedBody& body2, const Transform& frame2);
00688
00689
00690
00694 Weld& setAxisDisplayLength(Real r);
00695
00699 Real getAxisDisplayLength() const;
00700
00701
00702
00706 Weld& setDefaultFrameOnBody1(const Transform&);
00707
00709 const Transform& getDefaultFrameOnBody1() const;
00710
00714 Weld& setDefaultFrameOnBody2(const Transform&);
00715
00717 const Transform& getDefaultFrameOnBody2() const;
00718
00719
00720
00721
00723 MobilizedBodyIndex getBody1MobilizedBodyIndex() const;
00724
00726 MobilizedBodyIndex getBody2MobilizedBodyIndex() const;
00727
00728
00729
00730 const Transform& getFrameOnBody1(const State&) const;
00731 const Transform& getFrameOnBody2(const State&) const;
00732
00733
00734 Vec6 getPositionErrors(const State&) const;
00735 Vec6 getVelocityErrors(const State&) const;
00736
00737
00738 Vec6 getAccelerationErrors(const State&) const;
00739 Vec6 getMultipliers(const State&) const;
00740
00741
00742 const SpatialVec& getWeldReactionOnBody1(const State&) const;
00743 const SpatialVec& getWeldReactionOnBody2(const State&) const;
00744 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(Weld, WeldImpl, Constraint);
00745 };
00746
00748
00750
00762 class SimTK_SIMBODY_EXPORT Constraint::NoSlip1D : public Constraint {
00763 public:
00764
00765 NoSlip1D(MobilizedBody& caseBodyC, const Vec3& P_C, const UnitVec3& n_C,
00766 MobilizedBody& movingBody0, MobilizedBody& movingBody1);
00767
00768
00769
00770
00771 NoSlip1D& setDirectionDisplayLength(Real);
00772 NoSlip1D& setPointDisplayRadius(Real);
00773 Real getDirectionDisplayLength() const;
00774 Real getPointDisplayRadius() const;
00775
00776
00777 NoSlip1D& setDefaultDirection(const UnitVec3&);
00778 NoSlip1D& setDefaultContactPoint(const Vec3&);
00779
00780
00781 MobilizedBodyIndex getCaseMobilizedBodyIndex() const;
00782 MobilizedBodyIndex getMovingBodyMobilizedBodyIndex(int which) const;
00783
00784 const UnitVec3& getDefaultDirection() const;
00785 const Vec3& getDefaultContactPoint() const;
00786
00787
00788 const UnitVec3& getDirection(const State&) const;
00789 const Vec3& getContactPoint(const State&) const;
00790
00791
00792
00793 Real getVelocityError(const State&) const;
00794
00795
00796 Real getAccelerationError(const State&) const;
00797 Real getMultiplier(const State&) const;
00798 Real getForceAtContactPoint(const State&) const;
00799 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(NoSlip1D, NoSlip1DImpl, Constraint);
00800 };
00801
00803
00805
00812 class SimTK_SIMBODY_EXPORT Constraint::ConstantSpeed : public Constraint
00813 {
00814 public:
00815
00818 ConstantSpeed(MobilizedBody& mobilizer, MobilizerUIndex, Real speed);
00821 ConstantSpeed(MobilizedBody& mobilizer, Real speed);
00822
00823
00824 MobilizedBodyIndex getMobilizedBodyIndex() const;
00825 MobilizerUIndex getWhichU() const;
00826 Real getDefaultSpeed() const;
00827
00828
00829
00830 Real getVelocityError(const State&) const;
00831
00832
00833 Real getAccelerationError(const State&) const;
00834 Real getMultiplier(const State&) const;
00835 Real getGeneralizedForce(const State&) const;
00836
00838 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS
00839 (ConstantSpeed, ConstantSpeedImpl, Constraint);
00841 };
00842
00844
00846
00854 class SimTK_SIMBODY_EXPORT Constraint::ConstantAcceleration : public Constraint
00855 {
00856 public:
00857
00860 ConstantAcceleration(MobilizedBody& mobilizer, MobilizerUIndex,
00861 Real defaultAcceleration);
00864 ConstantAcceleration(MobilizedBody& mobilizer,
00865 Real defaultAcceleration);
00866
00867
00868 MobilizedBodyIndex getMobilizedBodyIndex() const;
00869 MobilizerUIndex getWhichU() const;
00870 Real getDefaultAcceleration() const;
00871 ConstantAcceleration& setDefaultAcceleration(Real accel);
00872
00875 void setAcceleration(State& state, Real accel) const;
00876 Real getAcceleration(const State& state) const;
00877
00878
00879
00880
00881
00882 Real getAccelerationError(const State&) const;
00883 Real getMultiplier(const State&) const;
00884 Real getGeneralizedForce(const State&) const;
00885
00887 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS
00888 (ConstantAcceleration, ConstantAccelerationImpl, Constraint);
00890 };
00891
00926 class SimTK_SIMBODY_EXPORT Constraint::Custom : public Constraint {
00927 public:
00928 class Implementation;
00929 class ImplementationImpl;
00930
00938 explicit Custom(Implementation* implementation);
00939 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(Custom, CustomImpl, Constraint);
00940 protected:
00941 const Implementation& getImplementation() const;
00942 Implementation& updImplementation();
00943
00944 Custom() {}
00945 };
00946
00947
00948
00949
00950 #ifndef SimTK_SIMBODY_DEFINING_CONSTRAINT
00951 extern template class PIMPLHandle<Constraint::Custom::Implementation,
00952 Constraint::Custom::ImplementationImpl>;
00953 #endif
00954
00955 class SimTK_SIMBODY_EXPORT Constraint::Custom::Implementation
00956 : public PIMPLHandle<Implementation,ImplementationImpl> {
00957 public:
00958
00959
00960
00963 virtual ~Implementation() { }
00964
00970 virtual Implementation* clone() const = 0;
00971
00976 Implementation(SimbodyMatterSubsystem&, int mp, int mv, int ma);
00977
00982 explicit Implementation(SimbodyMatterSubsystem&);
00983
00984 const SimbodyMatterSubsystem& getMatterSubsystem() const;
00985
00986
00987
00994 void invalidateTopologyCache() const;
00995
01000 Implementation& setDefaultNumConstraintEquations(int mp, int mv, int ma);
01001
01006 Implementation& setDisabledByDefault(bool shouldBeDisabled);
01007
01013 ConstrainedBodyIndex addConstrainedBody(const MobilizedBody&);
01014
01021 ConstrainedMobilizerIndex addConstrainedMobilizer(const MobilizedBody&);
01022
01023 MobilizedBodyIndex
01024 getMobilizedBodyIndexOfConstrainedBody(ConstrainedBodyIndex) const;
01025 MobilizedBodyIndex
01026 getMobilizedBodyIndexOfConstrainedMobilizer(ConstrainedMobilizerIndex) const;
01027
01028
01029
01030
01031
01035 Real getOneQ(const State&, ConstrainedMobilizerIndex, MobilizerQIndex) const;
01041 Real getOneU(const State&, ConstrainedMobilizerIndex, MobilizerUIndex) const;
01042
01047 Real getOneQDot (const State&, ConstrainedMobilizerIndex, MobilizerQIndex, bool realizingVelocity=false) const;
01052 Real getOneQDotDot(const State&, ConstrainedMobilizerIndex, MobilizerQIndex, bool realizingAcceleration=false) const;
01057 Real getOneUDot(const State&, ConstrainedMobilizerIndex, MobilizerUIndex, bool realizingAcceleration=false) const;
01058
01065 void addInOneMobilityForce(const State&,
01066 ConstrainedMobilizerIndex, MobilizerUIndex whichU,
01067 Real force, Vector& mobilityForces) const;
01068
01069
01070
01074 const Transform& getBodyTransform(const State& s, ConstrainedBodyIndex B) const;
01078 const SpatialVec& getBodyVelocity(const State& s, ConstrainedBodyIndex B) const;
01082 const SpatialVec& getBodyAcceleration(const State& s, ConstrainedBodyIndex B) const;
01083
01084
01085
01089 const Rotation& getBodyRotation(const State& s, ConstrainedBodyIndex B) const
01090 {return getBodyTransform(s,B).R();}
01094 const Vec3& getBodyAngularVelocity(const State& s, ConstrainedBodyIndex B) const
01095 {return getBodyVelocity(s,B)[0];}
01099 const Vec3& getBodyAngularAcceleration(const State& s, ConstrainedBodyIndex B) const
01100 {return getBodyAcceleration(s,B)[0];}
01101
01102
01103
01108 const Vec3& getBodyOriginLocation(const State& s, ConstrainedBodyIndex B) const
01109 {return getBodyTransform(s,B).p();}
01114 const Vec3& getBodyOriginVelocity (const State& s, ConstrainedBodyIndex B) const
01115 {return getBodyVelocity(s,B)[1];}
01120 const Vec3& getBodyOriginAcceleration(const State& s, ConstrainedBodyIndex B) const
01121 {return getBodyAcceleration(s,B)[1];}
01122
01123
01124
01131 Vec3 findStationLocation(const State& s, ConstrainedBodyIndex B, const Vec3& p_BS) const {
01132 return getBodyTransform(s,B) * p_BS;
01133 }
01139 Vec3 findStationVelocity(const State& s, ConstrainedBodyIndex B, const Vec3& p_BS) const {
01140 const Vec3 p_AS = getBodyRotation(s,B) * p_BS;
01141 const SpatialVec& V_AB = getBodyVelocity(s,B);
01142 return V_AB[1] + (V_AB[0] % p_AS);
01143 }
01149 Vec3 findStationAcceleration(const State& s, ConstrainedBodyIndex B, const Vec3& p_BS) const {
01150 const Vec3 p_AS = getBodyRotation(s,B) * p_BS;
01151 const Vec3& w_AB = getBodyAngularVelocity(s,B);
01152 const SpatialVec& A_AB = getBodyAcceleration(s,B);
01153 return A_AB[1] + (A_AB[0] % p_AS) + w_AB % (w_AB % p_AS);
01154 }
01155
01156
01157
01162 void addInStationForce(const State& s, ConstrainedBodyIndex B,
01163 const Vec3& p_BS,
01164 const Vec3& forceInA, Vector_<SpatialVec>& bodyForcesInA) const;
01165
01168 void addInBodyTorque(const State& s, ConstrainedBodyIndex B,
01169 const Vec3& torqueInA, Vector_<SpatialVec>& bodyForcesInA) const;
01170
01171
01172 protected:
01181
01183
01184
01185
01186
01187
01188
01189
01190
01191 virtual void realizeTopology(State&) const { }
01192
01201 virtual void realizeModel(State&) const { }
01202
01206 virtual void realizeInstance(const State&) const { }
01207
01212 virtual void realizeTime(const State&) const { }
01213
01220 virtual void realizePosition(const State&) const { }
01221
01228 virtual void realizeVelocity(const State&) const { }
01229
01234 virtual void realizeDynamics(const State&) const { }
01235
01242 virtual void realizeAcceleration(const State&) const { }
01243
01248 virtual void realizeReport(const State&) const { }
01250
01257
01258
01259
01260
01261
01262 virtual void realizePositionErrors(const State&, int mp, Real* perr) const;
01263
01268 virtual void realizePositionDotErrors(const State&, int mp, Real* pverr) const;
01269
01274 virtual void realizePositionDotDotErrors(const State&, int mp, Real* paerr) const;
01275
01290 virtual void applyPositionConstraintForces
01291 (const State&, int mp, const Real* multipliers,
01292 Vector_<SpatialVec>& bodyForces,
01293 Vector& mobilityForces) const;
01295
01298
01299
01300
01301
01302
01303 virtual void realizeVelocityErrors(const State&, int mv, Real* verr) const;
01304
01309 virtual void realizeVelocityDotErrors(const State&, int mv, Real* vaerr) const;
01310
01325 virtual void applyVelocityConstraintForces
01326 (const State&, int mv, const Real* multipliers,
01327 Vector_<SpatialVec>& bodyForces,
01328 Vector& mobilityForces) const;
01330
01333
01334
01335
01336
01337
01338 virtual void realizeAccelerationErrors(const State&, int ma, Real* aerr) const;
01353 virtual void applyAccelerationConstraintForces
01354 (const State&, int ma, const Real* multipliers,
01355 Vector_<SpatialVec>& bodyForces,
01356 Vector& mobilityForces) const;
01358
01365 virtual void calcDecorativeGeometryAndAppend
01366 (const State& s, Stage stage, Array_<DecorativeGeometry>& geom) const
01367 {
01368 }
01369
01370 friend class Constraint::CustomImpl;
01371 };
01372
01382 class SimTK_SIMBODY_EXPORT Constraint::CoordinateCoupler
01383 : public Constraint::Custom {
01384 public:
01397 CoordinateCoupler(SimbodyMatterSubsystem& matter, const Function* function,
01398 const Array_<MobilizedBodyIndex>& coordBody,
01399 const Array_<MobilizerQIndex>& coordIndex);
01400
01402 CoordinateCoupler(SimbodyMatterSubsystem& matter, const Function* function,
01403 const std::vector<MobilizedBodyIndex>& coordBody,
01404 const std::vector<MobilizerQIndex>& coordIndex)
01405 {
01406 new (this) CoordinateCoupler(matter,function,
01407 ArrayViewConst_<MobilizedBodyIndex>(coordBody),
01408 ArrayViewConst_<MobilizerQIndex>(coordIndex));
01409 }
01410 };
01411
01423 class SimTK_SIMBODY_EXPORT Constraint::SpeedCoupler : public Constraint::Custom {
01424 public:
01437 SpeedCoupler(SimbodyMatterSubsystem& matter, const Function* function,
01438 const Array_<MobilizedBodyIndex>& speedBody,
01439 const Array_<MobilizerUIndex>& speedIndex);
01440
01442 SpeedCoupler(SimbodyMatterSubsystem& matter, const Function* function,
01443 const std::vector<MobilizedBodyIndex>& speedBody,
01444 const std::vector<MobilizerUIndex>& speedIndex)
01445 {
01446 new (this) SpeedCoupler(matter, function,
01447 ArrayViewConst_<MobilizedBodyIndex>(speedBody),
01448 ArrayViewConst_<MobilizerUIndex>(speedIndex));
01449 }
01450
01467 SpeedCoupler(SimbodyMatterSubsystem& matter, const Function* function,
01468 const Array_<MobilizedBodyIndex>& speedBody,
01469 const Array_<MobilizerUIndex>& speedIndex,
01470 const Array_<MobilizedBodyIndex>& coordBody,
01471 const Array_<MobilizerQIndex>& coordIndex);
01472
01474 SpeedCoupler(SimbodyMatterSubsystem& matter, const Function* function,
01475 const std::vector<MobilizedBodyIndex>& speedBody,
01476 const std::vector<MobilizerUIndex>& speedIndex,
01477 const std::vector<MobilizedBodyIndex>& coordBody,
01478 const std::vector<MobilizerQIndex>& coordIndex)
01479 {
01480 new (this) SpeedCoupler(matter, function,
01481 ArrayViewConst_<MobilizedBodyIndex>(speedBody),
01482 ArrayViewConst_<MobilizerUIndex>(speedIndex),
01483 ArrayViewConst_<MobilizedBodyIndex>(coordBody),
01484 ArrayViewConst_<MobilizerQIndex>(coordIndex));
01485 }
01486 };
01487
01494 class SimTK_SIMBODY_EXPORT Constraint::PrescribedMotion : public Constraint::Custom {
01495 public:
01506 PrescribedMotion(SimbodyMatterSubsystem& matter, const Function* function,
01507 MobilizedBodyIndex coordBody, MobilizerQIndex coordIndex);
01508 };
01509
01510 }
01511
01512 #endif // SimTK_SIMBODY_CONSTRAINT_H_
01513
01514
01515