ism_pose_prediction_visualizer_rviz.cpp
Go to the documentation of this file.
1 
17 //Header include
19 
20 //Ilcas includes
22 #include <ISM/utility/GeometryHelper.hpp>
23 
24 //ros includes
25 #include <ros/package.h>
26 
27 //foreigen includes
28 #include <Eigen/Geometry>
29 #include <boost/filesystem.hpp>
30 #include <boost/filesystem/path.hpp>
31 #include <boost/algorithm/string.hpp>
32 #include <boost/random/uniform_real.hpp>
33 #include <boost/random/mersenne_twister.hpp>
34 #include <boost/random/variate_generator.hpp>
35 
36 //other includes
37 #include <vector>
38 #include <string>
39 #include <math.h>
40 
41 
42 
43 
44 
45 namespace VIZ
46 {
47 
48 void ISMPosePredictionVisualizerRVIZ::addVisualization(ISM::RecognitionResultPtr result, asr_msgs::AsrAttributedPointCloud attributed_point_cloud, bool valid_position_viz)
49 {
50 
51  if(attributed_point_cloud.elements.size() == 0 || result->referencePose == nullptr)
52  {
53  ROS_ERROR("No matching scene for prediction. Skipping visualization");
54  return;
55  }
56 
57  int id = 0;
59  id_to_object_name_map_.clear();
60  dist_color_.clear();
61 
62  //Fill maps with data from attributed point cloud
63  for (asr_msgs::AsrAttributedPoint attributed_point: attributed_point_cloud.elements)
64  {
65  ISM::PointPtr ism_point_ptr(new ISM::Point(attributed_point.pose.position.x,
66  attributed_point.pose.position.y,
67  attributed_point.pose.position.z));
68  ISM::QuaternionPtr ism_quat_ptr(new ISM::Quaternion(attributed_point.pose.orientation.w,
69  attributed_point.pose.orientation.x,
70  attributed_point.pose.orientation.y,
71  attributed_point.pose.orientation.z));
72  ISM::PosePtr ism_pose_ptr(new ISM::Pose(ism_point_ptr, ism_quat_ptr));
73 
74  ISM::Object oPtr(attributed_point.type, ism_pose_ptr, attributed_point.identifier, mesh_resource_paths_[attributed_point.type].string());
75 
77  std::vector<ISM::PosePtr> temp_vector;
78  object_type_to_poses_map_[oPtr] = temp_vector;
79  id_to_object_name_map_[id] = oPtr;
80  id++;
81  }
82  object_type_to_poses_map_[oPtr].push_back(ism_pose_ptr);
83 
84  }
85 
86  if(valid_position_viz){
87  //Visualization of valid positions
89  addMarker(ma);
91 
92 
93  }else{
94  // normal Pose Prediction
95  // generate and publish prediction marker
97  addMarker(ma);
99 
100  pose_counter_ = 0;
101  object_counter_ = 0;
102 
103  update = true;
105  }
106 
107 }
109  MarkerArray ret_marker;
110  std_msgs::ColorRGBA vp_sphere_color;
111  std_msgs::ColorRGBA vp_vector_color;
112  std::string voter_namespace;
113  int i = 1;
114 
115  typedef boost::variate_generator<boost::mt19937, boost::uniform_real<> > UniformDistributionGenerator;
116  UniformDistributionGenerator* udg = new UniformDistributionGenerator(boost::mt19937(time(0)), boost::uniform_real<>(-sphere_radius_, sphere_radius_));
117 
118  std::vector<std::string> object_axis;
119  boost::split(object_axis, object_axis_map_, boost::is_any_of(";"));
120 
121  std::map<std::string, int> axis_map;
122  for(uint k = 0; k < object_axis.size(); k++){
123  if(!object_axis[k].empty()){
124  std::vector<std::string> temp_tokens;
125  boost::split(temp_tokens, object_axis[k], boost::is_any_of("-"));
126  if(!temp_tokens[0].empty() && !temp_tokens[1].empty()){
127  int axis = 0;
128  if(temp_tokens[1].compare("X") == 0) axis = 0;
129  else if(temp_tokens[1].compare("Y") == 0) axis = 1;
130  else if(temp_tokens[1].compare("Z") == 0) axis = 2;
131  axis_map.insert(std::make_pair(temp_tokens[0], axis));
132  }
133  }
134  }
135 
136 
137  for(auto voter_to_pose_map_iter : object_type_to_poses_map_)
138  {
139  int id = 0;
140  voter_namespace = "positions_of_" + voter_to_pose_map_iter.first.type;
141 
142  vp_sphere_color = VizHelperRVIZ::hsvToRGBA(120 + (240.0 / (object_type_to_poses_map_.size() + 1)) * i , 1.0, pose_prediction_value_);
143  vp_sphere_color.a = pose_prediction_alpha_;
144  vp_vector_color = VizHelperRVIZ::hsvToRGBA(120 + (240.0 / (object_type_to_poses_map_.size() + 1)) * i , 1.0, sample_value_);
145  vp_vector_color.a = sample_alpha_;
146  int axis = 0;
147  if(axis_map.find(voter_to_pose_map_iter.first.type) != axis_map.end()){
148  axis = axis_map[voter_to_pose_map_iter.first.type];
149  }
150  for(ISM::PosePtr pose : voter_to_pose_map_iter.second){
151  ret_marker.markers.push_back(VizHelperRVIZ::createSphereMarker(pose->point , base_frame_, voter_namespace, id++, sphere_radius_ * 2, vp_sphere_color, marker_lifetime_));
152  MarkerArray temp_marker = VizHelperRVIZ::createPositionVector(pose, base_frame_, voter_namespace, vp_vector_color, udg, object_sampels_, axis, id, sphere_radius_ * sample_scale_, max_angle_scale_ * sample_scale_, sphere_radius_, marker_lifetime_);
153  id += object_sampels_*2;
154  ret_marker.markers.insert(ret_marker.markers.end(), temp_marker.markers.begin(), temp_marker.markers.end());
155 
156  }
157  i++;
158  }
159  return ret_marker;
160 }
161 
162 
164  if(!update)
165  return;
167  // current Object not in map. skipping.
168  return;
169  }
170 
171  ISM::Object object_ptr = id_to_object_name_map_[object_counter_];
172  ISM::PosePtr pose = object_type_to_poses_map_[object_ptr][pose_counter_];
173 
174  std::string marker_namespace = "selected_prediction_pose";
175 
176 
177  boost::filesystem::path object_ressource_path = object_ptr.ressourcePath;
178 
179  ColorRGBA object_color = VizHelperRVIZ::getColorOfObject(object_ptr);
180 
181  // generate and publish object Markers
182  Marker marker = VizHelperRVIZ::createMeshMarker(pose, base_frame_, marker_namespace, 1, object_color, marker_lifetime_, object_ressource_path.string());
183  MarkerArray ring_marker;
184  if(dist_color_.size() == 6){
185  ring_marker = VizHelperRVIZ::createRingMarker(pose,base_frame_, "ring_marker", 0.1, dist_color_[0], dist_color_[1], dist_color_[2],
187  }else{
188  ColorRGBA color_red = VizHelperRVIZ::createColorRGBA(1.0, 0.0, 0.0, 1.0);
189  ring_marker = VizHelperRVIZ::createRingMarker(pose,base_frame_, "ring_marker", 0.1, color_red, color_red, color_red, color_red, color_red, color_red, marker_lifetime_);
190  }
191 
192 
193  addMarker(marker);
194  addMarker(ring_marker);
196 }
197 
198 void ISMPosePredictionVisualizerRVIZ::calculateDistColor(ISM::ObjectPtr camera_object_ptr){
200  // Maps well initialised, set color to red
201 
202  if(id_to_object_name_map_[object_counter_].type == camera_object_ptr->type){
203  // given objects matches one object in Map, calculating absolute
204 
205  dist_color_.clear();
206  ColorRGBA temp_dist_color;
208  ISM::PointPtr camera_point_ptr = camera_object_ptr->pose->point;
209  ISM::QuaternionPtr quat_ptr = object_type_to_poses_map_[id_to_object_name_map_[object_counter_]][pose_counter_]->quat;
210  ISM::QuaternionPtr camera_quat_ptr = camera_object_ptr->pose->quat;
211 
212 
213 
214  // calculate distanceColor with the fiven maximum distance
215 
216  temp_dist_color = VizHelperRVIZ::hsvToRGBA(120 - std::min(1.0, std::abs(point_ptr->eigen.x() - camera_point_ptr->eigen.x()) / max_distance_in_overlay_) * 120, 1.0, 1.0);
217  dist_color_.push_back(temp_dist_color);
218  temp_dist_color = VizHelperRVIZ::hsvToRGBA(120 - std::min(1.0, std::abs(point_ptr->eigen.z() - camera_point_ptr->eigen.z()) / max_distance_in_overlay_) * 120, 1.0, 1.0);
219  dist_color_.push_back(temp_dist_color);
220  temp_dist_color = VizHelperRVIZ::hsvToRGBA(120 - std::min(1.0, std::abs(point_ptr->eigen.y() - camera_point_ptr->eigen.y()) / max_distance_in_overlay_) * 120, 1.0, 1.0);
221  dist_color_.push_back(temp_dist_color);
222 
223  Eigen::Quaternion<double> rot = ISM::GeometryHelper::quatToEigenQuat(quat_ptr);
224  Eigen::Matrix3d euler_angle = rot.toRotationMatrix();
225  Eigen::Vector3d vector = euler_angle.eulerAngles(2, 0, 2);
226 
227  Eigen::Quaternion<double> camera_rot = ISM::GeometryHelper::quatToEigenQuat(camera_quat_ptr);
228  Eigen::Matrix3d camera_euler_angle = camera_rot.toRotationMatrix();
229  Eigen::Vector3d camera_vector = camera_euler_angle.eulerAngles(2, 0, 2);
230 
231 
232  temp_dist_color = VizHelperRVIZ::hsvToRGBA(120 - std::min(1.0, std::abs(vector[0] - camera_vector[0]) / max_distance_in_overlay_) * 120, 1.0, 1.0);
233  dist_color_.push_back(temp_dist_color);
234  temp_dist_color = VizHelperRVIZ::hsvToRGBA(120 - std::min(1.0, std::abs(vector[2] - camera_vector[2]) / max_distance_in_overlay_) * 120, 1.0, 1.0);
235  dist_color_.push_back(temp_dist_color);
236  temp_dist_color = VizHelperRVIZ::hsvToRGBA(120 - std::min(1.0, std::abs(vector[1] - camera_vector[1]) / max_distance_in_overlay_) * 120, 1.0, 1.0);
237  dist_color_.push_back(temp_dist_color);
238  }
240  }
241 }
242 
244  MarkerArray ret_marker;
245  MarkerArray temp_arrow_markers;
246  std_msgs::ColorRGBA vote_color;
247  std::string voter_namespace;
248 
249  int i = 1;
250  for(auto iter: object_type_to_poses_map_)
251  {
252  voter_namespace = "prediction_of_" + iter.first.type;
253 
254  vote_color = VizHelperRVIZ::hsvToRGBA(120 + (240.0 / (object_type_to_poses_map_.size() + 1)) * i , 1.0, 1.0);
255  vote_color.a = 0.5;
256  std::vector<std::pair<ISM::PointPtr, std::vector<ISM::PosePtr>>> pose_vector;
257  pose_vector.push_back(std::make_pair(result->referencePose->point, iter.second));
258  temp_arrow_markers = VizHelperRVIZ::createCoordinateArrow(pose_vector, base_frame_, voter_namespace,
260  ret_marker.markers.insert(ret_marker.markers.end(), temp_arrow_markers.markers.begin(), temp_arrow_markers.markers.end());
261 
262 
263  i++;
264  }
265  return ret_marker;
266 }
267 
269  if(object_type_to_poses_map_.size() <= 0)
270  return;
272  pose_counter_ = 0;
273  dist_color_.clear();
275 }
276 
278  if(object_type_to_poses_map_.size() <= 0)
279  return;
281  pose_counter_ = 0;
282  dist_color_.clear();
284 }
285 
287  if(object_type_to_poses_map_.size() <= 0)
288  return;
291 }
292 
294  if(object_type_to_poses_map_.size() <= 0)
295  return;
298 }
299 }
static MarkerArray createRingMarker(ISM::PosePtr pose, std::string baseFrame, std::string markerNamespace, float scale, ColorRGBA x, ColorRGBA y, ColorRGBA z, ColorRGBA a, ColorRGBA b, ColorRGBA g, double markerLifetime)
static ColorRGBA hsvToRGBA(double hue, double saturation, double value)
static ColorRGBA getColorOfObject(const ISM::Object &object)
MarkerArray generatePredictionMarker(ISM::RecognitionResultPtr result)
generates prediction markers
visualization_msgs::Marker Marker
std::map< std::string, boost::filesystem::path > mesh_resource_paths_
void updateObjectMarker()
updates marker of selected object
static Marker createSphereMarker(ISM::PointPtr point, std::string baseFrame, std::string markerNamespace, int id, float radius, ColorRGBA color, double markerLifetime)
static MarkerArray createCoordinateArrow(std::vector< std::pair< ISM::PointPtr, std::vector< ISM::PosePtr > > > poses_vec, std::string baseFrame, std::string markerNamespace, float arrowScale, float axisScale, ColorRGBA color, double markerLifetime)
MarkerArray generateValidPositions(ISM::RecognitionResultPtr result)
generates markers for validPositionSpace visualization
static ColorRGBA createColorRGBA(float red, float green, float blue, float alpha)
std::map< ISM::Object, std::vector< ISM::PosePtr > > object_type_to_poses_map_
void nextObject()
increments object counter and uptates object marker
std_msgs::ColorRGBA ColorRGBA
visualization_msgs::MarkerArray MarkerArray
void addMarker(visualization_msgs::Marker marker)
static Marker createMeshMarker(ISM::PosePtr pose, std::string baseFrame, std::string markerNamespace, int id, ColorRGBA color, double markerLifetime, std::string resourcePath)
void calculateDistColor(ISM::ObjectPtr camera_object_ptr)
void addVisualization(ISM::RecognitionResultPtr result, asr_msgs::AsrAttributedPointCloud attributed_point_cloud, bool valid_position_viz)
boost::variate_generator< boost::mt19937, boost::uniform_real<> > UniformDistributionGenerator
void nextPose()
increments posecounter and uptates object marker
static MarkerArray createPositionVector(ISM::PosePtr pose, std::string baseFrame, std::string markerNamespace, ColorRGBA color, UniformDistributionGenerator *udg, int sampels, int axis, int id, float length, float openAngle, float sphereRadius, double markerLifetime)
#define ROS_ERROR(...)


asr_ism_visualizations
Author(s): Hanselmann Fabian, Heller Florian, Heizmann Heinrich, Kübler Marcel, Meißner Pascal, Reckling Reno, Stöckle Patrick, Trautmann Jeremias
autogenerated on Fri Nov 8 2019 03:28:47