00001 /** 00002 * @file FieldObject.h 00003 * 00004 * Definition of class Object 00005 * 00006 * @author <a href="mailto:timlaue@informatik.uni-bremen.de">Tim Laue</a> 00007 */ 00008 00009 #ifndef OBJECT_H_ 00010 #define OBJECT_H_ 00011 00012 #include "PotentialFunctions.h" 00013 #include "PfieldDatatypes.h" 00014 #include "PfieldGeometry.h" 00015 #include <string> 00016 00017 class PotentialfieldComposition; 00018 00019 00020 /** The possible types of tangential fields*/ 00021 enum TangentialField {NO_TANGENTIALFIELD, CLOCKWISE, COUNTER_CLOCKWISE}; 00022 00023 00024 /** 00025 * @class Object 00026 * 00027 * A class representing an object in a potential field 00028 */ 00029 class Object 00030 { 00031 public: 00032 /** Constructor */ 00033 Object(); 00034 00035 /** Constructor 00036 * @param name The name of the object 00037 * @param objectType The type of the object 00038 */ 00039 Object(const std::string& name, ObjectType objectType); 00040 00041 /** Destructor */ 00042 virtual ~Object(); 00043 00044 /** Computes the impact of an object at a given pose 00045 * @param otherPose The pose 00046 * @return The charge (= f(otherPose)) 00047 */ 00048 virtual double computeChargeAt(const PfPose& otherPose); 00049 00050 /** Computes the gradient of an object at a given pose 00051 * @param otherPose The pose 00052 * @return The gradient (= f'(otherPose)) 00053 */ 00054 virtual PfVec computeAbsFieldVecAt(const PfPose& otherPose); 00055 00056 /** Creates a copy of this object and changes the name of the copied object 00057 * @param instanceName The name of the copy 00058 * @return The copy 00059 */ 00060 Object* createInstance(const std::string& instanceName); 00061 00062 /** Copy operator 00063 * @param other The object to copy 00064 */ 00065 void operator = (const Object& other); 00066 00067 /** Polymorph copy function 00068 * @return A copy of the object 00069 */ 00070 virtual Object* getCopy(); 00071 00072 /** Get new data from other object. It is assumed that a full copy had been done 00073 * before. Only changing data (e.g. the pose) is copied. 00074 * @param other The object to get the data from 00075 */ 00076 void getMinimalCopyFrom(Object* other); 00077 00078 /** Returns the name of the object 00079 * @return The name 00080 */ 00081 std::string getName() const 00082 { return name;} 00083 00084 /** Returns the pose of the object 00085 * @return The pose 00086 */ 00087 PfPose getPose() const 00088 { return pose;} 00089 00090 /** Returns the pose of the object in reference to the robot pose 00091 * (used for getting a pose from formation objects) 00092 * @param robotPose The robot pose 00093 * @return The object pose 00094 */ 00095 virtual PfPose getPose(const PfPose& robotPose) 00096 { return pose;} 00097 00098 /** Sets the pose of the object and updates the absolute geometry 00099 * @param pose The new pose 00100 */ 00101 void setPose(const PfPose& pose); 00102 00103 /** Sets the state of the object 00104 * @param active Flag which determines whether the object is active or not 00105 */ 00106 void setActivation(const bool& active) 00107 { this->active = active;} 00108 00109 /** Returns whether the object is active or not 00110 * @return true, if active 00111 */ 00112 virtual bool isActive() const 00113 { return active;} 00114 00115 /** Returns the type of the object 00116 * @return The type 00117 */ 00118 ObjectType getType() const 00119 { return objectType;} 00120 00121 /** Sets the static/dynamic state of the object 00122 * @param isStatic Flag 00123 * @param dynamicPoseId The id of the static pose 00124 */ 00125 void setStatic(const bool& isStatic, unsigned int dynamicPoseId=0) 00126 { 00127 this->isStaticVar = isStatic; 00128 this->dynamicPoseId = dynamicPoseId; 00129 } 00130 00131 /** Return whether the object is static or not 00132 * @return true, if the object is static 00133 */ 00134 virtual bool isStatic() const 00135 { return isStaticVar;} 00136 00137 /** Sets the function of the object 00138 * @param function The function 00139 */ 00140 void setFunction(PotentialfieldFunction* function); 00141 00142 /** Sets the field type of the object 00143 * @param type The field type 00144 */ 00145 void setField(FieldType type); 00146 00147 /** Sets the field type of the object 00148 * @param type The field type 00149 * @param sector A sector description (if type == SECTOR_FIELD) 00150 */ 00151 void setField(FieldType type, const Sector& sector); 00152 00153 /** Sets the type of the tangential field 00154 * @param tangentialField The type of the tangential field 00155 */ 00156 void setTangentialField(TangentialField tangentialField) 00157 { this->tangentialField = tangentialField;} 00158 00159 /** Sets the geometry of the object 00160 * @param geometry The geometric description 00161 */ 00162 void setGeometry(PfieldGeometricObject* geometry); 00163 00164 /** Returns a pointer to the geometry of the object 00165 * @return The geometric description 00166 */ 00167 virtual PfieldGeometricObject* getGeometry() const 00168 { return geometry;} 00169 00170 /** Returns a pointer to the absolute geometry of the object 00171 * @return The geometric description 00172 */ 00173 virtual PfieldGeometricObject* getAbsGeometry() const 00174 { return absGeometry;} 00175 00176 /** Sets the reference to the PotentialfieldComposition 00177 * @param ref The reference 00178 */ 00179 void setPfieldCompositionRef(PotentialfieldComposition* ref) 00180 { this->refToPfieldComposition = ref;} 00181 00182 /** Gets new data (pose/activation), if dynamic*/ 00183 virtual void updateData(); 00184 00185 /** Computes the absolute geometry*/ 00186 void computeAbsGeometry(); 00187 00188 protected: 00189 /** The pose of the object*/ 00190 PfPose pose; 00191 /** The name of the object*/ 00192 std::string name; 00193 /** Flag, determines if object is active*/ 00194 bool active; 00195 /** Flag, determines if object is static/dynamic*/ 00196 bool isStaticVar; 00197 /** Flag, determines, if the field has a tangential direction*/ 00198 TangentialField tangentialField; 00199 /** The type of the potential field*/ 00200 FieldType fieldType; 00201 /** The function of this object*/ 00202 PotentialfieldFunction* function; 00203 /** The type of the object (attractive/repulsive)*/ 00204 ObjectType objectType; 00205 /** The description of the object's geometry*/ 00206 PfieldGeometricObject* geometry; 00207 /** The description of the object's geometry in absolute coordinates*/ 00208 PfieldGeometricObject* absGeometry; 00209 /** The sector of the potential field (if fieldType==SECTOR_FIELD)*/ 00210 Sector sector; 00211 /** A pointer to the PotentialfieldComposition*/ 00212 PotentialfieldComposition* refToPfieldComposition; 00213 /** The id of the dynamic pose (if used)*/ 00214 unsigned int dynamicPoseId; 00215 00216 /** Computes the charge at a pose 00217 * @param objectPose The pose of an object 00218 * @param position A position influenced by the object 00219 * @return The charge 00220 */ 00221 double computeChargeForSinglePose(const PfPose& objectPose, const PfPose& position) const; 00222 00223 /** Computes the gradient at a pose 00224 * @param objectPose The pose of an object 00225 * @param position A position influenced by the object 00226 * @return The gradient vector 00227 */ 00228 PfVec computeGradientVecForSinglePose(const PfPose& objectPose, const PfPose& position) const; 00229 }; 00230 00231 00232 #endif //OBJECT_H_ 00233 00234 00235 /* 00236 * $Log: FieldObject.h,v $ 00237 * Revision 1.1.1.1 2004/05/22 17:37:25 cvsadm 00238 * created new repository GT2004_WM 00239 * 00240 * Revision 1.1 2004/01/20 15:42:19 tim 00241 * Added potential fields implementation 00242 * 00243 * Revision 1.6 2003/06/13 14:27:58 tim 00244 * added random generator and tangential fields 00245 * 00246 * Revision 1.5 2003/05/20 12:43:43 tim 00247 * Changed function representation, fixed crash on SuperCore, integrated social functions 00248 * 00249 * Revision 1.4 2003/04/22 14:35:17 tim 00250 * Merged changes from GO 00251 * 00252 * Revision 1.4 2003/04/09 19:03:06 tim 00253 * Last commit before GermanOpen 00254 * 00255 * Revision 1.3 2003/04/04 14:50:53 tim 00256 * Fixed bugs, added minor features 00257 * 00258 * Revision 1.2 2003/03/23 20:32:37 loetzsch 00259 * removed green compiler warning: no newline at end of file 00260 * 00261 * Revision 1.1 2003/03/23 17:51:27 tim 00262 * Added potentialfields 00263 * 00264 */