00001
00002
00003
00004
00005
00006
00007 #include "srs_object_database_msgs/utility.h"
00008 #include <string.h>
00009 #include <ros/ros.h>
00010 #include <vector>
00011 #include <iostream>
00012 #include <fstream>
00013 #include <sstream>
00014 #include <stdint.h>
00015 #include <algorithm>
00016 #include <iterator>
00017 #include <database_interface/postgresql_database.h>
00018 #include <database_interface/db_class.h>
00019 #include <pcl/ros/conversions.h>
00020 #include <pcl/point_cloud.h>
00021 #include <pcl/point_types.h>
00022 #include <pcl/io/pcd_io.h>
00023 #include <pcl/pcl_base.h>
00024 #include <pcl/io/io.h>
00025 #include "srs_object_database_msgs/point_types.h"
00026 #include "srs_object_database_msgs/impl/point_types.cpp"
00027 #include "srs_object_database_msgs/surf.h"
00028 #include <geometry_msgs/Pose.h>
00029
00030 using namespace std;
00031
00032
00033
00034 void utWriteToFile(char * data, std::string path, long size)
00035 {
00036
00037 ofstream outfile(path.c_str(), ofstream::binary | ofstream::out);
00038
00039 outfile.write(data, size);
00040 outfile.close();
00041
00042 }
00043
00044 void utDataWrite(vector<uint8_t> data, string path)
00045 {
00046
00047
00048 if (data.size() <= 0)
00049 {
00050 ROS_INFO("Warning data supplied by service is not valid!");
00051 return;
00052 }
00053 size_t first_obj_size;
00054 vector<uint8_t> c;
00055 c.operator =(data);
00056 first_obj_size = c.size() * sizeof(char);
00057
00058 std::stringstream mod_id;
00059 uint8_t dataArray[first_obj_size];
00060
00061 for (size_t t = 0; t < first_obj_size; t++)
00062 {
00063 dataArray[t] = (uint8_t)data.at(t);
00064 }
00065 char * buffer;
00066 size_t size;
00067 size = first_obj_size;
00068 buffer = new char[first_obj_size];
00069
00070 for (uint i = 0; i < first_obj_size; i++)
00071 {
00072 buffer[i] = (char)dataArray[i];
00073 }
00074 utWriteToFile(buffer, path, size);
00075 delete[] buffer;
00076 }
00077
00078 char * utRetrieveDataFile(std::string path, int * siz)
00079 {
00080
00081 int size;
00082
00083 ifstream file(path.c_str(), ios::in | ios::binary | ios::ate);
00084
00085 char * memblock;
00086 if (file.is_open())
00087 {
00088
00089 file.seekg(0, ios::end);
00090 size = file.tellg();
00091 file.seekg(0, ios::beg);
00092
00093 memblock = new char[size];
00094 *siz = size;
00095 file.read(memblock, size);
00096
00097 file.close();
00098 return memblock;
00099 } else {
00100 ROS_INFO("Could not retrieve file");
00101 }
00102
00103 return NULL;
00104
00105 }
00106
00107 std::string fromCharPt(char * ch){
00108 if(ch == NULL){
00109 return "";
00110 } else {
00111 string tmp (ch);
00112 return tmp;
00113 }
00114 }
00115
00116 input utGetInputParameter(std::string path){
00117 ROS_INFO("Data from file %s",path.c_str());
00118 string line = "";
00119
00120 input input;
00121 char* pch;
00122
00123 ifstream source(path.c_str());
00124 if (source.is_open())
00125 {
00126 ROS_INFO("Loading input for test client");
00127 char * tokenString;
00128 string str;
00129 while (getline(source, line))
00130 {
00131 pch = (char*)malloc(sizeof(char) * (line.length() + 1));
00132 strcpy(pch, line.c_str());
00133 tokenString = strtok(pch, " ");
00134 std::string param=tokenString;
00135 string tmp;
00136 if (param=="id"){
00137 tokenString = strtok(NULL, " ");
00138 ROS_INFO("Line id ");
00139 input.id=fromCharPt(tokenString);
00140
00141 }
00142 if (param=="grasp"){
00143 ROS_INFO("Line grasp ");
00144 tokenString = strtok(NULL, " ");
00145 input.grasp=fromCharPt(tokenString);
00146 }
00147 if (param=="mesh"){
00148 ROS_INFO("Line Mesh ");
00149 tokenString = strtok(NULL, " ");
00150 input.mesh=fromCharPt(tokenString);
00151 }
00152 if (param=="image"){
00153 ROS_INFO("Line Image ");
00154 tokenString = strtok(NULL, " ");
00155 input.image=fromCharPt(tokenString);
00156 }
00157 if (param=="image-type"){
00158 ROS_INFO("Line Image Type ");
00159 tokenString = strtok(NULL, " ");
00160 input.image_type=fromCharPt(tokenString);
00161 }
00162 if (param=="pcl"){
00163 ROS_INFO("Line pcl ");
00164 tokenString = strtok(NULL, " ");
00165 input.pcl=fromCharPt(tokenString);
00166 }
00167 if (param=="surf"){
00168 ROS_INFO("Line Surf ");
00169 tokenString = strtok(NULL, " ");
00170 input.surf=fromCharPt(tokenString);
00171
00172 }
00173 if (param=="typeMesh"){
00174 ROS_INFO("Line TypeMesh ");
00175 tokenString = strtok(NULL, " ");
00176 input.mType=fromCharPt(tokenString);
00177 }
00178 if (param=="name"){
00179 ROS_INFO("Line Name ");
00180 tokenString = strtok(NULL, " ");
00181 input.name=fromCharPt(tokenString);
00182
00183 }
00184 if (param=="category"){
00185 ROS_INFO("Line category ");
00186 tokenString = strtok(NULL, " ");
00187 input.category=fromCharPt(tokenString);
00188
00189 }
00190 if (param=="description"){
00191 ROS_INFO("Line Description ");
00192 tokenString = strtok(NULL, " ");
00193 input.description=fromCharPt(tokenString);
00194
00195 }
00196 if (param=="x-size"){
00197 ROS_INFO("Line x ");
00198 tokenString = strtok(NULL, " ");
00199 input.x=line.substr(param.size()+1,(line.length()-param.size())-1);
00200 ROS_INFO("Line x size %f",atof(input.x.c_str()));
00201 }
00202 if (param=="y-size"){
00203 ROS_INFO("Line y size ");
00204 tokenString = strtok(NULL, " ");
00205 input.y=fromCharPt(tokenString);
00206
00207 ROS_INFO("Line y size %f",atof(input.y.c_str()));
00208 }
00209 if (param=="z-size"){
00210 ROS_INFO("Line z size ");
00211 tokenString = strtok(NULL, " ");
00212 input.z=fromCharPt(tokenString);
00213
00214 ROS_INFO("Line z size %f",atof(input.z.c_str()));
00215 }
00216 if (param=="basic-shape"){
00217 ROS_INFO("Line Basic Shape ");
00218 tokenString = strtok(NULL, " ");
00219 input.basic_shape=fromCharPt(tokenString);
00220
00221 }
00222 if (param=="end"){
00223 ROS_INFO("data loaded ");
00224 return input;
00225 }
00226 if (param=="graspable"){
00227 ROS_INFO("graspable loaded ");
00228 tokenString = strtok(NULL, " ");
00229 input.graspable=fromCharPt(tokenString);
00230
00231 }
00232 if (param=="urdf"){
00233 ROS_INFO("urdf loaded ");
00234 tokenString = strtok(NULL, " ");
00235 input.urdf=fromCharPt(tokenString);
00236 ROS_INFO("urdf %s ",input.urdf.c_str());
00237
00238 }
00239 }
00240
00241 return input;
00242 }else{
00243 ROS_INFO("Cannot load Input File");
00244 return input;
00245 }
00246
00247 }
00248
00249 database_interface::PostgresqlDatabase utLoadSettings(std::string dbInstance, std::string dbPort, std::string dbUser,
00250 std::string dbPwd, std::string dbName)
00251 {
00252
00253 database_interface::PostgresqlDatabase database(dbInstance, dbPort, dbUser, dbPwd, dbName);
00254 return database;
00255
00256 }
00257
00258 vector<char> utConvertToVector(char* inputData)
00259 {
00260 int size = sizeof(inputData) / sizeof(char);
00261 vector<char> vChar;
00262 for (int i = 0; i < size; i++)
00263 {
00264
00265 vChar.push_back(inputData[i]);
00266 }
00267 return vChar;
00268 }
00269
00270 char* utConvertToChar(vector<char> inputData)
00271 {
00272 int size = inputData.size();
00273 char* vChar = new char[size];
00274 for (int i = 0; i < size; i++)
00275 {
00276 vChar[i] = inputData.at(i);
00277 }
00278 return vChar;
00279 }
00280
00281 void utLoadFeaturePointFromFile(std::string path,srs_object_database_msgs::surf::Ptr & surf)
00282 {
00283 ROS_INFO("Data from file %s",path.c_str());
00284 pcl::PointCloud<PointSURF>::Ptr cloud(new pcl::PointCloud<PointSURF>);
00285 pcl::PointCloud<PointXYZ>::Ptr bBox(new pcl::PointCloud<PointXYZ>);
00286 pcl::PointCloud<PointSURF> pcl;
00287 PointSURF pSurf;
00288 pcl::PointCloud<PointXYZ> boundingBox;
00289
00290 pcl.height = 0;
00291 pcl.width = 1;
00292 boundingBox.height=2;
00293 boundingBox.width=1;
00294 boundingBox.points.resize(2);
00295
00296 uint32_t rRGB = 0;
00297 uint32_t gRGB = 0;
00298 uint32_t bRGB = 0;
00299 string line = "";
00300 long totalLine = 0;
00301 long totalPoints = 0;
00302 long numFeatures = 0;
00303 long points = 0;
00304 bool testLine = false;
00305 char* pch;
00306
00307 int offset = 4;
00308
00309 ifstream source(path.c_str());
00310 if (source.is_open())
00311 {
00312
00313 ROS_INFO("Loading file data to pcl Begin");
00314 char * tokenString;
00315 while (getline(source, line))
00316 {
00317 if (line.length() == 2)
00318 {
00319 string cut;
00320
00321
00322 if (line.substr(0, 2) == "-1")
00323 {
00324 testLine = true;
00325
00326 }
00327 else
00328 {
00329 testLine = false;
00330
00331 }
00332 }
00333 else
00334 {
00335 testLine = false;
00336 }
00337 if (!(testLine))
00338 {
00339 totalLine++;
00340
00341 if (totalLine > offset)
00342 {
00343
00344 if (points + 1 <= numFeatures)
00345 {
00346 totalPoints++;
00347 int mod;
00348 mod = (totalPoints) % 3;
00349 if (mod == 1)
00350 {
00351
00352
00353 pch = (char*)malloc(sizeof(char) * (line.length() + 1));
00354 strcpy(pch, line.c_str());
00355 tokenString = strtok(pch, " ");
00356 pSurf.id=atol(tokenString);
00357
00358 tokenString = strtok(NULL, " ");
00359 pSurf.confidence=atof(tokenString);
00360
00361
00362 }
00363 if (mod == 2)
00364 {
00365 pch = (char*)malloc(sizeof(char) * (line.length() + 1));
00366 strcpy(pch, line.c_str());
00367
00368 tokenString = strtok(pch, " ");
00369 pSurf.x=atof(tokenString);
00370
00371 tokenString = strtok(NULL, " ");
00372 pSurf.y=atof(tokenString);
00373
00374 tokenString = strtok(NULL, " ");
00375 pSurf.z=atof(tokenString);
00376 pSurf.rgbr=rRGB;
00377 pSurf.rgbg=gRGB;
00378 pSurf.rgbb=bRGB;
00379 }
00380 if (mod == 0)
00381 {
00382 pch = (char*)malloc(sizeof(char) * (line.length() + 1));
00383 strcpy(pch, line.c_str());
00384 tokenString = strtok(pch, " ");
00385 int i = 0;
00386 pSurf.descriptor[0]=atof(tokenString);
00387 tokenString = strtok(NULL, " ");
00388 while ((i < 63) & (tokenString != NULL))
00389 {
00390 pSurf.descriptor[i+1]=atof(tokenString);
00391 tokenString = strtok(NULL, " ");
00392 i++;
00393 }
00394 points++;
00395 pcl.points.push_back(pSurf);
00396 }
00397 }else{
00398
00399 pch = (char*)malloc(sizeof(char) * (line.length() + 1));
00400 strcpy(pch, line.c_str());
00401 float temp[6];
00402 tokenString = strtok(pch, " ");
00403 int i = 1;
00404 temp[0]=atof(tokenString);
00405 tokenString = strtok(NULL, " ");
00406
00407 while ((tokenString != NULL))
00408 {
00409 temp[i]=atof(tokenString);
00410 tokenString = strtok(NULL, " ");
00411 i++;
00412 }
00413 if(points + 1 == numFeatures+1){
00414
00415
00416 boundingBox.points[0].x=temp[0];
00417 boundingBox.points[0].y=temp[1];
00418 boundingBox.points[0].z=temp[2];
00419 boundingBox.points[1].x=temp[3];
00420 boundingBox.points[1].y=temp[4];
00421 boundingBox.points[1].z=temp[5];
00422
00423 } else if (points + 1 == numFeatures+2){
00424
00425 surf->coord_frame.position.x=temp[0];
00426 surf->coord_frame.position.y=temp[1];
00427 surf->coord_frame.position.z=temp[2];
00428 surf->coord_frame.orientation.x=temp[3];
00429 surf->coord_frame.orientation.y=temp[4];
00430 surf->coord_frame.orientation.z=temp[5];
00431 }else {
00432 ROS_INFO("Wrong information in the viewpoint");
00433 }
00434 points++;
00435 }
00436
00437 }
00438 else
00439 {
00440
00441 if (totalLine == 1)
00442 {
00443
00444
00445 pch = (char*)malloc(sizeof(char) * (line.length() + 1));
00446 strcpy(pch, line.c_str());
00447 tokenString = strtok(pch, " ");
00448
00449 numFeatures = atol(tokenString);
00450
00451 pcl.height = numFeatures;
00452 ROS_INFO("Declared features in file %i",numFeatures);
00453
00454
00455 }
00456 if (totalLine == 2)
00457 {
00458
00459 pch = (char*)malloc(sizeof(char) * (line.length() + 1));
00460 strcpy(pch, line.c_str());
00461 tokenString = strtok(pch, " ");
00462 rRGB = atoi(tokenString);
00463
00464
00465 tokenString = strtok(NULL, " ");
00466 gRGB = atoi(tokenString);
00467
00468
00469 tokenString = strtok(NULL, " ");
00470 bRGB = atoi(tokenString);
00471
00472
00473 }
00474 if (totalLine == 3)
00475 {
00476
00477 pch = (char*)malloc(sizeof(char) * (line.length() + 1));
00478 strcpy(pch, line.c_str());
00479 tokenString = strtok(pch, " ");
00480
00481
00482 }
00483 if (totalLine == 4)
00484 {
00485
00486 pch = (char*)malloc(sizeof(char) * (line.length() + 1));
00487 strcpy(pch, line.c_str());
00488 tokenString = strtok(pch, " ");
00489
00490
00491
00492 }
00493 }
00494 }
00495 }
00496 }
00497 else
00498 {
00499 ROS_INFO("Cannot open file data to load FPt");
00500 }
00501
00502 ROS_INFO("PCL loaded with: %i size", pcl.size());
00503 ROS_INFO("PCL loaded with: %i features", pcl.points.size());
00504
00505 *cloud=pcl;
00506 *bBox=boundingBox;
00507 sensor_msgs::PointCloud2 fpt;
00508 sensor_msgs::PointCloud2 bounding_box;
00509 pcl::toROSMsg(*cloud,fpt);
00510 pcl::toROSMsg(*bBox,bounding_box);
00511 surf->surf=fpt;
00512 surf->bounding_box=bounding_box;
00513 ROS_INFO("Retrieval executed");
00514
00515 }
00516
00517 void utLoadCloudPointFromPLYFile(std::string path, srs_object_database_msgs::pcl::Ptr & pcl){
00518 ROS_INFO("Data from file %s",path.c_str());
00519
00520 pcl::PointCloud<PointPLY>::Ptr plyPt(new pcl::PointCloud<PointPLY>);
00521 pcl::PointCloud<PointPLY> ply;
00522 ply.width=1;
00523 ply.height = 0;
00524
00525
00526 string line = "";
00527 long totalLine = 0;
00528
00529
00530 long points = 0;
00531 long numP=0;
00532
00533 char* pch;
00534
00535 int offset = 10;
00536 ifstream source(path.c_str());
00537 if (source.is_open())
00538 {
00539 ROS_INFO("Loading file data to pcl Begin");
00540 char * tokenString;
00541 while (getline(source, line))
00542 {
00543 totalLine++;
00544
00545 if (totalLine > offset)
00546 {
00547 points++;
00548 float temp[6];
00549 pch = (char*)malloc(sizeof(char) * (line.length() + 1));
00550 strcpy(pch, line.c_str());
00551 tokenString = strtok(pch, " ");
00552 int i = 1;
00553 temp[0]=atof(tokenString);
00554 tokenString = strtok(NULL, " ");
00555 while ((tokenString != NULL))
00556 {
00557 temp[i]=atof(tokenString);
00558 tokenString = strtok(NULL, " ");
00559 i++;
00560 }
00561 ply.points[i].x=temp[0];
00562 ply.points[i].y=temp[1];
00563 ply.points[i].z=temp[2];
00564 ply.points[i].rgbr=temp[3];
00565 ply.points[i].rgbb=temp[4];
00566 ply.points[i].rgbg=temp[5];
00567
00568 }else{
00569
00570 if(totalLine == 3){
00571 pch = (char*)malloc(sizeof(char) * (line.length() + 1));
00572 strcpy(pch, line.c_str());
00573 tokenString = strtok(pch, " ");
00574 tokenString = strtok(NULL, " ");
00575 tokenString = strtok(NULL, " ");
00576
00577 ROS_INFO("Resized with points %ld",atol(tokenString));
00578 ply.points.resize(atol(tokenString));
00579 numP=atol(tokenString);
00580 ply.height = numP;
00581 }
00582 }
00583 }
00584 }
00585 else
00586 {
00587 ROS_INFO("Cannot open file data to load Pcl");
00588 }
00589 ROS_INFO("PCL loaded with: %i size", ply.points.size());
00590 *plyPt=ply;
00591 sensor_msgs::PointCloud2 pcl2Msg;
00592 pcl::toROSMsg(*plyPt,pcl2Msg);
00593 pcl->pcl=pcl2Msg;
00594 ROS_INFO("Retrieval executed");
00595
00596 }
00597
00598 arm_navigation_msgs::Shape utLoadMeshFromFile(std::string path){
00599 arm_navigation_msgs::Shape mesh;
00600 arm_navigation_msgs::Shape::Ptr meshPt (new arm_navigation_msgs::Shape );
00601 geometry_msgs::Point pt;
00602 std::cerr << path.c_str() << endl;
00603
00604
00605 mesh.type = 3;
00606 bool startCoord=false;
00607 bool startIndex=false;
00608 char * pch;
00609 string line;
00610 ifstream source(path.c_str());
00611 if(source.is_open()){
00612 char * tokenString;
00613 while (getline(source, line))
00614 {
00615
00616
00617 if ((line.find("]")!=string::npos) && (startCoord) ){
00618
00619 startCoord=false;
00620 } else if ((line.find("]")==string::npos) && (startCoord)){
00621 pch = (char*)malloc(sizeof(char) * (line.length() + 1));
00622 strcpy(pch, line.c_str());
00623 tokenString = strtok(pch, " ");
00624 pt.x = strtod(tokenString,NULL);
00625 tokenString = strtok(NULL, " ");
00626 pt.y = strtod(tokenString,NULL);
00627 tokenString = strtok(NULL, " ");
00628 pt.z = strtod(tokenString,NULL);
00629 mesh.vertices.push_back(pt);
00630 }
00631
00632
00633 if ((line.find("]")!=string::npos) && (startIndex) ){
00634
00635 startIndex=false;
00636 }else if ((line.find("]")==string::npos) && (startIndex)){
00637
00638 pch = (char*)malloc(sizeof(char) * (line.length() + 1));
00639 strcpy(pch, line.c_str());
00640 tokenString = strtok(pch, ",");
00641
00642 mesh.triangles.push_back(atoi(tokenString));
00643
00644 tokenString = strtok(NULL, ",");
00645
00646 mesh.triangles.push_back(atoi(tokenString));
00647
00648 tokenString = strtok(NULL, ",");
00649
00650 mesh.triangles.push_back(atoi(tokenString));
00651
00652 }
00653 if (line.find("Coordinate3")!=string::npos){
00654
00655 getline(source, line);
00656 if (line.find("point")!=string::npos){
00657 startCoord=true;
00658 }
00659 }
00660
00661 if (line.find("IndexedFaceSet")!=string::npos){
00662 getline(source, line);
00663 if (line.find("coordIndex")!=string::npos){
00664
00665 startIndex=true;
00666 }
00667 }
00668 }
00669
00670
00671 } else {
00672 ROS_INFO("Cannot load file mesh");
00673 }
00674
00675 return mesh;
00676 }
00677