&& p->h() < this->slotHeading()
) || (
this->slotSide() == RIGHT
- && p->h() > this->slotHeading()
+ && (
+ p->h() > this->slotHeading()
+ || p->h() < 0
+ )
))
) {
+ if (tmpc.size() == 0) {
+ i = 0;
+ p = this->getFP();
+ }
bool end = false;
std::vector<RRTEdge *> eds = p->frame();
for (auto o: co)
&& p->h() < this->slotHeading()
))
) {
+ if (tmpc.size() == 0) {
+ i = 0;
+ p = this->getFPf();
+ }
bool end = false;
std::vector<RRTEdge *> eds = p->frame();
for (auto o: co)
BicycleCar *ParallelSlot::getISPP(BicycleCar *B)
{
+ // rigt side (for right parking slot)
float x = this->slot().bnodes().back()->x();
float y = this->slot().bnodes().back()->y();
- float y0;
- if (this->slotSide() == LEFT) // TODO only for backward parking now
- y0 = B->ccl()->y();
- else
- y0 = B->ccr()->y();
+ float x1;
+ float y1;
+ if (this->slotSide() == LEFT) {
+ x1 = B->ccl()->x();
+ y1 = B->ccl()->y();
+ } else {
+ x1 = B->ccr()->x();
+ y1 = B->ccr()->y();
+ }
float IR = BCAR_IN_RADI;
float a = 1;
- float b = -2 * x;
- float c = pow(x, 2) + pow(y - y0, 2) - pow(IR, 2);
+ float b = (x1 - x) * 2 * cos(B->h()) + (y1 - y) * 2 * sin(B->h());
+ float c = pow(x - x1, 2) + pow(y - y1, 2) - pow(IR, 2);
float D = pow(b, 2) - 4 * a * c;
- float x0;
- if (this->slotSide() == LEFT)
- x0 = -b - sqrt(D);
- else
- x0 = -b + sqrt(D);
- x0 /= 2 * a;
- return new BicycleCar(x0, B->y(), B->h());
+ float delta;
+ delta = -b - sqrt(D);
+ delta /= 2 * a;
+ float delta_1 = delta;
+ // left front (for right parking slot)
+ x = this->slot().bnodes().front()->x();
+ y = this->slot().bnodes().front()->y();
+ IR = BCAR_OUT_RADI;
+ a = 1;
+ b = (x1 - x) * 2 * cos(B->h()) + (y1 - y) * 2 * sin(B->h());
+ c = pow(x - x1, 2) + pow(y - y1, 2) - pow(IR, 2);
+ D = pow(b, 2) - 4 * a * c;
+ //delta = -b + sqrt(D);
+ //delta /= 2 * a;
+ float delta_2 = delta;
+ delta = -b - sqrt(D);
+ delta /= 2 * a;
+ float delta_3 = delta;
+ delta = std::max(delta_1, std::max(delta_2, delta_3));
+ return new BicycleCar(
+ B->x() + delta * cos(B->h()),
+ B->y() + delta * sin(B->h()),
+ B->h()
+ );
}
BicycleCar *ParallelSlot::getFPf()
float c = pow(x - x1, 2) + pow(y - y1, 2) - pow(IR, 2);
float D = pow(b, 2) - 4 * a * c;
float delta;
- delta = -b - sqrt(D); // Use just `(-b - D) / (2a)` formula.
+ delta = -b - sqrt(D); // TODO why this works?
delta /= 2 * a;
float delta_1 = delta;
// left front (for right parking slot)
{
struct SamplingInfo si;
RRTNode *n = this->getMidd();
+ if (n == nullptr)
+ return si;
+ BicycleCar *bc = new BicycleCar(n->x(), n->y(), n->h());
+ RRTNode *cc;
+ if (this->slotSide() == LEFT)
+ cc = bc->ccl();
+ else
+ cc = bc->ccr();
if (this->slotType() == PARALLEL) {
- if (n != nullptr) {
- si.x0 = n->x() + 1.5 * BCAR_LENGTH * cos(n->h());
- si.y0 = n->y() + 1.5 * BCAR_LENGTH * sin(n->h());
- si.h0 = n->h();
- } else {
- si.x0 = this->slot().bnodes().front()->x();
- si.y0 = this->slot().bnodes().front()->y();
- si.h0 = this->slotHeading();
- }
+ BicycleCar *nbc = bc->move(cc, this->slotHeading() - n->h());
+ si.x0 = nbc->x();
+ si.y0 = nbc->y();
+ si.h0 = nbc->h();
si.x = BCAR_WIDTH;
si.y = BCAR_WIDTH;
si.h = M_PI / 8;
} else {
- // TODO
+ BicycleCar *nbc;
+ if (this->slotSide() == LEFT)
+ nbc = bc->move(cc, M_PI/4);
+ else
+ nbc = bc->move(cc, -M_PI/4);
+ si.x0 = nbc->x();
+ si.y0 = nbc->y();
+ si.h0 = nbc->h();
+ si.x = BCAR_WIDTH;
+ si.y = BCAR_WIDTH;
+ si.h = M_PI / 8;
}
return si;
}