libmove3d
3.13.0
|
00001 #ifndef __MANIPULATIONUTILS_HPP__ 00002 #define __MANIPULATIONUTILS_HPP__ 00003 00004 #include "ManipulationStruct.h" 00005 #ifdef GRASP_PLANNING 00006 #include "GraspPlanning-pkg.h" 00007 #endif 00008 #include "P3d-pkg.h" 00009 #include <vector> 00010 00018 00019 00020 class ManipulationUtils { 00021 public: 00022 /*Constructors and Destructors*/ 00023 00024 ManipulationUtils(){}; 00025 virtual ~ManipulationUtils(){}; 00026 00027 00028 /*############# Static Functions ############*/ 00029 00030 /* Message gestion */ 00031 static void undefinedRobotMessage(); 00032 static void undefinedObjectMessage(); 00033 static void undefinedSupportMessage(); 00034 static void undefinedCameraMessage(); 00035 static void printManipulationMessage(MANIPULATION_TASK_MESSAGE message); 00036 static int printConstraintInfo(p3d_rob* robot); 00037 00038 /* UI gestion */ 00041 static int forbidWindowEvents(); 00042 00045 static int allowWindowEvents(); 00046 00049 static int copyConfigToFORM(p3d_rob* robot, configPt q); 00050 00053 static bool isValidVector(std::vector<double> ObjectPos); 00054 00056 static void fixAllHands(p3d_rob* robot, configPt q, bool rest); 00058 static void unFixAllHands(p3d_rob* robot); 00060 static void fixManipulationJoints(p3d_rob* robot, int armId, configPt q, p3d_rob* object); 00062 static void unfixManipulationJoints(p3d_rob* robot, int armId); 00063 }; 00064 00066 00067 class ArmManipulationData { 00068 00069 public: 00070 ArmManipulationData(int id = 0, p3d_cntrt* ccCntrt = NULL, p3d_cntrt* fkCntrt = NULL, p3d_jnt *manipulationJnt = NULL, int cartesianGroup = -1, int cartesianSmGroup = -1, int handGroup = -1, int handSmGroup = -1){ 00071 _id = id; 00072 _ccCntrt = ccCntrt; 00073 _fkCntrt = fkCntrt; 00074 _manipulationJnt = manipulationJnt; 00075 if(_ccCntrt == NULL){ 00076 _tAtt[0][0] = _tAtt[0][1] = _tAtt[0][2] = _tAtt[0][3] = 0; 00077 }else{ 00078 p3d_mat4Copy(_ccCntrt->Tatt, _tAtt); 00079 } 00080 _carriedObject = NULL; 00081 _placement = NULL; 00082 _human = NULL; 00083 _cartesian = false; 00084 }; 00085 00086 virtual ~ArmManipulationData(){}; 00087 00088 /*************/ 00089 /* Functions */ 00090 /*************/ 00092 void fixHand(p3d_rob* robot, bool rest); 00094 void unFixHand(p3d_rob* robot); 00096 void deactivateManipulationCntrts(p3d_rob* robot); 00097 00098 /***********/ 00099 /* Setters */ 00100 /***********/ 00101 inline void setId(int id) { 00102 _id = id; 00103 } 00104 inline void setCcCntrt(p3d_cntrt* ccCntrt){ 00105 _ccCntrt = ccCntrt; 00106 }; 00107 inline void setCcCntrt(p3d_rob* robot, int id){ 00108 _ccCntrt = robot->cntrt_manager->cntrts[id]; 00109 }; 00110 inline void setFkCntrt(p3d_cntrt* fkCntrt){ 00111 _fkCntrt = fkCntrt; 00112 }; 00113 inline void setFkCntrt(p3d_rob* robot, int id){ 00114 _fkCntrt = robot->cntrt_manager->cntrts[id]; 00115 }; 00116 inline void setManipulationJnt(p3d_jnt* manipulationJnt){ 00117 _manipulationJnt = manipulationJnt; 00118 }; 00119 inline void setManipulationJnt(p3d_rob* robot, int manipulationJnt){ 00120 _manipulationJnt = robot->joints[manipulationJnt]; 00121 }; 00122 inline void setAttachFrame(p3d_matrix4 tAtt){ 00123 p3d_mat4Copy(tAtt, _tAtt); 00124 } 00125 inline void setCarriedObject(p3d_rob* carriedObject){ 00126 _carriedObject = carriedObject; 00127 }; 00128 inline void setCarriedObject(const char* robotName){ 00129 if(robotName){ 00130 _carriedObject = p3d_get_robot_by_name(robotName); 00131 }else{ 00132 _carriedObject = NULL; 00133 } 00134 }; 00135 inline void setPlacement(p3d_rob* placement){ 00136 _placement = placement; 00137 }; 00138 inline void setHuman(p3d_rob* human){ 00139 _human = human; 00140 }; 00141 #ifdef GRASP_PLANNING 00142 inline void setHandProperties(int handId){ 00143 _handProp.initialize((gpHand_type)handId); 00144 }; 00145 #endif 00146 inline void setCartesian(bool cartesian){ 00147 _cartesian = cartesian; 00148 }; 00149 00150 /***********/ 00151 /* Getters */ 00152 /***********/ 00153 inline int getId() { 00154 return _id; 00155 } 00156 inline p3d_cntrt* getCcCntrt(void) const{ 00157 return _ccCntrt; 00158 }; 00159 inline p3d_cntrt* getFkCntrt(void) const{ 00160 return _fkCntrt; 00161 }; 00162 inline p3d_jnt* getManipulationJnt(void) const{ 00163 return _manipulationJnt; 00164 }; 00165 inline void getAttachFrame(p3d_matrix4 tAtt) const{ 00166 p3d_mat4Copy((p3d_matrix_type(*)[4])_tAtt, tAtt); 00167 } 00168 inline p3d_rob* getCarriedObject(void) const{ 00169 return _carriedObject; 00170 }; 00171 inline p3d_rob* getPlacement(void) const{ 00172 return _placement; 00173 }; 00174 inline p3d_rob* getHuman(void) const{ 00175 return _human; 00176 }; 00177 #ifdef GRASP_PLANNING 00178 inline gpHand_properties getHandProperties() const{ 00179 return _handProp; 00180 }; 00181 #endif 00182 inline bool getCartesian(void) const{ 00183 return _cartesian; 00184 }; 00185 00186 private : 00188 int _id; 00189 00190 /***************/ 00191 /* Constraints */ 00192 /***************/ 00194 p3d_cntrt * _ccCntrt; 00196 p3d_cntrt * _fkCntrt; 00198 p3d_matrix4 _tAtt; 00200 p3d_jnt * _manipulationJnt; 00202 bool _cartesian; 00203 00204 /************************/ 00205 /* Manipulation Objects */ 00206 /************************/ 00208 p3d_rob* _carriedObject; 00210 p3d_rob* _placement; 00212 p3d_rob* _human; 00213 00214 #ifdef GRASP_PLANNING 00215 /************/ 00216 /* Grasping */ 00217 /************/ 00219 gpHand_properties _handProp; 00220 #endif 00221 00222 }; 00223 00228 class ManipulationData{ 00229 public: 00230 ManipulationData(p3d_rob* robot){ 00231 _robot = robot; 00232 #ifdef GRASP_PLANNING 00233 _grasp = NULL; 00234 #endif 00235 _graspConfig = NULL; 00236 _graspConfigCost = P3D_HUGE; 00237 _openConfig = NULL; 00238 _approachFreeConfig = NULL; 00239 _approachGraspConfig = NULL; 00240 _graspAttachFrame[0][0] = _graspAttachFrame[0][1] = _graspAttachFrame[0][2] = _graspAttachFrame[0][3] = 0; 00241 }; 00242 #ifdef GRASP_PLANNING 00243 ManipulationData(p3d_rob* robot, gpGrasp* grasp, configPt graspConfig, configPt openConfig, configPt approachFreeConfig, configPt approachGraspConfig, p3d_matrix4 graspAttachFrame){ 00244 _robot = robot; 00245 _grasp = grasp; 00246 _graspConfig = p3d_copy_config(robot, graspConfig); 00247 _graspConfigCost = P3D_HUGE; 00248 _openConfig = p3d_copy_config(robot, openConfig); 00249 _approachFreeConfig = p3d_copy_config(robot, approachFreeConfig); 00250 _approachGraspConfig = p3d_copy_config(robot, approachGraspConfig); 00251 p3d_mat4Copy(graspAttachFrame ,_graspAttachFrame); 00252 }; 00253 #endif 00254 virtual ~ManipulationData(){ 00255 if(_graspConfig){ 00256 p3d_destroy_config(_robot, _graspConfig); 00257 _graspConfig = NULL; 00258 } 00259 if(_openConfig){ 00260 p3d_destroy_config(_robot, _openConfig); 00261 _openConfig = NULL; 00262 } 00263 if(_approachFreeConfig){ 00264 p3d_destroy_config(_robot, _approachFreeConfig); 00265 _approachFreeConfig = NULL; 00266 } 00267 if(_approachGraspConfig){ 00268 p3d_destroy_config(_robot, _approachGraspConfig); 00269 _approachGraspConfig = NULL; 00270 } 00271 #ifdef GRASP_PLANNING 00272 if(_grasp){ 00273 delete(_grasp); 00274 _grasp = NULL; 00275 } 00276 #endif 00277 00278 } 00279 //Reset 00280 void clear(){ 00281 if(_graspConfig){ 00282 p3d_destroy_config(_robot, _graspConfig); 00283 _graspConfig = NULL; 00284 } 00285 if(_openConfig){ 00286 p3d_destroy_config(_robot, _openConfig); 00287 _openConfig = NULL; 00288 } 00289 if(_approachFreeConfig){ 00290 p3d_destroy_config(_robot, _approachFreeConfig); 00291 _approachFreeConfig = NULL; 00292 } 00293 if(_approachGraspConfig){ 00294 p3d_destroy_config(_robot, _approachGraspConfig); 00295 _approachGraspConfig = NULL; 00296 } 00297 #ifdef GRASP_PLANNING 00298 if(_grasp){ 00299 delete(_grasp); 00300 _grasp = NULL; 00301 } 00302 #endif 00303 } 00304 //Getters 00305 inline p3d_rob* getRobot() const{ 00306 return _robot; 00307 } 00308 #ifdef GRASP_PLANNING 00309 inline gpGrasp* getGrasp() const{ 00310 return _grasp; 00311 } 00312 #endif 00313 inline configPt getGraspConfig() const{ 00314 return _graspConfig; 00315 } 00316 inline configPt getOpenConfig() const{ 00317 return _openConfig; 00318 } 00319 inline configPt getApproachFreeConfig() const{ 00320 return _approachFreeConfig; 00321 } 00322 inline configPt getApproachGraspConfig() const{ 00323 return _approachGraspConfig; 00324 } 00325 std::vector<configPt> getAllConfigs() const{ 00326 std::vector<configPt> vect(4); 00327 vect[0] = _graspConfig; 00328 vect[1] = _openConfig; 00329 vect[2] = _approachFreeConfig; 00330 vect[3] = _approachGraspConfig; 00331 return vect; 00332 } 00333 inline void getAttachFrame(p3d_matrix4 graspAttachFrame) const{ 00334 p3d_mat4Copy((p3d_matrix_type(*)[4])_graspAttachFrame, graspAttachFrame); 00335 } 00336 inline double getGraspConfigCost() const{ 00337 return _graspConfigCost; 00338 } 00339 //Setters 00340 #ifdef GRASP_PLANNING 00341 inline void setGrasp(gpGrasp* grasp){ 00342 if(_grasp == grasp){ 00343 return; 00344 } 00345 if (!grasp) { 00346 if(_grasp){ 00347 delete(_grasp); 00348 } 00349 _grasp = NULL; 00350 return; 00351 } 00352 if(_grasp){ 00353 delete(_grasp); 00354 _grasp = NULL; 00355 } 00356 _grasp = new gpGrasp(*grasp); 00357 } 00358 #endif 00359 inline void setGraspConfig(configPt graspConfig){ 00360 if(graspConfig){ 00361 if(_graspConfig){ 00362 p3d_copy_config_into(_robot, graspConfig, &_graspConfig); 00363 }else{ 00364 _graspConfig = p3d_copy_config(_robot, graspConfig); 00365 } 00366 } 00367 } 00368 inline void setOpenConfig(configPt openConfig){ 00369 if(openConfig){ 00370 if(_openConfig){ 00371 p3d_copy_config_into(_robot, openConfig, &_openConfig); 00372 }else{ 00373 _openConfig = p3d_copy_config(_robot, openConfig); 00374 } 00375 } 00376 } 00377 inline void setApproachFreeConfig(configPt approachFreeConfig){ 00378 if(approachFreeConfig){ 00379 if(_approachFreeConfig){ 00380 p3d_copy_config_into(_robot, approachFreeConfig, &_approachFreeConfig); 00381 }else{ 00382 _approachFreeConfig = p3d_copy_config(_robot, approachFreeConfig); 00383 } 00384 } 00385 } 00386 inline void setApproachGraspConfig(configPt approachGraspConfig){ 00387 if(approachGraspConfig){ 00388 if(_approachGraspConfig){ 00389 p3d_copy_config_into(_robot, approachGraspConfig, &_approachGraspConfig); 00390 }else{ 00391 _approachGraspConfig = p3d_copy_config(_robot, approachGraspConfig); 00392 } 00393 } 00394 } 00395 inline void setAttachFrame(p3d_matrix4 graspAttachFrame){ 00396 p3d_mat4Copy(graspAttachFrame, _graspAttachFrame); 00397 } 00398 inline void setGraspConfigCost(double graspConfigCost){ 00399 _graspConfigCost = graspConfigCost; 00400 } 00401 ManipulationData& operator = (const ManipulationData& data){ 00402 _robot = data.getRobot(); 00403 #ifdef GRASP_PLANNING 00404 setGrasp(data.getGrasp()); 00405 #endif 00406 setGraspConfig(data.getGraspConfig()); 00407 setOpenConfig(data.getOpenConfig()); 00408 setApproachFreeConfig(data.getApproachFreeConfig()); 00409 setApproachGraspConfig(data.getApproachGraspConfig()); 00410 data.getAttachFrame(_graspAttachFrame); 00411 setGraspConfigCost(data.getGraspConfigCost()); 00412 return *this; 00413 } 00414 private: 00415 p3d_rob* _robot; 00416 #ifdef GRASP_PLANNING 00417 gpGrasp* _grasp; 00418 #endif 00419 configPt _graspConfig; 00420 configPt _openConfig; 00421 configPt _approachFreeConfig; 00422 configPt _approachGraspConfig; 00423 double _graspConfigCost; 00424 p3d_matrix4 _graspAttachFrame; 00425 }; 00426 #endif