Simbody  3.4 (development)
ContactTracker.h
Go to the documentation of this file.
00001 #ifndef SimTK_SIMMATH_CONTACT_TRACKER_SUBSYSTEM_H_
00002 #define SimTK_SIMMATH_CONTACT_TRACKER_SUBSYSTEM_H_
00003 
00004 /* -------------------------------------------------------------------------- *
00005  *                        Simbody(tm): SimTKmath                              *
00006  * -------------------------------------------------------------------------- *
00007  * This is part of the SimTK biosimulation toolkit originating from           *
00008  * Simbios, the NIH National Center for Physics-Based Simulation of           *
00009  * Biological Structures at Stanford, funded under the NIH Roadmap for        *
00010  * Medical Research, grant U54 GM072970. See https://simtk.org/home/simbody.  *
00011  *                                                                            *
00012  * Portions copyright (c) 2010-12 Stanford University and the Authors.        *
00013  * Authors: Michael Sherman, Peter Eastman                                    *
00014  * Contributors:                                                              *
00015  *                                                                            *
00016  * Licensed under the Apache License, Version 2.0 (the "License"); you may    *
00017  * not use this file except in compliance with the License. You may obtain a  *
00018  * copy of the License at http://www.apache.org/licenses/LICENSE-2.0.         *
00019  *                                                                            *
00020  * Unless required by applicable law or agreed to in writing, software        *
00021  * distributed under the License is distributed on an "AS IS" BASIS,          *
00022  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   *
00023  * See the License for the specific language governing permissions and        *
00024  * limitations under the License.                                             *
00025  * -------------------------------------------------------------------------- */
00026 
00027 #include "SimTKcommon.h"
00028 #include "simmath/internal/common.h"
00029 #include "simmath/internal/Contact.h"
00030 
00031 namespace SimTK {
00032 
00033 //==============================================================================
00034 //                              CONTACT TRACKER
00035 //==============================================================================
00062 class SimTK_SIMMATH_EXPORT ContactTracker {
00063 public:
00064 class HalfSpaceSphere;
00065 class HalfSpaceEllipsoid;
00066 class SphereSphere;
00067 class HalfSpaceTriangleMesh;
00068 class SphereTriangleMesh;
00069 class TriangleMeshTriangleMesh;
00070 class ConvexImplicitPair;
00071 class GeneralImplicitPair;
00072 
00074 ContactTracker(ContactGeometryTypeId typeOfSurface1,
00075                ContactGeometryTypeId typeOfSurface2)
00076 :   m_surfaceTypes(typeOfSurface1, typeOfSurface2)
00077 {
00078 }
00079 
00082 const std::pair<ContactGeometryTypeId,ContactGeometryTypeId>&
00083 getContactGeometryTypeIds() const {return m_surfaceTypes;}
00084 
00085 virtual ~ContactTracker() {}
00086 
00092 virtual bool trackContact
00093    (const Contact&         priorStatus,
00094     const Transform& X_GS1, 
00095     const ContactGeometry& surface1,
00096     const Transform& X_GS2, 
00097     const ContactGeometry& surface2,
00098     Real                   cutoff,
00099     Contact&               currentStatus) const = 0;
00100 
00107 virtual bool predictContact
00108    (const Contact&         priorStatus,
00109     const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
00110     const ContactGeometry& surface1,
00111     const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
00112     const ContactGeometry& surface2,
00113     Real                   cutoff,
00114     Real                   intervalOfInterest,
00115     Contact&               predictedStatus) const = 0;
00116 
00122 virtual bool initializeContact
00123    (const Transform& X_GS1, const SpatialVec& V_GS1,
00124     const ContactGeometry& surface1,
00125     const Transform& X_GS2, const SpatialVec& V_GS2,
00126     const ContactGeometry& surface2,
00127     Real                   cutoff,
00128     Real                   intervalOfInterest,
00129     Contact&               contactStatus) const = 0;
00130 
00157 static bool refineImplicitPair
00158    (const ContactGeometry& shapeA, Vec3& pointP_A,    // in/out
00159     const ContactGeometry& shapeB, Vec3& pointQ_B,    // in/out
00160     const Transform& X_AB, Real accuracyRequested,
00161     Real& accuracyAchieved, int& numIterations);
00162 
00164 static Vec6 findImplicitPairError
00165    (const ContactGeometry& shapeA, const Vec3& pointP,
00166     const ContactGeometry& shapeB, const Vec3& pointQ,
00167     const Transform& X_AB);
00168 
00173 static Mat66 calcImplicitPairJacobian
00174    (const ContactGeometry& shapeA, const Vec3& pointP,
00175     const ContactGeometry& shapeB, const Vec3& pointQ,
00176     const Transform& X_AB, const Vec6& err0);
00177 
00188 static bool estimateConvexImplicitPairContactUsingMPR
00189    (const ContactGeometry& shapeA, const ContactGeometry& shapeB, 
00190     const Transform& X_AB,
00191     Vec3& pointP_A, Vec3& pointQ_B, UnitVec3& dirInA,
00192     int& numIterations);
00193 
00194 
00195 //--------------------------------------------------------------------------
00196                                 private:
00197 // This tracker should be called only for surfaces of these two types,
00198 // in this order.
00199 std::pair<ContactGeometryTypeId,ContactGeometryTypeId> m_surfaceTypes;
00200 };
00201 
00202 
00203 
00204 //==============================================================================
00205 //                     HALFSPACE-SPHERE CONTACT TRACKER
00206 //==============================================================================
00209 class SimTK_SIMMATH_EXPORT ContactTracker::HalfSpaceSphere 
00210 :   public ContactTracker {
00211 public:
00212 HalfSpaceSphere() 
00213 :   ContactTracker(ContactGeometry::HalfSpace::classTypeId(),
00214                    ContactGeometry::Sphere::classTypeId()) {}
00215 
00216 virtual ~HalfSpaceSphere() {}
00217 
00218 virtual bool trackContact
00219    (const Contact&         priorStatus,
00220     const Transform& X_GS1, 
00221     const ContactGeometry& surface1,
00222     const Transform& X_GS2, 
00223     const ContactGeometry& surface2,
00224     Real                   cutoff,
00225     Contact&               currentStatus) const;
00226 
00227 virtual bool predictContact
00228    (const Contact&         priorStatus,
00229     const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
00230     const ContactGeometry& surface1,
00231     const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
00232     const ContactGeometry& surface2,
00233     Real                   cutoff,
00234     Real                   intervalOfInterest,
00235     Contact&               predictedStatus) const;
00236 
00237 virtual bool initializeContact
00238    (const Transform& X_GS1, const SpatialVec& V_GS1,
00239     const ContactGeometry& surface1,
00240     const Transform& X_GS2, const SpatialVec& V_GS2,
00241     const ContactGeometry& surface2,
00242     Real                   cutoff,
00243     Real                   intervalOfInterest,
00244     Contact&               contactStatus) const;
00245 };
00246 
00247 
00248 
00249 //==============================================================================
00250 //                     HALFSPACE-ELLIPSOID CONTACT TRACKER
00251 //==============================================================================
00254 class SimTK_SIMMATH_EXPORT ContactTracker::HalfSpaceEllipsoid 
00255 :   public ContactTracker {
00256 public:
00257 HalfSpaceEllipsoid() 
00258 :   ContactTracker(ContactGeometry::HalfSpace::classTypeId(),
00259                    ContactGeometry::Ellipsoid::classTypeId()) {}
00260 
00261 virtual ~HalfSpaceEllipsoid() {}
00262 
00263 virtual bool trackContact
00264    (const Contact&         priorStatus,
00265     const Transform& X_GS1, 
00266     const ContactGeometry& surface1,
00267     const Transform& X_GS2, 
00268     const ContactGeometry& surface2,
00269     Real                   cutoff,
00270     Contact&               currentStatus) const;
00271 
00272 virtual bool predictContact
00273    (const Contact&         priorStatus,
00274     const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
00275     const ContactGeometry& surface1,
00276     const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
00277     const ContactGeometry& surface2,
00278     Real                   cutoff,
00279     Real                   intervalOfInterest,
00280     Contact&               predictedStatus) const;
00281 
00282 virtual bool initializeContact
00283    (const Transform& X_GS1, const SpatialVec& V_GS1,
00284     const ContactGeometry& surface1,
00285     const Transform& X_GS2, const SpatialVec& V_GS2,
00286     const ContactGeometry& surface2,
00287     Real                   cutoff,
00288     Real                   intervalOfInterest,
00289     Contact&               contactStatus) const;
00290 };
00291 
00292 
00293 
00294 //==============================================================================
00295 //                       SPHERE-SPHERE CONTACT TRACKER
00296 //==============================================================================
00299 class SimTK_SIMMATH_EXPORT ContactTracker::SphereSphere 
00300 :   public ContactTracker {
00301 public:
00302 SphereSphere() 
00303 :   ContactTracker(ContactGeometry::Sphere::classTypeId(),
00304                    ContactGeometry::Sphere::classTypeId()) {}
00305 
00306 virtual ~SphereSphere() {}
00307 
00308 virtual bool trackContact
00309    (const Contact&         priorStatus,
00310     const Transform& X_GS1, 
00311     const ContactGeometry& surface1,
00312     const Transform& X_GS2, 
00313     const ContactGeometry& surface2,
00314     Real                   cutoff,
00315     Contact&               currentStatus) const;
00316 
00317 virtual bool predictContact
00318    (const Contact&         priorStatus,
00319     const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
00320     const ContactGeometry& surface1,
00321     const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
00322     const ContactGeometry& surface2,
00323     Real                   cutoff,
00324     Real                   intervalOfInterest,
00325     Contact&               predictedStatus) const;
00326 
00327 virtual bool initializeContact
00328    (const Transform& X_GS1, const SpatialVec& V_GS1,
00329     const ContactGeometry& surface1,
00330     const Transform& X_GS2, const SpatialVec& V_GS2,
00331     const ContactGeometry& surface2,
00332     Real                   cutoff,
00333     Real                   intervalOfInterest,
00334     Contact&               contactStatus) const;
00335 };
00336 
00337 
00338 
00339 //==============================================================================
00340 //                 HALFSPACE-TRIANGLE MESH CONTACT TRACKER
00341 //==============================================================================
00344 class SimTK_SIMMATH_EXPORT ContactTracker::HalfSpaceTriangleMesh
00345 :   public ContactTracker {
00346 public:
00347 HalfSpaceTriangleMesh() 
00348 :   ContactTracker(ContactGeometry::HalfSpace::classTypeId(),
00349                    ContactGeometry::TriangleMesh::classTypeId()) {}
00350 
00351 virtual ~HalfSpaceTriangleMesh() {}
00352 
00353 virtual bool trackContact
00354    (const Contact&         priorStatus,
00355     const Transform& X_GS1, 
00356     const ContactGeometry& surface1,    // the half space
00357     const Transform& X_GS2, 
00358     const ContactGeometry& surface2,    // the mesh
00359     Real                   cutoff,
00360     Contact&               currentStatus) const;
00361 
00362 virtual bool predictContact
00363    (const Contact&         priorStatus,
00364     const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
00365     const ContactGeometry& surface1,
00366     const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
00367     const ContactGeometry& surface2,
00368     Real                   cutoff,
00369     Real                   intervalOfInterest,
00370     Contact&               predictedStatus) const;
00371 
00372 virtual bool initializeContact
00373    (const Transform& X_GS1, const SpatialVec& V_GS1,
00374     const ContactGeometry& surface1,
00375     const Transform& X_GS2, const SpatialVec& V_GS2,
00376     const ContactGeometry& surface2,
00377     Real                   cutoff,
00378     Real                   intervalOfInterest,
00379     Contact&               contactStatus) const;
00380 
00381 private:
00382 void processBox(const ContactGeometry::TriangleMesh&              mesh, 
00383                 const ContactGeometry::TriangleMesh::OBBTreeNode& node, 
00384                 const Transform& X_HM, const UnitVec3& hsNormal_M, 
00385                 Real hsFaceHeight_M, std::set<int>& insideFaces) const;
00386 void addAllTriangles(const ContactGeometry::TriangleMesh::OBBTreeNode& node, 
00387                      std::set<int>& insideFaces) const; 
00388 };
00389 
00390 
00391 
00392 //==============================================================================
00393 //                 SPHERE - TRIANGLE MESH CONTACT TRACKER
00394 //==============================================================================
00397 class SimTK_SIMMATH_EXPORT ContactTracker::SphereTriangleMesh
00398 :   public ContactTracker {
00399 public:
00400 SphereTriangleMesh() 
00401 :   ContactTracker(ContactGeometry::Sphere::classTypeId(),
00402                    ContactGeometry::TriangleMesh::classTypeId()) {}
00403 
00404 virtual ~SphereTriangleMesh() {}
00405 
00406 virtual bool trackContact
00407    (const Contact&         priorStatus,
00408     const Transform& X_GS1, 
00409     const ContactGeometry& surface1,    // the sphere
00410     const Transform& X_GS2, 
00411     const ContactGeometry& surface2,    // the mesh
00412     Real                   cutoff,
00413     Contact&               currentStatus) const;
00414 
00415 virtual bool predictContact
00416    (const Contact&         priorStatus,
00417     const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
00418     const ContactGeometry& surface1,
00419     const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
00420     const ContactGeometry& surface2,
00421     Real                   cutoff,
00422     Real                   intervalOfInterest,
00423     Contact&               predictedStatus) const;
00424 
00425 virtual bool initializeContact
00426    (const Transform& X_GS1, const SpatialVec& V_GS1,
00427     const ContactGeometry& surface1,
00428     const Transform& X_GS2, const SpatialVec& V_GS2,
00429     const ContactGeometry& surface2,
00430     Real                   cutoff,
00431     Real                   intervalOfInterest,
00432     Contact&               contactStatus) const;
00433 
00434 private:
00435 void processBox
00436    (const ContactGeometry::TriangleMesh&              mesh, 
00437     const ContactGeometry::TriangleMesh::OBBTreeNode& node, 
00438     const Vec3& center_M, Real radius2,   
00439     std::set<int>& insideFaces) const ;
00440 };
00441 
00442 
00443 
00444 //==============================================================================
00445 //             TRIANGLE MESH - TRIANGLE MESH CONTACT TRACKER
00446 //==============================================================================
00449 class SimTK_SIMMATH_EXPORT ContactTracker::TriangleMeshTriangleMesh
00450 :   public ContactTracker {
00451 public:
00452 TriangleMeshTriangleMesh() 
00453 :   ContactTracker(ContactGeometry::TriangleMesh::classTypeId(),
00454                    ContactGeometry::TriangleMesh::classTypeId()) {}
00455 
00456 virtual ~TriangleMeshTriangleMesh() {}
00457 
00458 virtual bool trackContact
00459    (const Contact&         priorStatus,
00460     const Transform& X_GS1, 
00461     const ContactGeometry& surface1,    // mesh1
00462     const Transform& X_GS2, 
00463     const ContactGeometry& surface2,    // mesh2
00464     Real                   cutoff,
00465     Contact&               currentStatus) const;
00466 
00467 virtual bool predictContact
00468    (const Contact&         priorStatus,
00469     const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
00470     const ContactGeometry& surface1,
00471     const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
00472     const ContactGeometry& surface2,
00473     Real                   cutoff,
00474     Real                   intervalOfInterest,
00475     Contact&               predictedStatus) const;
00476 
00477 virtual bool initializeContact
00478    (const Transform& X_GS1, const SpatialVec& V_GS1,
00479     const ContactGeometry& surface1,
00480     const Transform& X_GS2, const SpatialVec& V_GS2,
00481     const ContactGeometry& surface2,
00482     Real                   cutoff,
00483     Real                   intervalOfInterest,
00484     Contact&               contactStatus) const;
00485 
00486 private:
00487 void findIntersectingFaces
00488    (const ContactGeometry::TriangleMesh&                mesh1, 
00489     const ContactGeometry::TriangleMesh&                mesh2,
00490     const ContactGeometry::TriangleMesh::OBBTreeNode&   node1, 
00491     const ContactGeometry::TriangleMesh::OBBTreeNode&   node2, 
00492     const OrientedBoundingBox&                          node2Bounds_M1,
00493     const Transform&                                    X_M1M2, 
00494     std::set<int>&                                      insideFaces1, 
00495     std::set<int>&                                      insideFaces2) const; 
00496 void findBuriedFaces
00497    (const ContactGeometry::TriangleMesh&    mesh,
00498     const ContactGeometry::TriangleMesh&    otherMesh,
00499     const Transform&                        X_OM, 
00500     std::set<int>&                          insideFaces) const;
00501 void tagFaces(const ContactGeometry::TriangleMesh&   mesh, 
00502               Array_<int>&                           faceType,
00503               std::set<int>&                         triangles, 
00504               int                                    index,
00505               int                                    depth) const;
00506 };
00507 
00508 
00509 //==============================================================================
00510 //               CONVEX IMPLICIT SURFACE PAIR CONTACT TRACKER
00511 //==============================================================================
00515 class SimTK_SIMMATH_EXPORT ContactTracker::ConvexImplicitPair 
00516 :   public ContactTracker {
00517 public:
00518 ConvexImplicitPair(ContactGeometryTypeId type1, ContactGeometryTypeId type2) 
00519 :   ContactTracker(type1, type2) {}
00520 
00521 virtual ~ConvexImplicitPair() {}
00522 
00523 virtual bool trackContact
00524    (const Contact&         priorStatus,
00525     const Transform& X_GS1, 
00526     const ContactGeometry& surface1,
00527     const Transform& X_GS2, 
00528     const ContactGeometry& surface2,
00529     Real                   cutoff,
00530     Contact&               currentStatus) const;
00531 
00532 virtual bool predictContact
00533    (const Contact&         priorStatus,
00534     const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
00535     const ContactGeometry& surface1,
00536     const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
00537     const ContactGeometry& surface2,
00538     Real                   cutoff,
00539     Real                   intervalOfInterest,
00540     Contact&               predictedStatus) const;
00541 
00542 virtual bool initializeContact
00543    (const Transform& X_GS1, const SpatialVec& V_GS1,
00544     const ContactGeometry& surface1,
00545     const Transform& X_GS2, const SpatialVec& V_GS2,
00546     const ContactGeometry& surface2,
00547     Real                   cutoff,
00548     Real                   intervalOfInterest,
00549     Contact&               contactStatus) const;
00550 };
00551 
00552 
00553 //==============================================================================
00554 //                GENERAL IMPLICIT SURFACE PAIR CONTACT TRACKER
00555 //==============================================================================
00563 class SimTK_SIMMATH_EXPORT ContactTracker::GeneralImplicitPair 
00564 :   public ContactTracker {
00565 public:
00566 GeneralImplicitPair(ContactGeometryTypeId type1, ContactGeometryTypeId type2) 
00567 :   ContactTracker(type1, type2) {}
00568 
00569 virtual ~GeneralImplicitPair() {}
00570 
00571 virtual bool trackContact
00572    (const Contact&         priorStatus,
00573     const Transform& X_GS1, 
00574     const ContactGeometry& surface1,
00575     const Transform& X_GS2, 
00576     const ContactGeometry& surface2,
00577     Real                   cutoff,
00578     Contact&               currentStatus) const;
00579 
00580 virtual bool predictContact
00581    (const Contact&         priorStatus,
00582     const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
00583     const ContactGeometry& surface1,
00584     const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
00585     const ContactGeometry& surface2,
00586     Real                   cutoff,
00587     Real                   intervalOfInterest,
00588     Contact&               predictedStatus) const;
00589 
00590 virtual bool initializeContact
00591    (const Transform& X_GS1, const SpatialVec& V_GS1,
00592     const ContactGeometry& surface1,
00593     const Transform& X_GS2, const SpatialVec& V_GS2,
00594     const ContactGeometry& surface2,
00595     Real                   cutoff,
00596     Real                   intervalOfInterest,
00597     Contact&               contactStatus) const;
00598 };
00599 
00600 } // namespace SimTK
00601 
00602 #endif // SimTK_SIMMATH_CONTACT_TRACKER_SUBSYSTEM_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines