From 539bdbbebc2410bbad25af01d9088594d02c95b0 Mon Sep 17 00:00:00 2001 From: yy1717 <fctom1215@outlook.com> Date: 星期三, 12 八月 2020 18:45:58 +0800 Subject: [PATCH] 坐标 --- lib/src/main/cpp/test_items2/road_exam.cpp | 837 +++++++++++++++-------------------------------------------- 1 files changed, 219 insertions(+), 618 deletions(-) diff --git a/lib/src/main/cpp/test_items2/road_exam.cpp b/lib/src/main/cpp/test_items2/road_exam.cpp index 674f248..e476e9a 100644 --- a/lib/src/main/cpp/test_items2/road_exam.cpp +++ b/lib/src/main/cpp/test_items2/road_exam.cpp @@ -42,6 +42,26 @@ STOP_CAR_DONE }; +typedef struct { + int road; + int sep; + int no; + int guide; +} lane_t; + +typedef struct { + int edgeIndex; + int pointIndex; + PointF point; +} projection_t; + +typedef struct +{ + int name; + int value; + struct RtkTime time; +} car_sensor_value_t; + static const int INVALID_ROAD = -1; static const int TURN_THRESHOLD = 1; @@ -65,7 +85,7 @@ static bool occurCrashGreenLine; static bool occurOverSpeed; static bool occurSecondBreak; -static int checkCrashGreenTimeout; + static char carIntersectionOfGreenLine; static int currTurnSignalStatus; static int turnSignalStatusWhenCrashGreenLine; @@ -82,7 +102,7 @@ static bool occurSlide; static bool startCarLeftTurnSignal, checkStartCarSignal; -static struct drive_timer crashGreenRunTime, crashGreenCmpTime, crashGreenStartTime, turnSignalChangeTime; +static struct RtkTime crashGreenRunTime, crashGreenStartTime; static struct drive_timer gearErrorTimePoint; static struct drive_timer gearNSlideTimePoint; static struct drive_timer startCarLeftTurnSignalTime; @@ -106,30 +126,14 @@ static const uint32_t TURN_ERROR_COLD_TIME = D_SEC(10); static bool turnError13Cold, turnError14Cold; -static struct car_on_lane { - int road; - int separate; - int lane; - int direct; // 杞﹂亾鏂瑰悜闄愬埗 - int type; // 瀹炵嚎锛岃櫄绾� -} CurrentLane; + +static lane_t Lane; + static bool laneChanging; static int changeLaneDirect; +static int CrashLineType; - - -typedef struct { - int road; - int sep; - int lane; - int guide; -} lane_t; - -typedef struct { - int edgeIndex; - int pointIndex; - PointF point; -} projection_t; +static map<int, car_sensor_value_t> CarSensorValue; static const int MAX_ENGINE_RPM = 2500; static const double START_CAR_MOVE_DISTANCE = 10.0; @@ -147,7 +151,7 @@ static const int CRL_EDGE_DOTTED = 3; static const int CRL_EDGE_SOLID = 4; -static const double MAX_SPEED = 40.0 * 1000.0 / 3600.0; +static const double MAX_SPEED = 60.0 * 1000.0 / 3600.0; static const int SPEED_GEAR_TABLE[][2] = {{0, 20}, {5, 30}, {15, 40}, {25, 10000}, {35, 10000}}; static int TestRoadStartCar(const car_model *car, double speed, int moveDirect, const struct RtkTime *rtkTime); @@ -158,9 +162,8 @@ static void TurnSignalError13ColdTimer(union sigval sig); static void TurnSignalError14ColdTimer(union sigval sig); static void ReportTurnSignalError(int err, const struct RtkTime *rtkTime); -static bool UpdateLane(struct car_on_lane &out, road_t &road, const car_model *car); -static int CrashRoadLine(road_t &road, const car_model *car); -static void ArrivedRoadEnd(road_t &road, const car_model *car, LIST_CAR_MODEL &CarModelList); + + static trigger_line_t * EntryItem(int index, road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList); static void ClearAll(road_exam_map &map); static bool AllCmp(road_exam_map &map); @@ -174,13 +177,12 @@ { DEBUG("Start road_exam"); - crashGreenCmpTime.hour = -1; occurCrashRedLine = false; occurCrashGreenLine = false; occurOverSpeed = false; occurSecondBreak = false; - checkCrashGreenTimeout = 0; + carIntersectionOfGreenLine = 0; reportTurnSignalError = false; @@ -211,13 +213,15 @@ turnError13Cold = turnError14Cold = true; - CurrentLane.road = CurrentLane.separate = CurrentLane.lane = -1; + Lane.road = Lane.sep = Lane.no = -1; laneChanging = false; changeLaneDirect = 0; nextRoadId = -1; checkTurn = false; ClearAll(RoadMap); + + CrashLineType = -1; ResetOdo(); @@ -489,29 +493,26 @@ /************************************************ * 杞﹁疆鍘嬪疄绾匡紝鍓嶅悗杞翠氦鍙夛紝鍓嶅悗杞抗浜ゅ弶 - * @param mode 1 - 閬撹矾瀹炵嚎/鍒嗛亾瀹炵嚎 2 - 鍒嗛亾铏氱嚎/鍗婂疄鍗婅櫄绾� + * @param currCrashLineType * @param RoadMap * @param car * @param CarModelList * @return */ -static bool CrashRedLine(int mode, int roadIndex, road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList) +static int CrashRedLine(int currCrashLineType, int roadIndex, road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList) { Line frontTireAxle, rearTireAxle; Line frontLeftTireTrack, frontRightTireTrack; Line rearLeftTireTrack, rearRightTireTrack; bool track = false; int lineType = -1; - + PointF p11, p12, p21, p22, p31, p32, p41, p42; MakeLine(&frontTireAxle, &car->carXY[car->left_front_tire[TIRE_OUTSIDE]], &car->carXY[car->right_front_tire[TIRE_OUTSIDE]]); MakeLine(&rearTireAxle, &car->carXY[car->left_rear_tire[TIRE_OUTSIDE]], &car->carXY[car->right_rear_tire[TIRE_OUTSIDE]]); if (CarModelList.size() >= 2) { list<car_model *>::iterator iter = CarModelList.begin(); - - PointF p11, p12, p21, p22, p31, p32, p41, p42; - p11 = ((car_model *)(*iter))->carXY[((car_model *)(*iter))->left_front_tire[TIRE_OUTSIDE]]; p21 = ((car_model *)(*iter))->carXY[((car_model *)(*iter))->right_front_tire[TIRE_OUTSIDE]]; p31 = ((car_model *)(*iter))->carXY[((car_model *)(*iter))->left_rear_tire[TIRE_OUTSIDE]]; @@ -528,7 +529,7 @@ struct RtkTime time2 = ((car_model *)(*iter))->tm; - if (TimeGetDiff(time1.hh, time1.mm, time1.ss, time1.mss, time2.hh, time2.mm, time2.ss, time2.mss) <= D_SEC(1)) { + if (TimeGetDiff(&time1, &time2) <= D_SEC(1)) { MakeLine(&frontLeftTireTrack, &p11, &p12); MakeLine(&frontRightTireTrack, &p21, &p22); MakeLine(&rearLeftTireTrack, &p31, &p32); @@ -635,24 +636,19 @@ } CRASH_LINE_CONFIRM: - if (lineType == LINE_HALF_SOLID_LEFT) { - if (currCrashLineType != LINE_HALF_SOLID_LEFT && track) { - if (IntersectionOfLine(car->carXY[car->right_front_tire[TIRE_OUTSIDE]], redLine) == -1) { - // 闈炴硶璺ㄧ嚎 - } + if (lineType == LINE_HALF_SOLID_LEFT && currCrashLineType != lineType && track) { + if (IntersectionOfLine(p21, redLine) == -1 && IntersectionOfLine(p22, redLine) == 1) { + // 闈炴硶璺ㄧ嚎 + lineType += 100; } - } else if (lineType == LINE_HALF_SOLID_RIGHT) { - if (currCrashLineType != LINE_HALF_SOLID_RIGHT && track) { - if (IntersectionOfLine(car->carXY[car->left_front_tire[TIRE_OUTSIDE]], redLine) == 1) { - // 闈炴硶璺ㄧ嚎 - } + } else if (lineType == LINE_HALF_SOLID_RIGHT && currCrashLineType != lineType && track) { + if (IntersectionOfLine(p11, redLine) == 1 && IntersectionOfLine(p12, redLine) == -1) { + // 闈炴硶璺ㄧ嚎 + lineType += 100; } } - - return false; + return lineType; } - - static int GetGuideDirect(road_exam_map &RoadMap, PointF point, int roadIndex, int sepIndex, int laneNo) { @@ -673,7 +669,7 @@ * @param roadIndex * @return */ -static bool GetLane(lane_t &theLane, PointF point, road_exam_map &RoadMap, int roadIndex) +static bool GetLane(lane_t &lane, PointF point, road_exam_map &RoadMap, int roadIndex) { Line leftProjLine, rightProjLine; Line sep; @@ -694,7 +690,7 @@ char pos; // 鐐瑰湪杞﹂亾鐨勫乏鍙充綅缃� bool operator == (const int &x) { - return(this->lane_no == x); + return (this->lane_no == x); } }; @@ -770,22 +766,65 @@ } } - theLane.road = roadIndex; - theLane.sep = i; - theLane.lane = CLP.size(); + lane.road = roadIndex; + lane.sep = i; + lane.no = CLP.size(); for (int x = 0; x < CLP.size(); ++x) { if (CLP[x].pos == 'L') { - theLane.lane = x; + lane.no = x; break; } } - theLane.guide = GetGuideDirect(RoadMap, p0, theLane.road, theLane.sep, theLane.lane); + lane.guide = GetGuideDirect(RoadMap, p0, lane.road, lane.sep, lane.no); return true; } } return false; +} + +static void WriteCarSensorValue(int name, int value, const struct RtkTime *rtkTime) +{ + car_sensor_value_t nv; + + nv.name = name; + nv.value = value; + nv.time = *rtkTime; + + auto it = CarSensorValue.find(name); + + if (it != CarSensorValue.end()) { + if (it->second.value != value || name == ENGINE_RPM) { + CarSensorValue[name] = nv; + } + } else { + CarSensorValue.insert(pair<int, car_sensor_value_t>(name, nv)); + } +} + +static car_sensor_value_t ReadCarSensorValue(int name) +{ + car_sensor_value_t nv = {.name = -1}; + + auto it = CarSensorValue.find(name); + + if (it != CarSensorValue.end()) { + nv = it->second; + } + + return nv; +} + +static void UpdateCarSensor(const struct RtkTime *rtkTime) +{ + WriteCarSensorValue(TURN_SIGNAL_LAMP, ReadCarStatus(TURN_SIGNAL_LAMP), rtkTime); + WriteCarSensorValue(HAND_BREAK, ReadCarStatus(HAND_BREAK), rtkTime); + WriteCarSensorValue(DOOR, ReadCarStatus(DOOR), rtkTime); + WriteCarSensorValue(ENGINE_RPM, ReadCarStatus(ENGINE_RPM), rtkTime); + WriteCarSensorValue(SECOND_BREAK, ReadCarStatus(SECOND_BREAK), rtkTime); + WriteCarSensorValue(GEAR, ReadCarStatus(GEAR), rtkTime); + WriteCarSensorValue(BREAK, ReadCarStatus(BREAK), rtkTime); } static void TurnSignalError13ColdTimer(union sigval sig) @@ -893,17 +932,119 @@ return startCar; } +static void DetectLine(int roadIndex, road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList, int moveDirect, const struct RtkTime *rtkTime) +{ + static int checkCrashGreenTimeout = 0; + static bool crashDottedLine = false; + int newLineType = CrashRedLine(CrashLineType, roadIndex, RoadMap, car, CarModelList); + + if (newLineType >= 100) { + newLineType -= 100; + DEBUG("闈炴硶璺ㄨ秺鍒嗛亾绾�"); + AddExamFault(11, rtkTime); + } + if (newLineType == LINE_SOLID && CrashLineType != LINE_SOLID) { + // 杞﹁締琛岄┒涓獞杞ц溅閬撲腑蹇冨疄绾挎垨鑰呰溅閬撹竟缂樺疄绾匡紝涓嶅悎鏍� + DEBUG("鎾為亾璺竟缂樼嚎"); + AddExamFault(11, rtkTime); + } + if (newLineType == LINE_DOTTED || newLineType == LINE_HALF_SOLID_LEFT || newLineType == LINE_HALF_SOLID_RIGHT) { + if (!crashDottedLine) { + checkCrashGreenTimeout = 0; + // 璁板綍寮�濮嬪帇绾跨殑鏃堕棿锛屼笉纭畾鏄惁鏈夊彉閬撴剰鍥撅紝寰呯‘璁ゅ彉閬撳悗鍐嶅鐞嗕箣 + crashGreenStartTime = *rtkTime; + } + crashDottedLine = true; + } else { + crashDottedLine = false; + } + + if (crashDottedLine) { + // 鍘嬭櫄绾� + if (moveDirect != 0) { + if (checkCrashGreenTimeout == 0) { + checkCrashGreenTimeout = 1; + crashGreenRunTime = *rtkTime; // 杩愬姩涓帇铏氱嚎鐨勫紑濮嬫椂闂寸偣 + } else if (checkCrashGreenTimeout == 1) { + if (TimeGetDiff(rtkTime, &crashGreenRunTime) >= CRASH_DOTTED_LINE_TIMEOUT) { + DEBUG("闀挎椂闂村帇铏氱嚎"); + checkCrashGreenTimeout = 2; + // 闀挎椂闂撮獞杞ц溅閬撳垎鐣岀嚎琛岄┒锛屼笉鍚堟牸 + AddExamFault(12, rtkTime); + } + } + } else { + // 鍋滆溅灏变笉璁℃椂浜� + checkCrashGreenTimeout = 0; + } + } else { + // 涓嶅啀鍘嬭櫄绾� + checkCrashGreenTimeout = 0; + } + + CrashLineType = newLineType; +} + +int DetectLane(road_exam_map &RoadMap, const car_model *car, int roadIndex, const struct RtkTime *rtkTime) +{ + lane_t newLane; + int gain = 0; + + if (CrashLineType == LINE_DOTTED || CrashLineType == LINE_HALF_SOLID_LEFT || CrashLineType == LINE_HALF_SOLID_RIGHT) { + // 鎺掗櫎璺ㄧ嚎涓� + return 0; + } + if (GetLane(newLane, car->carXY[car->axial[AXIAL_FRONT]], RoadMap, roadIndex)) { + if (newLane.road == Lane.road && newLane.sep == Lane.sep) { + gain = newLane.no - Lane.no; + } + + // 妫�鏌ヨ浆鍚戠伅 + if (gain != 0) { + car_sensor_value_t lamp = ReadCarSensorValue(TURN_SIGNAL_LAMP); + if (lamp.name == TURN_SIGNAL_LAMP) { + if (gain < 0) { + if (lamp.value != LEFT_TURN_LIGHT) { + DEBUG("鍙樿皟鏈墦鐏�!!"); + // 娌℃墦鐏紝涓嶅悎鏍� + ReportTurnSignalError(13, rtkTime); + } else if (TimeGetDiff(&crashGreenStartTime, &lamp.time) >= D_SEC(3)) { + DEBUG("杞悜鐏椂闂翠笉瓒�"); + // 涓嶈冻3绉掞紝涓嶅悎鏍� + reportTurnSignalError = true; + ReportTurnSignalError(14, rtkTime); + } + } else { + if (lamp.value != RIGHT_TURN_LIGHT) { + DEBUG("鍙樿皟鏈墦鐏�!!"); + // 娌℃墦鐏紝涓嶅悎鏍� + ReportTurnSignalError(13, rtkTime); + } else { + DEBUG("杞悜鐏椂闂翠笉瓒�"); + // 涓嶈冻3绉掞紝涓嶅悎鏍� + reportTurnSignalError = true; + ReportTurnSignalError(14, rtkTime); + } + } + } + } + + Lane = newLane; + } + return gain; +} + void TestRoadGeneral(road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime) { uint32_t cts = AppTimer_GetTickCount(); int ri = CalcRoadIndex(-1, RoadMap, car); - bool crash = CrashRedLine(0, 0, RoadMap, car, CarModelList); + bool crash = CrashRedLine(CrashLineType, 0, RoadMap, car, CarModelList); lane_t laneInfo; double redist = -1; laneInfo.road = -1; laneInfo.sep = -1; - laneInfo.lane = -1; + laneInfo.no = -1; if (ri >= 0) { GetLane(laneInfo, car->carXY[car->axial[AXIAL_FRONT]], RoadMap, ri); @@ -919,7 +1060,9 @@ RoadMap.roads[ri].rightEdge); } - DEBUG("褰撳墠閬撹矾绱㈠紩 %d, 瑙﹀彂绾㈢嚎 %d lane %d 璺濈 %f %ld", ri, crash, laneInfo.lane, redist, AppTimer_GetTickCount() - cts); + DEBUG("褰撳墠閬撹矾绱㈠紩 %d, 瑙﹀彂绾㈢嚎 %d lane %d 璺濈 %f %ld", ri, crash, laneInfo.no, redist, AppTimer_GetTickCount() - cts); + + UpdateCarSensor(rtkTime); UpdataOdo(speed, moveDirect, rtkTime); @@ -1076,24 +1219,6 @@ } - // 杞悜鐏鍙� - switch (ReadCarStatus(TURN_SIGNAL_LAMP)) { - case LEFT_TURN_LIGHT: - if (currTurnSignalStatus != LEFT_TURN_LIGHT) { - currTurnSignalStatus = LEFT_TURN_LIGHT; - Rtk2DriveTimer(turnSignalChangeTime, rtkTime); - } - break; - case RIGHT_TURN_LIGHT: - if (currTurnSignalStatus != RIGHT_TURN_LIGHT) { - currTurnSignalStatus = RIGHT_TURN_LIGHT; - Rtk2DriveTimer(turnSignalChangeTime, rtkTime); - } - break; - default: - currTurnSignalStatus = ReadCarStatus(TURN_SIGNAL_LAMP); - break; - } // 妫�娴嬮�氳繃璺彛銆佷汉琛岄亾绛夊尯鍩熸椂锛岄噴鏀惧埞杞︽垨鍑忛�� CheckBreakActive(RoadMap, car, CarModelList, @@ -1102,268 +1227,12 @@ // 妫�娴嬬寮�姝よ矾娈碉紝鍏ㄨ溅闇�涓嶅湪鑼冨洿鍐� currExamMapIndex = CalcRoadIndex(currExamMapIndex, RoadMap, car); + DetectLine(currExamMapIndex, RoadMap, car, CarModelList, moveDirect, rtkTime); + + DetectLane(RoadMap, car, currExamMapIndex, rtkTime); + // 妫�娴嬪帇绾跨姸鎬� - bool crashRedLineNow = false; - bool crashGreenLineNow = false; - if (currExamMapIndex >= 0) { - int crl = CrashRoadLine(RoadMap.roads[currExamMapIndex], car); - - if (crl == CRL_NONE) { -// DEBUG("浠�涔堥兘娌″帇"); - } else if (crl == CRL_SEP_DOTTED) { - DEBUG("鍘嬪垎閬撹櫄绾�"); - crashGreenLineNow = true; - } else if (crl == CRL_SEP_SOLID) { - DEBUG("鍘嬪垎閬撳疄绾�"); - crashRedLineNow = true; - } else if (crl == CRL_EDGE_DOTTED) { - DEBUG("鍘嬭竟娌胯櫄绾�"); - crashGreenLineNow = true; - } else if (crl == CRL_EDGE_SOLID) { - DEBUG("鍘嬭竟娌垮疄绾�"); - crashRedLineNow = true; - } - - // 妫�鏌ュ綋鍓嶈溅閬� - struct car_on_lane lane; - - if (UpdateLane(lane, RoadMap.roads[currExamMapIndex], car)) { - - if (lane.road == CurrentLane.road && lane.separate == CurrentLane.separate && - lane.lane == CurrentLane.lane) { - laneChanging = false; - } - - if (lane.road == CurrentLane.road && lane.separate == CurrentLane.separate && - lane.lane != CurrentLane.lane) { - if (crl == CRL_SEP_DOTTED) { - // 鍙橀亾杩涜涓� - if (!laneChanging) { - laneChanging = true; - DEBUG("鍙戠敓鍙橀亾"); - // 姣旇緝涓婃璺ㄧ嚎鏃堕棿 - if (crashGreenCmpTime.hour >= 0) { - uint32_t diff = TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, - rtkTime->mss * 10, - crashGreenCmpTime.hour, - crashGreenCmpTime.min, - crashGreenCmpTime.sec, - crashGreenCmpTime.msec * 10); - int laneDirect = 0; - - if (CurrentLane.lane > lane.lane) { - laneDirect = -1; - } else { - laneDirect = 1; - } - - if (diff < CHANGE_LANE_MIN_INTERVAL && laneDirect == changeLaneDirect) { - DEBUG("===================== 杩炵画鍙橀亾 %d -> %d ============", CurrentLane.lane, lane.lane); - // 杩炵画鍙橀亾锛屼笉鍚堟牸 - AddExamFault(15, rtkTime); - } - } - - // 妫�鏌ュ彉閬撳墠锛屾槸鍚︽彁鍓嶈浆鍚戠伅 - if (lane.lane < CurrentLane.lane) { - // 鍚戝乏渚у彉閬� - DEBUG("鍚戝乏渚у彉閬�"); - if (currTurnSignalStatus != LEFT_TURN_LIGHT) { - DEBUG("鍙樿皟鏈墦鐏�!!"); - // 娌℃墦鐏紝涓嶅悎鏍� - ReportTurnSignalError(13, rtkTime); - } else if (TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, - rtkTime->mss * 10, - turnSignalChangeTime.hour, - turnSignalChangeTime.min, - turnSignalChangeTime.sec, - turnSignalChangeTime.msec * 10) < - TURN_SIGNAL_LAMP_ADVANCE) { - if (!reportTurnSignalError) { - DEBUG("杞悜鐏椂闂翠笉瓒�"); - // 涓嶈冻3绉掞紝涓嶅悎鏍� - reportTurnSignalError = true; - ReportTurnSignalError(14, rtkTime); - } - } - } else { - // 鍚戝彸渚у彉閬� - DEBUG("鍚戝彸渚у彉閬�"); - if (currTurnSignalStatus != RIGHT_TURN_LIGHT) { - DEBUG("鍙樿皟鏈墦鐏�!!"); - // 娌℃墦鐏紝涓嶅悎鏍� - ReportTurnSignalError(13, rtkTime); - } else if (TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, - rtkTime->mss * 10, - turnSignalChangeTime.hour, - turnSignalChangeTime.min, - turnSignalChangeTime.sec, - turnSignalChangeTime.msec * 10) < - TURN_SIGNAL_LAMP_ADVANCE) { - if (!reportTurnSignalError) { - DEBUG("杞悜鐏椂闂翠笉瓒�"); - // 涓嶈冻3绉掞紝涓嶅悎鏍� - reportTurnSignalError = true; - ReportTurnSignalError(14, rtkTime); - } - } - } - } - } else { - // 鍙橀亾瀹屾垚 - DEBUG("鍙橀亾瀹屾垚 %d -> %d", CurrentLane.lane, lane.lane); - - if (currRoadItem != NULL && currRoadItem->active == ROAD_ITEM_CHANGE_LANE) { - DEBUG("鍙樻洿杞﹂亾椤圭洰瀹屾垚"); - currRoadItem = NULL; - PlayTTS("瀹屾垚鍙橀亾"); - } else if (currRoadItem != NULL && currRoadItem->active == ROAD_ITEM_OVERTAKE) { - if (CurrentLane.lane > lane.lane) { - DEBUG("瓒呰溅鍙橀亾瀹屾垚"); - overtake = true; - Rtk2DriveTimer(overTakeCmpTime, rtkTime); - PlayTTS("瀹屾垚瓒呰溅"); - } else { - DEBUG("鍙抽亾瓒呰溅锛岄敊璇�"); - AddExamFault(3, rtkTime); - currRoadItem = NULL; - } - } - - if (CurrentLane.lane > lane.lane) { - changeLaneDirect = -1; - } else { - changeLaneDirect = 1; - } - - CurrentLane = lane; - laneChanging = false; - // 璁板綍鏈鍙橀亾鏃堕棿鐐� - Rtk2DriveTimer(crashGreenCmpTime, rtkTime); - } - } - - if (lane.road != CurrentLane.road || lane.separate != CurrentLane.separate || lane.direct != CurrentLane.direct) { - // 璺垨娈靛彉鏇达紝鎾ら攢鍙橀亾璺熻釜 - DEBUG("============== 璺垨娈靛彉鏇� CURR %d, %d dir %d NEW %d, %d, dir %d", CurrentLane.road, - CurrentLane.separate, CurrentLane.direct, - lane.road, lane.separate, lane.direct); - - CurrentLane = lane; - laneChanging = false; - } - - if (CurrentLane.direct != 0 && !(CurrentLane.direct & RoadMap.roads[currExamMapIndex].active)) { - if (!RoadMap.roads[currExamMapIndex].errorLane) { - RoadMap.roads[currExamMapIndex].errorLane = true; - DEBUG("涓嶆寜瑙勫畾杞﹂亾鏍囩嚎鏂瑰悜琛岄┒ <%d> %d %d", RoadMap.roads[currExamMapIndex].id, CurrentLane.direct, RoadMap.roads[currExamMapIndex].active); - AddExamFault(9, rtkTime); - } - } - } - - ArrivedRoadEnd(RoadMap.roads[currExamMapIndex], car, CarModelList); - -// if (CrashTheLine(RoadMap.roads[currExamMapIndex].stopLine, car, CarModelList)) { -// DEBUG("涓嬩竴涓洰鏍囪矾 id = %d", RoadMap.roads[currExamMapIndex].targetRoad); -// nextRoadId = RoadMap.roads[currExamMapIndex].targetRoad; -// checkTurn = true; -// } - - if (checkTurn) { - // 妫�鏌ユ槸鍚︽寔缁浆鍚� - char turnDirect = CheckCarTurn(CarModelList); - if (turnDirect == 'L') { -// PlayTTS("宸�1"); - if (currTurnSignalStatus != LEFT_TURN_LIGHT) { - if (!reportTurnSignalError) { - DEBUG("娌℃墦宸﹁浆鐏�"); - // 娌℃墦宸﹁浆鐏紝涓嶅悎鏍� - reportTurnSignalError = true; - ReportTurnSignalError(13, rtkTime); - } - } else if (TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10, - turnSignalChangeTime.hour, turnSignalChangeTime.min, turnSignalChangeTime.sec, turnSignalChangeTime.msec*10) < TURN_SIGNAL_LAMP_ADVANCE) { - if (!reportTurnSignalError) { - DEBUG("杞悜鐏椂闂翠笉瓒�"); - // 涓嶈冻3绉掞紝涓嶅悎鏍� - reportTurnSignalError = true; - ReportTurnSignalError(14, rtkTime); - } - } - } else if (turnDirect == 'R') { -// PlayTTS("鍙�1"); - if (currTurnSignalStatus != RIGHT_TURN_LIGHT) { - if (!reportTurnSignalError) { - DEBUG("娌℃墦鍙宠浆鐏�"); - // 娌℃墦鍙宠浆鐏紝涓嶅悎鏍� - reportTurnSignalError = true; - ReportTurnSignalError(13, rtkTime); - } - } else if (TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10, - turnSignalChangeTime.hour, turnSignalChangeTime.min, turnSignalChangeTime.sec, turnSignalChangeTime.msec*10) < TURN_SIGNAL_LAMP_ADVANCE) { - if (!reportTurnSignalError) { - DEBUG("杞悜鐏椂闂翠笉瓒�"); - // 涓嶈冻3绉掞紝涓嶅悎鏍� - reportTurnSignalError = true; - ReportTurnSignalError(14, rtkTime); - } - } - } else { - reportTurnSignalError = false; - } - } - } - - // 鎾炵孩绾� - if (crashRedLineNow) { - if (!occurCrashRedLine) { - // 杞﹁締琛岄┒涓獞杞ц溅閬撲腑蹇冨疄绾挎垨鑰呰溅閬撹竟缂樺疄绾匡紝涓嶅悎鏍� - DEBUG("鎾為亾璺竟缂樼嚎"); - AddExamFault(11, rtkTime); - occurCrashRedLine = true; - } - } else { - occurCrashRedLine = false; - } - - // 鍘嬭櫄绾� - if (crashGreenLineNow) { - // 鍘嬭櫄绾� - if (moveDirect != 0) { - if (checkCrashGreenTimeout == 0) { - checkCrashGreenTimeout = 1; - Rtk2DriveTimer(crashGreenRunTime, rtkTime); // 杩愬姩涓帇铏氱嚎鐨勫紑濮嬫椂闂寸偣 - } else if (checkCrashGreenTimeout == 1) { - uint32_t diff = TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10, - crashGreenRunTime.hour, crashGreenRunTime.min, crashGreenRunTime.sec, crashGreenRunTime.msec*10); - - if (diff >= CRASH_DOTTED_LINE_TIMEOUT) { - DEBUG("闀挎椂闂村帇铏氱嚎"); - checkCrashGreenTimeout = 2; - // 闀挎椂闂撮獞杞ц溅閬撳垎鐣岀嚎琛岄┒锛屼笉鍚堟牸 - AddExamFault(12, rtkTime); - } - } - } else { - // 鍋滆溅灏变笉璁℃椂浜� - checkCrashGreenTimeout = 0; - } - - // 妫�娴嬪綋鍓嶈溅杈嗕簬铏氱嚎鐨勪綅缃紝鍋氬彉閬撴娴�; - // 妫�娴嬫槸鍚�3绉掑墠鏈夊紑鍚搴斾箣杞悜鐏� - if (!occurCrashGreenLine) { - occurCrashGreenLine = true; - // 璁板綍寮�濮嬪帇绾跨殑鏃堕棿锛屼笉纭畾鏄惁鏈夊彉閬撴剰鍥撅紝寰呯‘璁ゅ彉閬撳悗鍐嶅鐞嗕箣 - Rtk2DriveTimer(crashGreenStartTime, rtkTime); - turnSignalStatusWhenCrashGreenLine = currTurnSignalStatus; - } - } else { - // 涓嶅啀鍘嬭櫄绾� - occurCrashGreenLine = false; - checkCrashGreenTimeout = 0; - } TestRoadStartCar(car, speed, moveDirect, rtkTime); @@ -1432,274 +1301,6 @@ } } } -} - -/************************************************************* - * 妫�娴嬪綋鍓嶈溅閬擄紝浠ヨ溅澶翠腑鐐逛负鍩哄噯 - * @param road - * @param car - */ -static bool UpdateLane(struct car_on_lane &out, road_t &road, const car_model *car) -{ - bool leftExt = false, rightExt = false; - Line leftExtLine, rightExtLine; - struct car_on_lane lane; - - for (int i = 0; i < road.leftEdge.size(); ++i) { - PointF p1, p2; - Line edge; - - p1 = road.leftEdge[i].points[0]; - for (int j = 1; j < road.leftEdge[i].points.size(); ++j) { - p2 = road.leftEdge[i].points[j]; - MakeLine(&edge, &p1, &p2); - - PointF vp; - if (VerticalPointOnLine(car->carXY[car->axial[AXIAL_FRONT]], edge, vp)) { - leftExt = true; - MakeLine(&leftExtLine, &car->carXY[car->axial[AXIAL_FRONT]], &vp); - goto LEFT_EXT_CMP; - } - p1 = p2; - } - } -LEFT_EXT_CMP: - for (int i = 0; i < road.rightEdge.size(); ++i) { - PointF p1, p2; - Line edge; - - p1 = road.rightEdge[i].points[0]; - for (int j = 1; j < road.rightEdge[i].points.size(); ++j) { - p2 = road.rightEdge[i].points[j]; - MakeLine(&edge, &p1, &p2); - - PointF vp; - if (VerticalPointOnLine(car->carXY[car->axial[AXIAL_FRONT]], edge, vp)) { - rightExt = true; - MakeLine(&rightExtLine, &car->carXY[car->axial[AXIAL_FRONT]], &vp); - goto RIGHT_EXT_CMP; - } else { -// DEBUG("鍙充晶涓嶅瀭鐐� %d p1(%f,%f) p2(%f,%f) (%f,%f)", j, p1.X, p1.Y, p2.X, p2.Y, vp.X, vp.Y); - } - p1 = p2; - } - } -RIGHT_EXT_CMP: - - if (!leftExt || !rightExt) { - DEBUG("宸﹀彸杈圭晫涓嶅尮閰�"); - return false; - } - - bool orthogonalInSegment = false; - - for (int i = 0; i < road.separate.size(); ++i) { // 娈� - PointF p1, p2; - Line sep; - - map<int, vector<int>> orthogonal; - - // 涓�娈靛垎閬撶粍鍐咃紝鏈変竴鏉℃浜わ紝灏卞繀椤讳繚璇佸悓缁勭殑鍏ㄩ兘姝d氦锛屽惁鍒欑洿鎺ラ��鍑� - for (int j = 0; j < road.separate[i].lines.size(); ++j) { // 绾跨粍 - bool intersection = false; - - for (int k = 0; !intersection && k < road.separate[i].lines[j].size(); ++k) { // 鑺� - - p1 = road.separate[i].lines[j][k].points[0]; - for (int m = 1; m < road.separate[i].lines[j][k].points.size(); ++m) { - p2 = road.separate[i].lines[j][k].points[m]; - MakeLine(&sep, &p1, &p2); - - if (IntersectionOf(leftExtLine, sep) == GM_Intersection) { - vector<int> stor(4); - - stor[0] = 1; - stor[1] = road.separate[i].lines[j][k].character; - stor[2] = road.separate[i].lines[j][k].left_lane_direct; - stor[3] = road.separate[i].lines[j][k].right_lane_direct; - - orthogonal.insert(pair<int, vector<int>>(j, stor)); - orthogonalInSegment = true; - intersection = true; - - break; - } else if (IntersectionOf(rightExtLine, sep) == GM_Intersection) { - vector<int> stor(4); - - stor[0] = 2; - stor[1] = road.separate[i].lines[j][k].character; - stor[2] = road.separate[i].lines[j][k].left_lane_direct; - stor[3] = road.separate[i].lines[j][k].right_lane_direct; - - orthogonal.insert(pair<int, vector<int>>(j, stor)); - orthogonalInSegment = true; - intersection = true; - - break; - } - p1 = p2; - } - } - } -// DEBUG("鐩爣 %d 褰撳墠 %d", road.separate[i].lines.size(), orthogonal.size()); - - if (orthogonal.size() > 0) { - if (orthogonal.size() == road.separate[i].lines.size()) { - // 寰楀埌褰撳墠鍦ㄧ鍑犱釜杞﹂亾 - int x = 0; - int left_char = LINE_SOLID; // 閬撹矾宸﹁竟绾� - int right_direct = 0; - - for (x = 0; x < orthogonal.size(); ++x) { - auto itx = orthogonal.find(x); - if (itx != orthogonal.end()) { - if (itx->second[0] != 1) { // 鍦ㄨ溅杈嗗彸渚� - lane.road = road.id; - lane.separate = i; - lane.lane = itx->first; - -// DEBUG("left_char %d second %d", left_char, itx->second[1]); - - if ((left_char == LINE_SOLID || left_char == LINE_HALF_SOLID_RIGHT) && - (itx->second[1] == LINE_SOLID || itx->second[1] == LINE_HALF_SOLID_LEFT)) // 杞﹂亾宸﹀彸鍧囨槸瀹炵嚎 - lane.direct = itx->second[2]; - else - lane.direct = 0; -// DEBUG("璺� %d 娈� %d 杞﹂亾 %d 闄愬畾 %d", lane.road, lane.separate, lane.lane, lane.direct); - break; - } else { - right_direct = itx->second[3]; - left_char = itx->second[2]; - } - } - } - if (x >= orthogonal.size()) { - lane.road = road.id; - lane.separate = i; - lane.lane = orthogonal.size(); - -// DEBUG("left_char %d right_direct %d", left_char, right_direct); - - // 鏈�鍚庤溅閬撶殑鍙充晶闄愬畾 - if (left_char == LINE_SOLID || left_char == LINE_HALF_SOLID_RIGHT) - lane.direct = right_direct; - else - lane.direct = 0; -// DEBUG("璺� %d 娈� %d 杞﹂亾 %d 闄愬畾 %d", lane.road, lane.separate, lane.lane, lane.direct); - } - out = lane; - return true; - } else { - // 涓嶅畬鍏ㄦ浜わ紝鐩存帴閫�鍑� - } - DEBUG("鍒嗛亾绾块暱鐭笉鍚岋紝閫�鍑�"); - return false; - } - } - DEBUG("娈靛尮閰嶅け璐�"); - return false; -} - -/************************************************************************* - * 纰拌Е杞﹂亾绾垮瀷 - * @param road - * @param car - */ -static int CrashRoadLine(road_t &road, const car_model *car) -{ - 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]]); - - // 妫�鏌ラ亾璺竟缂� - for (int i = 0; i < road.leftEdge.size(); ++i) { - PointF p1, p2; - Line edge; - - p1 = road.leftEdge[i].points[0]; - for (int j = 1; j < road.leftEdge[i].points.size(); ++j) { - p2 = road.leftEdge[i].points[j]; - MakeLine(&edge, &p1, &p2); - - if (IntersectionOf(edge, frontAxle) == GM_Intersection || - IntersectionOf(edge, rearAxle) == GM_Intersection) { - // 鍘嬮亾璺乏杈圭嚎 - if (road.leftEdge[i].character != LINE_SOLID) { - return CRL_EDGE_DOTTED; - } - return CRL_EDGE_SOLID; - } - p1 = p2; - } - } - - for (int i = 0; i < road.rightEdge.size(); ++i) { - PointF p1, p2; - Line edge; - - p1 = road.rightEdge[i].points[0]; - for (int j = 1; j < road.rightEdge[i].points.size(); ++j) { - p2 = road.rightEdge[i].points[j]; - MakeLine(&edge, &p1, &p2); - - if (IntersectionOf(edge, frontAxle) == GM_Intersection || - IntersectionOf(edge, rearAxle) == GM_Intersection) { - // 鍘嬮亾璺彸杈圭嚎 - if (road.rightEdge[i].character != LINE_SOLID) { - return CRL_EDGE_DOTTED; - } - return CRL_EDGE_SOLID; - } - p1 = p2; - } - } - - // 妫�鏌ュ垎閬撶嚎 - for (int i = 0; i < road.separate.size(); ++i) { - // 娈� - PointF p1, p2; - Line sep; - - for (int j = 0; j < road.separate[i].lines.size(); ++j) { - // 绾� - for (int k = 0; k < road.separate[i].lines[j].size(); ++k) { - // 鑺� - p1 = road.separate[i].lines[j][k].points[0]; - - for (int m = 1; m < road.separate[i].lines[j][k].points.size(); ++m) { - p2 = road.separate[i].lines[j][k].points[m]; - MakeLine(&sep, &p1, &p2); - - if (IntersectionOf(sep, frontAxle) == GM_Intersection || - IntersectionOf(sep, rearAxle) == GM_Intersection) { - // 妫�鏌ラ亾璺垎闅旂嚎绫诲瀷 - if (road.separate[i].lines[j][k].character == LINE_DOTTED) { - // 鍘嬭櫄绾� - return CRL_SEP_DOTTED; - } else if (road.separate[i].lines[j][k].character == LINE_SOLID) { - // 鍘嬪疄绾� - return CRL_SEP_SOLID; - } else if (road.separate[i].lines[j][k].character == LINE_HALF_SOLID_LEFT) { - if (LaneIsValid(CurrentLane) && CurrentLane.lane <= j) { - return CRL_SEP_SOLID; - } - return CRL_SEP_DOTTED; - } else if (road.separate[i].lines[j][k].character == LINE_HALF_SOLID_RIGHT) { - if (LaneIsValid(CurrentLane) && CurrentLane.lane > j) { - return CRL_SEP_SOLID; - } - return CRL_SEP_DOTTED; - } - } - - p1 = p2; - } - } - } - } - - return CRL_NONE; } void Rtk2DriveTimer(struct drive_timer &tm, const struct RtkTime *rtkTime) @@ -2006,17 +1607,17 @@ */ static void ClearAll(road_exam_map &map) { - for (int i = 0; i < map.roads.size(); ++i) { - map.roads[i].activeStop = map.roads[i].activeBreak = false; - map.roads[i].arrivedTail = false; - map.roads[i].errorLane = false; - } - for (int i = 0; i < map.specialAreas.size(); i++) { - map.specialAreas[i].overSpeed = map.specialAreas[i].activeBreak = false; - } - for (int i = 0; i < map.triggerLines.size(); ++i) { - map.triggerLines[i].cmp = false; - } +// for (int i = 0; i < map.roads.size(); ++i) { +// map.roads[i].activeStop = map.roads[i].activeBreak = false; +// map.roads[i].arrivedTail = false; +// map.roads[i].errorLane = false; +// } +// for (int i = 0; i < map.specialAreas.size(); i++) { +// map.specialAreas[i].overSpeed = map.specialAreas[i].activeBreak = false; +// } +// for (int i = 0; i < map.triggerLines.size(); ++i) { +// map.triggerLines[i].cmp = false; +// } } static void CheckBreakActive(road_exam_map &map, const car_model *car, LIST_CAR_MODEL &CarModelList, -- Gitblit v1.8.0