float x = this->slot().bnodes().front()->x();
float y = this->slot().bnodes().front()->y();
float h = this->slotHeading();
+ float ph = this->poseHeading();
+ ph += M_PI;
+ while (ph > M_PI)
+ ph -= 2 * M_PI;
+ while (ph <= -M_PI)
+ ph += 2 * M_PI;
float nx;
float ny;
if (this->slotSide() == LEFT) {
- h += M_PI / 2;
- nx = x + (BCAR_LENGTH - BCAR_WHEEL_BASE) / 2
- * cos(h);
- ny = y + (BCAR_LENGTH - BCAR_WHEEL_BASE) / 2
- * sin(h);
- x = nx + (BCAR_DIAG_RRADI) * cos(h - M_PI / 2);
- y = ny + (BCAR_DIAG_RRADI) * sin(h - M_PI / 2);
+ nx = x + (BCAR_LENGTH - BCAR_WHEEL_BASE) / 2 * cos(ph);
+ ny = y + (BCAR_LENGTH - BCAR_WHEEL_BASE) / 2 * sin(ph);
+ x = nx + (BCAR_DIAG_RRADI) * cos(h);
+ y = ny + (BCAR_DIAG_RRADI) * sin(h);
} else {
- h -= M_PI / 2;
- nx = x + (BCAR_LENGTH - BCAR_WHEEL_BASE) / 2
- * cos(h);
- ny = y + (BCAR_LENGTH - BCAR_WHEEL_BASE) / 2
- * sin(h);
- x = nx + (BCAR_DIAG_RRADI) * cos(h + M_PI / 2);
- y = ny + (BCAR_DIAG_RRADI) * sin(h + M_PI / 2);
+ nx = x + (BCAR_LENGTH - BCAR_WHEEL_BASE) / 2 * cos(ph);
+ ny = y + (BCAR_LENGTH - BCAR_WHEEL_BASE) / 2 * sin(ph);
+ x = nx + (BCAR_DIAG_RRADI) * cos(h);
+ y = ny + (BCAR_DIAG_RRADI) * sin(h);
}
- return new BicycleCar(x, y, h);
+ return new BicycleCar(x, y, ph);
}
BicycleCar *ParallelSlot::getISPPf(BicycleCar *B)