84 const Eigen::Vector2f e2_origin,
92 unsigned int SAMPLES = 100;
93 unsigned int matches = 0;
94 for (
unsigned int i = 0; i < SAMPLES; ++i)
96 float theta =
static_cast<float>(rand()) /
static_cast<float>(RAND_MAX / 2 *
M_PI);
97 float k = sqrt(
static_cast<float>(rand()) /
static_cast<float>(RAND_MAX));
98 Eigen::Vector2f sample(k * e2_rx * cos(theta), k * e2_ry * sin(theta));
108 return (1.0f * matches) / SAMPLES;
116 const Eigen::Vector2f line_seg_start,
117 const Eigen::Vector2f line_seg_end)
120 const Eigen::Vector2f difference_vec = line_seg_end - line_seg_start;
121 const Eigen::Vector2f difference_vec_normed = difference_vec.normalized();
122 const float distance = difference_vec.norm();
123 const unsigned int SAMPLES = std::max(
distance / 10.0, 40.0);
125 const Vector2f difference_start_origin = e_origin - line_seg_start;
126 const Vector2f difference_end_origin = e_origin - line_seg_end;
128 if (difference_start_origin.norm() > std::max(e_rx, e_ry) &&
134 if (difference_end_origin.norm() > std::max(e_rx, e_ry) &&
distance < std::max(e_rx, e_ry))
140 const float step_size =
distance / SAMPLES;
141 const Eigen::Vector2f dir = difference_vec_normed * step_size;
143 unsigned int samples_in_ellipsis = 0;
146 for (
unsigned int i = 0; i < SAMPLES * 0.5; ++i)
148 Eigen::Vector2f start_sample = line_seg_start + i * dir;
149 Eigen::Vector2f end_sample = line_seg_end - i * dir;
150 unsigned int samples_in_ellipsis_this_iteration = 0;
152 for (
const auto& point : {start_sample, end_sample})
156 ++samples_in_ellipsis;
157 ++samples_in_ellipsis_this_iteration;
161 if (samples_in_ellipsis_this_iteration == 2)
166 const unsigned int remaining_samples = SAMPLES - 2 * (i + 1);
167 return (1.0f * samples_in_ellipsis + remaining_samples) / SAMPLES;
170 return (1.0f * samples_in_ellipsis) / SAMPLES;
182 <<
" matching line segments since last update";
184 std::vector<float> x_pos;
185 std::vector<float> y_pos;
189 x_pos.push_back(match(0));
190 y_pos.push_back(match(1));
193 cv::Mat
x(x_pos.size(), 1, CV_32F, x_pos.data());
194 cv::Mat y(y_pos.size(), 1, CV_32F, y_pos.data());
199 cv::Mat
data(x_pos.size(), 2, CV_32F);
200 x.col(0).copyTo(
data.col(0));
201 y.col(0).copyTo(
data.col(1));
205 cv::PCA pca(
data, cv::Mat(), CV_PCA_DATA_AS_ROW, 2);
207 cv::Mat
mean = pca.mean;
209 cv::Mat eigenvalues = pca.eigenvalues;
211 cv::Mat eigenvectors = pca.eigenvectors;
214 Eigen::Vector2f pca_center(
mean.at<
float>(0, 0),
mean.at<
float>(0, 1));
215 Eigen::Vector2f pca1_direction(eigenvectors.at<
float>(0, 0), eigenvectors.at<
float>(0, 1));
216 Eigen::Vector2f pca2_direction(eigenvectors.at<
float>(1, 0), eigenvectors.at<
float>(1, 1));
217 double pca1_eigenvalue = eigenvalues.at<
float>(0, 0);
218 double pca2_eigenvalue = eigenvalues.at<
float>(1, 0);
222 <<
", Eigenvalue: " << pca1_eigenvalue;
224 <<
", Eigenvalue: " << pca2_eigenvalue;
227 const Eigen::Vector2f difference_vec = pca1_direction;
228 const Eigen::Vector2f center_vec = pca_center;
231 const float yaw1 = getXAxisAngle(difference_vec);
232 const float yaw2 = getXAxisAngle(-1 * difference_vec);
234 const float diff_origin_yaw1 = std::abs(yaw1 -
m_obstacle.yaw);
235 const float diff_origin_yaw2 = std::abs(yaw2 -
m_obstacle.yaw);
236 const float diff_origin_yaw1_opposite = std::abs(2 *
M_PI - diff_origin_yaw1);
237 const float diff_origin_yaw2_opposite = std::abs(2 *
M_PI - diff_origin_yaw2);
241 if ((diff_origin_yaw1 < diff_origin_yaw2 && diff_origin_yaw1 < diff_origin_yaw2_opposite) ||
242 (diff_origin_yaw1_opposite < diff_origin_yaw2 &&
243 diff_origin_yaw1_opposite < diff_origin_yaw2_opposite))
260 std::make_tuple(center_vec(0),
263 sqrt(pca1_eigenvalue) * 1.3,
264 std::max(1.0f * thickness,
265 static_cast<float>(sqrt(pca2_eigenvalue)) *
274 double sum_x_pos = 0;
275 double sum_y_pos = 0;
277 double sum_sin_yaw = 0;
278 double sum_cos_yaw = 0;
279 double sum_axisX = 0;
280 double sum_axisY = 0;
290 sum_x_pos += current_x_pos;
291 sum_y_pos += current_y_pos;
292 sum_yaw += current_yaw;
293 sum_sin_yaw += sin(current_yaw);
294 sum_cos_yaw += cos(current_yaw);
295 sum_axisX += current_axisX;
296 sum_axisY += current_axisY;
298 yaws += std::to_string(current_yaw) +
", ";
303 double mean_yaw = atan2(
309 mean_yaw = normalizeYaw(mean_yaw);
static float ellipsis_ellipsis_coverage(const Eigen::Vector2f e1_origin, const float e1_rx, const float e1_ry, const float e1_yaw, const Eigen::Vector2f e2_origin, const float e2_rx, const float e2_ry, const float e2_yaw)