ram_display.cpp
Go to the documentation of this file.
1 #include <string>
2 #include <mutex>
3 
6 #include <ram_display/DeleteTrajectory.h>
7 #include <ram_display/DisplayTrajectory.h>
8 #include <ram_display/UpdateMeshColor.h>
9 #include <ram_display/UpdateSelection.h>
10 #include <ram_msgs/AdditiveManufacturingTrajectory.h>
11 #include <ram_utils/GetTool.h>
12 #include <ros/ros.h>
14 #include <std_msgs/ColorRGBA.h>
15 
17 
20 
21 std::string trajectory_frame;
22 
23 // Get tool service client
25 
26 // Trajectory
27 std::recursive_mutex trajectory_mutex;
28 ram_msgs::AdditiveManufacturingTrajectory additive_traj;
29 
30 // Display parameters
31 std::recursive_mutex display_params_mutex;
32 ram_display::DisplayTrajectory::Request display_params;
33 
34 // Selection
35 std::recursive_mutex selection_params_mutex;
36 ram_display::UpdateSelection::Request selection;
37 
38 bool updateSelection(bool display = true);
39 
40 std::string fileExtension(const std::string full_path)
41 {
42  size_t last_index = full_path.find_last_of("/");
43  std::string file_name = full_path.substr(last_index + 1, full_path.size());
44 
45  last_index = file_name.find_last_of("\\");
46  file_name = file_name.substr(last_index + 1, file_name.size());
47 
48  last_index = file_name.find_last_of(".");
49  if (last_index == std::string::npos)
50  return "";
51 
52  return file_name.substr(last_index + 1, file_name.size());
53 }
54 
55 std_msgs::ColorRGBA intToColor(const unsigned int color)
56 {
57  std_msgs::ColorRGBA rvalue;
58  rvalue.a = 1;
59 
60  switch (color % 28)
61  {
62  case 0:
63  rvalue.r = 225;
64  rvalue.g = 11;
65  rvalue.b = 29;
66  break;
67  case 1:
68  rvalue.r = 0;
69  rvalue.g = 136;
70  rvalue.b = 31;
71  break;
72  case 2:
73  rvalue.r = 143;
74  rvalue.g = 63;
75  rvalue.b = 250;
76  break;
77  case 3:
78  rvalue.r = 0;
79  rvalue.g = 172;
80  rvalue.b = 197;
81  break;
82  case 4:
83  rvalue.r = 255;
84  rvalue.g = 128;
85  rvalue.b = 207;
86  break;
87  case 5:
88  rvalue.r = 139;
89  rvalue.g = 254;
90  rvalue.b = 60;
91  break;
92  case 6:
93  rvalue.r = 113;
94  rvalue.g = 8;
95  rvalue.b = 78;
96  break;
97  case 7:
98  rvalue.r = 255;
99  rvalue.g = 165;
100  rvalue.b = 66;
101  break;
102  case 8:
103  rvalue.r = 0;
104  rvalue.g = 13;
105  rvalue.b = 154;
106  break;
107  case 9:
108  rvalue.r = 136;
109  rvalue.g = 112;
110  rvalue.b = 105;
111  break;
112  case 10:
113  rvalue.r = 0;
114  rvalue.g = 73;
115  rvalue.b = 66;
116  break;
117  case 11:
118  rvalue.r = 0;
119  rvalue.g = 253;
120  rvalue.b = 208;
121  break;
122  case 12:
123  rvalue.r = 82;
124  rvalue.g = 42;
125  rvalue.b = 14;
126  break;
127  case 13:
128  rvalue.r = 188;
129  rvalue.g = 183;
130  rvalue.b = 252;
131  break;
132  case 14:
133  rvalue.r = 146;
134  rvalue.g = 180;
135  rvalue.b = 125;
136  break;
137  case 15:
138  rvalue.r = 200;
139  rvalue.g = 18;
140  rvalue.b = 182;
141  break;
142  case 16:
143  rvalue.r = 0;
144  rvalue.g = 103;
145  rvalue.b = 160;
146  break;
147  case 17:
148  rvalue.r = 41;
149  rvalue.g = 6;
150  rvalue.b = 64;
151  break;
152  case 18:
153  rvalue.r = 224;
154  rvalue.g = 179;
155  rvalue.b = 176;
156  break;
157  case 19:
158  rvalue.r = 255;
159  rvalue.g = 245;
160  rvalue.b = 152;
161  break;
162  case 20:
163  rvalue.r = 81;
164  rvalue.g = 69;
165  rvalue.b = 90;
166  break;
167  case 21:
168  rvalue.r = 168;
169  rvalue.g = 124;
170  rvalue.b = 35;
171  break;
172  case 22:
173  rvalue.r = 255;
174  rvalue.g = 114;
175  rvalue.b = 106;
176  break;
177  case 23:
178  rvalue.r = 51;
179  rvalue.g = 129;
180  rvalue.b = 111;
181  break;
182  case 24:
183  rvalue.r = 136;
184  rvalue.g = 7;
185  rvalue.b = 21;
186  break;
187  case 25:
188  rvalue.r = 166;
189  rvalue.g = 124;
190  rvalue.b = 177;
191  break;
192  case 26:
193  rvalue.r = 49;
194  rvalue.g = 78;
195  rvalue.b = 19;
196  break;
197  default: // case 28
198  rvalue.r = 144;
199  rvalue.g = 228;
200  rvalue.b = 253;
201  break;
202  }
203 
204  rvalue.r /= 255.0;
205  rvalue.g /= 255.0;
206  rvalue.b /= 255.0;
207  return rvalue;
208 }
209 
210 // Return true if the a pose in the trajectory is close to another pose
211 bool closeToPose(const unsigned pose_index,
212  const double tolerance)
213 {
214  // Current point
215  Eigen::Vector3d current_p(Eigen::Vector3d::Identity());
216  tf::pointMsgToEigen(additive_traj.poses[pose_index].pose.position, current_p);
217  for (unsigned i(0); i < pose_index; ++i)
218  {
219  // Points already published
220  Eigen::Vector3d p(Eigen::Vector3d::Identity());
221  tf::pointMsgToEigen(additive_traj.poses[i].pose.position, p);
222 
223  if ((current_p - p).norm() < tolerance)
224  return true;
225  }
226 
227  return false;
228 }
229 
231  const EigenSTL::vector_Vector3d &b_points,
232  const std::vector<std_msgs::ColorRGBA> &colors,
233  double radius)
234 {
235  if (a_points.size() != b_points.size())
236  {
237  ROS_ERROR_STREAM("Skipping path because " << a_points.size() << " different from " << b_points.size());
238  return false;
239  }
240 
241  if (a_points.size() != colors.size())
242  {
243  ROS_ERROR_STREAM("Skipping path because " << a_points.size() << " different from " << colors.size());
244  return false;
245  }
246 
247  // Create the cylinders
248  for (unsigned i(0); i < a_points.size(); ++i)
249  rvt_trajectory->publishCylinder(a_points[i], b_points[i], colors[i], radius, "Cylinders");
250  return true;
251 
252 }
253 
254 void displayMesh(const std_msgs::ColorRGBA color,
255  const std::string frame_id = "base",
256  const std::string mesh_file_name = "")
257 {
258  visualization_msgs::Marker mesh_marker;
259  mesh_marker.pose.orientation.w = 1;
260 
261  if (mesh_file_name.empty())
262  {
263  mesh_marker.header.frame_id = frame_id;
264  mesh_marker.header.stamp = ros::Time();
265  mesh_marker.ns = "mesh";
266  mesh_marker.id = 0;
267  mesh_marker.type = visualization_msgs::Marker::MESH_RESOURCE;
268  mesh_marker.action = visualization_msgs::Marker::DELETE;
269  }
270  else
271  {
272  mesh_marker.header.frame_id = frame_id;
273  mesh_marker.header.stamp = ros::Time();
274  mesh_marker.ns = "mesh";
275  mesh_marker.id = 0;
276  mesh_marker.type = visualization_msgs::Marker::MESH_RESOURCE;
277  mesh_marker.action = visualization_msgs::Marker::ADD;
278  mesh_marker.pose.position.x = 0;
279  mesh_marker.pose.position.y = 0;
280  mesh_marker.pose.position.z = 0;
281  mesh_marker.scale.x = 1;
282  mesh_marker.scale.y = 1;
283  mesh_marker.scale.z = 1;
284  mesh_marker.color = color;
285  mesh_marker.mesh_resource = "file:///" + mesh_file_name;
286  mesh_marker.frame_locked = true;
287  }
288 
289  if (mesh_pub.getNumSubscribers() == 0)
290  ROS_ERROR_STREAM("No subscriber on topic " << mesh_pub.getTopic() << ": mesh will not be displayed");
291  mesh_pub.publish(mesh_marker);
292 }
293 
295 {
296  std_msgs::ColorRGBA color;
297  displayMesh(color);
298  rvt_trajectory->deleteAllMarkers();
299  rvt_trajectory->trigger();
300  updateSelection(false); // Don't clear the selection, but don't display it!
301 }
302 
303 std::string displayTrajectory()
304 {
305  std::lock_guard<std::recursive_mutex> lock_1(trajectory_mutex);
306  std::lock_guard<std::recursive_mutex> lock_2(display_params_mutex);
307 
308  if (additive_traj.poses.empty())
309  return "Trajectory is empty";
310 
311  // Validate parameters
312  if (display_params.color_mode > 3)
313  return "color_mode must be between 0 and 3. color_mode = " + std::to_string(display_params.color_mode);
314 
315  if (display_params.display_mode > 3)
316  return "display_mode must be between 0 and 3. display_mode = " + std::to_string(display_params.display_mode);
317 
318  if (display_params.wire_size <= 0)
319  return "wire_size cannot be zero/negative. wire_size = " + std::to_string(display_params.wire_size);
320 
321  if (display_params.cylinder_size <= 0)
322  return "cylinder_size cannot be zero/negative. cylinder_size = " + std::to_string(display_params.cylinder_size);
323 
324  if (display_params.axis_size <= 0)
325  return "axis_size cannot be zero/negative. axis_size = " + std::to_string(display_params.axis_size);
326 
327  if (display_params.display_labels && (display_params.labels_size <= 0))
328  return "labels_size cannot be zero/negative. labels_size = " + std::to_string(display_params.labels_size);
329 
330  if (display_params.display_range_of_layers)
331  {
332  if (display_params.last_layer < display_params.first_layer)
333  return "first_layer must be less than last_layer";
334 
335  unsigned highest_level(additive_traj.poses.front().layer_level);
336  for (auto ram_pose : additive_traj.poses)
337  {
338  if (ram_pose.layer_level > highest_level)
339  highest_level = ram_pose.layer_level;
340  }
341 
342  if (display_params.last_layer > highest_level)
343  return "Cannot display this range of layers, last layer do not exist in the trajectory.\n"
344  "Try with a lower \"Last layer\" value.";
345  }
346 
348 
349  std::string file_extension(fileExtension(additive_traj.file));
350  if (!strcasecmp(file_extension.c_str(), "yaml") || !strcasecmp(file_extension.c_str(), "yml"))
351  {
352  std_msgs::ColorRGBA color;
353  displayMesh(color);
354  }
355  else if (!strcasecmp(file_extension.c_str(), "obj") ||
356  !strcasecmp(file_extension.c_str(), "ply") ||
357  !strcasecmp(file_extension.c_str(), "stl"))
358  {
359  displayMesh(display_params.mesh_color,
361  additive_traj.file);
362  }
363 
364  std::vector<std_msgs::ColorRGBA> colors_vector;
365  std::map<double, std_msgs::ColorRGBA> color_map;
366  unsigned color(0);
368  EigenSTL::vector_Vector3d path_positions;
369 
370  // Get the highest level of the trajectory
371  // Warning: This is NOT necessarily the last pose level!
372  unsigned maximum_level(0);
373  for (auto pose : additive_traj.poses)
374  if (pose.layer_level > maximum_level)
375  maximum_level = pose.layer_level;
376 
377  std::vector<unsigned> pose_index_within_layer_count(maximum_level + 1);
378  std::fill(pose_index_within_layer_count.begin(), pose_index_within_layer_count.end(), 0);
379 
380  EigenSTL::vector_Vector3d a_points;
381  EigenSTL::vector_Vector3d b_points;
382 
383  Eigen::Affine3d pose_affine(Eigen::Affine3d::Identity());
384  Eigen::Affine3d previous_pose_affine(Eigen::Affine3d::Identity());
385  unsigned previous_i(0);
386 
387  for (unsigned i(0); i < additive_traj.poses.size(); ++i)
388  {
389  if ((additive_traj.poses[i].layer_level < display_params.first_layer
390  || additive_traj.poses[i].layer_level > display_params.last_layer) && display_params.display_range_of_layers)
391  continue;
392  previous_pose_affine = pose_affine;
393  tf::poseMsgToEigen(additive_traj.poses[i].pose, pose_affine);
394  path.push_back(pose_affine);
395  path_positions.push_back(pose_affine.translation());
396 
397  // Verify if the current pose and the previous pose are contiguous
398  if (i != 0 && previous_i + 1 == i)
399  {
400  b_points.push_back(pose_affine.translation());
401  a_points.push_back(previous_pose_affine.translation());
402 
403  // Define the path colors
404  if (display_params.color_mode == 0)
405  {
406  // Display one color per layer level
407  colors_vector.push_back(intToColor(additive_traj.poses[i].layer_level));
408 
409  }
410  else if (display_params.color_mode == 1)
411  {
412  // Display one color per layer index
413  colors_vector.push_back(intToColor(additive_traj.poses[i].layer_index));
414  }
415  else if (display_params.color_mode == 2)
416  {
417  // Display one color per speed
418  if (color_map.find(additive_traj.poses[i].params.speed) == color_map.end()) // Cannot find color
419  color_map[additive_traj.poses[i].params.speed] = intToColor(color++);
420  colors_vector.push_back(color_map[additive_traj.poses[i].params.speed]);
421  }
422  else
423  {
424  if (additive_traj.poses[i].entry_pose == true)
425  colors_vector.push_back(intToColor(0));
426  else if (additive_traj.poses[i].exit_pose == true)
427  colors_vector.push_back(intToColor(1));
428  else if (additive_traj.poses[i].polygon_start == true)
429  colors_vector.push_back(intToColor(2));
430  else if (additive_traj.poses[i].polygon_end == true)
431  colors_vector.push_back(intToColor(3));
432  else
433  colors_vector.push_back(intToColor(4));
434  }
435 
436  }
437  previous_i = i;
438 
439  // Display labels
440  if (display_params.display_labels)
441  {
442  double z_text_offset = 1e-4;
443  if (display_params.display_mode == 1 || display_params.display_mode == 3)
444  z_text_offset += (display_params.cylinder_size / 2);
445  else
446  z_text_offset += (display_params.wire_size / 2);
447 
448  Eigen::Affine3d upper_pose(pose_affine);
449  upper_pose.translate(Eigen::Vector3d(0, 0, z_text_offset));
450 
451  // Pose label is close to another pose, change color and translate
452  double label_tol = (0.5e-3);
453  rviz_visual_tools::colors label_color = rviz_visual_tools::colors::WHITE;
454  if (closeToPose(i, label_tol))
455  {
456  label_color = rviz_visual_tools::colors::DARK_GREY;
457  upper_pose.translate(Eigen::Vector3d(0, 0, label_tol / 2.0));
458  }
459 
460  geometry_msgs::Vector3 scale_vector;
461  scale_vector.x = display_params.labels_size;
462  scale_vector.y = display_params.labels_size;
463  scale_vector.z = display_params.labels_size;
464 
465  if (display_params.label_type == 0)
466  {
467  // Pose number
468  rvt_trajectory->publishText(upper_pose, std::string(std::to_string(i)), label_color, scale_vector, false);
469  }
470  else if (display_params.label_type == 1)
471  {
472  // Layer level
473  rvt_trajectory->publishText(upper_pose, std::string(std::to_string(additive_traj.poses[i].layer_level)),
474  label_color,
475  scale_vector, false);
476  }
477  else if (display_params.label_type == 2)
478  {
479  // Layer index
480  rvt_trajectory->publishText(upper_pose, std::string(std::to_string(additive_traj.poses[i].layer_index)),
481  label_color,
482  scale_vector, false);
483  }
484  else // Pose number within layer
485  {
486  rvt_trajectory->publishText(
487  upper_pose,
488  std::string(std::to_string(pose_index_within_layer_count[additive_traj.poses[i].layer_level]++)),
489  label_color, scale_vector, false);
490  }
491  }
492  }
493 
494  // Transform pose orientation to take account of tool orientation
495  // Check that service exists
496  if (!get_tool_client.waitForExistence(ros::Duration(0.5)))
497  return "Cannot get tool, service does not exist";
498 
499  // Call service to get start pose
500  ram_utils::GetTool srv;
501  if (!get_tool_client.call(srv))
502  return "Cannot get tool, call to service failed";
503 
504  Eigen::Affine3d tool;
505  tf::poseMsgToEigen(srv.response.pose, tool);
506  for (auto &pose : path)
507  pose = pose * tool;
508 
509  // Display modes
510  if (display_params.display_mode == 0 || display_params.display_mode == 2) // Wire frame mode and wire + axis mode
511  {
512 
513  std::vector<geometry_msgs::Point> a_points_geom, b_points_geom;
514  for (Eigen::Vector3d point : a_points)
515  {
516  geometry_msgs::Point p;
517  p.x = point[0];
518  p.y = point[1];
519  p.z = point[2];
520  a_points_geom.push_back(p);
521  }
522  for (Eigen::Vector3d point : b_points)
523  {
524  geometry_msgs::Point p;
525  p.x = point[0];
526  p.y = point[1];
527  p.z = point[2];
528  b_points_geom.push_back(p);
529  }
530 
531  geometry_msgs::Vector3 scale_vector;
532  scale_vector.x = display_params.wire_size;
533  scale_vector.y = display_params.wire_size;
534  scale_vector.z = display_params.wire_size;
535 
536  rvt_trajectory->publishLines(a_points_geom, b_points_geom, colors_vector, scale_vector);
537 
538  if (display_params.display_mode == 2)
539  rvt_trajectory->publishAxisPath(path, display_params.axis_size, 0.1 * display_params.axis_size);
540  }
541 
542  if (display_params.display_mode == 1 || display_params.display_mode == 3) // Cylinders mode and cylinders + axis mode
543  {
544  // rvt_trajectory->publishPath(path_positions, colors_vector, display_params.cylinder_size);
545  publishCylinders(a_points, b_points, colors_vector, display_params.cylinder_size);
546  if (display_params.display_mode == 3)
547  rvt_trajectory->publishAxisPath(path, display_params.axis_size, 0.1 * display_params.axis_size);
548  }
549  rvt_trajectory->trigger();
550  updateSelection();
551  return "";
552 }
553 
554 void trajectoryCallback(const ram_msgs::AdditiveManufacturingTrajectory::ConstPtr& msg)
555 {
556  std::lock_guard<std::recursive_mutex> lock(trajectory_mutex);
557  additive_traj = *msg;
558  if (!displayTrajectory().empty())
559  {
560  display_params.display_range_of_layers = false;
562  }
563 }
564 
565 bool displayTrajectoryCallback(ram_display::DisplayTrajectory::Request &req,
566  ram_display::DisplayTrajectory::Response &res)
567 {
568  std::lock_guard<std::recursive_mutex> lock(display_params_mutex);
569  display_params = req;
570  res.error = displayTrajectory();
571  return true;
572 }
573 
574 bool deleteTrajectoryCallback(ram_display::DeleteTrajectory::Request &,
575  ram_display::DeleteTrajectory::Response &)
576 {
578  return true;
579 }
580 
581 bool updateSelection(const bool display)
582 {
583  std::lock_guard<std::recursive_mutex> lock_1(display_params_mutex);
584  std::lock_guard<std::recursive_mutex> lock_2(selection_params_mutex);
585 
586  rvt_selection->deleteAllMarkers();
587  rvt_selection->trigger();
588 
589  if (!display)
590  return true;
591 
592  std_msgs::ColorRGBA color;
593  color.r = 0.9;
594  color.g = 0.9;
595  color.b = 0.9;
596  if (selection.temporary)
597  color.a = 0.5;
598  else
599  color.a = 1.0;
600 
601  geometry_msgs::Vector3 size;
602  // Cylinders
603  if (display_params.display_mode == 1 || display_params.display_mode == 3)
604  {
605  size.x = display_params.cylinder_size * 1.4;
606  size.y = size.x;
607  size.z = size.x;
608  }
609  else // Wire
610  {
611  size.x = display_params.wire_size / 600.0;
612  size.y = size.x;
613  size.z = size.x;
614  }
615 
616  for (auto ram_pose : selection.selected_poses)
617  {
618  geometry_msgs::Pose geometry_pose;
619  geometry_pose.position = ram_pose.pose.position;
620  geometry_pose.orientation.w = 1;
621  rvt_selection->publishSphere(geometry_pose, color, size);
622  }
623 
624  rvt_selection->trigger();
625  return true;
626 }
627 
628 bool updateSelectionCallback(ram_display::UpdateSelection::Request &req,
629  ram_display::UpdateSelection::Response &)
630 {
631  std::lock_guard<std::recursive_mutex> lock_1(display_params_mutex);
632  std::lock_guard<std::recursive_mutex> lock_2(selection_params_mutex);
633  selection = req;
634  return updateSelection();
635 }
636 
637 bool updateMeshColorCallback(ram_display::UpdateMeshColor::Request &req,
638  ram_display::UpdateMeshColor::Response &)
639 {
640  std::lock_guard<std::recursive_mutex> lock_1(display_params_mutex);
641 
642  display_params.mesh_color = req.color;
643 
644  displayMesh(display_params.mesh_color,
646  additive_traj.file);
647  return true;
648 }
649 
650 int main(int argc,
651  char **argv)
652 {
653  ros::init(argc, argv, "ram_display");
655  nh.param<std::string>("ram/trajectory_frame", trajectory_frame, "base");
656  std::string trajectory_marker_topic, selection_marker_topic;
657  nh.param<std::string>("ram/display/trajectory_marker_topic", trajectory_marker_topic, "/rvt_trajectory");
658  nh.param<std::string>("ram/display/selection_marker_topic", selection_marker_topic, "/rvt_selection");
659  get_tool_client = nh.serviceClient<ram_utils::GetTool>("ram/get_tool");
660 
661  // Default parameters
662  display_params.display_mode = 1;
663  display_params.cylinder_size = 0.001;
664  display_params.display_labels = false;
665  display_params.wire_size = 3;
666  display_params.labels_size = 1;
667  display_params.mesh_color.r = 0.7;
668  display_params.mesh_color.g = 0.7;
669  display_params.mesh_color.b = 0.7;
670  display_params.mesh_color.a = 1;
671 
672  mesh_pub = nh.advertise<visualization_msgs::Marker>("ram/display/mesh", 1, true);
673 
674  // Allow the action server to receive and send ROS messages
676  spinner.start();
677 
678  rvt_trajectory = std::make_shared<rviz_visual_tools::RvizVisualTools>(trajectory_frame, trajectory_marker_topic);
679  rvt_selection = std::make_shared<rviz_visual_tools::RvizVisualTools>(trajectory_frame, selection_marker_topic);
680 
681  // Dynamic markers
682  rvt_trajectory->enableFrameLocking();
683  rvt_selection->enableFrameLocking();
684 
685  // Latch publish
686  rvt_trajectory->loadMarkerPub(false, true);
687  rvt_selection->loadMarkerPub(false, true);
688 
689  ros::Subscriber sub = nh.subscribe("ram/trajectory", 5, trajectoryCallback);
690 
691  ros::ServiceServer service_1 = nh.advertiseService("ram/display/add_trajectory", displayTrajectoryCallback);
692  ros::ServiceServer service_2 = nh.advertiseService("ram/display/delete_trajectory", deleteTrajectoryCallback);
693  ros::ServiceServer service_3 = nh.advertiseService("ram/display/update_selection", updateSelectionCallback);
694  ros::ServiceServer service_4 = nh.advertiseService("ram/display/update_mesh_color", updateMeshColorCallback);
695 
697  spinner.stop();
698  return 0;
699 }
700 
ServiceClient serviceClient(const std::string &service_name, bool persistent=false, const M_string &header_values=M_string())
std::string trajectory_frame
Definition: ram_display.cpp:21
std::recursive_mutex trajectory_mutex
Definition: ram_display.cpp:27
ros::ServiceClient get_tool_client
Definition: ram_display.cpp:24
bool updateMeshColorCallback(ram_display::UpdateMeshColor::Request &req, ram_display::UpdateMeshColor::Response &)
void trajectoryCallback(const ram_msgs::AdditiveManufacturingTrajectory::ConstPtr &msg)
std::string fileExtension(const std::string full_path)
Definition: ram_display.cpp:40
std::recursive_mutex selection_params_mutex
Definition: ram_display.cpp:35
void publish(const boost::shared_ptr< M > &message) const
std::vector< Eigen::Affine3d, Eigen::aligned_allocator< Eigen::Affine3d > > vector_Affine3d
std::vector< Eigen::Vector3d, Eigen::aligned_allocator< Eigen::Vector3d > > vector_Vector3d
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
ram_msgs::AdditiveManufacturingTrajectory additive_traj
Definition: ram_display.cpp:28
geometry_msgs::Pose tool
void poseMsgToEigen(const geometry_msgs::Pose &m, Eigen::Affine3d &e)
std::unique_ptr< ros::NodeHandle > nh
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
bool call(MReq &req, MRes &res)
ServiceServer advertiseService(const std::string &service, bool(T::*srv_func)(MReq &, MRes &), T *obj)
void spinner()
std::shared_ptr< RvizVisualTools > RvizVisualToolsPtr
ros::Publisher mesh_pub
Definition: ram_display.cpp:16
bool closeToPose(const unsigned pose_index, const double tolerance)
bool displayTrajectoryCallback(ram_display::DisplayTrajectory::Request &req, ram_display::DisplayTrajectory::Response &res)
bool waitForExistence(ros::Duration timeout=ros::Duration(-1))
bool param(const std::string &param_name, T &param_val, const T &default_val) const
bool publishCylinders(const EigenSTL::vector_Vector3d &a_points, const EigenSTL::vector_Vector3d &b_points, const std::vector< std_msgs::ColorRGBA > &colors, double radius)
void deleteTrajectory()
void pointMsgToEigen(const geometry_msgs::Point &m, Eigen::Vector3d &e)
bool deleteTrajectoryCallback(ram_display::DeleteTrajectory::Request &, ram_display::DeleteTrajectory::Response &)
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
std::recursive_mutex display_params_mutex
Definition: ram_display.cpp:31
std_msgs::ColorRGBA intToColor(const unsigned int color)
Definition: ram_display.cpp:55
colors
bool updateSelection(bool display=true)
uint32_t getNumSubscribers() const
bool updateSelectionCallback(ram_display::UpdateSelection::Request &req, ram_display::UpdateSelection::Response &)
ram_display::DisplayTrajectory::Request display_params
Definition: ram_display.cpp:32
void displayMesh(const std_msgs::ColorRGBA color, const std::string frame_id="base", const std::string mesh_file_name="")
rviz_visual_tools::RvizVisualToolsPtr rvt_trajectory
Definition: ram_display.cpp:18
std::string getTopic() const
int main(int argc, char **argv)
#define ROS_ERROR_STREAM(args)
std::string displayTrajectory()
ram_display::UpdateSelection::Request selection
Definition: ram_display.cpp:36
ROSCPP_DECL void waitForShutdown()
rviz_visual_tools::RvizVisualToolsPtr rvt_selection
Definition: ram_display.cpp:19


ram_display
Author(s): Andres Campos - Institut Maupertuis
autogenerated on Mon Jun 10 2019 14:49:58