161 typename pcl::PointCloud<PointType>::Ptr inputCloudPtr(
new pcl::PointCloud<PointType>());
162 typename pcl::PointCloud<PointType>::Ptr downsampledTransformedInputCloudPtr(
163 new pcl::PointCloud<PointType>());
164 typename pcl::PointCloud<PointType>::Ptr outputCloudPtr(
new pcl::PointCloud<PointType>());
174 ARMARX_INFO <<
"Timeout or error while waiting for point cloud data" <<
flush;
183 ARMARX_INFO <<
"Got cloud of size: " << inputCloudPtr->size();
187 << IceUtil::Time::microSeconds(format->timeProvided).toDateTime();
194 <<
"failed to sync robot to timestamp! conversion to globalpose "
195 "will fail! aborting";
200 Eigen::Matrix4f
transform = Eigen::Matrix4f::Identity();
207 Eigen::Matrix4f cam2robot;
208 cam2robot << 0, 0, 1, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1;
210 pcl::FrustumCulling<PointType> fc;
211 fc.setInputCloud(inputCloudPtr);
212 fc.setNegative(
false);
213 fc.setVerticalFOV(35);
214 fc.setHorizontalFOV(45);
215 fc.setNearPlaneDistance(0.0);
216 fc.setFarPlaneDistance(3500);
218 fc.setCameraPose(cam2robot);
220 fc.filter(*outputCloudPtr);
221 ARMARX_INFO <<
"size before frustrum culling: " << inputCloudPtr->size()
222 <<
" size after: " << outputCloudPtr->size();
223 inputCloudPtr.swap(outputCloudPtr);
232 pcl::transformPointCloud(*inputCloudPtr, *outputCloudPtr,
transform);
233 outputCloudPtr.swap(inputCloudPtr);
238 pcl::PassThrough<PointType> pass;
241 pass.setInputCloud(inputCloudPtr);
242 pass.setFilterFieldName(
"z");
244 pass.filter(*outputCloudPtr);
245 outputCloudPtr.swap(inputCloudPtr);
247 pass.setInputCloud(inputCloudPtr);
248 pass.setFilterFieldName(
"x");
250 pass.filter(*outputCloudPtr);
251 outputCloudPtr.swap(inputCloudPtr);
253 pass.setInputCloud(inputCloudPtr);
254 pass.setFilterFieldName(
"y");
256 pass.filter(*outputCloudPtr);
257 outputCloudPtr.swap(inputCloudPtr);
263 pcl::VoxelGrid<PointType> grid;
264 grid.setMinimumPointsNumberPerVoxel(
268 grid.setInputCloud(inputCloudPtr);
269 grid.filter(*outputCloudPtr);
271 <<
" after downsampling: " << outputCloudPtr->size();
272 outputCloudPtr.swap(inputCloudPtr);
306 typename pcl::PointCloud<PointType>::Ptr occludedPoints(
new pcl::PointCloud<PointType>());
307 typename pcl::PointCloud<PointType>::Ptr oldPointsInView(
new pcl::PointCloud<PointType>());
311 Eigen::Matrix4f cam2robot;
312 cam2robot << 0, 0, 1, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1;
314 pcl::FrustumCulling<PointType> fc;
316 fc.setNegative(
false);
317 fc.setVerticalFOV(40);
318 fc.setHorizontalFOV(50);
319 fc.setNearPlaneDistance(0.0);
320 fc.setFarPlaneDistance(2500);
324 fc.filter(*oldPointsInView);
327 fc.setNegative(
true);
328 fc.filter(*outputCloudPtr);
334 Eigen::Vector3f cameraPos =
transform.block<3, 1>(0, 3);
335 for (
auto& p : *oldPointsInView)
337 Eigen::Vector3f currentPoint(
338 p._PointXYZRGBA::x, p._PointXYZRGBA::y, p._PointXYZRGBA::z);
339 VirtualRobot::MathTools::BaseLine<Eigen::Vector3f> line(
transform.block<3, 1>(0, 3),
340 currentPoint - cameraPos);
341 float distP1 = (currentPoint - cameraPos).
norm();
342 for (
auto& p2pcl : *inputCloudPtr)
345 p2pcl._PointXYZRGBA::x, p2pcl._PointXYZRGBA::y, p2pcl._PointXYZRGBA::z);
346 float distP2 = (cameraPos - p2).
norm();
349 auto distance = VirtualRobot::MathTools::distPointLine(line, p2);
357 occludedPoints->push_back(newP);
367 ARMARX_VERBOSE <<
"Size after removal of robot voxels: " << inputCloudPtr->size();
382 <<
" new point count: " << inputCloudPtr->size()
383 <<
" number of occluded points: " << occludedPoints->size();
388 pcl::VoxelGrid<PointType> grid2;
391 grid2.filter(*outputCloudPtr);
403 std::vector<VirtualRobot::VisualizationFactory::Color> gridColors;
407 DebugDrawerTriMesh ddTriMesh;
415 if (!std::isnan(p._PointXYZRGBA::x) && !std::isnan(p._PointXYZRGBA::y) &&
416 !std::isnan(p._PointXYZRGBA::z))
420 {p._PointXYZRGBA::x, p._PointXYZRGBA::y, p._PointXYZRGBA::z});
421 gridColors.push_back(
422 VirtualRobot::VisualizationFactory::Color(p._PointXYZRGBA::r / 255.f,
423 p._PointXYZRGBA::g / 255.f,
424 p._PointXYZRGBA::b / 255.f,
432 +[](
const Vector3f& p) -> Eigen::Vector3f {
433 return {p.e0, p.e1, p.e2};
441 gridMesh = VirtualRobot::TriMeshUtils::CreateSparseBoxGrid(
442 Eigen::Matrix4f::Identity(),
447 VirtualRobot::VisualizationFactory::Color::Blue(),
456 dd->setTriMeshVisu(
"VoxelGrid",
"PointCloudCollisionGrid", ddTriMesh);