153 typename pcl::PointCloud<PointType>::Ptr inputCloudPtr(
new pcl::PointCloud<PointType>());
154 typename pcl::PointCloud<PointType>::Ptr downsampledTransformedInputCloudPtr(
155 new pcl::PointCloud<PointType>());
156 typename pcl::PointCloud<PointType>::Ptr outputCloudPtr(
new pcl::PointCloud<PointType>());
166 ARMARX_INFO <<
"Timeout or error while waiting for point cloud data" <<
flush;
175 ARMARX_INFO <<
"Got cloud of size: " << inputCloudPtr->size();
179 << IceUtil::Time::microSeconds(format->timeProvided).toDateTime();
186 <<
"failed to sync robot to timestamp! conversion to globalpose "
187 "will fail! aborting";
192 Eigen::Matrix4f
transform = Eigen::Matrix4f::Identity();
199 Eigen::Matrix4f cam2robot;
200 cam2robot << 0, 0, 1, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1;
202 pcl::FrustumCulling<PointType> fc;
203 fc.setInputCloud(inputCloudPtr);
204 fc.setNegative(
false);
205 fc.setVerticalFOV(35);
206 fc.setHorizontalFOV(45);
207 fc.setNearPlaneDistance(0.0);
208 fc.setFarPlaneDistance(3500);
210 fc.setCameraPose(cam2robot);
212 fc.filter(*outputCloudPtr);
213 ARMARX_INFO <<
"size before frustrum culling: " << inputCloudPtr->size()
214 <<
" size after: " << outputCloudPtr->size();
215 inputCloudPtr.swap(outputCloudPtr);
224 pcl::transformPointCloud(*inputCloudPtr, *outputCloudPtr,
transform);
225 outputCloudPtr.swap(inputCloudPtr);
230 pcl::PassThrough<PointType> pass;
233 pass.setInputCloud(inputCloudPtr);
234 pass.setFilterFieldName(
"z");
236 pass.filter(*outputCloudPtr);
237 outputCloudPtr.swap(inputCloudPtr);
239 pass.setInputCloud(inputCloudPtr);
240 pass.setFilterFieldName(
"x");
242 pass.filter(*outputCloudPtr);
243 outputCloudPtr.swap(inputCloudPtr);
245 pass.setInputCloud(inputCloudPtr);
246 pass.setFilterFieldName(
"y");
248 pass.filter(*outputCloudPtr);
249 outputCloudPtr.swap(inputCloudPtr);
255 pcl::VoxelGrid<PointType> grid;
256 grid.setMinimumPointsNumberPerVoxel(
260 grid.setInputCloud(inputCloudPtr);
261 grid.filter(*outputCloudPtr);
263 <<
" after downsampling: " << outputCloudPtr->size();
264 outputCloudPtr.swap(inputCloudPtr);
298 typename pcl::PointCloud<PointType>::Ptr occludedPoints(
new pcl::PointCloud<PointType>());
299 typename pcl::PointCloud<PointType>::Ptr oldPointsInView(
new pcl::PointCloud<PointType>());
303 Eigen::Matrix4f cam2robot;
304 cam2robot << 0, 0, 1, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1;
306 pcl::FrustumCulling<PointType> fc;
308 fc.setNegative(
false);
309 fc.setVerticalFOV(40);
310 fc.setHorizontalFOV(50);
311 fc.setNearPlaneDistance(0.0);
312 fc.setFarPlaneDistance(2500);
316 fc.filter(*oldPointsInView);
319 fc.setNegative(
true);
320 fc.filter(*outputCloudPtr);
326 Eigen::Vector3f cameraPos =
transform.block<3, 1>(0, 3);
327 for (
auto& p : *oldPointsInView)
329 Eigen::Vector3f currentPoint(
330 p._PointXYZRGBA::x, p._PointXYZRGBA::y, p._PointXYZRGBA::z);
331 VirtualRobot::MathTools::BaseLine<Eigen::Vector3f> line(
transform.block<3, 1>(0, 3),
332 currentPoint - cameraPos);
333 float distP1 = (currentPoint - cameraPos).
norm();
334 for (
auto& p2pcl : *inputCloudPtr)
337 p2pcl._PointXYZRGBA::x, p2pcl._PointXYZRGBA::y, p2pcl._PointXYZRGBA::z);
338 float distP2 = (cameraPos - p2).
norm();
341 auto distance = VirtualRobot::MathTools::distPointLine(line, p2);
349 occludedPoints->push_back(newP);
359 ARMARX_VERBOSE <<
"Size after removal of robot voxels: " << inputCloudPtr->size();
374 <<
" new point count: " << inputCloudPtr->size()
375 <<
" number of occluded points: " << occludedPoints->size();
380 pcl::VoxelGrid<PointType> grid2;
383 grid2.filter(*outputCloudPtr);
395 std::vector<VirtualRobot::VisualizationFactory::Color> gridColors;
399 DebugDrawerTriMesh ddTriMesh;
407 if (!std::isnan(p._PointXYZRGBA::x) && !std::isnan(p._PointXYZRGBA::y) &&
408 !std::isnan(p._PointXYZRGBA::z))
412 {p._PointXYZRGBA::x, p._PointXYZRGBA::y, p._PointXYZRGBA::z});
413 gridColors.push_back(
414 VirtualRobot::VisualizationFactory::Color(p._PointXYZRGBA::r / 255.f,
415 p._PointXYZRGBA::g / 255.f,
416 p._PointXYZRGBA::b / 255.f,
424 +[](
const Vector3f& p) -> Eigen::Vector3f {
425 return {p.e0, p.e1, p.e2};
433 gridMesh = VirtualRobot::TriMeshUtils::CreateSparseBoxGrid(
434 Eigen::Matrix4f::Identity(),
439 VirtualRobot::VisualizationFactory::Color::Blue(),
448 dd->setTriMeshVisu(
"VoxelGrid",
"PointCloudCollisionGrid", ddTriMesh);