collisiondetectors/CD_JointLimits.cpp

Go to the documentation of this file.
00001 //## begin module%37542C1B0011.cm preserve=no
00002 //        %X% %Q% %Z% %W%
00003 //## end module%37542C1B0011.cm
00004 
00005 //## begin module%37542C1B0011.cp preserve=no
00006 //## end module%37542C1B0011.cp
00007 
00008 //## Module: CD_JointLimits%37542C1B0011; Pseudo Package body
00009 //## Source file: C:\project\mpk\code\CollisionDetectors\CD_JointLimits.cpp
00010 
00011 //## begin module%37542C1B0011.additionalIncludes preserve=no
00012 //## end module%37542C1B0011.additionalIncludes
00013 
00014 //## begin module%37542C1B0011.includes preserve=yes
00015 #include <math.h>
00016 #include <math/math2.h>
00017 //## end module%37542C1B0011.includes
00018 
00019 // Configuration
00020 #include "kinematics\Configuration.h"
00021 // CD_JointLimits
00022 #include "CollisionDetectors\CD_JointLimits.h"
00023 //## begin module%37542C1B0011.additionalDeclarations preserve=yes
00024 //## end module%37542C1B0011.additionalDeclarations
00025 
00026 
00027 // Class CD_JointLimits 
00028 
00029 CD_JointLimits::~CD_JointLimits()
00030 {
00031   //## begin CD_JointLimits::~CD_JointLimits%.body preserve=yes
00032   //## end CD_JointLimits::~CD_JointLimits%.body
00033 }
00034 
00035 
00036 
00037 //## Other Operations (implementation)
00038 double CD_JointLimits::DistanceBetween (const Configuration& c1, const Configuration& c2) const
00039 {
00040   //## begin CD_JointLimits::DistanceBetween%930083383.body preserve=yes
00041         double distance = 0 ;
00042         for( int i = 0; i < c1.DOF(); i++ )
00043         {
00044                 double addme = 0 ;
00045                 double jmax = JointMax( i ) ;
00046                 double jmin = JointMin( i ) ;
00047                 double a1 = fabs( c2[ i ] - c1[ i ] ) ;
00048                 if( JointWraps( i ) )
00049                 {
00050                         double a2 = fabs( jmax - c1[ i ] ) + fabs( c2[ i ] - jmin ) ;
00051                         double a3 = fabs( jmax - c2[ i ] ) + fabs( c1[ i ] - jmin ) ;
00052                         addme = Min( a1, a2, a3 ) ;             //IMPROVE: this is a rapid funciton
00053                 }
00054                 else
00055                 {
00056                         addme = a1 ;
00057                 }
00058                 distance += addme ;
00059         }
00060         return distance ;
00061   //## end CD_JointLimits::DistanceBetween%930083383.body
00062 }
00063 
00064 VectorN CD_JointLimits::JointDisplacement( const Configuration& c1, const Configuration& c2) const
00065 {
00066         int dof = c1.DOF();
00067         VectorN displacement;
00068 
00069         displacement.SetLength( dof );
00070 
00071         double diff;
00072 
00073         for (int i=0; i < dof; i++ )
00074         {
00075                 // Direct Linear Difference
00076                 double diff1 = c2[i] - c1[i];
00077 
00078                 double jrange = JointMax( i ) - JointMin( i );
00079                 
00080                 // If the joint wraps, it may be shorter to go over the joint limits and adjust them.
00081                 if ( JointWraps( i ) )
00082                 {
00083                         double diff2 = ( jrange + c2[i] ) - c1[i];
00084                         double diff3 = c2[i] - ( jrange + c1[i] );
00085                         diff = MinMag ( diff1, diff2, diff3 );
00086                 }
00087                 else
00088                 {
00089                         diff = diff1;
00090                 }
00091 
00092                 // Assign the smallest displacment as the actual displacement between the two joint configs.
00093                 displacement[i] = diff;
00094 
00095         }
00096 
00097         return displacement;
00098 }
00099 
00100 
00101 // Additional Declarations
00102   //## begin CD_JointLimits%37542C1B0011.declarations preserve=yes
00103   //## end CD_JointLimits%37542C1B0011.declarations
00104 
00105 //## begin module%37542C1B0011.epilog preserve=yes
00106 //## end module%37542C1B0011.epilog

Generated on Sat Apr 1 21:30:36 2006 for Motion Planning Kernel by  doxygen 1.4.6-NO