conversions.cpp
Go to the documentation of this file.
1 
29 #include <gz/msgs/geometry.pb.h>
30 #include <gz/msgs/material.pb.h>
31 #include <gz/msgs/inertial.pb.h>
32 #include <gz/msgs/collision.pb.h>
33 #include <gz/msgs/visual.pb.h>
34 #include <gz/msgs/link.pb.h>
35 #include <gz/msgs/Utility.hh>
36 #include <gz/math/eigen3/Conversions.hh>
37 #include <gz/common/Console.hh>
38 #include <gz/common/MeshManager.hh>
39 #include <console_bridge/console.h>
41 
45 
47 {
48 bool isMeshWithColor(const std::string& file_path)
49 {
50  if (file_path.length() >= 4)
51  {
52  std::string last_four = file_path.substr(file_path.length() - 4);
53  std::string last_four_lower;
54  last_four_lower.resize(4);
55  std::transform(last_four.begin(), last_four.end(), last_four_lower.begin(), ::tolower);
56  return (last_four_lower == ".dae") || (last_four_lower == ".obj");
57  }
58 
59  return false;
60 }
61 
62 gz::msgs::Material convert(const Eigen::Vector4d& rgba)
63 {
64  gz::msgs::Material shape_material_msg;
65  shape_material_msg.mutable_ambient()->set_r(static_cast<float>(rgba(0)));
66  shape_material_msg.mutable_ambient()->set_g(static_cast<float>(rgba(1)));
67  shape_material_msg.mutable_ambient()->set_b(static_cast<float>(rgba(2)));
68  shape_material_msg.mutable_ambient()->set_a(static_cast<float>(rgba(3)));
69 
70  shape_material_msg.mutable_diffuse()->set_r(static_cast<float>(rgba(0)));
71  shape_material_msg.mutable_diffuse()->set_g(static_cast<float>(rgba(1)));
72  shape_material_msg.mutable_diffuse()->set_b(static_cast<float>(rgba(2)));
73  shape_material_msg.mutable_diffuse()->set_a(static_cast<float>(rgba(3)));
74 
75  shape_material_msg.mutable_specular()->set_r(static_cast<float>(rgba(0)));
76  shape_material_msg.mutable_specular()->set_g(static_cast<float>(rgba(1)));
77  shape_material_msg.mutable_specular()->set_b(static_cast<float>(rgba(2)));
78  shape_material_msg.mutable_specular()->set_a(static_cast<float>(rgba(3)));
79 
80  return shape_material_msg;
81 }
82 
83 bool toMsg(gz::msgs::Scene& scene_msg,
84  EntityManager& entity_manager,
85  const tesseract_scene_graph::SceneGraph& scene_graph,
86  const tesseract_common::TransformMap& link_transforms)
87 {
88  scene_msg.set_name("scene");
89  gz::msgs::Model* model = scene_msg.add_model();
90  model->set_name(scene_graph.getName());
91  model->set_id(static_cast<unsigned>(entity_manager.addModel(scene_graph.getName())));
92  for (const auto& link : scene_graph.getLinks())
93  {
94  gz::msgs::Link* link_msg = model->add_link();
95  link_msg->set_name(link->getName());
96  link_msg->set_id(static_cast<unsigned>(entity_manager.addLink(link->getName())));
97  link_msg->mutable_pose()->CopyFrom(
98  gz::msgs::Convert(gz::math::eigen3::convert(link_transforms.at(link->getName()))));
99 
100  int cnt = 0;
101  for (const auto& vs : link->visual)
102  {
103  std::string gv_name = link->getName() + std::to_string(++cnt);
104  switch (vs->geometry->getType())
105  {
107  {
108  gz::msgs::Visual* gv_msg = link_msg->add_visual();
109  gv_msg->set_id(static_cast<unsigned>(entity_manager.addVisual(gv_name)));
110  gv_msg->set_name(gv_name);
111  gv_msg->mutable_pose()->CopyFrom(gz::msgs::Convert(gz::math::eigen3::convert(vs->origin)));
112 
113  gz::msgs::Geometry geometry_msg;
114  geometry_msg.set_type(gz::msgs::Geometry::Type::Geometry_Type_BOX);
115 
116  auto shape = std::static_pointer_cast<const tesseract_geometry::Box>(vs->geometry);
117  gz::msgs::BoxGeom shape_geometry_msg;
118  shape_geometry_msg.mutable_size()->CopyFrom(
119  gz::msgs::Convert(gz::math::Vector3d(shape->getX(), shape->getY(), shape->getZ())));
120  geometry_msg.mutable_box()->CopyFrom(shape_geometry_msg);
121  gv_msg->mutable_geometry()->CopyFrom(geometry_msg);
122 
123  if (vs->material != nullptr && vs->material->getName() != "default_tesseract_material" &&
124  vs->material->texture_filename.empty())
125  {
126  gv_msg->mutable_material()->CopyFrom(convert(vs->material->color));
127  }
128 
129  gv_msg->set_parent_name(link->getName());
130  break;
131  }
133  {
134  gz::msgs::Visual* gv_msg = link_msg->add_visual();
135  gv_msg->set_id(static_cast<unsigned>(entity_manager.addVisual(gv_name)));
136  gv_msg->set_name(gv_name);
137  gv_msg->mutable_pose()->CopyFrom(gz::msgs::Convert(gz::math::eigen3::convert(vs->origin)));
138 
139  gz::msgs::Geometry geometry_msg;
140  geometry_msg.set_type(gz::msgs::Geometry::Type::Geometry_Type_SPHERE);
141 
142  auto shape = std::static_pointer_cast<const tesseract_geometry::Sphere>(vs->geometry);
143  gz::msgs::SphereGeom shape_geometry_msg;
144  shape_geometry_msg.set_radius(shape->getRadius());
145  geometry_msg.mutable_sphere()->CopyFrom(shape_geometry_msg);
146  gv_msg->mutable_geometry()->CopyFrom(geometry_msg);
147 
148  if (vs->material != nullptr && vs->material->getName() != "default_tesseract_material" &&
149  vs->material->texture_filename.empty())
150  {
151  gv_msg->mutable_material()->CopyFrom(convert(vs->material->color));
152  }
153 
154  gv_msg->set_parent_name(link->getName());
155  break;
156  }
158  {
159  gz::msgs::Visual* gv_msg = link_msg->add_visual();
160  gv_msg->set_id(static_cast<unsigned>(entity_manager.addVisual(gv_name)));
161  gv_msg->set_name(gv_name);
162  gv_msg->mutable_pose()->CopyFrom(gz::msgs::Convert(gz::math::eigen3::convert(vs->origin)));
163 
164  gz::msgs::Geometry geometry_msg;
165  geometry_msg.set_type(gz::msgs::Geometry::Type::Geometry_Type_CYLINDER);
166 
167  auto shape = std::static_pointer_cast<const tesseract_geometry::Cylinder>(vs->geometry);
168  gz::msgs::CylinderGeom shape_geometry_msg;
169  shape_geometry_msg.set_radius(shape->getRadius());
170  shape_geometry_msg.set_length(shape->getLength());
171  geometry_msg.mutable_cylinder()->CopyFrom(shape_geometry_msg);
172  gv_msg->mutable_geometry()->CopyFrom(geometry_msg);
173 
174  if (vs->material != nullptr && vs->material->getName() != "default_tesseract_material" &&
175  vs->material->texture_filename.empty())
176  {
177  gv_msg->mutable_material()->CopyFrom(convert(vs->material->color));
178  }
179 
180  gv_msg->set_parent_name(link->getName());
181  break;
182  }
183  // case tesseract_geometry::GeometryType::CONE:
184  // {
185  // gz::msgs::Visual* gv_msg = link_msg->add_visual();
186  // gv_msg->set_id(static_cast<unsigned>(entity_manager.addVisual(gv_name)));
187  // gv_msg->set_name(gv_name);
188  // gv_msg->mutable_pose()->CopyFrom(gz::msgs::Convert(gz::math::eigen3::convert(vs->origin)));
189 
190  // gz::msgs::Geometry geometry_msg;
191  // geometry_msg.set_type(gz::msgs::Geometry::Type::Geometry_Type_CONE);
192 
193  // auto shape = std::static_pointer_cast<const tesseract_geometry::Cone>(vs->geometry);
194  // gz::msgs::ConeGeom shape_geometry_msg;
195  // shape_geometry_msg.set_radius(shape->getRadius());
196  // shape_geometry_msg.set_length(shape->getLength());
197  // geometry_msg.mutable_sphere()->CopyFrom(shape_geometry_msg);
198  // gv_msg->mutable_geometry()->CopyFrom(geometry_msg);
199  //
200  // if (vs->material != nullptr && vs->material->getName() != "default_tesseract_material" &&
201  // vs->material->texture_filename.empty())
202  // {
203  // gv_msg->mutable_material()->CopyFrom(convert(vs->material->color));
204  // }
205  //
206  // gv_msg->set_parent_name(link->getName());
207  // break;
208  // }
209 
210  // case tesseract_geometry::GeometryType::CAPSULE:
211  // {
212  // gz::msgs::Visual* gv_msg = link_msg->add_visual();
213  // gv_msg->set_id(static_cast<unsigned>(entity_manager.addVisual(gv_name)));
214  // gv_msg->set_name(gv_name);
215  // gv_msg->mutable_pose()->CopyFrom(gz::msgs::Convert(gz::math::eigen3::convert(vs->origin)));
216 
217  // gz::msgs::Geometry geometry_msg;
218  // geometry_msg.set_type(gz::msgs::Geometry::Type::Geometry_Type_CAPSULE);
219 
220  // auto shape = std::static_pointer_cast<const tesseract_geometry::Capsule>(vs->geometry);
221  // gz::msgs::CapsuleGeom shape_geometry_msg;
222  // shape_geometry_msg.set_radius(shape->getRadius());
223  // shape_geometry_msg.set_length(shape->getLength());
224  // geometry_msg.mutable_sphere()->CopyFrom(shape_geometry_msg);
225  // gv_msg->mutable_geometry()->CopyFrom(geometry_msg);
226  //
227  // if (vs->material != nullptr && vs->material->getName() != "default_tesseract_material" &&
228  // vs->material->texture_filename.empty())
229  // {
230  // gv_msg->mutable_material()->CopyFrom(convert(vs->material->color));
231  // }
232  //
233  // gv_msg->set_parent_name(link->getName());
234  // break;
235  // }
237  {
238  gz::msgs::Visual* gv_msg = link_msg->add_visual();
239  gv_msg->set_id(static_cast<unsigned>(entity_manager.addVisual(gv_name)));
240  gv_msg->set_name(gv_name);
241  gv_msg->mutable_pose()->CopyFrom(gz::msgs::Convert(gz::math::eigen3::convert(vs->origin)));
242 
243  gz::msgs::Geometry geometry_msg;
244  geometry_msg.set_type(gz::msgs::Geometry::Type::Geometry_Type_MESH);
245 
246  auto shape = std::static_pointer_cast<const tesseract_geometry::Mesh>(vs->geometry);
247  auto resource = shape->getResource();
248  if (resource)
249  {
250  gz::msgs::MeshGeom shape_geometry_msg;
251  shape_geometry_msg.set_filename(resource->getFilePath());
252  shape_geometry_msg.mutable_scale()->CopyFrom(
253  gz::msgs::Convert(gz::math::eigen3::convert(shape->getScale())));
254  geometry_msg.mutable_mesh()->CopyFrom(shape_geometry_msg);
255  gv_msg->mutable_geometry()->CopyFrom(geometry_msg);
256 
257  if (!isMeshWithColor(resource->getFilePath()) && vs->material != nullptr &&
258  vs->material->getName() != "default_tesseract_material" && vs->material->texture_filename.empty())
259  {
260  gv_msg->mutable_material()->CopyFrom(convert(vs->material->color));
261  }
262 
263  gv_msg->set_parent_name(link->getName());
264  }
265  else
266  {
267  assert(false);
268  }
269 
270  break;
271  }
273  {
274  gz::msgs::Visual* gv_msg = link_msg->add_visual();
275  gv_msg->set_id(static_cast<unsigned>(entity_manager.addVisual(gv_name)));
276  gv_msg->set_name(gv_name);
277  gv_msg->mutable_pose()->CopyFrom(gz::msgs::Convert(gz::math::eigen3::convert(vs->origin)));
278 
279  gz::msgs::Geometry geometry_msg;
280  geometry_msg.set_type(gz::msgs::Geometry::Type::Geometry_Type_MESH);
281 
282  auto shape = std::static_pointer_cast<const tesseract_geometry::ConvexMesh>(vs->geometry);
283  auto resource = shape->getResource();
284  if (resource)
285  {
286  gz::msgs::MeshGeom shape_geometry_msg;
287  shape_geometry_msg.set_filename(resource->getFilePath());
288  shape_geometry_msg.mutable_scale()->CopyFrom(
289  gz::msgs::Convert(gz::math::eigen3::convert(shape->getScale())));
290  geometry_msg.mutable_mesh()->CopyFrom(shape_geometry_msg);
291  gv_msg->mutable_geometry()->CopyFrom(geometry_msg);
292 
293  if (!isMeshWithColor(resource->getFilePath()) && vs->material != nullptr &&
294  vs->material->getName() != "default_tesseract_material" && vs->material->texture_filename.empty())
295  {
296  gv_msg->mutable_material()->CopyFrom(convert(vs->material->color));
297  }
298 
299  gv_msg->set_parent_name(link->getName());
300  }
301  else
302  {
303  assert(false);
304  }
305 
306  break;
307  }
308  // case tesseract_geometry::GeometryType::OCTREE:
309  // {
310  // auto shape = std::static_pointer_cast<const tesseract_geometry::Octree>(vs->geometry);
311 
312  // // TODO: Need to implement
313  // assert(false);
314  // break;
315  // }
316  default:
317  {
318  ignerr << "This geometric shape type " << static_cast<int>(vs->geometry->getType()) << " is not supported";
319  break;
320  }
321  }
322  }
323  }
324  return true;
325 }
326 
327 } // namespace tesseract_visualization
graph.h
tesseract_visualization::EntityManager::addLink
EntityID addLink(const std::string &name)
Add link name to manager and return id for link.
Definition: entity_manager.cpp:47
tesseract_scene_graph::SceneGraph::getLinks
std::vector< std::shared_ptr< const Link > > getLinks() const
tesseract_visualization::convert
gz::msgs::Material convert(const Eigen::Vector4d &rgba)
Definition: conversions.cpp:62
tesseract_common::TransformMap
AlignedMap< std::string, Eigen::Isometry3d > TransformMap
tesseract_visualization::isMeshWithColor
bool isMeshWithColor(const std::string &file_path)
Definition: conversions.cpp:48
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
tesseract_geometry::GeometryType::MESH
@ MESH
tesseract_scene_graph::SceneGraph
conversions.h
A set of conversion between Tesseract and Ignition Robotics objects.
tesseract_geometry::GeometryType::CYLINDER
@ CYLINDER
geometries.h
tesseract_scene_graph::SceneGraph::getName
const std::string & getName() const
tesseract_visualization::EntityManager::addVisual
EntityID addVisual(const std::string &name)
Add visual name to manager and return id for visual.
Definition: entity_manager.cpp:64
tesseract_geometry::GeometryType::SPHERE
@ SPHERE
TESSERACT_COMMON_IGNORE_WARNINGS_POP
tesseract_visualization::toMsg
bool toMsg(gz::msgs::Scene &scene_msg, EntityManager &entity_manager, const tesseract_scene_graph::SceneGraph &scene_graph, const tesseract_common::TransformMap &link_transforms)
Definition: conversions.cpp:83
tesseract_geometry::GeometryType::BOX
@ BOX
tesseract_visualization::EntityManager::addModel
EntityID addModel(const std::string &name)
Add model name to manager and return id for model.
Definition: entity_manager.cpp:30
tesseract_visualization::EntityManager
Definition: entity_manager.h:41
tesseract_geometry::GeometryType::CONVEX_MESH
@ CONVEX_MESH
macros.h
tesseract_visualization
Definition: fwd.h:4


tesseract_visualization
Author(s): Levi Armstrong
autogenerated on Wed Apr 9 2025 03:03:25