bool PSPlanner::forward()
{
- double heading = this->ps().heading();
+ if (this->ps().parallel())
+ return false;
+ double heading = atan2(
+ this->ps().y2() - this->ps().y1(),
+ this->ps().x2() - this->ps().x1()
+ );
while (heading < 0) heading += 2 * M_PI;
- if (!this->ps().parallel())
- heading -= M_PI / 2;
double h = this->gc().h();
while (h < 0) h += 2 * M_PI;
- if (-0.00001 < heading - h && heading - h < 0.00001)
+ if (std::abs(heading - h) < M_PI / 4)
return true;
- else
- return false;
+ return false;
}
void PSPlanner::guess_gc()
double dts = + M_PI / 2; // direction to slot
if (this->ps().right())
dts = - M_PI / 2;
+ dts *= 0.99; // precision workaround
if (this->ps().parallel()) {
x += (this->gc().w() / 2 + 0.01) * cos(h + dts);
x += (this->gc().dr() + 0.01) * cos(h);
y += (this->gc().w() / 2 + 0.01) * sin(h + dts);
y += (this->gc().dr() + 0.01) * sin(h);
} else {
- x += (this->ps().x4() - this->ps().x1()) / 2;
- x += (this->gc().df() + 0.01) * cos(h + dts);
- y += (this->ps().y4() - this->ps().y1()) / 2;
- y += (this->gc().df() + 0.01) * sin(h + dts);
- if (this->ps().right())
- h += M_PI / 2;
- else
- h -= M_PI / 2;
+ dts = atan2(
+ this->ps().y2() - this->ps().y1(),
+ this->ps().x2() - this->ps().x1()
+ );
+ dts *= 1.01; // precision workaround
+ if (std::abs(dts - this->ps().heading()) < M_PI / 2) {
+ x = this->ps().x4();
+ y = this->ps().y4();
+ h = dts;
+ x += (this->gc().dr() + 0.01) * cos(h);
+ y += (this->gc().dr() + 0.01) * sin(h);
+ if (this->ps().right())
+ dts -= M_PI / 2;
+ else
+ dts += M_PI / 2;
+ x += (this->gc().w() / 2 + 0.01) * cos(dts);
+ y += (this->gc().w() / 2 + 0.01) * sin(dts);
+ } else {
+ h = dts + M_PI;
+ x += -(this->gc().df() + 0.01) * cos(h);
+ y += -(this->gc().df() + 0.01) * sin(h);
+ if (this->ps().right())
+ dts += M_PI / 2;
+ else
+ dts -= M_PI / 2;
+ x += (this->gc().w() / 2 + 0.01) * cos(dts);
+ y += (this->gc().w() / 2 + 0.01) * sin(dts);
+ }
}
while (h > M_PI)
h -= 2 * M_PI;
)
{
std::vector<BicycleCar> pi;
- if (!this->ps().parallel()) {
- this->cc().sp(this->cc().sp() * -dist);
- this->cc().st(this->cc().st() * -1);
- } else {
- this->cc().sp(this->cc().sp() * dist);
- this->cc().st(this->cc().st() * 1);
- }
+ this->cc().sp(this->cc().sp() * dist);
+ this->cc().st(this->cc().st() * 1);
BicycleCar orig_cc(this->cc());
for (unsigned int i = 0; i < cnt; i++) {
this->cc().next();
//
// Another approach could be testing angles from the
// beginning of the escape parkig slot maneuver.
- return fer_perpendicular();
+ if (this->forward())
+ this->cc().sp(-0.01);
+ else
+ this->cc().sp(0.01);
+ while (!this->left())
+ this->cc().next();
+ return;
}
void PSPlanner::fer()
this->cc().h(cc_h);
// get current car `cc` out of slot
if (this->forward())
- this->cc().sp(-0.1);
+ this->cc().sp(-0.01);
else
- this->cc().sp(0.1);
+ this->cc().sp(0.01);
this->cc().st(this->cc().wb() / this->cc().mtr());
if (this->ps().right())
this->cc().st(this->cc().st() * -1);