25 const auto max_edge = std::max(obj->size(0), obj->size(1));
26 if (max_edge < split_distance) {
27 split_objs->push_back(obj);
30 const auto& cloud = obj->lidar_supplement.cloud;
31 const auto& cloud_world = obj->lidar_supplement.cloud_world;
32 const auto& point_ids = obj->lidar_supplement.point_ids;
33 Eigen::Vector3f params;
34 if (!
LineFit2D(obj->lidar_supplement.cloud, ¶ms)) {
35 split_objs->push_back(obj);
39 Eigen::Vector2f offset(cloud.at(0).x, cloud.at(0).y);
40 Eigen::Vector2f min_xy(std::numeric_limits<float>::max(), std::numeric_limits<float>::max());
41 Eigen::Vector2f max_xy(-std::numeric_limits<float>::max(), -std::numeric_limits<float>::max());
42 Eigen::Vector2f odirection = params.head(2);
43 Eigen::Vector2f direction(odirection(1), -odirection(0));
44 std::vector<Eigen::Vector2f> transfrom_cloud;
45 transfrom_cloud.resize(cloud.size());
46 for (
size_t i = 0; i < cloud.size(); ++i) {
47 const auto& pt = cloud.at(i);
48 auto& vec_pt = transfrom_cloud.at(i);
49 Eigen::Vector2f vec(pt.x, pt.y);
51 vec_pt(0) = direction.dot(vec);
52 vec_pt(1) = odirection.dot(vec);
53 min_xy(0) = std::min(min_xy(0), vec_pt(0));
54 min_xy(1) = std::min(min_xy(1), vec_pt(1));
55 max_xy(0) = std::max(max_xy(0), vec_pt(0));
56 max_xy(1) = std::max(max_xy(1), vec_pt(1));
59 const auto size = max_xy - min_xy;
60 size_t segments = size(0) / split_distance + 1;
61 base::ObjectPool::Instance().BatchGet(segments, split_objs);
68 for (
auto& obj : *split_objs) {
72 for (
size_t i = 0; i < transfrom_cloud.size(); ++i) {
73 auto& vec_pt = transfrom_cloud.at(i);
74 const int section = (vec_pt(0) - min_xy(0)) / split_distance;
75 auto& obj = split_objs->at(section);
77 obj->lidar_supplement.cloud_world.push_back(cloud_world.at(i));
78 obj->lidar_supplement.point_ids.push_back(point_ids.at(i));
82 for (
auto& obj : *split_objs) {
83 if (obj->lidar_supplement.cloud.size() > 3) {
84 obj->lidar_supplement.num_points_in_roi = obj->lidar_supplement.point_ids.size();
85 split_objs->at(valid++) = obj;
88 split_objs->resize(valid);
92 if (cloud.
size() < 2) {
95 Eigen::Vector2f mean(0, 0);
96 Eigen::Matrix2f covariance = Eigen::Matrix2f::Zero();
97 for (
size_t i = 0; i < cloud.
size(); ++i) {
98 const auto& pt = cloud.
at(i);
102 mean /= cloud.
size();
103 for (
size_t i = 0; i < cloud.
size(); ++i) {
104 const auto& pt = cloud.
at(i);
105 float dx = pt.x - mean(0);
106 float dy = pt.y - mean(1);
107 covariance(0, 0) += dx * dx;
108 covariance(1, 1) += dy * dy;
109 covariance(0, 1) += dx * dy;
111 covariance(1, 0) = covariance(0, 1);
112 covariance /= cloud.
size();
113 Eigen::SelfAdjointEigenSolver<Eigen::Matrix2f> solver(covariance);
114 if (solver.info() != Eigen::Success) {
117 Eigen::Vector2f values = solver.eigenvalues();
118 Eigen::Vector2f normal
119 = std::abs(values(0)) < std::abs(values(1)) ? solver.eigenvectors().col(0) : solver.eigenvectors().col(1);
121 params->head(2) = normal;
122 (*params)[2] = -normal.dot(mean);