48 std::vector<Violation> found;
52 for (std::size_t i = 0; i < points.size(); i++)
54 const auto& p = points[i].waypoint.pose.translation();
56 if (isInCollision(p.x(), p.y()))
58 found.push_back({.index = i,
59 .clearance = clearanceAt(p.x(), p.y()),
63 if (i + 1 >= points.size())
69 constexpr float segmentResolution = 50.0F;
71 const auto&
q = points[i + 1].waypoint.pose.translation();
72 const float dx =
q.x() - p.x();
73 const float dy =
q.y() - p.y();
74 int numSamples =
static_cast<int>(std::ceil(std::hypot(dx, dy) / segmentResolution));
80 for (
int s = 1; s < numSamples; s++)
82 const float t =
static_cast<float>(s) /
static_cast<float>(numSamples);
83 const float x = p.x() + t * dx;
84 const float y = p.y() + t * dy;
86 if (isInCollision(
x, y))
89 {.index = i, .clearance = clearanceAt(
x, y), .onSegment =
true});
100 bool collisionFree =
true;
103 for (std::size_t i = 0; i <
trajectory.points().size(); ++i)
105 const auto& p =
trajectory.points()[i].waypoint.pose.translation();
106 if (isInCollision(p.x(), p.y()))
108 collisionFree =
false;
111 ARMARX_INFO <<
"[TrajectoryChecker2D] Collision at waypoint " << i <<
" : ("
112 << p.x() <<
", " << p.y() <<
")";
118 constexpr float segmentResolution = 50.0f;
119 for (std::size_t i = 0; i + 1 <
trajectory.points().size(); ++i)
121 const auto& p1 =
trajectory.points()[i].waypoint.pose.translation();
122 const auto& p2 =
trajectory.points()[i + 1].waypoint.pose.translation();
124 const float dx = p2.x() - p1.x();
125 const float dy = p2.y() - p1.y();
126 const float dist = std::hypot(dx, dy);
127 int numSamples =
static_cast<int>(std::ceil(dist / segmentResolution));
131 for (
int s = 1; s < numSamples; ++s)
133 const float t =
static_cast<float>(s) / numSamples;
134 const float x = p1.x() + t * dx;
135 const float y = p1.y() + t * dy;
136 if (isInCollision(
x, y))
138 collisionFree =
false;
141 ARMARX_INFO <<
"[TrajectoryChecker2D] Collision on segment " << i <<
"-"
142 << (i + 1) <<
" at t=" << t;
148 return collisionFree;