From 4bd08f0355b6b2cf3c027202d5ad301b4e182953 Mon Sep 17 00:00:00 2001 From: yy1717 <fctom1215@outlook.com> Date: 星期五, 31 三月 2023 17:16:22 +0800 Subject: [PATCH] 科目二修改 --- lib/src/main/cpp/test_items/stop_and_start.cpp | 314 ++++++++++++++++++++++++---------------------------- 1 files changed, 146 insertions(+), 168 deletions(-) diff --git a/lib/src/main/cpp/test_items/stop_and_start.cpp b/lib/src/main/cpp/test_items/stop_and_start.cpp index 7639775..0037350 100644 --- a/lib/src/main/cpp/test_items/stop_and_start.cpp +++ b/lib/src/main/cpp/test_items/stop_and_start.cpp @@ -2,6 +2,21 @@ // Created by YY on 2019/10/31. // +// |9 +// | +// | +// | +// | +// 7-----------------|8 +// 6_________________|5 +// 3_________________|4 +// | +// 2-----------------|1 +// | +// | +// | +// |0 + #include <cstdlib> #include <vector> #include <cmath> @@ -21,7 +36,7 @@ using namespace std; -const uint32_t STOP_CAR_TIME = D_SEC(1); + const double EPSILON = 1e-3; @@ -29,62 +44,66 @@ static PointF stopPoint; -static int mapIndex = 0; -static int prevMoveDirect; -static uint32_t stopTimepoint = 0; -static bool stopCar = false; -static uint32_t stopCarTime; +static bool check1 = false; + +static bool stopConfirm; +static bool restartComplete = false; static bool occurCrashRedLine = false; -static bool slideLongDistance = false; + static bool slideNormalDistance = false; static bool reportSlideFault = false; -static bool reportStartTimeout = false; static bool handBreakActive = false; -static bool CrashRedLine(const Polygon *map, const car_model *car); -static double DistanceOfHead2Stopline(const Polygon *map, const car_model *car); -static double DistanceOfTire2Edge(const Polygon *map, const car_model *car); -static bool ExitTestArea(const Polygon *map, const car_model *car); -void StartSAS(int index, const Polygon *map, const car_model *car, int moveDirect, const struct RtkTime *rtkTime) +static bool CrashRedLine(prime_t &prime); +static double DistanceOfHead2Stopline(prime_t &prime); +static double DistanceOfTire2Edge(prime_t &prime); +static bool ExitTestArea(prime_t &prime); + +void StartSAS(prime_t &prime) { - double yawEdge = YawOf(map->point[8], map->point[0]); - - if (moveDirect < 0 || DeltaYaw(car->yaw, yawEdge) >= 90.0) { - testing = false; - return; - } - DEBUG("杩涘叆鍧¤捣椤圭洰"); testing = true; - mapIndex = index; - prevMoveDirect = moveDirect; - - if (moveDirect == 0) { - stopTimepoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10); - } - + stopConfirm = false; + restartComplete = false; occurCrashRedLine = false; - stopCar = false; - slideLongDistance = false; + check1 = false; slideNormalDistance = false; reportSlideFault = false; - reportStartTimeout = false; handBreakActive = false; - MA_EnterMap(mapIndex, MAP_TYPE_STOP_START, 1); + MA_EnterMap(prime.curr_exam_map.map_idx, MAP_TYPE_UPHILL, 1); } -int TestSAS(const Polygon *map, const car_model *car, const car_model *carPrev, double speed, int moveDirect, const struct RtkTime *rtkTime) +static void StoppingTimeout(apptimer_var_t val) { + // 璧锋鏃堕棿瓒呰繃30绉掞紝涓嶅悎鏍� + AddExamFault(20303); + DEBUG("璧锋鏃堕棿瓒呰繃30绉�"); +} + +static void StopConfirm(apptimer_var_t val) { + stopConfirm = true; +} + +void MotionChange(move_status_t mv) +{ + AppTimer_delete(StopConfirm); + + if (mv == STOP) { + AppTimer_add(StopConfirm, D_SEC(1)); + } else { + + } +} + +int TestSAS(prime_t &prime) { static double distanceToStopLine = 0, distanceToEdge = 0; - if (!testing) - return 0; - if (CrashRedLine(map, car)) { + if (CrashRedLine(prime)) { // 杞﹁疆鍘嬬嚎锛屼笉鍚堟牸 if (!occurCrashRedLine) { - AddExamFault(10116, rtkTime); + AddExamFault(10116); DEBUG("杞﹁疆鍘嬬嚎"); } occurCrashRedLine = true; @@ -92,158 +111,125 @@ occurCrashRedLine = false; } - if (ExitTestArea(map, car)) { - // 椹剁娴嬭瘯鍖� - if (!stopCar) { - // 涓嶅仠杞︾洿鎺ョ寮� - AddExamFault(10103, rtkTime); - } - testing = false; - } + // 妫�娴嬪埌鍋滆溅 + if (prime.pMotion->move == STOP && stopConfirm) { + if (!check1) { + check1 = true; + // 瀛樺偍鍋滄鐐� + stopPoint = prime.pModeling->base_point; + // 寮�濮嬪仠杞﹁鏃� + AppTimer_delete(StoppingTimeout); + AppTimer_add(StoppingTimeout, examParam.ramp_start_car_limit_time); - if (prevMoveDirect != moveDirect) { - if (moveDirect == 0) { - stopTimepoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10); - } else if (stopCar && !handBreakActive) { - // 妫�鏌ユ槸鍚︽媺浣忔墜鍒� - handBreakActive = true; - AddExamFault(20306, rtkTime); - DEBUG("娌℃媺鎵嬪埞"); - } - prevMoveDirect = moveDirect; - } else if (moveDirect == 0) { - uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10); - - if (tp - stopTimepoint >= STOP_CAR_TIME && !stopCar) { - // 杩欓噷鍒ゆ柇鍋滆溅鐘舵�� - stopCar = true; - stopCarTime = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10); - - stopPoint = car->carXY[car->body[0]]; - - distanceToStopLine = DistanceOfHead2Stopline(map, car); - distanceToEdge = DistanceOfTire2Edge(map, car); + // 妫�鏌ヨ溅澶村拰鍋滆溅甯︾殑璺濈 + distanceToStopLine = DistanceOfHead2Stopline(prime); + distanceToEdge = DistanceOfTire2Edge(prime); DEBUG("DIS1 = %f DIS2 = %f", distanceToStopLine, distanceToEdge); if (distanceToStopLine > examParam.ramp_stoppoint_red_distance) { // 璺濈鍋滄绾垮墠鍚庤秴鍑�50鍘樼背 - AddExamFault(20301, rtkTime); + AddExamFault(20301); DEBUG("璺濈鍋滄绾垮墠鍚庤秴鍑�50鍘樼背锛屼笉鍚堟牸"); } else if (fabs(distanceToStopLine) > EPSILON) { // 鍓嶄繚闄╂病鏈変綅浜庡仠姝㈠甫鍐咃紝浣嗘病鏈夎秴鍑�50鍘樼背锛屾墸10鍒� - AddExamFault(20304, rtkTime); + AddExamFault(20304); DEBUG("鍓嶄繚闄╂病鏈変綅浜庡仠姝㈠甫鍐咃紝浣嗘病鏈夎秴鍑�50鍘樼背"); } if (distanceToEdge > examParam.ramp_edge_red_distance) { // 璺濈杈圭嚎瓒呭嚭50鍘樼背,涓嶅悎鏍� - AddExamFault(20302, rtkTime); + AddExamFault(20302); DEBUG("璺濈杈圭嚎瓒呭嚭50鍘樼背"); } else if (distanceToEdge > examParam.ramp_edge_yellow_distance) { // 璺濈杈圭嚎瓒呭嚭30鍘樼背锛屾墸10鍒� - AddExamFault(20305, rtkTime); + AddExamFault(20305); DEBUG("璺濈杈圭嚎瓒呭嚭30鍘樼背"); } } - if (stopCar && !handBreakActive && ReadCarStatus(HAND_BREAK) == BREAK_ACTIVE) { + // 鍋滆溅鍚庯紝妫�鏌ユ墜鍒规媺璧锋儏鍐� + if (!handBreakActive && ReadCarStatus(HAND_BREAK) == BREAK_ACTIVE) { handBreakActive = true; } } - if (!stopCar) { - // 璺濈妫�娴� - vector<double> dtox; - vector<Line> line_set; - Line distance_line; + if (prime.pMotion->move != STOP && stopConfirm) { + // 杞﹁締浠庡仠姝㈢姸鎬佸啀娆$Щ鍔� + double juli = DistanceOf(prime.pModeling->base_point, stopPoint); - MakeLine(&distance_line, &map->point[0], &map->point[8]); - line_set.push_back(distance_line); - DistanceOfTire2X(dtox, car, line_set); - MA_SendDistance(dtox[0], dtox[1]); - } else { - MA_SendDistance(distanceToStopLine, distanceToEdge); - } - - // 鍒ゆ柇璧锋鍚庢粦鐘舵�� - if (stopCar) { - if (IntersectionOfLine(map->point[4], stopPoint, car->carXY[car->axial[AXIAL_FRONT]]) == 1) { - // 鍙戠敓鍚庢粦 - double slideDistance = DistanceOf(stopPoint, car->carXY[car->axial[AXIAL_FRONT]]); - - if (slideDistance > examParam.ramp_slide_yellow_distance) { + if (juli > examParam.ramp_slide_yellow_distance) { + double deg = YawOf(stopPoint, prime.pModeling->base_point); + deg = fabs(prime.pModeling->yaw - deg); + if (deg > 180) { + deg = 360 - deg; + } + if (deg < 90) { + // 杞﹁締涓婂潯 + if (!restartComplete) { + restartComplete = true; + AppTimer_delete(StoppingTimeout); + if (slideNormalDistance && !reportSlideFault) { + // 鍚庢粦瓒呰繃10鍘樼背锛屼絾娌¤秴杩�30鍘樼背 + DEBUG("鍚庢粦瓒呰繃10鍘樼背锛屼絾娌¤秴杩�30鍘樼背"); + reportSlideFault = true; + AddExamFault(10204); + } + if (!handBreakActive) { + // 妫�鏌ユ槸鍚︽媺浣忔墜鍒� + DEBUG("娌℃媺鎵嬪埞"); + handBreakActive = true; + AddExamFault(20306); + } + } + } else { + // 杞﹁締鍚庢粦 slideNormalDistance = true; - } - - if (slideDistance > examParam.ramp_slide_red_distance && !slideLongDistance && !reportSlideFault) { - // 鍚庢粦瓒呰繃30鍘樼背, 涓嶅悎鏍� - AddExamFault(10106, rtkTime); - DEBUG("鍚庢粦瓒呰繃30鍘樼背"); - slideLongDistance = true; - reportSlideFault = true; - } - } - - - if (!reportStartTimeout && (IntersectionOfLine(map->point[4], stopPoint, car->carXY[car->axial[AXIAL_FRONT]]) != -1 || - DistanceOf(stopPoint, car->carXY[car->axial[AXIAL_FRONT]]) < 0.1)) { - if (TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10) - stopCarTime > examParam.ramp_start_car_limit_time) { - // 璧锋鏃堕棿瓒呰繃30绉掞紝涓嶅悎鏍� - AddExamFault(20303, rtkTime); - DEBUG("璧锋鏃堕棿瓒呰繃30绉�"); - reportStartTimeout = true; - } - } - - if (IntersectionOfLine(map->point[5], map->point[6], car->carXY[car->axial[AXIAL_REAR]]) == -1) { - // 杞﹀熬椹惰繃鍋滄鏉� - if (slideNormalDistance && !slideLongDistance && !reportSlideFault) { - reportSlideFault = true; - // 鍚庢粦瓒呰繃10鍘樼背锛屼絾娌¤秴杩�30鍘樼背 - AddExamFault(10204, rtkTime); - DEBUG("鍚庢粦瓒呰繃10鍘樼背锛屼絾娌¤秴杩�30鍘樼背"); + if (juli > examParam.ramp_slide_red_distance && !reportSlideFault) { + // 鍚庢粦瓒呰繃30鍘樼背, 涓嶅悎鏍� + DEBUG("鍚庢粦瓒呰繃30鍘樼背"); + reportSlideFault = true; + AddExamFault(10106); + } } } } - if (!testing) { - MA_EnterMap(mapIndex, MAP_TYPE_STOP_START, 0); + if (ExitTestArea(prime)) { + // 椹剁娴嬭瘯鍖� + if (!stopConfirm) { + // 涓嶅仠杞︾洿鎺ョ寮� + AddExamFault(10103); + } + MA_EnterMap(prime.curr_exam_map.map_idx, MAP_TYPE_UPHILL, 0); } return testing ? 1 : 0; } // 杞﹁疆鏄惁鍘嬭竟绾� -static bool CrashRedLine(const Polygon *map, const car_model *car) +static bool CrashRedLine(prime_t &prime) { bool ret = false; - Line red_line; - int red_lines[2][2]; - int red_line_num = 0; + int red_lines[][2] = {{0, 1}, {1, 4}, {4, 5}, {5, 8}, {8, 9}}; - if (map->num == 10) { - red_lines[0][0] = 0; - red_lines[0][1] = 8; - red_lines[1][0] = 8; - red_lines[1][1] = 9; - red_line_num = 2; - } else { - red_lines[0][0] = 0; - red_lines[0][1] = 8; - red_line_num = 1; - } Line frontAxle, rearAxle; - MakeLine(&frontAxle, &car->carXY[car->left_front_tire[TIRE_OUTSIDE]], &car->carXY[car->right_front_tire[TIRE_OUTSIDE]]); - MakeLine(&rearAxle, &car->carXY[car->left_rear_tire[TIRE_OUTSIDE]], &car->carXY[car->right_rear_tire[TIRE_OUTSIDE]]); + // 浠呯湅杞﹁疆澶栦晶 + 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 (int i = 0; i < red_line_num; ++i) { - MakeLine(&red_line, &map->point[red_lines[i][0]], &map->point[red_lines[i][1]]); + for (int i = 0; i < sizeof(red_lines) / sizeof(red_lines[0]); ++i) { + Line red_line; + MAKE_LINE(red_line, prime.pMap->uphill_map[prime.curr_exam_map.map_idx].map[red_lines[i][0]], + prime.pMap->uphill_map[prime.curr_exam_map.map_idx].map[red_lines[i][1]]); + if (IntersectionOf(red_line, frontAxle) == GM_Intersection || - IntersectionOf(red_line, rearAxle) == GM_Intersection) { + IntersectionOf(red_line, rearAxle) == GM_Intersection) { ret = true; break; } @@ -252,28 +238,21 @@ return ret; } -static double DistanceOfHead2Stopline(const Polygon *map, const car_model *car) +static double DistanceOfHead2Stopline(prime_t &prime) { double dis = 0.0; - int rel1 = IntersectionOfLine(map->point[4], map->point[3], car->carXY[car->body[0]]); - int rel2 = IntersectionOfLine(map->point[5], map->point[6], car->carXY[car->body[0]]); + Line upper_edge, lower_edge; - DEBUG("%d %d %f, %f", car->body[0], car->axial[AXIAL_FRONT], car->carXY[car->body[0]].X, car->carXY[car->body[0]].Y); - DEBUG("rel1 %d rel2 %d", rel1, rel2); + MAKE_LINE(upper_edge, prime.pMap->uphill_map[prime.curr_exam_map.map_idx].map[5], + prime.pMap->uphill_map[prime.curr_exam_map.map_idx].map[6]); + MAKE_LINE(lower_edge, prime.pMap->uphill_map[prime.curr_exam_map.map_idx].map[4], + prime.pMap->uphill_map[prime.curr_exam_map.map_idx].map[3]); - if (rel1 == 1) { - Line line1; - - MakeLine(&line1, &map->point[4], &map->point[3]); - - dis = DistanceOf(car->carXY[car->body[0]], line1); - } else if (rel2 == -1) { - Line line2; - - MakeLine(&line2, &map->point[5], &map->point[6]); - - dis = DistanceOf(car->carXY[car->body[0]], line2); + if (IntersectionOfLine(prime.pModeling->points[prime.pModel->axial[AXIAL_FRONT]], upper_edge) == REL_POS_RIGHT) { + dis = DistanceOf(prime.pModeling->points[prime.pModel->axial[AXIAL_FRONT]], upper_edge); + } else if (IntersectionOfLine(prime.pModeling->points[prime.pModel->axial[AXIAL_FRONT]], lower_edge) == REL_POS_LEFT) { + dis = DistanceOf(prime.pModeling->points[prime.pModel->axial[AXIAL_FRONT]], lower_edge); } DEBUG("DistanceOfHead2Stopline dis %f", dis); @@ -281,28 +260,27 @@ return dis; } -static double DistanceOfTire2Edge(const Polygon *map, const car_model *car) +static double DistanceOfTire2Edge(prime_t &prime) { Line edge; - MakeLine(&edge, &map->point[0], &map->point[8]); + MAKE_LINE(edge, prime.pMap->uphill_map[prime.curr_exam_map.map_idx].map[0], + prime.pMap->uphill_map[prime.curr_exam_map.map_idx].map[8]); - double l1 = DistanceOf(car->carXY[car->right_front_tire[TIRE_OUTSIDE]], edge); + double l1 = DistanceOf(prime.pModeling->points[prime.pModel->right_front_tire[TIRE_OUTSIDE]], edge); - double l2 = DistanceOf(car->carXY[car->right_rear_tire[TIRE_OUTSIDE]], edge); - -// return (l1+l2)/2.0; + double l2 = DistanceOf(prime.pModeling->points[prime.pModel->right_rear_tire[TIRE_OUTSIDE]], edge); return MAX(l1, l2); // 鍙栨渶杩滅殑 } // 鏁翠釜杞﹁締閮借椹剁璇ユ祴璇曞尯鍩� -static bool ExitTestArea(const Polygon *map, const car_model *car) +static bool ExitTestArea(prime_t &prime) { // 鍏ㄨ溅閮介渶涓嶅湪鍦板浘涓� bool ret = false; - Polygon carBody, map2; + /*Polygon carBody, map2; PointF vPoint = Calc3Point(map->point[8], map->point[0], DistanceOf(map->point[8], map->point[7]), 'R'); PointF vPoint2; @@ -329,6 +307,6 @@ } free(carBody.point); - free(map2.point); + free(map2.point);*/ return ret; } -- Gitblit v1.8.0