From 583d5dbf2526072723a60047f790f0da273bd8dc Mon Sep 17 00:00:00 2001 From: Jiri Vlasak Date: Mon, 30 Mar 2020 00:31:22 +0200 Subject: [PATCH] Add workaround for fe() for perpendicular parking slot --- CHANGELOG.md | 2 ++ src/psp.cc | 62 +++++++++++++++++++++++++++++++++++----------------- 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8519a27..9b2bd19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ The format is based on [Keep a Changelog][] and this project adheres to [Semantic Versioning]: http://semver.org/ ## Unreleased +### Added +- Workaround to not working `fe()` for perpendicular parking slot. ## 0.3.0 - 2020-02-04 ### Added diff --git a/src/psp.cc b/src/psp.cc index 987a49b..7fe4ea8 100644 --- a/src/psp.cc +++ b/src/psp.cc @@ -23,6 +23,8 @@ bool PSPlanner::forward() { if (this->ps().parallel()) return false; + else + return true; double heading = atan2( this->ps().y2() - this->ps().y1(), this->ps().x2() - this->ps().x1() @@ -101,27 +103,47 @@ void PSPlanner::guess_gc() y += (this->gc().w() / 2 + 0.01) * sin(h + dts); y += (this->gc().dr() + 0.01) * sin(h); } else { - // This is for backward parking only. + // Forward parking double entry_width = edist( this->ps().x1(), this->ps().y1(), this->ps().x4(), this->ps().y4() ); - double dist_l = - this->gc().orradi() - - (this->gc().mtr() + this->gc().w() / 2) - ; - double move1 = dist_l + this->gc().w() / 2; - double dist_r = entry_width - this->gc().w() - dist_l; - double move2 = sqrt( - pow(this->gc().iradi(), 2) - - pow(this->gc().iradi() - dist_r, 2) + x += entry_width / 2 * cos(h); + y += entry_width / 2 * sin(h); + h = atan2( + this->ps().y2() - this->ps().y1(), + this->ps().x2() - this->ps().x1() ); - move2 -= this->gc().dr() / 2; // workaround - x += move1 * cos(h); - y += move1 * sin(h); - x += move2 * cos(h + dts); - y += move2 * sin(h + dts); - h += dts + M_PI; + while (h < 0) h += 2 * M_PI; + x += 2 * cos(h); + y += 2 * sin(h); + + //// This is for backward parking only. + //double entry_width = edist( + // this->ps().x1(), this->ps().y1(), + // this->ps().x4(), this->ps().y4() + //); + //double dist_l = + // this->gc().orradi() + // - (this->gc().mtr() + this->gc().w() / 2) + //; + //double move1 = dist_l + this->gc().w() / 2; + //double dist_r = entry_width - this->gc().w() - dist_l; + //double move2 = sqrt( + // pow(this->gc().iradi(), 2) + // - pow(this->gc().iradi() - dist_r, 2) + //); + //move2 -= this->gc().dr() / 2; // workaround + //x += move1 * cos(h); + //y += move1 * sin(h); + //dts = atan2( + // this->ps().y2() - this->ps().y1(), + // this->ps().x2() - this->ps().x1() + //); + //while (dts < 0) dts += 2 * M_PI; + //x += move2 * cos(h + dts); + //y += move2 * sin(h + dts); + //h += dts - M_PI / 2; } while (h > M_PI) h -= 2 * M_PI; @@ -209,10 +231,10 @@ void PSPlanner::fe() } else { this->guess_gc(); this->cc() = BicycleCar(this->gc()); - this->cc().set_max_steer(); - if (this->ps().right()) - this->cc().st(this->cc().st() * -1); - this->cc().sp(1); + //this->cc().set_max_steer(); + //if (this->ps().right()) + // this->cc().st(this->cc().st() * -1); + this->cc().sp(-0.2); } } -- 2.39.2