Loading...
Searching...
No Matches
BLITstar.h
1/*********************************************************************
2 * Software License Agreement (BSD License)
3 *
4 * Copyright (c) 2025, University of New Hampshire
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
17 * * Neither the names of the copyright holders nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
33 *********************************************************************/
34/*********************************************************************
35 * Attribution Notice:
36 *
37 * This file contains code partially adapted from the AIT* and BIT* planners
38 * in the Open Motion Planning Library (OMPL). Elements such as sampling
39 * structure and queue management are based on those planners.
40 *
41 * The overall planning strategy and key contributions for BLIT* were developed
42 * independently by Yi Wang.
43 *********************************************************************/
44
45// Authors: Yi Wang, Eyal Weiss, Bingxian Mu, Oren Salzman
46
47#ifndef OMPL_GEOMETRIC_PLANNERS_INFORMEDTREES_BLITSTAR_
48#define OMPL_GEOMETRIC_PLANNERS_INFORMEDTREES_BLITSTAR_
49
50#include <algorithm>
51#include <memory>
52#include <unordered_map>
53#include "ompl/base/Planner.h"
54#include <unsupported/Eigen/Polynomials>
55#include "ompl/geometric/PathGeometric.h"
56#include "ompl/geometric/planners/lazyinformedtrees/blitstar/ImplicitGraph.h"
57#include "ompl/geometric/planners/lazyinformedtrees/blitstar/Vertex.h"
58#include "ompl/geometric/planners/lazyinformedtrees/blitstar/Queuetypes.h"
59
60#include <chrono>
61using namespace std::chrono;
62namespace ompl
63{
64 namespace geometric
65 {
80
82 {
83 public:
85 explicit BLITstar(const ompl::base::SpaceInformationPtr &spaceInformation);
86
88 ~BLITstar();
89
91 void setup() override;
92
95
99
101 void clear() override;
102
105 solve(const ompl::base::PlannerTerminationCondition &terminationCondition) override;
106
108 void getPlannerData(base::PlannerData &data) const override;
109
111 void setBatchSize(std::size_t batchSize);
112
114 std::size_t getBatchSize() const;
115
117 void setRewireFactor(double rewireFactor);
118
120 double getRewireFactor() const;
121
123 void enablePruning(bool prune);
124
126 bool isPruningEnabled() const;
127
129 void setUseKNearest(bool useKNearest);
130
132 bool getUseKNearest() const;
133
135 void setMaxNumberOfGoals(unsigned int numberOfGoals);
136
138 unsigned int getMaxNumberOfGoals() const;
139
141
143 bool SCD(const blitstar::keyEdgePair &edge);
144 bool CCD(const blitstar::keyEdgePair &edge);
145
148 void clearForwardVertexQueue();
149
151 void resetReverseValue(const std::shared_ptr<blitstar::Vertex> &vertex);
152 void resetForwardValue(const std::shared_ptr<blitstar::Vertex> &vertex);
153
155 bool terminateSearch();
156
159 void insertStartVerticesInForWardVertexQueue();
160
162 bool SelectExpandState(bool &forward);
163
165 void resetForwardParentInformation(const std::shared_ptr<blitstar::Vertex> &vertex);
166 void resetReverseParentInformation(const std::shared_ptr<blitstar::Vertex> &vertex);
167 void resetForwardParentAndRemeberTheVertex(const std::shared_ptr<blitstar::Vertex> &child,
168 const std::shared_ptr<blitstar::Vertex> &parent);
169 void resetReverseParentAndRemeberTheVertex(const std::shared_ptr<blitstar::Vertex> &child,
170 const std::shared_ptr<blitstar::Vertex> &parent);
171
173 void lookingForBestNeighbor(ompl::base::Cost curMin_, size_t neighbor);
174 void bestNeighbor(ompl::base::Cost costToCome, ompl::base::Cost costToGoal, size_t neighbor);
175
177 void ForwardLazySearch(const std::shared_ptr<blitstar::Vertex> &vertex);
178 void ReverseLazySearch(const std::shared_ptr<blitstar::Vertex> &vertex);
179
181 bool PathValidity(std::shared_ptr<blitstar::Vertex> &vertex);
182 void ForwardPathValidityChecking(std::shared_ptr<blitstar::Vertex> &vertex, bool &validity);
183 void ReversePathValidityChecking(std::shared_ptr<blitstar::Vertex> &vertex, bool &validity);
184
186 bool isValidAtResolution(const blitstar::keyEdgePair &edge, std::size_t numChecks, bool sparseCheck);
187
189 void EvaluateValidityStartAndToGoal(const std::shared_ptr<blitstar::Vertex> &start,
190 const std::shared_ptr<blitstar::Vertex> &goal);
191
193 void insertOrUpdateInForwardVertexQueue(const std::shared_ptr<blitstar::Vertex> &vertex,
194 ompl::base::Cost CostToCome, ompl::base::Cost CostToGoal,
195 bool couldMeet);
196 void insertOrUpdateInReverseVertexQueue(const std::shared_ptr<blitstar::Vertex> &vertex,
197 ompl::base::Cost CostToCome, ompl::base::Cost CostToGoal,
198 bool couldMeet);
199
201 void updateReverseCost(const std::shared_ptr<blitstar::Vertex> &vertex, ompl::base::Cost costToCome,
202 ompl::base::Cost &costToGo);
203 void updateForwardCost(const std::shared_ptr<blitstar::Vertex> &vertex, ompl::base::Cost costToCome,
204 ompl::base::Cost &costToGo);
205 void updateCostToGo(ompl::base::Cost &costToCome, ompl::base::Cost &costToGo,
206 ompl::base::Cost costFromOriginal, bool meetOnTree);
207
209 void updateBestSolutionFoundSoFar(const std::shared_ptr<blitstar::Vertex> &vertex,
210 ompl::base::Cost meetCost, ompl::base::Cost costToCome,
211 ompl::base::Cost &costToGo, ompl::base::Cost costFromOri);
212
213 private:
215 void iterate(const ompl::base::PlannerTerminationCondition &terminationCondition);
216 ompl::base::SpaceInformationPtr spaceInformation_;
217
218 ompl::base::State *detectionState_;
219
221 void informAboutNewSolution() const;
223 void informAboutPlannerStatus(ompl::base::PlannerStatus::StatusType status) const;
224
226 void insertGoalVerticesInReverseQueue();
227
229 std::shared_ptr<ompl::geometric::PathGeometric>
230 getPathToVertex(const std::shared_ptr<blitstar::Vertex> &vertex) const;
231
233 std::array<ompl::base::Cost, 3u> computeEstimatedPathCosts(ompl::base::Cost CostToStart,
234 ompl::base::Cost CostToGoal,
235 ompl::base::Cost motionCost) const;
236
237 std::array<ompl::base::Cost, 3u> computeSortKey(const std::shared_ptr<blitstar::Vertex> &parent,
238 const std::shared_ptr<blitstar::Vertex> &child) const;
239
241 std::array<ompl::base::Cost, 2u> computeSortKey(const std::shared_ptr<blitstar::Vertex> &vertex) const;
242
243 std::array<ompl::base::Cost, 2u> computeEstimatedPathCosts(ompl::base::Cost CostToStart,
244 ompl::base::Cost CostToGoal) const;
245
247 void updateExactSolution();
248
251
253 ompl::base::PlannerStatus::StatusType updateSolution(const std::shared_ptr<blitstar::Vertex> &vertex);
254
256 ompl::base::Cost lowerboundToStart(const std::shared_ptr<blitstar::Vertex> &vertex) const;
258 ompl::base::Cost lowerboundToGoal(const std::shared_ptr<blitstar::Vertex> &vertex) const;
259
261 std::size_t countNumVerticesInForwardTree() const;
262
264 std::size_t countNumVerticesInReverseTree() const;
265
267 ompl::base::Cost solutionCost_;
268
270 ompl::base::Cost PriorityC;
271
273 ompl::base::Cost C_curr;
274
276 ompl::base::Cost approximateSolutionCost_{};
277
279 ompl::base::Cost approximateSolutionCostToGoal_{};
280
282 ompl::base::Cost fmin_{0u};
283
285 ompl::base::Cost ForwardCost{0u};
286 ompl::base::Cost ReverseCost{0u};
287
288 ompl::base::Cost minimalneighbor_{0u};
291
293 blitstar::VertexQueue forwardVertexQueue_;
294 blitstar::VertexQueue reverseVertexQueue_;
295
297 std::shared_ptr<blitstar::Vertex> BestVertex_;
298
300 std::shared_ptr<ompl::geometric::PathGeometric> path_;
301
303 blitstar::MiddleVertex V_meet;
304
306 bool isVertexBetter(const blitstar::KeyVertexPair &lhs, const blitstar::KeyVertexPair &rhs) const;
307
309 std::size_t numIterations_{0u};
310 std::size_t bestNeighbor_{0u};
311 std::size_t numSparseCollisionChecksCurrentLevel_{0u};
312
314 std::size_t forwardId_{0u};
315 std::size_t reverseId_{0u};
316
317 std::size_t meetId_{0u};
319 std::size_t batchSize_{100u};
320
322 bool trackApproximateSolutions_{true};
323
325 bool isPruningEnabled_{false};
326 bool increProcess_{false};
327
328 bool meeting_{false};
329 bool start_scratch_{false};
330
331 bool betterThan(const ompl::base::Cost &cost1, const ompl::base::Cost &cost2);
332 bool largerThan(const ompl::base::Cost &cost1, const ompl::base::Cost &cost2);
333
335 bool NeedMoreSamples();
336 bool iSolution_{false};
337 bool need_Prune_{false};
338 bool isVertexEmpty_{true};
339 bool found_meeting_{false};
340 bool find_solution_{false};
341 bool forwardInvalid_{false};
342 bool reverseInvalid_{false};
343 bool goalCloseToStart_{false};
344 bool searchExhausted_{false};
345
346 double time_taken{0u};
348 ompl::base::OptimizationObjectivePtr objective_;
349
351 ompl::base::MotionValidatorPtr motionValidator_;
352
354 std::size_t numProcessedEdges_{0u};
355 std::size_t numbatch_{0u};
356 std::shared_ptr<ompl::base::StateSpace> space_;
358 std::size_t numEdgeCollisionChecks_{0u};
359
361 mutable unsigned int numCollisionCheckedEdges_{0u};
362 };
363 } // namespace geometric
364} // namespace ompl
365
366#endif // OMPL_GEOMETRIC_PLANNERS_INFORMEDTREES_bmitstar
Definition of a cost value. Can represent the cost of a motion or the cost of a state.
Definition Cost.h:48
Object containing planner generated vertex and edge data. It is assumed that all vertices are unique,...
Encapsulate a termination condition for a motion planner. Planners will call operator() to decide whe...
Base class for a planner.
Definition Planner.h:216
Definition of an abstract state.
Definition State.h:50
bool getUseKNearest() const
Get whether to use a k-nearest RGG connection model. If false, BLIT* uses an r-disc model.
Definition BLITstar.cpp:343
ompl::base::PlannerStatus solve(const ompl::base::PlannerTerminationCondition &terminationCondition) override
Solves a motion planning problem.
Definition BLITstar.cpp:227
void enablePruning(bool prune)
Set whether pruning is enabled or not.
Definition BLITstar.cpp:328
void setup() override
Additional setup that can only be done once a problem definition is set.
Definition BLITstar.cpp:108
void EvaluateValidityStartAndToGoal(const std::shared_ptr< blitstar::Vertex > &start, const std::shared_ptr< blitstar::Vertex > &goal)
Checking the collision detection between start and goal vertices.
void resetReverseValue(const std::shared_ptr< blitstar::Vertex > &vertex)
Reset a vertex's value.
Definition BLITstar.cpp:681
bool PathValidity(std::shared_ptr< blitstar::Vertex > &vertex)
Checking the validity of a path from each direction.
Definition BLITstar.cpp:574
bool isPruningEnabled() const
Get whether pruning is enabled or not.
Definition BLITstar.cpp:333
void ForwardLazySearch(const std::shared_ptr< blitstar::Vertex > &vertex)
Forward and Reverse Search.
Definition BLITstar.cpp:794
void updateReverseCost(const std::shared_ptr< blitstar::Vertex > &vertex, ompl::base::Cost costToCome, ompl::base::Cost &costToGo)
Refine heuristics on-the-fly.
void setUseKNearest(bool useKNearest)
Set whether to use a k-nearest RGG connection model. If false, BLIT* uses an r-disc model.
Definition BLITstar.cpp:338
void clear() override
Clears the algorithm's internal state.
Definition BLITstar.cpp:218
void resetForwardParentInformation(const std::shared_ptr< blitstar::Vertex > &vertex)
Reset parent vertex's information.
Definition BLITstar.cpp:652
bool SelectExpandState(bool &forward)
Select the vertex with minimal priority on both trees.
unsigned int getMaxNumberOfGoals() const
Get the maximum number of goals BLIT* will sample from sampleable goal regions.
Definition BLITstar.cpp:353
void insertGoalVerticesInReverseVertexQueue()
Insert start and goal vertices into the queues.
Definition BLITstar.cpp:512
bool isValidAtResolution(const blitstar::keyEdgePair &edge, std::size_t numChecks, bool sparseCheck)
Checking the collision detection.
ompl::base::PlannerStatus::StatusType ensureStartAndGoalStates(const ompl::base::PlannerTerminationCondition &terminationCondition)
Checks whether the problem is successfully setup.
Definition BLITstar.cpp:186
void lookingForBestNeighbor(ompl::base::Cost curMin_, size_t neighbor)
Look for a neighbor with the minimal priority.
Definition BLITstar.cpp:532
std::size_t getBatchSize() const
Get the batch size.
Definition BLITstar.cpp:313
void setBatchSize(std::size_t batchSize)
Set the batch size.
Definition BLITstar.cpp:308
BLITstar(const ompl::base::SpaceInformationPtr &spaceInformation)
Constructs a BLIT*.
Definition BLITstar.cpp:64
bool SCD(const blitstar::keyEdgePair &edge)
Above references inherit from BLIT*.
void clearReverseVertexQueue()
Empty the queues.
Definition BLITstar.cpp:358
double getRewireFactor() const
Get the rewire factor of the RGG graph.
Definition BLITstar.cpp:323
void getPlannerData(base::PlannerData &data) const override
Get the planner data.
Definition BLITstar.cpp:264
void setMaxNumberOfGoals(unsigned int numberOfGoals)
Set the maximum number of goals BLIT* will sample from sampleable goal regions.
Definition BLITstar.cpp:348
void setRewireFactor(double rewireFactor)
Set the rewire factor of the RGG graph.
Definition BLITstar.cpp:318
ompl::base::PlannerStatus::StatusType ensureSetup()
Checks whether the planner is successfully setup.
Definition BLITstar.cpp:162
void insertOrUpdateInForwardVertexQueue(const std::shared_ptr< blitstar::Vertex > &vertex, ompl::base::Cost CostToCome, ompl::base::Cost CostToGoal, bool couldMeet)
Inserts or updates a vertex in the reverse queue.
bool terminateSearch()
Ensuring meet-in-the-middle and optimality to terminate the current search.
Definition BLITstar.cpp:697
~BLITstar()
Destructs a BLIT*.
Definition BLITstar.cpp:103
void updateBestSolutionFoundSoFar(const std::shared_ptr< blitstar::Vertex > &vertex, ompl::base::Cost meetCost, ompl::base::Cost costToCome, ompl::base::Cost &costToGo, ompl::base::Cost costFromOri)
Improve the current solution.
This namespace contains code that is specific to planning under geometric constraints.
Main namespace. Contains everything in this library.
A class to store the exit status of Planner::solve().
StatusType
The possible values of the status returned by a planner.