From 27fc91fbe8f88b6885356e68828cfe1ce1db7601 Mon Sep 17 00:00:00 2001 From: yy1717 <fctom1215@outlook.com> Date: 星期三, 28 二月 2024 09:53:13 +0800 Subject: [PATCH] 坐标 --- lib/src/main/cpp/test_items/park_bottom.cpp | 423 +++++++++++++++++++--------------------------------- 1 files changed, 159 insertions(+), 264 deletions(-) diff --git a/lib/src/main/cpp/test_items/park_bottom.cpp b/lib/src/main/cpp/test_items/park_bottom.cpp index 421ecf5..3424f6e 100644 --- a/lib/src/main/cpp/test_items/park_bottom.cpp +++ b/lib/src/main/cpp/test_items/park_bottom.cpp @@ -24,27 +24,15 @@ #include "area_exam.h" #include "../test_common/car_sensor.h" #include "../test_common/odo_graph.h" +#include "../teach/train.h" +#include "../teach/teach.h" #include <vector> #include <cstdlib> +#include <tuple> #define DEBUG(fmt, args...) LOGD("<park_bottom> <%s>: " fmt, __func__, ##args) using namespace std; - -enum { - NONE, - FIRST_TOUCH_CTRL_LINE, - FIRST_PARK, - SECOND_TOUCH_CTRL_LINE, - SECOND_PARK, - THIRD_TOUCH_CTRL_LINE -}; - -enum { - TESTING, - TEST_FAIL, // 鍥犺Е鍙戞煇浜涜鍒欙紝鍦ㄨ溅韬湭瀹屽叏绔嬪満鎯呭喌涓嬶紝鎻愬墠缁堟閮ㄥ垎娴嬭瘯 - TEST_FINISH -}; typedef enum { NONE_CTRL_LINE, @@ -52,151 +40,157 @@ RIGHT_CTRL_LINE } ctrl_line_t; -static bool reverseCar = false; - -const uint32_t CHECK_PARK_DELAY = 400; - -static uint32_t stopTimepoint; -static int prevMoveDirect; static bool occurCrashRedLine; - -static uint32_t firstReverseTimepoint; - static int parkCount; -static char carray[3]; -static int darray[3]; -static int parkStatus[3]; - -static int gearAtStop; -static int currGear; +static int reverseCnt = 0; +static bool stopFlag; static ctrl_line_t prevCrossedCtrlLine; -static double odo; +static bool checkCtrlLine, checkParkspace; +static int handleGearOb, handleMoveOb; + +static bool BodyCollidingLine(prime_t &prime); static ctrl_line_t CrossCtrlLine(prime_t &prime); -static bool EnterParking(prime_t &prime); -static bool CrashRedLine(prime_t &prime); +static bool CheckParkspace(prime_t &prime); +static void MoveOb(move_status_t curr, move_status_t prev, double distance); +static void GearOb(int gear, int prevGear, double move_distance); +enum { + PREPARE_REVERSE, + REVERSE_LEFT, + REVERSE_RIGHT, + OBVERSE_LEFT, + OBVERSE_RIGHT +}; + +/* +1. 杩涘叆 --- 棣栨鍊掑簱鍓� +2. 鍊掑簱 ---- 鍋滆溅鍒颁綅鍓嶏紙鍙冲�掑簱锛� +3. 宸﹀嚭搴� +4. 鍊掑簱 ---- 鍋滆溅鍒颁綅鍓嶏紙宸﹀�掑簱锛� +5. 鍙冲嚭搴�(绂诲紑鍦哄湴) +*/ void StartParkBottom(prime_t &prime) { - DEBUG("StartParkBottom"); - - reverseCar = false; - memset(carray, 0, sizeof(carray)); - memset(darray, 0, sizeof(darray)); - memset(parkStatus, 0, sizeof(parkStatus)); - prevMoveDirect = prime.pMotion->move; - - firstReverseTimepoint = 0; - + DEBUG("杩涘叆鍊掑簱鍦哄湴"); + stopFlag = false; parkCount = 0; - + reverseCnt = 0; + checkCtrlLine = false; + checkParkspace = false; occurCrashRedLine = false; - - currGear = ReadCarStatus(GEAR); + prime.examing_area.stage = PREPARE_REVERSE; + testAll(); + LoadStageTips(prime); prevCrossedCtrlLine = NONE_CTRL_LINE; - stopTimepoint = 0; - - odo = ReadOdo(); - + handleGearOb = RegisterShiftObserver(GearOb); + handleMoveOb = RegisterCarMoveObserver(MoveOb); PlayTTS("鎮ㄥ凡杩涘叆鍊掕溅鍏ュ簱鍖哄煙", NULL); +} + +static void ParkTimeout(apptimer_var_t var) +{ + DEBUG("椤圭洰瓒呮椂"); + AddExamFault(20105); +} + +static void MoveOb(move_status_t curr, move_status_t prev, double distance) +{ + // 杞﹁締鐢辫繍鍔ㄥ埌鍋滄锛岃褰曚竴涓嬶紝褰撴崲鎸″彂鐢熸椂锛岄伩鍏嶅師鍦版潵鍥炴崲鎸¢�犳垚璇垽 + if (curr == STOP && distance > 0.5) { + stopFlag = true; + } +} + +static void GearOb(int gear, int prevGear, double move_distance) +{ + DEBUG("GearOb %d %f", gear, move_distance); + + if (gear == GEAR_R && stopFlag) { // 绉诲叆鍊掓尅 + stopFlag = false; + reverseCnt++; + if (reverseCnt == 1) { + AppTimer_delete(ParkTimeout); + AppTimer_add(ParkTimeout, GetPrime().examParam.park_bottom_limit_time); + } + checkCtrlLine = true; + } else if (prevGear == GEAR_R && stopFlag) { // 浠庡�掓尅绉诲嚭 + stopFlag = false; + checkParkspace = true; + } +} + +void StopParkBottom(prime_t &prime) +{ + if (prime.examing_area.type != MAP_TYPE_PARK_BUTTOM) + return; + + DEBUG("绂诲紑鍊掑簱鍦哄湴"); + + if (parkCount < 2) { + DEBUG("鐩存帴椹剁娴嬭瘯鍖�,涓嶆寜鑰冭瘯鍛樻寚浠ら┚椹�"); + AddExamFault(10103); + } + AppTimer_delete(ParkTimeout); + prime.examing_area.type = MAP_TYPE_NONE; + UnregisterShiftObserver(handleGearOb); + UnregisterCarMoveObserver(handleMoveOb); } void TestParkBottom(prime_t &prime) { - ctrl_line_t crossCtrlLine = NONE_CTRL_LINE; - uint32_t tp = AppTimer_GetTickCount(); + if (prime.examing_area.type != MAP_TYPE_PARK_BUTTOM) + return; - vector<double> dtox; - vector<Line> line_set; - Line distance_line; + train(prime); - bool gear_change = false; - int gear = ReadCarStatus(GEAR); + if (checkCtrlLine) { + ctrl_line_t crossCtrlLine = CrossCtrlLine(prime); - if (gear == GEAR_R) { - if (currGear != GEAR_R) { - gear_change = true; - currGear = GEAR_R; - } - } else if (currGear == GEAR_R) { - gear_change = true; - currGear = gear; - } - - if (gear_change) { - // 妫�鏌ヤ笂涓�娆℃尅浣嶇殑琛岄┒璺濈锛岃繃灏忓氨鏀惧純锛岄伩寮�瀛﹀憳鍘熷湴鎸傛尅閲嶈瘯 - double run_distance = ReadOdo() - odo; - - DEBUG("2娆℃尅浣嶈繍琛岃窛绂� %f", run_distance); - - if (run_distance < 1) { - gear_change = false; - DEBUG("2娆℃尅浣嶈繍琛岃窛绂昏繃灏忥紝蹇界暐"); - } - odo = ReadOdo(); - } - - if (gear_change) { - if (currGear == GEAR_R) { - // 鎸傚�掓尅,妫�娴嬫槸鍚﹁繃鎺у埗绾� - DEBUG("寮�濮嬫寕鍊掓尅"); - if (!reverseCar) { - DEBUG("寮�濮嬮杞叆搴�"); - reverseCar = true; - MA_EnterMap(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].id, MAP_TYPE_PARK_BUTTOM, 1); - firstReverseTimepoint = tp; // 寮�濮�210绉掕鏃� - } - crossCtrlLine = CrossCtrlLine(prime); - - if (parkCount >= 2) { - DEBUG("寮�濮嬫杞叆搴�"); - parkCount = 0; - MA_EnterMap(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].id, MAP_TYPE_PARK_BUTTOM, 1); - firstReverseTimepoint = tp; // 寮�濮�210绉掕鏃� - } - - if (crossCtrlLine == NONE_CTRL_LINE) { - // 鍊掕溅鍓嶏紝鍓嶈疆鏈┒杩囨帶鍒剁嚎 - AddExamFault(20104); - DEBUG("鍊掕溅鍓嶏紝鍓嶈疆鏈┒杩囨帶鍒剁嚎"); - } else if (crossCtrlLine == prevCrossedCtrlLine) { - // 閲嶅璺ㄨ秺鍚屼竴鎺у埗绾匡紝涓嶆寜瑙勫畾绾胯矾锛岄『搴忓舰寮忥紝涓嶅悎鏍� - AddExamFault(20101); - DEBUG("涓嶆寜瑙勫畾绾胯矾锛岄『搴忓舰寮忥紝 鍚� %c 渚�", prevCrossedCtrlLine); - } else { - prevCrossedCtrlLine = crossCtrlLine; - DEBUG("寮�濮� %c 渚� 鍊掑簱", prevCrossedCtrlLine); - } + if (crossCtrlLine == NONE_CTRL_LINE) { + // 鍊掕溅鍓嶏紝鍓嶈疆鏈┒杩囨帶鍒剁嚎 + DEBUG("鍊掕溅鍓嶏紝鍓嶈疆鏈┒杩囨帶鍒剁嚎"); + AddExamFault(20104); + } else if (crossCtrlLine == prevCrossedCtrlLine) { + // 閲嶅璺ㄨ秺鍚屼竴鎺у埗绾匡紝涓嶆寜瑙勫畾绾胯矾锛岄『搴忓舰寮忥紝涓嶅悎鏍� + AddExamFault(20101); + DEBUG("涓嶆寜瑙勫畾绾胯矾锛岄『搴忓舰寮忥紝 鍚� %d 渚�", prevCrossedCtrlLine); } else { - // 浠庡�掓尅绉诲嚭锛屾娴嬫槸鍚﹀叆搴� - DEBUG("浠庡�掓尅绉诲嚭"); - - parkCount++; - - DEBUG("搴撲綅妫�鏌ユ鏁� = %d", parkCount); - - if (EnterParking(prime)) { - DEBUG("鍊掑簱鎴愬姛"); - } else { - AddExamFault(20103); - DEBUG("鍊掑簱涓嶅叆"); - } + prevCrossedCtrlLine = crossCtrlLine; + DEBUG("寮�濮� %d 渚� 鍊掑簱", prevCrossedCtrlLine); } + + if (DeltaYaw(YawOf(std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[3], + std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[4]), prime.pModeling[prime.curr_modeling_index].yaw) < 90) { + DEBUG("鍙充晶鍊掑簱"); + prime.examing_area.stage = REVERSE_RIGHT; + } else { + DEBUG("宸︿晶鍊掑簱"); + prime.examing_area.stage = REVERSE_LEFT; + } + LoadStageTips(prime); + checkCtrlLine = false; } - if (ExitParkArea(prime)) { - // 绂诲紑鍦哄湴 - DEBUG("绂诲紑鍦哄湴"); - if (parkCount < 2) { - AddExamFault(10103); - DEBUG("鐩存帴椹剁娴嬭瘯鍖�,涓嶆寜鑰冭瘯鍛樻寚浠ら┚椹�"); + if (checkParkspace) { + if (CheckParkspace(prime)) { + DEBUG("鍊掑簱鎴愬姛"); + } else { + DEBUG("鍊掑簱涓嶅叆"); + AddExamFault(20103); } - prime.curr_exam_map.type = 0; - goto TEST_END; + parkCount++; + if (prime.examing_area.stage == REVERSE_RIGHT) { + prime.examing_area.stage = OBVERSE_LEFT; // 浠庡乏渚у�掑簱 + } else { + prime.examing_area.stage = OBVERSE_RIGHT; // 绂诲紑鍦哄湴 + } + LoadStageTips(prime); + checkParkspace = false; } - if (BodyCollidingLine(prime) >= 0) { + if (BodyCollidingLine(prime)) { if (!occurCrashRedLine) { occurCrashRedLine = true; // 杞﹁韩鍑虹嚎锛屼笉鍚堟牸 @@ -207,76 +201,35 @@ occurCrashRedLine = false; } - if (prime.pMotion->move != prevMoveDirect) { - if (prime.pMotion->move == STOP) { - stopTimepoint = tp; - gearAtStop = (currGear == GEAR_R ? 1 : 0); - DEBUG("鍋滆溅浜�"); - DEBUG("鍋滆溅鏃舵尅浣� = %d", gearAtStop); - } else if (prevMoveDirect == STOP && stopTimepoint > 0) { - DEBUG("缁х画琛岄┒"); - - DEBUG("鍋滆溅鏃堕棿 %ld", tp - stopTimepoint); - DEBUG("鍐嶆绉诲姩鏃舵尅浣� = %d", currGear == GEAR_R ? 1 : 0); - - if (tp - stopTimepoint >= CorrectPauseCriteria(examParam.park_bottom_pause_criteria) - && gearAtStop == (currGear == GEAR_R ? 1 : 0)) { - // 鍋滆溅瓒�2绉掞紝姣忔鎵�5鍒� - AddExamFault(20106); - DEBUG("涓�斿仠杞�"); - } - } - - prevMoveDirect = prime.pMotion->move; - } -TEST_END: - DEBUG("鍊掑簱缁撴潫"); - MA_EnterMap(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].id, MAP_TYPE_PARK_BUTTOM, 0); + teach(prime); } -static int BodyCollidingLine(prime_t &prime) +// 杞﹁韩鎴栬溅杞殕涓嶅緱纰拌Е瀹炵嚎 +static bool BodyCollidingLine(prime_t &prime) { - vector<Line> lines; + MakePolygon car_body(prime.pModel->body.size()); - Polygon car_body; - - car_body.num = prime.pModel->body.size(); - car_body.point = new PointF[car_body.num]; - - for (int i = 0; i < car_body.num; ++i) { - car_body.point[i] = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->body[i]]; + for (int i = 0; i < prime.pModel->body.size(); ++i) { + car_body.AddPoint(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->body[i]]); } - Line line; - MAKE_LINE(line, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[0], - prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[7]); - lines.push_back(line); - MAKE_LINE(line, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[1], - prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[2]); - lines.push_back(line); - MAKE_LINE(line, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[2], - prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[3]); - lines.push_back(line); - MAKE_LINE(line, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[3], - prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[4]); - lines.push_back(line); - MAKE_LINE(line, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[4], - prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[5]); - lines.push_back(line); - MAKE_LINE(line, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[5], - prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[6]); - lines.push_back(line); + Line frontAxle, rearAxle; - int idx = 0; + MAKE_LINE(frontAxle, prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]], prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]]); + MAKE_LINE(rearAxle, prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_rear_tire[TIRE_OUTSIDE]], prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_rear_tire[TIRE_OUTSIDE]]); - for (auto line: lines) { - if (IntersectionOf(line, &car_body) != GM_None) { - break; + const int red_lines[][2] = {{0, 7}, {1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6}}; + + for (int i = 0; i < sizeof(red_lines) / sizeof(red_lines[0]); ++i) { + Line red_line; + MAKE_LINE(red_line, std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[red_lines[i][0]], std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[red_lines[i][1]]); + if (IntersectionOf(red_line, frontAxle) == GM_Intersection + || IntersectionOf(red_line, rearAxle) == GM_Intersection + || IntersectionOf(red_line, car_body.GetPolygon()) != GM_None) { + return true; } - idx++; } - delete []car_body.point; - return idx < lines.size()? idx : -1; + return false; } // 妫�娴�2鍓嶈疆鏄惁姝e悜瓒婅繃宸﹀彸鎺у埗绾� @@ -291,95 +244,37 @@ MAKE_LINE(right_trace, prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]], prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_rear_tire[TIRE_OUTSIDE]]); - MAKE_LINE(left_ctrl, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[1], prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[0]); - MAKE_LINE(right_ctrl, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[6], prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[7]); + MAKE_LINE(left_ctrl, std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[1], std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[0]); + MAKE_LINE(right_ctrl, std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[6], std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[7]); if (IntersectionOf(left_trace, left_ctrl) == GM_Intersection && IntersectionOf(right_trace, left_ctrl) == GM_Intersection && - IntersectionOfLine(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]], left_ctrl) == RELATION_LEFT) { + IntersectionOfLine(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]], left_ctrl) == REL_POS_LEFT) { return LEFT_CTRL_LINE; } if (IntersectionOf(left_trace, right_ctrl) == GM_Intersection && IntersectionOf(right_trace, right_ctrl) == GM_Intersection && - IntersectionOfLine(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]], right_ctrl) == RELATION_RIGHT) { + IntersectionOfLine(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]], right_ctrl) == REL_POS_RIGHT) { return RIGHT_CTRL_LINE; } return NONE_CTRL_LINE; } -// 闇�瑕佸簱鍏ュ彛绾垮璁$畻鍦ㄥ唴 -static bool EnterParking(prime_t &prime) { - bool succ = false; +static bool CheckParkspace(prime_t &prime) { + MakePolygon car_body(prime.pModel->body.size()); - Polygon park_area; - Polygon car_body; - - car_body.num = prime.pModel->body.size(); - car_body.point = new PointF[car_body.num]; - for (int i = 0; i < car_body.num; ++i) { - car_body.point[i] = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->body[i]]; + for (int i = 0; i < prime.pModel->body.size(); ++i) { + car_body.AddPoint(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->body[i]]); } - PointF p8 = PointExtend(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[2], - prime.pMap->park_button_map[prime.curr_exam_map.map_idx].line_width, - YawOf(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[2], prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[3])); + MakePolygon park_area({std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[8], + std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[3], + std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[4], + std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[9]}); - PointF p9 = PointExtend(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[5], - prime.pMap->park_button_map[prime.curr_exam_map.map_idx].line_width, - YawOf(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[5], prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[4])); - - MakePolygon(&park_area, {p8, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[3], prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[4], p9}); - - if (IntersectionOf(&car_body, &park_area) == GM_Containment) { - succ = true; - } - - CleanPolygon(&park_area); - free(car_body.point); - - DEBUG("妫�鏌ュ�掑簱鐘舵�� %s", succ ? "鎴愬姛" : "澶辫触"); - - return succ; + return (bool) (IntersectionOf(car_body.GetPolygon(), park_area.GetPolygon()) == GM_Containment); } -// 4涓溅杞拰杞﹀ご鐐逛笉鍦ㄥ満鍦颁腑 -bool ExitParkArea(prime_t &prime) -{ - Polygon polygon; - - polygon.num = prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map.size(); - polygon.point = new PointF[polygon.num]; - for (int i = 0; i < polygon.num; ++i) { - polygon.point[i] = prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[i]; - } - - int num = 0; - - if (IntersectionOf(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]], - &polygon) == GM_None) { - num++; - } - if (IntersectionOf(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]], - &polygon) == GM_None) { - num++; - } - if (IntersectionOf(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_rear_tire[TIRE_OUTSIDE]], - &polygon) == GM_None) { - num++; - } - if (IntersectionOf(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_rear_tire[TIRE_OUTSIDE]], - &polygon) == GM_None) { - num++; - } - if (IntersectionOf(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->body[prime.pModel->axial[AXIAL_FRONT]]], - &polygon) == GM_None) { - num++; - } - - delete []polygon.point; - - return num == 5? true : false; -} -- Gitblit v1.8.0