60 pcl::PointCloud<pcl::PointXYZRGBA> cloud;
61 if (mesh.faces.empty())
64 std::mt19937 gen{std::random_device{}()};
65 std::uniform_int_distribution<std::size_t> d{0, mesh.faces.size() - 1};
67 cloud.points.reserve(
static_cast<std::size_t
>(sampleCount));
69 for (
int i = 0; i < sampleCount; ++i)
71 const auto& f = mesh.faces.at(d(gen));
72 const float f0 = 1 + d(gen);
73 const float f1 = 1 + d(gen);
74 const float f2 = 1 + d(gen);
75 Eigen::Vector3f factors = Eigen::Vector3f{f0, f1, f2}.normalized();
76 factors /= factors.sum();
77 const Eigen::Vector3f pt = factors(0) * mesh.vertices.at(f.id1) +
78 factors(1) * mesh.vertices.at(f.id2) +
79 factors(2) * mesh.vertices.at(f.id3);
81 pcl::PointXYZRGBA point;
87 const auto color = mesh.colors.at(f.id1);
89 point.r =
static_cast<std::uint8_t
>(color.r * 255);
90 point.g =
static_cast<std::uint8_t
>(color.g * 255);
91 point.b =
static_cast<std::uint8_t
>(color.b * 255);
93 cloud.points.push_back(point);
96 cloud.is_dense =
true;
97 cloud.width = cloud.points.size();
116 const VirtualRobot::ManipulationObject& manipulationObject,
120 const std::string agent =
"";
122 armarx::armem::arondto::FamiliarObjectInstance familiarObject;
127 const Eigen::Matrix4f objPose = manipulationObject.getGlobalPose();
129 familiarObject.poseSensFrame.pose = objPose;
131 familiarObject.poseSensFrame.header.agent = agent;
133 familiarObject.poseGlobal.emplace();
134 familiarObject.poseGlobal->pose = objPose;
136 familiarObject.poseGlobal->header.agent = agent;
138 toAron(familiarObject.objectID, objectID);
139 familiarObject.confidence = 1.0f;
143 <<
"ManipulationObject has no visualization node.";
144 const auto mesh = manipulationObject.getVisualization()->getTriMeshModel();
146 if (mesh && !mesh->faces.empty())
148 std::mt19937 gen{std::random_device{}()};
149 std::uniform_int_distribution<std::size_t> d{0, mesh->faces.size() - 1};
153 auto nonUniformSampleSurface = [mesh = *mesh, &gen, &d]() -> pcl::PointXYZRGBA
155 const auto& f = mesh.faces.at(d(gen));
156 const float f0 = 1 + d(gen);
157 const float f1 = 1 + d(gen);
158 const float f2 = 1 + d(gen);
159 Eigen::Vector3f factors = Eigen::Vector3f{f0, f1, f2}.normalized();
160 factors /= factors.sum();
161 const Eigen::Vector3f pt = factors(0) * mesh.vertices.at(f.id1) +
162 factors(1) * mesh.vertices.at(f.id2) +
163 factors(2) * mesh.vertices.at(f.id3);
165 pcl::PointXYZRGBA point;
171 const auto color = mesh.colors.at(f.id1);
173 point.r =
static_cast<std::uint8_t
>(color.r * 255);
174 point.g =
static_cast<std::uint8_t
>(color.g * 255);
175 point.b =
static_cast<std::uint8_t
>(color.b * 255);
180 const int sampleCount = 1000;
181 for (
int i = 0; i < sampleCount; ++i)
183 familiarObject.points.points.push_back(nonUniformSampleSurface());
187 familiarObject.points.is_dense =
true;
188 familiarObject.points.width = familiarObject.points.points.size();
189 familiarObject.points.height = 1;
191 std::vector<Eigen::Vector3f> sampledPoints;
192 sampledPoints.reserve(familiarObject.points.points.size());
193 for (
const auto& pt : familiarObject.points.points)
195 sampledPoints.emplace_back(pt.x, pt.y, pt.z);
198 auto aabb = simox::aabb::from_points(sampledPoints);
199 familiarObject.bounding_box.center = aabb.center();
200 familiarObject.bounding_box.extents = aabb.extents();
203 return familiarObject;