56 mesh_msgs::MeshGeometryStamped geometryMsg;
69 mesh_msgs::MeshVertexColorsStamped vertexColorsMsg;
77 mesh_msgs::MeshVertexCostsStamped vertexCostsMsg;
87 catch (
const hf::DataSpaceException& e)
96 unsigned int nVertices = vertices.size() / 3;
98 geometryMsg.mesh_geometry.vertices.resize(nVertices);
99 for (
unsigned int i = 0; i < nVertices; i++)
101 geometryMsg.mesh_geometry.vertices[i].x = vertices[i * 3];
102 geometryMsg.mesh_geometry.vertices[i].y = vertices[i * 3 + 1];
103 geometryMsg.mesh_geometry.vertices[i].z = vertices[i * 3 + 2];
108 geometryMsg.header.frame_id =
"map";
116 unsigned int nFaces = faceIds.size() / 3;
118 geometryMsg.mesh_geometry.faces.resize(nFaces);
119 for (
unsigned int i = 0; i < nFaces; i++)
121 geometryMsg.mesh_geometry.faces[i].vertex_indices[0] = faceIds[i * 3];
122 geometryMsg.mesh_geometry.faces[i].vertex_indices[1] = faceIds[i * 3 + 1];
123 geometryMsg.mesh_geometry.faces[i].vertex_indices[2] = faceIds[i * 3 + 2];
128 geometryMsg.header.frame_id =
"map";
136 unsigned int nVertexNormals = vertexNormals.size() / 3;
138 geometryMsg.mesh_geometry.vertex_normals.resize(nVertexNormals);
139 for (
unsigned int i = 0; i < nVertexNormals; i++)
141 geometryMsg.mesh_geometry.vertex_normals[i].x = vertexNormals[i * 3];
142 geometryMsg.mesh_geometry.vertex_normals[i].y = vertexNormals[i * 3 + 1];
143 geometryMsg.mesh_geometry.vertex_normals[i].z = vertexNormals[i * 3 + 2];
148 geometryMsg.header.frame_id =
"map";
156 unsigned int nVertices = vertexColors.size() / 3;
157 ROS_INFO_STREAM(
"Found " << nVertices <<
" vertices for vertex colors");
158 vertexColorsMsg.mesh_vertex_colors.vertex_colors.resize(nVertices);
159 for (
unsigned int i = 0; i < nVertices; i++)
161 vertexColorsMsg.mesh_vertex_colors
162 .vertex_colors[i].r = vertexColors[i * 3] / 255.0f;
163 vertexColorsMsg.mesh_vertex_colors
164 .vertex_colors[i].g = vertexColors[i * 3 + 1] / 255.0f;
165 vertexColorsMsg.mesh_vertex_colors
166 .vertex_colors[i].b = vertexColors[i * 3 + 2] / 255.0f;
167 vertexColorsMsg.mesh_vertex_colors
168 .vertex_colors[i].a = 1;
173 vertexColorsMsg.header.frame_id =
"map";
181 vertexCostsMsg.mesh_vertex_costs.costs.resize(costs.size());
182 for (uint32_t i = 0; i < costs.size(); i++)
184 vertexCostsMsg.mesh_vertex_costs.costs[i] = costs[i];
188 vertexCostsMsg.type = layer;
189 vertexCostsMsg.header.frame_id =
"map";
196 mesh_msgs::GetUUIDs::Request& req,
197 mesh_msgs::GetUUIDs::Response& res)
204 mesh_msgs::GetGeometry::Request& req,
205 mesh_msgs::GetGeometry::Response& res)
215 getFaces(faceIds, res.mesh_geometry_stamped);
225 mesh_msgs::GetGeometry::Request& req,
226 mesh_msgs::GetGeometry::Response& res)
232 return getVertices(vertices, res.mesh_geometry_stamped);
236 mesh_msgs::GetGeometry::Request& req,
237 mesh_msgs::GetGeometry::Response& res)
243 return getFaces(faceIds, res.mesh_geometry_stamped);
247 mesh_msgs::GetGeometry::Request& req,
248 mesh_msgs::GetGeometry::Response& res)
258 mesh_msgs::GetMaterials::Request& req,
259 mesh_msgs::GetMaterials::Response& res)
267 unsigned int nMaterials = materials.size();
268 unsigned int nFaces = materialFaceIndices.size();
269 ROS_INFO_STREAM(
"Found " << nMaterials <<
" materials and " << nFaces <<
" faces");
270 res.mesh_materials_stamped.mesh_materials.materials.resize(nMaterials);
271 for (uint32_t i = 0; i < nMaterials; i++)
273 int texture_index = materials[i].textureIndex;
276 res.mesh_materials_stamped
279 .has_texture = texture_index >= 0;
282 res.mesh_materials_stamped.mesh_materials.materials[i]
283 .texture_index =
static_cast<uint32_t
>(texture_index);
285 res.mesh_materials_stamped.mesh_materials.materials[i]
286 .color.r = materials[i].r / 255.0f;
287 res.mesh_materials_stamped.mesh_materials.materials[i]
288 .color.g = materials[i].g / 255.0f;
289 res.mesh_materials_stamped.mesh_materials.materials[i]
290 .color.b = materials[i].b / 255.0f;
291 res.mesh_materials_stamped.mesh_materials.materials[i]
297 std::map<uint32_t, std::vector<uint32_t>> materialToFaces;
299 for (uint32_t i = 0; i < nFaces; i++)
302 uint32_t materialIndex = materialFaceIndices[i];
304 if (materialToFaces.count(materialIndex) == 0)
306 materialToFaces.insert(std::make_pair(materialIndex, std::vector<uint32_t>()));
309 materialToFaces[materialIndex].push_back(i);
312 res.mesh_materials_stamped.mesh_materials.clusters.resize(nMaterials);
313 for (uint32_t i = 0; i < nMaterials; i++)
315 for (uint32_t j = 0; j < materialToFaces[i].size(); j++)
317 res.mesh_materials_stamped.mesh_materials.clusters[i].face_indices.push_back(materialToFaces[i][j]);
320 res.mesh_materials_stamped.mesh_materials.cluster_materials.resize(nMaterials);
321 for (uint32_t i = 0; i < nMaterials; i++)
323 res.mesh_materials_stamped.mesh_materials.cluster_materials[i] = i;
328 unsigned int nVertices = vertexTexCoords.size() / 3;
329 res.mesh_materials_stamped.mesh_materials.vertex_tex_coords.resize(nVertices);
330 for (uint32_t i = 0; i < nVertices; i++)
334 res.mesh_materials_stamped.mesh_materials.vertex_tex_coords[i].u = vertexTexCoords[3 * i];
335 res.mesh_materials_stamped.mesh_materials.vertex_tex_coords[i].v = vertexTexCoords[3 * i + 1];
339 res.mesh_materials_stamped.uuid =
mesh_uuid;
340 res.mesh_materials_stamped.header.frame_id =
"map";
347 mesh_msgs::GetTexture::Request& req,
348 mesh_msgs::GetTexture::Response& res)
354 if (std::stoi(texture.name) == req.texture_index)
356 res.texture.texture_index = req.texture_index;
358 sensor_msgs::Image image;
368 res.texture.image = image;
378 mesh_msgs::GetVertexColors::Request& req,
379 mesh_msgs::GetVertexColors::Response& res)
389 mesh_msgs::GetVertexCosts::Request& req,
390 mesh_msgs::GetVertexCosts::Response& res)
395 return getVertexCosts(costs, req.layer, res.mesh_vertex_costs_stamped);
399 mesh_msgs::GetVertexCostLayers::Request &req,
400 mesh_msgs::GetVertexCostLayers::Response &res)
409 mesh_msgs::GetLabeledClusters::Request& req,
410 mesh_msgs::GetLabeledClusters::Response& res)
416 for (
size_t i = 0; i < groups.size(); i++)
420 for (
size_t j = 0; j < labelsInGroup.size(); j++)
424 mesh_msgs::MeshFaceCluster cluster;
425 std::stringstream ss;
426 ss << groups[i] <<
"_" << labelsInGroup[j];
427 cluster.label = ss.str();
428 cluster.face_indices.resize(faceIds.size());
429 for (
size_t k = 0; k < faceIds.size(); k++)
431 cluster.face_indices[k] = faceIds[k];
433 res.clusters.push_back(cluster);
451 ROS_WARN(
"Override is enabled by default");
454 std::vector<std::string> split_results;
455 boost::split(split_results, msg->cluster.label, [](
char c){ return c ==
'_'; });
457 if (split_results.size() != 2)
459 ROS_ERROR(
"Received illegal cluster name");
464 std::string label_group = split_results[0];
465 std::string label_name = split_results[1];
466 std::vector<uint32_t> indices;
467 for (
size_t i = 0; i < msg->cluster.face_indices.size(); i++)
469 indices.push_back(msg->cluster.face_indices[i]);
473 io.
addLabel(label_group, label_name, indices);