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>
50 if (file_path.length() >= 4)
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");
62 gz::msgs::Material
convert(
const Eigen::Vector4d& rgba)
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)));
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)));
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)));
80 return shape_material_msg;
83 bool toMsg(gz::msgs::Scene& scene_msg,
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())
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(
101 for (
const auto& vs : link->visual)
103 std::string gv_name = link->getName() + std::to_string(++cnt);
104 switch (vs->geometry->getType())
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);
113 gz::msgs::Geometry geometry_msg;
114 geometry_msg.set_type(gz::msgs::Geometry::Type::Geometry_Type_BOX);
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);
123 if (vs->material !=
nullptr && vs->material->getName() !=
"default_tesseract_material" &&
124 vs->material->texture_filename.empty())
126 gv_msg->mutable_material()->CopyFrom(
convert(vs->material->color));
129 gv_msg->set_parent_name(link->getName());
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);
139 gz::msgs::Geometry geometry_msg;
140 geometry_msg.set_type(gz::msgs::Geometry::Type::Geometry_Type_SPHERE);
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);
148 if (vs->material !=
nullptr && vs->material->getName() !=
"default_tesseract_material" &&
149 vs->material->texture_filename.empty())
151 gv_msg->mutable_material()->CopyFrom(
convert(vs->material->color));
154 gv_msg->set_parent_name(link->getName());
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);
164 gz::msgs::Geometry geometry_msg;
165 geometry_msg.set_type(gz::msgs::Geometry::Type::Geometry_Type_CYLINDER);
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);
174 if (vs->material !=
nullptr && vs->material->getName() !=
"default_tesseract_material" &&
175 vs->material->texture_filename.empty())
177 gv_msg->mutable_material()->CopyFrom(
convert(vs->material->color));
180 gv_msg->set_parent_name(link->getName());
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);
243 gz::msgs::Geometry geometry_msg;
244 geometry_msg.set_type(gz::msgs::Geometry::Type::Geometry_Type_MESH);
246 auto shape = std::static_pointer_cast<const tesseract_geometry::Mesh>(vs->geometry);
247 auto resource = shape->getResource();
250 gz::msgs::MeshGeom shape_geometry_msg;
251 shape_geometry_msg.set_filename(resource->getFilePath());
252 shape_geometry_msg.mutable_scale()->CopyFrom(
254 geometry_msg.mutable_mesh()->CopyFrom(shape_geometry_msg);
255 gv_msg->mutable_geometry()->CopyFrom(geometry_msg);
257 if (!
isMeshWithColor(resource->getFilePath()) && vs->material !=
nullptr &&
258 vs->material->getName() !=
"default_tesseract_material" && vs->material->texture_filename.empty())
260 gv_msg->mutable_material()->CopyFrom(
convert(vs->material->color));
263 gv_msg->set_parent_name(link->getName());
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);
279 gz::msgs::Geometry geometry_msg;
280 geometry_msg.set_type(gz::msgs::Geometry::Type::Geometry_Type_MESH);
282 auto shape = std::static_pointer_cast<const tesseract_geometry::ConvexMesh>(vs->geometry);
283 auto resource = shape->getResource();
286 gz::msgs::MeshGeom shape_geometry_msg;
287 shape_geometry_msg.set_filename(resource->getFilePath());
288 shape_geometry_msg.mutable_scale()->CopyFrom(
290 geometry_msg.mutable_mesh()->CopyFrom(shape_geometry_msg);
291 gv_msg->mutable_geometry()->CopyFrom(geometry_msg);
293 if (!
isMeshWithColor(resource->getFilePath()) && vs->material !=
nullptr &&
294 vs->material->getName() !=
"default_tesseract_material" && vs->material->texture_filename.empty())
296 gv_msg->mutable_material()->CopyFrom(
convert(vs->material->color));
299 gv_msg->set_parent_name(link->getName());
318 ignerr <<
"This geometric shape type " <<
static_cast<int>(vs->geometry->getType()) <<
" is not supported";