42 max_grid_size_ = 4.00;
43 plane_inlier_distance_ = 0.05;
44 min_planepoints_number_ = 60;
45 plane_type_degree_ = 80.0;
46 below_lidar_height_ = 1.0;
58 min_planepoints_number_ =
static_cast<int>(d);
66 const Eigen::Vector3f& tmp1) {
67 float cos_theta = tmp0.dot(tmp1) / (tmp0.norm() * tmp1.norm());
68 return static_cast<float>(std::acos(cos_theta) * 180.0 / M_PI);
78 pcl::copyPointCloud<PointT>(*cloud, *pointcloud_ptr);
79 int iter_num =
static_cast<int>(log2(max_grid_size_ / min_grid_size_));
83 std::clock_t plane_time;
84 plane_time = std::clock();
85 int total_plane_num = 0;
87 for (
int iter = 0; iter <= iter_num; ++iter) {
89 float grid_size =
static_cast<float>(max_grid_size_ / power2);
91 vgc.setInputCloud(pointcloud_ptr);
93 vgc.setLeafSize(grid_size, grid_size, grid_size);
98 typename std::map<size_t, VoxelGridCovariance<PointT>::Leaf>::iterator it;
100 if (it->second.GetPointCount() < min_planepoints_number_) {
101 cloud_tmp += it->second.cloud_;
105 if (GetPlaneFeaturePoint(it->second.cloud_, &cloud_outlier)) {
106 cloud_tmp += cloud_outlier;
109 cloud_tmp += it->second.cloud_;
112 AINFO <<
"the " << iter <<
" interation: plane_num = " << plane_num;
113 total_plane_num += plane_num;
115 *pointcloud_ptr = cloud_tmp;
118 *non_xy_plane_cloud_ = *pointcloud_ptr;
119 plane_time = std::clock() - plane_time;
120 AINFO <<
"plane_patch takes:"
121 <<
static_cast<double>(plane_time) / CLOCKS_PER_SEC <<
"sec.";
122 AINFO <<
"total_plane_num = " << total_plane_num;
123 AINFO <<
"total_points_num = " << xy_plane_cloud_->points.size();
128 bool GetPlaneFeaturePoint(
const PointCloudT& cloud,
131 std::vector<int> inliers;
134 pcl::SampleConsensusModelPlane<PointT>::Ptr model_plane(
135 new pcl::SampleConsensusModelPlane<PointT>(cloud_new));
136 pcl::RandomSampleConsensus<PointT> ransac(model_plane);
137 ransac.setDistanceThreshold(plane_inlier_distance_);
138 ransac.computeModel();
139 ransac.getInliers(inliers);
140 if (
static_cast<int>(inliers.size()) < min_planepoints_number_) {
144 pcl::copyPointCloud<PointT>(*cloud_new, inliers, *cloud_inlier);
145 std::vector<int> outliers;
146 unsigned int inlier_idx = 0;
147 for (
unsigned int i = 0; i < cloud_new->points.size(); ++i) {
148 if (inlier_idx >= inliers.size() ||
149 static_cast<int>(i) < inliers[inlier_idx]) {
150 outliers.push_back(i);
155 pcl::copyPointCloud<PointT>(*cloud_new, outliers, *cloud_outlier);
157 Eigen::Vector4f centroid;
158 pcl::compute3DCentroid(*cloud_inlier, centroid);
160 if (centroid(2) > -below_lidar_height_) {
165 Eigen::VectorXf coeff;
166 ransac.getModelCoefficients(coeff);
168 double tan_theta = 0;
169 double tan_refer_theta = std::tan(plane_type_degree_ / 180.0 * M_PI);
170 if ((std::abs(coeff(2)) > std::abs(coeff(0))) &&
171 (std::abs(coeff(2)) > std::abs(coeff(1)))) {
172 tan_theta = std::abs(coeff(2)) /
173 std::sqrt(coeff(0) * coeff(0) + coeff(1) * coeff(1));
174 if (tan_theta > tan_refer_theta) {
175 *xy_plane_cloud_ += *cloud_inlier;
185 double min_grid_size_;
186 double max_grid_size_;
187 double plane_inlier_distance_;
188 int min_planepoints_number_;
189 double plane_type_degree_;
190 double below_lidar_height_;