GraspTable.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2017 Fraunhofer Institute for Manufacturing Engineering and Automation (IPA)
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 
18 #include <ros/ros.h>
19 #include <GraspTable.h>
20 
21 void GraspTable::ReadDoubleValue(TiXmlElement* xml, const char * tag, double * value)
22 {
23  TiXmlHandle handle(xml);
24  TiXmlElement* element=handle.FirstChild(tag).Element();
25  sscanf(element->GetText(), "%lf", value);
26 }
27 
28 void GraspTable::ReadJoint(TiXmlElement* xml, const char * tag, std::vector<double> & values)
29 {
30  TiXmlHandle handle(xml);
31  TiXmlElement* element=handle.FirstChild(tag).Element();
32  values.resize(16);
33  ReadDoubleValue(element, "ThumbAngle", &(values.data()[0]));
34  ReadDoubleValue(element, "ThumbBase", &(values.data()[1]));
35  ReadDoubleValue(element, "ThumbProximal", &(values.data()[2]));
36  ReadDoubleValue(element, "ThumbDistal", &(values.data()[3]));
37  ReadDoubleValue(element, "FirstFingerBase", &(values.data()[4]));
38  ReadDoubleValue(element, "FirstFingerProximal", &(values.data()[5]));
39  ReadDoubleValue(element, "FirstFingerDistal", &(values.data()[6]));
40  ReadDoubleValue(element, "MiddleFingerBase", &(values.data()[7]));
41  ReadDoubleValue(element, "MiddleFingerProximal", &(values.data()[8]));
42  ReadDoubleValue(element, "MiddleFingerDistal", &(values.data()[9]));
43  ReadDoubleValue(element, "RingFingerBase", &(values.data()[10]));
44  ReadDoubleValue(element, "RingFingerProximal", &(values.data()[11]));
45  ReadDoubleValue(element, "RingFingerDistal", &(values.data()[12]));
46  ReadDoubleValue(element, "LittleFingerBase", &(values.data()[13]));
47  ReadDoubleValue(element, "LittleFingerProximal", &(values.data()[14]));
48  ReadDoubleValue(element, "LittleFingerDistal", &(values.data()[15]));
49 }
50 
51 void GraspTable::ReadPose(TiXmlElement* xml, const char * tag, std::vector<double> & values)
52 {
53  TiXmlHandle handle(xml);
54  TiXmlElement* element=handle.FirstChild(tag).Element();
55  values.resize(6);
56  ReadDoubleValue(element, "PositionX", &(values.data()[0]));
57  ReadDoubleValue(element, "PositionY", &(values.data()[1]));
58  ReadDoubleValue(element, "PositionZ", &(values.data()[2]));
59  ReadDoubleValue(element, "Roll", &(values.data()[3]));
60  ReadDoubleValue(element, "Pitch", &(values.data()[4]));
61  ReadDoubleValue(element, "Yaw", &(values.data()[5]));
62 }
63 
64 int GraspTable::ReadFromFile(const char * filename, GraspTableObject* graspTableObject)
65 {
66  TiXmlDocument doc(filename);
67  if (graspTableObject == NULL)
68  {
69  printf("GraspTable::ReadFromFile:Error, argument error%s\n",filename);
70  return -3;
71  }
72  if (!doc.LoadFile())
73  {
74  printf("GraspTable::ReadFromFile:Error, could not read %s\n",filename);
75  return -1;
76  }
77  //printf ("Readig file %s\n",filename);
78  TiXmlHandle root_handle(&doc);
79  TiXmlHandle grasp_list_handle=root_handle.FirstChild("GraspList");
80  TiXmlElement* number_element=grasp_list_handle.FirstChildElement("Number").Element();
81  // total number of grasps in this file
82  int number;
83  sscanf(number_element->GetText(), "%d", &number);
84 
85  if (graspTableObject->Init(number) != 0)
86  {
87  printf("GraspTable::ReadFromFile:Error, could not allocate GraspTableObject\n");
88  return -2;
89  }
90  for (int i=0; i<number; i++)
91  {
92  TiXmlHandle grasp_handle=grasp_list_handle.ChildElement("Grasp", i);
93  TiXmlElement* grasp_element=grasp_handle.Element();
94  double quality;
95  grasp_element->QueryDoubleAttribute("Quality", &quality);
96 
97  Grasp * newGrasp = new Grasp();
98  newGrasp->SetGraspId(i);
99 
100  std::vector<double> values;
101 
102  ReadPose(grasp_element, "ApproachPose", values);
103  newGrasp->SetTCPPreGraspPose(values);
104 
105  ReadPose(grasp_element, "GraspPose", values);
106  newGrasp->SetTCPGraspPose(values);
107 
108  ReadJoint(grasp_element, "ApproachJoint", values);
109  newGrasp->SetHandPreGraspConfig(values);
110 
111  ReadJoint(grasp_element, "GraspJoint", values);
112  newGrasp->SetHandGraspConfig(values);
113 
114  ReadJoint(grasp_element, "GraspOptimalJoint", values);
115  newGrasp->SetHandOptimalGraspConfig(values);
116 
117  graspTableObject->AddGrasp(newGrasp);
118  }
119 
120  return 0;
121 }
122 
123 
124 int GraspTable::Init(char* object_table_file,unsigned int table_size)
125 {
126  FILE* f = fopen(object_table_file,"r");
127  int numberOfObjects = 0;
128 
129  if (f==NULL)
130  {
131  printf("GraspTable::Error, Object Table File not found :%s\n",object_table_file);
132  return -1;
133  }
134  fscanf(f,"%d\n",&numberOfObjects);
135  m_GraspTable.resize(table_size); //range of DESIRE class ids
136  for (unsigned int i=0;i < table_size;i++)
137  {
138  m_GraspTable[i] = NULL;
139  }
140  for (int obj=0; obj <numberOfObjects; obj++)
141  {
142  char GraspTableFileName[500];
143  int objectClassId = 0;
144  fscanf(f,"%d, %s\n",&objectClassId,GraspTableFileName);
145 //~ #####################################################################################################################
146  std::string object_table_file_str=object_table_file;
147  unsigned found = object_table_file_str.find_last_of("/");
148  std::string filepath = object_table_file_str.substr(0, found);
149  std::string grasp_table_file_str = filepath + '/' + GraspTableFileName;
150  strncpy(GraspTableFileName, grasp_table_file_str.c_str(), sizeof(GraspTableFileName));
151  GraspTableFileName[sizeof(GraspTableFileName) - 1] = 0;
152 //~ #####################################################################################################################
153  printf("GraspTable::Init: Trying to read grasp table for object %d from file %s ...\n",objectClassId,GraspTableFileName);
154  GraspTableObject * graspTableObject = new GraspTableObject();
155  graspTableObject->SetObjectClassId(objectClassId);
156  if (ReadFromFile(GraspTableFileName,graspTableObject)==0)
157  {
158  printf("successful\n");
159  AddGraspTableObject(graspTableObject);
160  }
161  else
162  {
163  printf("failed\n");
164  }
165  }
166  return 5;
167 }
168 
170 {
171  unsigned int objectClassId = object->GetObjectClassId();
172  if (objectClassId < m_GraspTable.size())
173  {
174  m_GraspTable[objectClassId]=object;
175  }
176  else
177  {
178  printf("GraspTable::AddGraspTableObject: Error, class id larger than table size!\n");
179  }
180 }
181 
182 
183 Grasp* GraspTable::GetNextGrasp(unsigned int objectClassId)
184 {
185  Grasp* retVal = NULL;
186  if (objectClassId < m_GraspTable.size() && m_GraspTable[objectClassId] != NULL)
187  {
188  if ((objectClassId != m_lastObjectClassId))
189  {
190  m_lastObjectClassId=objectClassId;
191  m_GraspTable[objectClassId]->ResetGraspReadPtr();
192  }
193  retVal = m_GraspTable[objectClassId]->GetNextGrasp();
194  }
195  return retVal;
196 }
197 
198 void GraspTable::ResetReadPtr(unsigned int object_class_id)
199 {
200  if (object_class_id < m_GraspTable.size())
201  {
202  m_GraspTable[object_class_id]->ResetGraspReadPtr();
203  }
204 }
205 
206 Grasp * GraspTable::GetGrasp(unsigned int objectClassId, unsigned int & grasp_id)
207 {
208  Grasp* retVal = NULL;
209  if (objectClassId < m_GraspTable.size() && m_GraspTable[objectClassId] != NULL)
210  {
211  retVal=m_GraspTable[objectClassId]->GetGrasp(grasp_id);
212  }
213  return retVal;
214 }
int Init(int size)
Definition: GraspTable.h:68
#define NULL
Grasp * GetGrasp(unsigned int object_class_id, unsigned int &grasp_id)
Definition: GraspTable.cpp:206
int ReadFromFile(const char *filename, GraspTableObject *tableObject)
Definition: GraspTable.cpp:64
std::vector< GraspTableObject * > m_GraspTable
Definition: GraspTable.h:126
unsigned int m_lastObjectClassId
Definition: GraspTable.h:127
void SetObjectClassId(unsigned int ObjectClassId)
Definition: GraspTable.h:96
std::vector< double > values
Grasp * GetNextGrasp(unsigned int object_class_id)
Definition: GraspTable.cpp:183
f
void SetHandOptimalGraspConfig(std::vector< double > HandOptimalGraspConfig)
Definition: GraspTable.h:47
void SetTCPPreGraspPose(std::vector< double > TCPPreGraspPose)
Definition: GraspTable.h:34
bool found
void ReadJoint(TiXmlElement *xml, const char *tag, std::vector< double > &values)
Definition: GraspTable.cpp:28
void SetGraspId(int graspId)
Definition: GraspTable.h:49
void SetTCPGraspPose(std::vector< double > TCPGraspPose)
Definition: GraspTable.h:37
void AddGraspTableObject(GraspTableObject *graspTableObject)
Definition: GraspTable.cpp:169
void SetHandGraspConfig(std::vector< double > HandGraspConfig)
Definition: GraspTable.h:44
int Init(char *iniFile, unsigned int table_size=MAX_NO_OF_OBJECTS)
Definition: GraspTable.cpp:124
void ReadPose(TiXmlElement *xml, const char *tag, std::vector< double > &values)
Definition: GraspTable.cpp:51
void ReadDoubleValue(TiXmlElement *xml, const char *tag, double *value)
Definition: GraspTable.cpp:21
void SetHandPreGraspConfig(std::vector< double > HandPreGraspConfig)
Definition: GraspTable.h:41
void AddGrasp(Grasp *grasp)
Definition: GraspTable.h:92
void ResetReadPtr(unsigned int object_class_id)
Definition: GraspTable.cpp:198


cob_pick_place_action
Author(s): Felix Messmer
autogenerated on Mon Jun 10 2019 13:10:02