4 const std::vector<Cone>& cone_array,
bool rebuild_all_midpoints) {
7 std::vector<std::shared_ptr<Cone>> filtered_cones;
8 filtered_cones.reserve(cone_array.size());
10 filter_cones(cone_array, filtered_cones, rebuild_all_midpoints);
18 for (
const auto& cone : filtered_cones) {
19 (void)dt.insert(
Point(cone->position.x, cone->position.y));
23 std::map<std::pair<int, int>, std::shared_ptr<Midpoint>> segment_to_midpoint;
25 for (
auto triangle_it = dt.finite_faces_begin(); triangle_it != dt.finite_faces_end();
27 std::array<std::shared_ptr<Midpoint>, 3> triangle_midpoints;
30 for (
int i = 0; i < 3; ++i) {
45 std::vector<std::shared_ptr<Cone>>& filtered_cones,
46 bool rebuild_all_midpoints) {
47 if (!rebuild_all_midpoints) {
48 for (
const auto& cone : cone_array) {
54 if (dx * dx + dy * dy <= sq_window_radius) {
55 filtered_cones.push_back(std::make_shared<Cone>(cone));
59 for (
const auto& cone : cone_array) {
60 filtered_cones.push_back(std::make_shared<Cone>(cone));
64 if (filtered_cones.size() < 2) {
65 RCLCPP_WARN(rclcpp::get_logger(
"planning"),
"[Planning] Not enough cones to compute midpoints");
71 std::vector<std::shared_ptr<Cone>>& filtered_cones,
72 std::map<std::pair<int, int>, std::shared_ptr<Midpoint>>& segment_to_midpoint) {
73 Point p1 = va->point();
74 Point p2 = vb->point();
77 int id1 =
find_cone(filtered_cones, p1.x(), p1.y());
78 int id2 =
find_cone(filtered_cones, p2.x(), p2.y());
80 if (id1 == -1 || id2 == -1) {
85 if (
double squared_distance = CGAL::squared_distance(p1, p2);
92 auto key = std::minmax(id1, id2);
95 if (
auto it = segment_to_midpoint.find(key); it != segment_to_midpoint.end()) {
101 std::make_shared<Midpoint>(CGAL::midpoint(p1, p2), filtered_cones[id1], filtered_cones[id2]);
103 segment_to_midpoint[key] = midpoint;
111 const std::array<std::shared_ptr<Midpoint>, 3>& triangle_midpoints) {
112 for (
int i = 0; i < 3; ++i) {
113 if (!triangle_midpoints[i]) {
116 for (
int j = 0; j < 3; ++j) {
117 if (i == j || !triangle_midpoints[j]) {
120 triangle_midpoints[i]->close_points.push_back(triangle_midpoints[j]);
134 for (
int i = 0; i < static_cast<int>(cones.size()); i++) {
135 if (cones[i]->position.x == x && cones[i]->position.y == y) {
int find_cone(std::vector< std::shared_ptr< Cone > > &cones, double x, double y)
Finds a cone in a vector based on its position coordinates.
void connect_triangle_midpoints(const std::array< std::shared_ptr< Midpoint >, 3 > &triangle_midpoints)
Connects midpoints that belong to the same Delaunay triangle.
void filter_cones(const std::vector< Cone > &cone_array, std::vector< std::shared_ptr< Cone > > &filtered_cones, bool rebuild_all_midpoints)
Filters input cones based on proximity to the vehicle pose.
std::shared_ptr< Midpoint > process_triangle_edge(const Vertex_handle &va, const Vertex_handle &vb, std::vector< std::shared_ptr< Cone > > &filtered_cones, std::map< std::pair< int, int >, std::shared_ptr< Midpoint > > &segment_to_midpoint)
Processes a single edge of a Delaunay triangle and creates its midpoint if valid.
void set_vehicle_pose(const Pose &vehicle_pose)
Updates the vehicle pose for dynamic filtering.
MidpointGeneratorConfig config_
std::vector< std::shared_ptr< Midpoint > > & generate_midpoints(const std::vector< Cone > &cone_array, bool rebuild_all_midpoints)
Generates midpoints from a set of cones.
std::vector< std::pair< Point, Point > > triangulations_
std::vector< std::shared_ptr< Midpoint > > midpoints_
const std::vector< std::pair< Point, Point > > & get_triangulations() const
Returns the current set of Delaunay edges used for visualization.
CGAL::Delaunay_triangulation_2< K > DT
DT::Vertex_handle Vertex_handle
double maximum_cone_distance_
Maximum distance between cones.
double sliding_window_radius_
Sliding window radius for midpoint generation.
double minimum_cone_distance_
Minimum distance between cones.
Struct for pose representation.