7 RRTExt13::DijkstraNode::DijkstraNode(RRTNode* n) : node(n)
12 RRTExt13::DijkstraNode::vi()
22 RRTExt13::DijkstraNodeComparator::operator() (DijkstraNode const& n1,
23 DijkstraNode const& n2)
25 return n1.node->cc() > n2.node->cc();
29 RRTExt13::interesting_forward()
32 this->dn_.reserve(this->path_.size());
33 #if 0 // all path poses are interesting
34 for (auto n: this->opath_) {
35 this->dn_.push_back(DijkstraNode(n));
36 this->dn_.back().i = this->dn_.size() - 1;
40 #if 1 // cusp and 1st non-drivable path poses are interesting
41 this->dn_.push_back(DijkstraNode(this->opath_.front()));
42 this->dn_.back().i = this->dn_.size() - 1;
43 for (unsigned int i = 0; i < this->opath_.size() - 1; i++) {
44 RRTNode& ni = *this->opath_[i];
45 this->bc_.set_pose(ni);
46 for (unsigned int j = i + 1; j < this->opath_.size(); j++) {
47 RRTNode& nj = *this->opath_[j];
48 RRTNode& njl = *this->opath_[j - 1];
49 if (!this->bc_.drivable(nj)) {
50 this->dn_.push_back(DijkstraNode(&njl));
51 this->dn_.back().i = this->dn_.size() - 1;
55 if (njl.sp() == 0.0 || sgn(njl.sp()) != sgn(nj.sp())) {
56 this->dn_.push_back(DijkstraNode(&njl));
57 this->dn_.back().i = this->dn_.size() - 1;
61 this->dn_.push_back(DijkstraNode(this->opath_.back()));
62 this->dn_.back().i = this->dn_.size() - 1;
67 RRTExt13::interesting_backward()
70 this->dn_.reserve(this->path_.size());
71 #if 0 // all path poses are interesting
72 for (auto n: this->opath_) {
73 this->dn_.push_back(DijkstraNode(n));
74 this->dn_.back().i = this->dn_.size() - 1;
76 std::reverse(this->dn_.begin(), this->dn_.end());
79 #if 1 // cusp and 1st non-drivable path poses are interesting
80 this->dn_.push_back(DijkstraNode(this->opath_.back()));
81 this->dn_.back().i = this->dn_.size() - 1;
82 for (unsigned int i = this->opath_.size() - 1; i > 1; i--) {
83 RRTNode& ni = *this->opath_[i];
84 this->bc_.set_pose(ni);
85 for (unsigned int j = i - 1; j > 0; j--) {
86 RRTNode& nj = *this->opath_[j];
87 RRTNode& njl = *this->opath_[j + 1];
88 if (!this->bc_.drivable(nj)) {
89 this->dn_.push_back(DijkstraNode(&njl));
90 this->dn_.back().i = this->dn_.size() - 1;
94 if (njl.sp() == 0.0 || sgn(njl.sp()) != sgn(nj.sp())) {
95 this->dn_.push_back(DijkstraNode(&njl));
96 this->dn_.back().i = this->dn_.size() - 1;
100 this->dn_.push_back(DijkstraNode(this->opath_.front()));
101 this->dn_.back().i = this->dn_.size() - 1;
106 RRTExt13::dijkstra_forward()
108 std::priority_queue<DijkstraNode, std::vector<DijkstraNode>,
109 DijkstraNodeComparator> pq;
110 this->dn_.front().vi();
111 pq.push(this->dn_.front());
112 while (!pq.empty()) {
113 DijkstraNode fd = pq.top();
114 RRTNode& f = *fd.node;
116 for (unsigned int i = fd.i + 1; i < this->dn_.size(); i++) {
117 RRTNode& t = *this->dn_[i].node;
118 double cost = f.cc() + this->cost_build(f, t);
120 if (this->steered_.size() == 0) {
123 unsigned int ss = this->steered_.size();
124 if (this->collide_steered()
125 || ss != this->steered_.size()) {
128 this->bc_.set_pose(this->steered_.back());
129 bool td = this->bc_.drivable(t);
130 bool tn = this->bc_.edist(t) < 2.0 * this->eta_;
131 if (cost < t.cc() && td && tn) {
132 this->join_steered(&f);
133 t.p(this->nodes_.back());
134 t.c(this->cost_build(this->nodes_.back(), t));
135 if (!this->dn_[i].vi()) {
136 pq.push(this->dn_[i]);
144 RRTExt13::dijkstra_backward()
146 std::priority_queue<DijkstraNode, std::vector<DijkstraNode>,
147 DijkstraNodeComparator> pq;
148 this->dn_.back().vi();
149 pq.push(this->dn_.back());
150 while (!pq.empty()) {
151 DijkstraNode td = pq.top();
152 RRTNode& t = *td.node;
154 for (unsigned int i = td.i - 1; i > 0; i--) {
155 RRTNode& f = *this->dn_[i].node;
156 double cost = f.cc() + this->cost_build(f, t);
158 if (this->steered_.size() == 0) {
161 if (this->collide_steered()) {
164 this->bc_.set_pose(this->steered_.back());
165 bool td = this->bc_.drivable(t);
166 bool tn = this->bc_.edist(t) < this->eta_;
167 if (cost < t.cc() && td && tn) {
168 this->join_steered(&f);
169 t.p(this->nodes_.back());
170 t.c(this->cost_build(this->nodes_.back(), t));
171 if (!this->dn_[i].vi()) {
172 pq.push(this->dn_[i]);
180 RRTExt13::compute_path()
182 RRTS::compute_path();
183 if (this->goal_.cc() == 0.0 || this->path_.size() == 0) {
186 #if 0 // TODO 0.59 should work for sc4-1-0 only.
187 if (this->goal_.cc() * 0.59 > this->last_goal_cc_
188 && this->last_goal_cc_ != 0.0) {
192 bool measure_time = false;
193 if (this->opath_.size() == 0) {
194 this->opath_ = this->path_;
195 this->ogoal_cc_ = this->goal_.cc();
199 this->otime_ = -this->ter_.scnt();
201 double curr_cc = this->goal_.cc();
202 double last_cc = curr_cc + 1.0;
203 while (curr_cc < last_cc) {
205 RRTS::compute_path();
206 this->interesting_forward();
207 this->dijkstra_forward();
208 RRTS::compute_path();
209 this->interesting_backward();
210 this->dijkstra_backward();
211 RRTS::compute_path();
212 curr_cc = this->goal_.cc();
215 this->otime_ += this->ter_.scnt();
221 this->opath_.reserve(10000);
222 this->dn_.reserve(10000);
226 RRTExt13::json() const
228 auto jvo = RRTS::json();
230 for (auto n: this->opath_) {
231 jvo["opath"][i][0] = n->x();
232 jvo["opath"][i][1] = n->y();
233 jvo["opath"][i][2] = n->h();
236 jvo["ogoal_cc"] = this->ogoal_cc_;
237 jvo["otime"] = this->otime_;
242 RRTExt13::json(Json::Value jvi)
251 this->opath_.clear();