31 #ifndef _MIRA_RASTERRANGESCAN_H_ 32 #define _MIRA_RASTERRANGESCAN_H_ 38 #include <robot/RangeScanInfo.h> 41 namespace mira {
namespace maps {
223 template<
typename Visitor,
bool VisitorUsesWorldDistance=true>
225 float maxRange,
float cellSize, Visitor& visitor);
231 template<
typename Visitor,
bool VisitorUsesWorldDistance>
236 mVisitor(visitor), mRegion(region), mCellSize(cellSize), mDistanceOffset(distOffset) {}
240 mVisitor.beginScanline(y);
243 for(
int x=xl; x<=xr; ++x, ++i)
245 if constexpr (VisitorUsesWorldDistance) {
246 float min_d = i->minDist * mCellSize - mDistanceOffset;
247 float max_d = i->maxDist * mCellSize - mDistanceOffset;
248 mVisitor(x,y, min_d, max_d);
250 mVisitor(x,y, i->minDist, i->maxDist);
261 float mDistanceOffset;
266 template<
typename Visitor,
bool VisitorUsesWorldDistance>
268 float maxRange,
float cellSize, Visitor& visitor)
274 float phi = c.
origin.phi();
276 float phi_left = phi -
alpha;
277 float phi_right = phi +
alpha;
293 maxRange += cellSize;
295 if (cosf(
alpha) < std::numeric_limits<float>::min()) {
296 MIRA_THROW(XInvalidConfig,
"rasterSensorCone: " 297 "Invalid cone angle " << c.
coneAngle <<
" (must be 0 < angle < 180deg)");
300 maxRange /= cosf(
alpha);
303 float x_left = cosf(phi_left) * maxRange + x;
304 float y_left = sinf(phi_left) * maxRange + y;
307 float x_right = cosf(phi_right) * maxRange + x;
308 float y_right = sinf(phi_right) * maxRange + y;
311 float xi_eps, yi_eps;
314 xi = (int)floor(x/cellSize);
315 yi = (int)floor(y/cellSize);
318 xi_eps = x/cellSize - (float)xi;
319 yi_eps = y/cellSize - (float)yi;
324 int xi_left, yi_left;
325 int xi_right, yi_right;
327 xi_left = (int)floor(x_left/cellSize);
328 yi_left = (int)floor(y_left/cellSize);
330 xi_right = (int)floor(x_right/cellSize);
331 yi_right = (int)floor(y_right/cellSize);
334 int ri = maxRange / cellSize;
341 visitor.beginScan(c);
345 Point2i left(xi_left-xi,yi_left-yi);
346 Point2i right(xi_right-xi,yi_right-yi);
Definition: RasterRangeScan.h:232
Configuration of a sensor cone.
Definition: RasterRangeScan.h:65
float distanceOffset
Definition: RasterRangeScan.h:69
void rasterTriangle(Point2i p0, Point2i p1, Point2i p2, Visitor &&visitor)
Pose2 origin
Definition: RasterRangeScan.h:67
#define MIRA_THROW(ex, msg)
const CellDist * iterator
void rasterSensorCone(const RangeScanCone &c, float maxRange, float cellSize, Visitor &visitor)
Function for fast rasterization of sensor cones cell by cell.
Definition: RasterRangeScan.h:267
RasterSensorConeVisitor(Visitor &visitor, const DistanceLUT::Region ®ion, float cellSize, float distOffset)
Definition: RasterRangeScan.h:235
Point< float, 2 > Point2f
void operator()(int xl, int xr, int y)
Definition: RasterRangeScan.h:238
float coneAngle
Definition: RasterRangeScan.h:72
iterator getIterator(int x, int y) const