| | |
| | | // |
| | | // Created by YY on 2019/10/23. |
| | | // |
| | | // |
| | | // 4 ___________________________ 3 |
| | | // | | |
| | | // | | |
| | | // | | |
| | | // ________________| |___________1 |
| | | // 6 5 2 |
| | | // |
| | | // |
| | | // 7______________________________________________________0 |
| | | // |
| | | |
| | | #include "park_edge.h" |
| | | #include "../jni_log.h" |
| | |
| | | |
| | | const uint32_t CHECK_PARK_DELAY = 400; |
| | | |
| | | static int mapIndex = 0; |
| | | static bool reportExamTimeout; |
| | | static bool reportParkFail; |
| | | |
| | |
| | | static int currGear; |
| | | static double odo; |
| | | |
| | | static bool CrashRedLine1(const Polygon *map, const car_model *car); |
| | | static bool CrashRedLine2(const Polygon *map, const car_model *car); |
| | | static bool CrashRedLine3(const Polygon *map, const car_model *car); |
| | | static bool EnterParking(const Polygon *map, const car_model *car); |
| | | static bool ExitParkArea(const Polygon *map, const car_model *car); |
| | | static bool ExitParkArea2(const Polygon *map, const car_model *car); |
| | | static bool CrashRedLine1(const Polygon *map, const car_model_t *car); |
| | | static bool CrashRedLine2(const Polygon *map, const car_model_t *car); |
| | | static bool CrashRedLine3(const Polygon *map, const car_model_t *car); |
| | | static bool EnterParking(const Polygon *map, const car_model_t *car); |
| | | static bool ExitParkArea(const Polygon *map, const car_model_t *car); |
| | | static bool ExitParkArea2(const Polygon *map, const car_model_t *car); |
| | | |
| | | void StartParkEdge(int index, int moveStatus, const struct RtkTime *rtkTime) |
| | | void StartParkEdge(prime_t &prime) |
| | | { |
| | | DEBUG("进入侧方停车场地"); |
| | | |
| | | testStatus = TESTING; |
| | | mapIndex = index; |
| | | |
| | | occurCrashRedLine1 = occurCrashRedLine2 = occurCrashRedLine3 = false; // 这个科目规定特殊点,发生一次扣10分,而不直接淘汰 |
| | | reportExamTimeout = false; |
| | | reportParkFail = false; |
| | | prevMoveStatus = moveStatus; |
| | | prevMoveStatus = prime.pMotion->move; |
| | | parkSuccess = false; |
| | | parkStatus = 0; |
| | | occurMoveBack = false; |
| | |
| | | }*/ |
| | | } |
| | | |
| | | int TestParkEdge(const Polygon *map, const car_model *car, const car_model *carPrev, double speed, int moveStatus, const struct RtkTime *rtkTime) |
| | | int TestParkEdge(prime_t &prime) |
| | | { |
| | | vector<double> dtox; |
| | | vector<Line> line_set; |
| | |
| | | occurMoveBack = true; |
| | | moveBackTimePoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, |
| | | rtkTime->mss * 10); // 开始计时 |
| | | MA_EnterMap(mapIndex, MAP_TYPE_PART_EDGE, 1); |
| | | MA_EnterMap(mapIndex, MAP_TYPE_PARK_EDGE, 1); |
| | | } |
| | | } else { |
| | | if (occurMoveBack && !checkPark) { |
| | |
| | | DEBUG("开始倒车"); |
| | | occurMoveBack = true; |
| | | moveBackTimePoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10); |
| | | MA_EnterMap(mapIndex, MAP_TYPE_PART_EDGE, 1); |
| | | MA_EnterMap(mapIndex, MAP_TYPE_PARK_EDGE, 1); |
| | | }*/ |
| | | } |
| | | |
| | |
| | | TEST_END: |
| | | if (testStatus == TEST_FINISH) { |
| | | DEBUG("侧方停车结束"); |
| | | MA_EnterMap(mapIndex, MAP_TYPE_PART_EDGE, 0); |
| | | MA_EnterMap(mapIndex, MAP_TYPE_PARK_EDGE, 0); |
| | | return 0; |
| | | } |
| | | return 1; |
| | | } |
| | | |
| | | int EnterParkEdge(prime_t &prime) { |
| | | if (prime.prev_modeling_index == -1 || prime.curr_modeling_index == -1) { |
| | | return -1; |
| | | } |
| | | |
| | | PointF &lp1 = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]]; |
| | | PointF &lp2 = prime.pModeling[prime.prev_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]]; |
| | | PointF &rp1 = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]]; |
| | | PointF &rp2 = prime.pModeling[prime.prev_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]]; |
| | | |
| | | Line left_trace, right_trace; |
| | | |
| | | MAKE_LINE(left_trace, lp1, lp2); |
| | | MAKE_LINE(right_trace, rp1, rp2); |
| | | |
| | | // 不同地区左右倒库次序可能不同,所以两个方向都可以进入 |
| | | for (int i = 0; i < prime.pMap->park_button_map.size(); ++i) { |
| | | Line left_entrance_line; |
| | | |
| | | MAKE_LINE(left_entrance_line, prime.pMap->park_button_map[i].map[1], prime.pMap->park_button_map[i].map[0]); |
| | | |
| | | if (IntersectionOf(left_trace, left_entrance_line) == GM_Intersection |
| | | && IntersectionOfLine(lp1, left_entrance_line) == RELATION_RIGHT) { |
| | | return i; |
| | | } |
| | | } |
| | | return -1; |
| | | } |
| | | |
| | | // 车轮是否压道路边线 |
| | | static bool CrashRedLine1(const Polygon *map, const car_model *car) |
| | | static bool CrashRedLine1(const Polygon *map, const car_model_t *car) |
| | | { |
| | | bool ret = false; |
| | | |
| | |
| | | } |
| | | |
| | | // 车身是否压库位线 |
| | | static bool CrashRedLine2(const Polygon *map, const car_model *car) |
| | | static bool CrashRedLine2(const Polygon *map, const car_model_t *car) |
| | | { |
| | | bool ret = false; |
| | | |
| | |
| | | return ret; |
| | | } |
| | | |
| | | static bool CrashRedLine3(const Polygon *map, const car_model *car) { |
| | | static bool CrashRedLine3(const Polygon *map, const car_model_t *car) { |
| | | bool ret = false; |
| | | |
| | | if (!occurMoveBack) { |
| | |
| | | |
| | | free(car_body.point); |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | static bool EnterParking(const Polygon *map, const car_model *car) { |
| | | DEBUG("检查停车到位..."); |
| | | |
| | | bool succ = false; |
| | | |
| | | Polygon parking; |
| | | Polygon car_body; |
| | | |
| | | car_body.num = car->bodyNum; |
| | | car_body.point = (PointF *) malloc(sizeof(PointF) * car_body.num); |
| | | for (int i = 0; i < car_body.num; ++i) { |
| | | car_body.point[i] = car->carXY[car->body[i]]; |
| | | } |
| | | |
| | | MakePolygon(&parking, {map->point[2], map->point[3], map->point[4], map->point[5]}); |
| | | |
| | | if (IntersectionOf(&car_body, &parking) == GM_Containment) { |
| | | succ = true; |
| | | } |
| | | |
| | | CleanPolygon(&parking); |
| | | free(car_body.point); |
| | | |
| | | return succ; |
| | | } |
| | | |
| | | // 车头要驶过前库位线 |
| | | static bool ExitParkArea(const Polygon *map, const car_model *car) |
| | | { |
| | | if (IntersectionOfLine(map->point[6], map->point[7], car->carXY[ car->axial[AXIAL_FRONT] ]) == -1) |
| | | return true; |
| | | return false; |
| | | } |
| | | |
| | | static bool ExitParkArea2(const Polygon *map, const car_model *car) |
| | | { |
| | | // 全车都需不在地图中 |
| | | bool ret = false; |
| | | |
| | | Polygon carBody; |
| | | |
| | | carBody.num = car->bodyNum; |
| | | carBody.point = (PointF *)malloc(carBody.num * sizeof(PointF)); |
| | | for (int i = 0; i < carBody.num; ++i) { |
| | | carBody.point[i] = car->carXY[car->body[i]]; |
| | | } |
| | | |
| | | if (IntersectionOf(&carBody, map) == GM_None) { |
| | | ret = true; |
| | | } |
| | | |
| | | free(carBody.point); |
| | | |
| | | return ret; |
| | | } |