pose_predictor.cpp
Go to the documentation of this file.
1 
19 #include "ISM/utility/GeometryHelper.hpp"
20 #include "Eigen/Geometry"
21 namespace pose_prediction_ism
22 {
23 PosePredictor::PosePredictor(std::string database_filename,
24  std::string name_space,
25  PredictorType predictor_type):
26  NAME_SPACE_(name_space),
27  PREDICTOR_TYPE_(predictor_type)
28 {
29 
30  ROS_INFO_STREAM("Pose prediction is run with database " << database_filename);
31  table_helper_ = ISM::TableHelperPtr(new ISM::TableHelper(database_filename));
32 
33  int counter = 0;
34 
35  for(std::string pattern_name : table_helper_->getModelPatternNames())
36  {
37  IsmObjectSet objects_in_pattern = table_helper_->getObjectTypesAndIdsBelongingToPattern(pattern_name);
38  ISM::ObjectToVoteMap object_votes = table_helper_->getVoteSpecifiersForPatternAndObjects(pattern_name, objects_in_pattern);
39  votes_[pattern_name] = object_votes;
40 
41  for (IsmObject object : objects_in_pattern)
42  {
44  .at(pattern_name)
45  .at(object.first)
46  .at(object.second).size();
47 
49 
50  break;
51  }
52  counter ++;
53  }
54 
55  average_votes_ = (average_votes_/counter);
56 
57  ROS_INFO("PosePredictor: averageVotes: %f", average_votes_);
58 }
59 
61 {
62 }
63 
64 void PosePredictor::traverseISM(std::string pattern_name, unsigned int level)
65 {
66  std::string s = "";
67  for (unsigned int i = 0; i < level; ++i)
68  s += "-";
69  s += ">";
70  ROS_DEBUG_STREAM(s << " patternName: " << pattern_name);
71  IsmObjectSet objects_in_pattern =
72  table_helper_->getObjectTypesAndIdsBelongingToPattern(pattern_name);
73  for (IsmObject object : objects_in_pattern)
74  traverseISM(object.first, level + 1);
75 }
76 
77 ISM::PosePtr PosePredictor::predictPose(ISM::PosePtr reference_pose_ptr,
78  IsmObjects path_to_object)
79 {
80  ROS_ASSERT_MSG(path_to_object.size() > 1 ,
81  "There must be more than one predecessor, otherwise all objects are in the reference");
82  ISM::PosePtr current_pose(reference_pose_ptr);
83  for (IsmObjects::iterator predecessors_it = path_to_object.begin();
84  predecessors_it + 1 != path_to_object.end();
85  ++predecessors_it)
86  {
87  using namespace ISM;
88  std::vector<VoteSpecifierPtr> specifiers = votes_
89  .at(predecessors_it->first)
90  .at((predecessors_it + 1)->first)
91  .at((predecessors_it + 1)->second);
92  unsigned int index = rand() % specifiers.size();
93  VoteSpecifierPtr specifier = specifiers.at(index);
94  PointPtr absolute_position = GeometryHelper::getSourcePoint(current_pose,
95  specifier->refToObjectQuat,
96  specifier->radius);
97 
98  Eigen::Quaterniond q;
99  if(USE_RANDOMS){
100  double r_x, r_y, r_z;
101  do{
102  r_x = udg_dist_->operator ()();
103  r_y = udg_dist_->operator ()();
104  r_z = udg_dist_->operator ()();
105  }while(std::sqrt(r_x * r_x + r_y * r_y + r_z * r_z) > SPHERE_RADIUS);
106  absolute_position->eigen.x() = absolute_position->eigen.x() + r_x;
107  absolute_position->eigen.y() = absolute_position->eigen.y() + r_y;
108  absolute_position->eigen.z() = absolute_position->eigen.z() + r_z;
109 
110  r_x = udg_rot_->operator ()();
111  r_y = udg_rot_->operator ()();
112  r_z = udg_rot_->operator ()();
113 
114  q = Eigen::AngleAxisd(GeometryHelper::deg2rad(r_x), Eigen::Vector3d::UnitX())
115  * Eigen::AngleAxisd(GeometryHelper::deg2rad(r_y), Eigen::Vector3d::UnitY())
116  * Eigen::AngleAxisd(GeometryHelper::deg2rad(r_z), Eigen::Vector3d::UnitZ());
117 
118  }
119  PosePtr absolute_pose = GeometryHelper::getSourcePose(current_pose, absolute_position, specifier->refToObjectPoseQuat);
120  current_pose = absolute_pose;
121 
122  if(USE_RANDOMS){
123  current_pose->quat = ISM::GeometryHelper::eigenQuatToQuat(ISM::GeometryHelper::quatToEigenQuat(current_pose->quat) * q);
124  }
125 }
126  return current_pose;
127 }
128 
129 /* ----------------- Setters ------------------ */
131 {
132  found_objects_ = value;
133 }
134 /* ----------------- Getters ------------------ */
135 
137 {
138  return NAME_SPACE_;
139 }
140 
142 {
144 }
146 {
147  return PREDICTOR_TYPE_;
148 }
149 
150 std::ostream &operator <<(std::ostream &strm, const PosePredictorPtr &pPtr)
151 {
152  return strm << (*pPtr);
153 }
154 
155 std::ostream&operator <<(std::ostream &strm, const PosePredictor &p)
156 {
157  std::string type_string;
158  switch (p.getPredictorType())
159  {
160  case Shortest: type_string = "ShortestPath"; break;
161  case Best: type_string = "BestPath";break;
162  case Random: type_string = "RandomPath";break;
163  case PPNonNor: type_string = "PaperPredictionNonNormalized";break;
164  case PPNor: type_string = "PaperPredictionNormalized";break;
165  default: type_string = "Unknown Predictor";
166  }
167  return strm << type_string;
168 }
169 }
170 
171 
172 
173 
174 
175 
176 
177 
178 
179 
180 
ISM::PatternToObjectToVoteMap votes_
AttributedPointCloud attributed_point_cloud_
std::set< IsmObject > IsmObjectSet
std::ostream & operator<<(std::ostream &strm, const PosePredictor &p)
XmlRpcServer s
PosePredictor(std::string database_filename, std::string name_space, PredictorType predictor_type)
void traverseISM(std::string pattern_name, unsigned int level)
AttributedPointCloud getAttributedPointCloud() const
UniformDistributionGenerator * udg_rot_
ISM::PosePtr predictPose(ISM::PosePtr reference_pose_ptr, IsmObjects path_to_object)
#define ROS_INFO(...)
UniformDistributionGenerator * udg_dist_
#define ROS_ASSERT_MSG(cond,...)
std::string getMarkerNameSpace() const
#define ROS_DEBUG_STREAM(args)
std::pair< std::string, std::string > IsmObject
PredictorType getPredictorType() const
#define ROS_INFO_STREAM(args)
std::vector< FoundObject > FoundObjects
Definition: typedef.h:34
std::vector< IsmObject > IsmObjects
void setFoundObjects(const FoundObjects &value)
asr_msgs::AsrAttributedPointCloud AttributedPointCloud
Definition: typedef.h:37


asr_lib_pose_prediction_ism
Author(s): Heizmann Heinrich, Heller Florian, Meißner Pascal, Stöckle Patrick
autogenerated on Thu Jan 9 2020 07:19:56