double ogoal_cc_ = 0.0;
double otime_ = 0.0;
std::vector<DijkstraNode> dn_;
- void pick_interesting();
+ void interesting_forward();
+ void interesting_backward();
void dijkstra_forward();
void dijkstra_backward();
void compute_path();
+#include <algorithm>
#include <queue>
#include "rrtext.hh"
}
void
-RRTExt13::pick_interesting()
+RRTExt13::interesting_forward()
{
this->dn_.clear();
this->dn_.reserve(this->path_.size());
#endif
}
+void
+RRTExt13::interesting_backward()
+{
+ this->dn_.clear();
+ this->dn_.reserve(this->path_.size());
+#if 0 // all path poses are interesting
+ for (auto n: this->opath_) {
+ this->dn_.push_back(DijkstraNode(n));
+ this->dn_.back().i = this->dn_.size() - 1;
+ }
+ std::reverse(this->dn_.begin(), this->dn_.end());
+ return;
+#endif
+#if 1 // cusp and 1st non-drivable path poses are interesting
+ this->dn_.push_back(DijkstraNode(this->opath_.back()));
+ this->dn_.back().i = this->dn_.size() - 1;
+ for (unsigned int i = this->opath_.size() - 1; i > 1; i--) {
+ RRTNode& ni = *this->opath_[i];
+ this->bc_.set_pose(ni);
+ for (unsigned int j = i - 1; j > 0; j--) {
+ RRTNode& nj = *this->opath_[j];
+ RRTNode& njl = *this->opath_[j + 1];
+ if (!this->bc_.drivable(nj)) {
+ this->dn_.push_back(DijkstraNode(&njl));
+ this->dn_.back().i = this->dn_.size() - 1;
+ i = j;
+ break;
+ }
+ if (njl.sp() == 0.0 || sgn(njl.sp()) != sgn(nj.sp())) {
+ this->dn_.push_back(DijkstraNode(&njl));
+ this->dn_.back().i = this->dn_.size() - 1;
+ }
+ }
+ }
+ this->dn_.push_back(DijkstraNode(this->opath_.front()));
+ this->dn_.back().i = this->dn_.size() - 1;
+#endif
+}
+
void
RRTExt13::dijkstra_forward()
{