50 const double dAngularStepDegrees = 57,
51 const double dMaxRadius = 25,
52 const double dStartingHeadingDegrees = 0,
53 const double dStartSpacing = 1)
56 std::vector<geoops::Waypoint> vWaypoints;
57 double dAngularStepRadians = dAngularStepDegrees * M_PI / 180;
58 double dAngleRadians = (-dStartingHeadingDegrees) * M_PI / 180.0;
59 double dCurrentSpacingWindUp = 0.0;
62 double dCurrentRadius = 0.0;
68 LOG_WARNING(logging::g_qSharedLogger,
"MaxRadius is less than 1 meter. Cannot create spiral pattern.");
73 while (dCurrentRadius <= dMaxRadius)
76 double dCurrentX = dStartingX + dCurrentSpacingWindUp *
cos(dAngleRadians);
77 double dCurrentY = dStartingY + dCurrentSpacingWindUp *
sin(dAngleRadians);
81 stCurrentCoordinate.dEasting = dCurrentX;
82 stCurrentCoordinate.dNorthing = dCurrentY;
83 vWaypoints.emplace_back(stCurrentCoordinate, geoops::WaypointType::eNavigationWaypoint);
86 dAngleRadians += dAngularStepRadians;
87 dCurrentSpacingWindUp += dStartSpacing;
93 while (dCurrentRadius >= 0.5 && dCurrentSpacingWindUp > 0.0)
96 double dCurrentX = dStartingX + dCurrentSpacingWindUp *
cos(dAngleRadians);
97 double dCurrentY = dStartingY + dCurrentSpacingWindUp *
sin(dAngleRadians);
101 stCurrentCoordinate.dEasting = dCurrentX;
102 stCurrentCoordinate.dNorthing = dCurrentY;
103 vWaypoints.emplace_back(stCurrentCoordinate, geoops::WaypointType::eNavigationWaypoint);
106 dAngleRadians += dAngularStepRadians;
107 dCurrentSpacingWindUp -= dStartSpacing;
114 std::string szSearchPatternPoints =
"Search Pattern Points (Spiral): ";
117 szSearchPatternPoints +=
118 "(" + std::to_string(stWaypoint.GetGPSCoordinate().dLatitude) +
", " + std::to_string(stWaypoint.GetGPSCoordinate().dLongitude) +
"), ";
121 LOG_DEBUG(logging::g_qSharedLogger,
"{}", szSearchPatternPoints);
144 const double dWidth = 20.0,
145 const double dHeight = 20.0,
146 const double dSpacing = 1.0,
147 const bool bVertical =
true)
150 std::vector<geoops::Waypoint> vWaypoints;
151 double dStartingX = stCenterPoint.
GetUTMCoordinate().dEasting - (dWidth / 2);
152 double dStartingY = stCenterPoint.
GetUTMCoordinate().dNorthing - (dHeight / 2);
153 double dCurrentX = dStartingX;
154 double dCurrentY = dStartingY;
155 bool bZigNotZag =
true;
156 double bCalcSpacing = dSpacing;
159 if (dWidth < 1 || dHeight < 1 || dSpacing < 1)
162 LOG_WARNING(logging::g_qSharedLogger,
"Width or height or spacing is less than 1 meter. Cannot create zigzag pattern.");
167 if (bCalcSpacing > dWidth / 2.0)
170 LOG_WARNING(logging::g_qSharedLogger,
"Spacing is greater than width. Setting spacing to width / 2.");
172 bCalcSpacing = dWidth / 2.0 - 1.0;
174 if (bCalcSpacing > dHeight / 2.0)
177 LOG_WARNING(logging::g_qSharedLogger,
"Spacing is greater than height. Setting spacing to height / 2.");
179 bCalcSpacing = dHeight / 2.0 - 1.0;
183 while ((bVertical && dCurrentY <= dStartingY + dHeight) || (!bVertical && dCurrentX <= dStartingX + dWidth))
192 dCurrentX = dStartingX + bCalcSpacing;
197 dCurrentX = dStartingX - bCalcSpacing;
206 dCurrentY = dStartingY + bCalcSpacing;
211 dCurrentY = dStartingY - bCalcSpacing;
216 while ((bZigNotZag && bVertical && dCurrentX <= dStartingX + dWidth) || (!bZigNotZag && bVertical && dCurrentX >= dStartingX) ||
217 (bZigNotZag && !bVertical && dCurrentY <= dStartingY + dHeight) || (!bZigNotZag && !bVertical && dCurrentY >= dStartingY))
221 stCurrentCoordinate.dEasting = dCurrentX;
222 stCurrentCoordinate.dNorthing = dCurrentY;
223 geoops::Waypoint stCurrentWaypoint(stCurrentCoordinate, geoops::WaypointType::eNavigationWaypoint);
225 vWaypoints.push_back(stCurrentWaypoint);
231 dCurrentX += bZigNotZag ? bCalcSpacing : -bCalcSpacing;
236 dCurrentY += bZigNotZag ? bCalcSpacing : -bCalcSpacing;
243 dCurrentY += bCalcSpacing;
247 dCurrentX += bCalcSpacing;
251 bZigNotZag = !bZigNotZag;
261 std::vector<geoops::Waypoint> vFilterWaypoints;
263 vFilterWaypoints.push_back(vWaypoints[0]);
265 for (
size_t i = 0; i < vWaypoints.size() - 1; ++i)
269 if (stGeoMeasurement.dDistanceMeters > bCalcSpacing * 1.5)
272 vFilterWaypoints.push_back(vWaypoints[i]);
273 vFilterWaypoints.push_back(vWaypoints[i + 1]);
278 std::string szSearchPatternPoints =
"Search Pattern Points (Spiral): ";
281 szSearchPatternPoints +=
282 "(" + std::to_string(stWaypoint.GetGPSCoordinate().dLatitude) +
", " + std::to_string(stWaypoint.GetGPSCoordinate().dLongitude) +
"), ";
285 LOG_DEBUG(logging::g_qSharedLogger,
"{}", szSearchPatternPoints);
288 return vFilterWaypoints;
306 const double dWidth = 20.0,
307 const double dHeight = 20.0,
308 const double dSpacing = 1.0,
309 const int nNumberOfSlithers = 1.0,
310 const bool bVertical =
true)
313 std::vector<geoops::Waypoint> vWaypoints;
315 double dStartingX = (bVertical) ? stStartUTM.dEasting : stStartUTM.dEasting - (dWidth / 2);
316 double dStartingY = (bVertical) ? stStartUTM.dNorthing - (dHeight / 2) : stStartUTM.dNorthing;
319 if (dWidth < 1.0 || dHeight < 1.0 || dSpacing < 0.1 || nNumberOfSlithers < 1)
322 LOG_WARNING(logging::g_qSharedLogger,
323 "Invalid parameters for snake pattern: width={}, height={}, spacing={}, number of slithers={}",
333 int nPoints =
static_cast<int>(dWidth + dHeight / dSpacing);
336 for (
int nIter = 0; nIter < nPoints; ++nIter)
338 double dTime =
static_cast<double>(nIter) / (nPoints - 1);
339 double dCurrentX, dCurrentY;
344 dCurrentY = dStartingY + dTime * dWidth;
346 dCurrentX = dStartingX + (dHeight / 2.0) * std::cos(2.0 * nNumberOfSlithers * M_PI * dTime);
351 dCurrentX = dStartingX + dTime * dWidth;
353 dCurrentY = dStartingY + (dHeight / 2.0) * std::cos(2.0 * nNumberOfSlithers * M_PI * dTime);
358 stCurrentUTM.dEasting = dCurrentX;
359 stCurrentUTM.dNorthing = dCurrentY;
360 geoops::Waypoint stCurrentWaypoint(stCurrentUTM, geoops::WaypointType::eNavigationWaypoint);
361 vWaypoints.push_back(stCurrentWaypoint);
365 std::string szSearchPatternPoints =
"Search Pattern Points (Snake): ";
368 szSearchPatternPoints +=
369 "(" + std::to_string(stWaypoint.GetGPSCoordinate().dLatitude) +
", " + std::to_string(stWaypoint.GetGPSCoordinate().dLongitude) +
"), ";
371 LOG_DEBUG(logging::g_qSharedLogger,
"{}", szSearchPatternPoints);