double orig_path_cost_ = 9999;
std::vector<RRTNode *> first_optimized_path_;
double first_optimized_path_cost_ = 9999;
- std::vector<RRTNode *> first_path_optimization();
- std::vector<RRTNode *> second_path_optimization();
- std::vector<RRTNode *> path();
+ void first_path_optimization();
+ void second_path_optimization();
+ void compute_path();
Json::Value json();
void json(Json::Value jvi);
double orig_path_cost_ = 9999;
std::vector<RRTNode *> first_optimized_path_;
double first_optimized_path_cost_ = 9999;
- std::vector<RRTNode *> first_path_optimization();
- std::vector<RRTNode *> second_path_optimization();
- std::vector<RRTNode *> path();
+ void first_path_optimization();
+ void second_path_optimization();
+ void compute_path();
Json::Value json();
void json(Json::Value jvi);
std::vector<Obstacle> obstacles_;
std::vector<RRTNode> samples_;
std::vector<RRTNode> steered_;
+ std::vector<RRTNode *> path_;
double log_path_time_ = 0.1;
unsigned int log_path_iter_ = 20;
virtual void deinit();
/*! \brief Return path found by RRT*.
*/
- virtual std::vector<RRTNode *> path();
+ virtual std::vector<RRTNode *>& path()
+ {
+ return this->path_;
+ }
+ virtual void compute_path();
/*! \brief Return ``true`` if algorithm should stop.
Update counters (iteration, seconds, ...) and return if
#include <queue>
#include "rrtext.h"
#include <iostream>
-std::vector<RRTNode *> RRTExt13::first_path_optimization()
+void RRTExt13::first_path_optimization()
{
if (this->orig_path().size() == 0) {
this->orig_path_ = RRTS::path();
if (this->orig_path().size() == 0)
- return this->orig_path();
+ return;
else
this->orig_path_cost(this->orig_path().back()->cc);
}
ln = &n;
}
if (ln == nullptr || ln->p() == nullptr)
- return this->orig_path();
+ return;
while (ln->p() != nullptr) {
RRTNode *t = ln->n;
RRTNode *f = ln->p()->n;
this->steer(*f, *t);
if (std::get<0>(this->collide_steered_from(*f)))
- return this->orig_path();
+ return;
this->join_steered(f);
t->p(&this->nodes().back());
t->c(this->cost_build(this->nodes().back(), *t));
ln = ln->p();
}
- return RRTS::path();
+ RRTS::compute_path();
}
-std::vector<RRTNode *> RRTExt13::second_path_optimization()
+void RRTExt13::second_path_optimization()
{
if (this->first_optimized_path().size() == 0) {
- return this->orig_path();
+ return;
}
class DijkstraNode : public RRTNode {
public:
}
}
if (fn == nullptr || fn->p() == nullptr)
- return this->first_optimized_path();
+ return;
DijkstraNode *ln = &dn.back();
while (ln->p() != fn) {
RRTNode *t = ln->n;
RRTNode *f = ln->p()->n;
this->steer(*f, *t);
if (std::get<0>(this->collide_steered_from(*f)))
- return this->first_optimized_path();
+ return;
this->join_steered(f);
t->p(&this->nodes().back());
t->c(this->cost_build(this->nodes().back(), *t));
ln = ln->p();
}
- return RRTS::path();
+ RRTS::compute_path();
}
-std::vector<RRTNode *> RRTExt13::opt_path()
+void RRTExt13::compute_path()
{
+ RRTS::compute_path();
auto tstart = std::chrono::high_resolution_clock::now();
- this->first_optimized_path_ = this->first_path_optimization();
- if (this->first_optimized_path_.size() > 0)
+ this->first_path_optimization();
+ this->first_optimized_path_ = RRTS::path();
+ if (this->first_optimized_path_.size() > 0) {
this->first_optimized_path_cost(
this->first_optimized_path_.back()->cc
);
- else
- return this->orig_path();
- auto opt2 = this->second_path_optimization();
+ } else {
+ return;
+ }
+ this->second_path_optimization();
auto tend = std::chrono::high_resolution_clock::now();
auto tdiff = std::chrono::duration_cast<std::chrono::duration<double>>(
tend - tstart);
this->log_opt_time_.push_back(tdiff.count());
- return opt2;
}
Json::Value RRTExt13::json()
#include <queue>
#include "rrtext.h"
-std::vector<RRTNode *> RRTExt3::first_path_optimization()
+void RRTExt3::first_path_optimization()
{
if (this->orig_path().size() == 0) {
this->orig_path_ = RRTS::path();
if (this->orig_path().size() == 0)
- return this->orig_path();
+ return;
else
this->orig_path_cost(this->orig_path().back()->cc);
}
ln = &n;
}
if (ln == nullptr || ln->p() == nullptr)
- return this->orig_path();
+ return;
while (ln->p() != nullptr) {
RRTNode *t = ln->n;
RRTNode *f = ln->p()->n;
this->steer(*f, *t);
if (std::get<0>(this->collide_steered_from(*f)))
- return this->orig_path();
+ return;
this->join_steered(f);
t->p(&this->nodes().back());
t->c(this->cost_build(this->nodes().back(), *t));
ln = ln->p();
}
- return RRTS::path();
+ RRTS::compute_path();
}
-std::vector<RRTNode *> RRTExt3::second_path_optimization()
+void RRTExt3::second_path_optimization()
{
if (this->first_optimized_path().size() == 0) {
- return this->orig_path();
+ return;
}
class DijkstraNode : public RRTNode {
public:
}
}
if (fn == nullptr || fn->p() == nullptr)
- return this->first_optimized_path();
+ return;
DijkstraNode *ln = &dn.back();
while (ln->p() != fn) {
RRTNode *t = ln->n;
RRTNode *f = ln->p()->n;
this->steer(*f, *t);
if (std::get<0>(this->collide_steered_from(*f)))
- return this->first_optimized_path();
+ return;
this->join_steered(f);
t->p(&this->nodes().back());
t->c(this->cost_build(this->nodes().back(), *t));
ln = ln->p();
}
- return RRTS::path();
+ RRTS::compute_path();
}
-std::vector<RRTNode *> RRTExt3::path()
+void RRTExt3::compute_path()
{
+ RRTS::compute_path();
auto tstart = std::chrono::high_resolution_clock::now();
- this->first_optimized_path_ = this->first_path_optimization();
- if (this->first_optimized_path_.size() > 0)
+ this->first_path_optimization();
+ this->first_optimized_path_ = RRTS::path();
+ if (this->first_optimized_path_.size() > 0) {
this->first_optimized_path_cost(
this->first_optimized_path_.back()->cc
);
- else
- return this->orig_path();
- auto opt2 = this->second_path_optimization();
+ } else {
+ return;
+ }
+ this->second_path_optimization();
auto tend = std::chrono::high_resolution_clock::now();
auto tdiff = std::chrono::duration_cast<std::chrono::duration<double>>(
tend - tstart);
this->log_opt_time_.push_back(tdiff.count());
- return opt2;
}
Json::Value RRTExt3::json()
this->gf_ = false;
}
-std::vector<RRTNode *> RRTS::path()
+void RRTS::compute_path()
{
- std::vector<RRTNode *> path;
if (this->goals().size() == 0)
- return path;
- RRTNode *goal = &this->goals().back();
+ return;
+ RRTNode *goal = &this->goals().front();
if (goal->p() == nullptr)
- return path;
+ return;
+ this->path_.clear();
while (goal != nullptr) {
- path.push_back(goal);
+ this->path_.push_back(goal);
goal = goal->p();
}
- std::reverse(path.begin(), path.end());
- return path;
+ std::reverse(this->path_.begin(), this->path_.end());
}
bool RRTS::next()
this->steered2_.push_back(jap);
jap = jap->p();
}
- this->gf(this->goal_found(this->nodes().back()));
+ auto gf = this->goal_found(this->nodes().back());
+ this->gf(gf);
just_added = just_added->p();
}
+ if (
+ this->gf()
+ && (
+ this->path().size() == 0
+ || this->goals().front().cc < this->path().back()->cc
+ )
+ ) {
+ this->compute_path();
+ }
this->log_path_cost();
return next;
}