From 372659e4d884f390f2f5031c55ba7b3fa9fd5912 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期四, 13 八月 2020 18:21:13 +0800
Subject: [PATCH] 坐标
---
lib/src/main/cpp/test_items2/road_exam.cpp | 412 ++++++++++++++++++++++++++++++++++++----------------------
1 files changed, 257 insertions(+), 155 deletions(-)
diff --git a/lib/src/main/cpp/test_items2/road_exam.cpp b/lib/src/main/cpp/test_items2/road_exam.cpp
index e476e9a..d75355d 100644
--- a/lib/src/main/cpp/test_items2/road_exam.cpp
+++ b/lib/src/main/cpp/test_items2/road_exam.cpp
@@ -42,6 +42,11 @@
STOP_CAR_DONE
};
+enum {
+ CROSSING_NOT_HINT,
+ CROSSING_HAS_HINT,
+};
+
typedef struct {
int road;
int sep;
@@ -61,6 +66,11 @@
int value;
struct RtkTime time;
} car_sensor_value_t;
+
+typedef struct {
+ int gain;
+ struct RtkTime time;
+} change_lane_t;
static const int INVALID_ROAD = -1;
@@ -103,6 +113,7 @@
static bool startCarLeftTurnSignal, checkStartCarSignal;
static struct RtkTime crashGreenRunTime, crashGreenStartTime;
+
static struct drive_timer gearErrorTimePoint;
static struct drive_timer gearNSlideTimePoint;
static struct drive_timer startCarLeftTurnSignalTime;
@@ -123,17 +134,13 @@
static bool handBreakActive = false;
static bool reportRPMOver = false;
-static const uint32_t TURN_ERROR_COLD_TIME = D_SEC(10);
-
-static bool turnError13Cold, turnError14Cold;
-
static lane_t Lane;
+static change_lane_t ChangeLane;
-static bool laneChanging;
-static int changeLaneDirect;
static int CrashLineType;
static map<int, car_sensor_value_t> CarSensorValue;
+static map<int, int> CrossingHint;
static const int MAX_ENGINE_RPM = 2500;
static const double START_CAR_MOVE_DISTANCE = 10.0;
@@ -158,10 +165,6 @@
static char isTurn(int currYaw, int prevYaw, int &ang);
static char CheckCarTurn(LIST_CAR_MODEL &CarModelList);
-
-static void TurnSignalError13ColdTimer(union sigval sig);
-static void TurnSignalError14ColdTimer(union sigval sig);
-static void ReportTurnSignalError(int err, const struct RtkTime *rtkTime);
static trigger_line_t * EntryItem(int index, road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList);
@@ -211,11 +214,7 @@
checkStartCarSignal = startCarLeftTurnSignal = false;
- turnError13Cold = turnError14Cold = true;
-
Lane.road = Lane.sep = Lane.no = -1;
- laneChanging = false;
- changeLaneDirect = 0;
nextRoadId = -1;
checkTurn = false;
@@ -234,9 +233,6 @@
TerminateStopCarExam();
TerminateOperateGearExam();
TerminateDriveStraightExam();
-
- AppTimer_delete(TurnSignalError13ColdTimer);
- AppTimer_delete(TurnSignalError14ColdTimer);
}
/*********************************************************************
@@ -598,10 +594,16 @@
}
// 鍒嗛亾瀹炵嚎
+// DEBUG("%d 鍒嗛亾娈� %d", n, RoadMap.roads[n].separate.size());
+
for (int m = 0; m < RoadMap.roads[n].separate.size(); ++m) {
// 涓�缁勮溅閬�
+// DEBUG("%d %d 杞﹂亾鏁� %d", n, m, RoadMap.roads[n].separate[m].lines.size());
+
for (int l = 0; l < RoadMap.roads[n].separate[m].lines.size(); ++l) {
// 澶氭牴鍒嗛亾绾�
+
+// DEBUG("%d %d %d 绾挎鏍� %d", n, m, l, RoadMap.roads[n].separate[m].lines[l].size());
for (int a = 0; a < RoadMap.roads[n].separate[m].lines[l].size(); ++a) {
// 涓�鏍瑰垎閬撶嚎涓嚎鍨嬬浉鍚岀殑
int character = RoadMap.roads[n].separate[m].lines[l][a].character;
@@ -827,39 +829,6 @@
WriteCarSensorValue(BREAK, ReadCarStatus(BREAK), rtkTime);
}
-static void TurnSignalError13ColdTimer(union sigval sig)
-{
- AppTimer_delete(TurnSignalError13ColdTimer);
-
- turnError13Cold = true;
-}
-
-static void TurnSignalError14ColdTimer(union sigval sig)
-{
- AppTimer_delete(TurnSignalError14ColdTimer);
-
- turnError14Cold = true;
-}
-
-static void ReportTurnSignalError(int err, const struct RtkTime *rtkTime)
-{
- if (err == 13 && turnError13Cold) {
- DEBUG("璧锋涓嶅紑杞悜鐏�");
- AddExamFault(13, rtkTime);
-
- turnError13Cold = false;
- AppTimer_delete(TurnSignalError13ColdTimer);
- AppTimer_add(TurnSignalError13ColdTimer, TURN_ERROR_COLD_TIME);
- } else if (err == 14 && turnError14Cold) {
- DEBUG("璧锋杞悜鐏笉瓒�3绉�");
- AddExamFault(14, rtkTime);
-
- turnError14Cold = false;
- AppTimer_delete(TurnSignalError14ColdTimer);
- AppTimer_add(TurnSignalError14ColdTimer, TURN_ERROR_COLD_TIME);
- }
-}
-
static int TestRoadStartCar(const car_model *car, double speed, int moveDirect, const struct RtkTime *rtkTime)
{
double moveDistance;
@@ -882,10 +851,10 @@
if (!checkStartCarSignal && moveDirect == 1) {
checkStartCarSignal = true;
if (!startCarLeftTurnSignal) {
- ReportTurnSignalError(13, rtkTime);
+ AddExamFault(13, rtkTime);
} else if (TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10,
startCarLeftTurnSignalTime.hour, startCarLeftTurnSignalTime.min, startCarLeftTurnSignalTime.sec, startCarLeftTurnSignalTime.msec*10) < TURN_SIGNAL_LAMP_ADVANCE) {
- ReportTurnSignalError(14, rtkTime);
+ AddExamFault(14, rtkTime);
}
}
@@ -997,36 +966,46 @@
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;
+ } else {
+ ChangeLane.gain = 0;
}
// 妫�鏌ヨ浆鍚戠伅
if (gain != 0) {
+ DEBUG("鍙橀亾 gain %d", gain);
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);
+ AddExamFault(13, rtkTime);
} else if (TimeGetDiff(&crashGreenStartTime, &lamp.time) >= D_SEC(3)) {
DEBUG("杞悜鐏椂闂翠笉瓒�");
// 涓嶈冻3绉掞紝涓嶅悎鏍�
reportTurnSignalError = true;
- ReportTurnSignalError(14, rtkTime);
+ AddExamFault(14, rtkTime);
}
} else {
if (lamp.value != RIGHT_TURN_LIGHT) {
DEBUG("鍙樿皟鏈墦鐏�!!");
// 娌℃墦鐏紝涓嶅悎鏍�
- ReportTurnSignalError(13, rtkTime);
- } else {
+ AddExamFault(13, rtkTime);
+ } else if (TimeGetDiff(&crashGreenStartTime, &lamp.time) >= D_SEC(3)) {
DEBUG("杞悜鐏椂闂翠笉瓒�");
// 涓嶈冻3绉掞紝涓嶅悎鏍�
reportTurnSignalError = true;
- ReportTurnSignalError(14, rtkTime);
+ AddExamFault(14, rtkTime);
}
}
}
+
+ if (((ChangeLane.gain < 0 && gain < 0) || (ChangeLane.gain > 0 && gain > 0)) && TimeGetDiff(rtkTime, &ChangeLane.time) < CHANGE_LANE_MIN_INTERVAL) {
+ DEBUG("杩炵画鍙橀亾");
+ AddExamFault(15, rtkTime);
+ }
+ ChangeLane.gain = gain;
+ ChangeLane.time = *rtkTime;
}
Lane = newLane;
@@ -1034,33 +1013,222 @@
return gain;
}
-void TestRoadGeneral(road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime)
+static void ChangeCrossingStatus(int roadIndex, int index, int status)
{
- uint32_t cts = AppTimer_GetTickCount();
- int ri = CalcRoadIndex(-1, RoadMap, car);
- bool crash = CrashRedLine(CrashLineType, 0, RoadMap, car, CarModelList);
- lane_t laneInfo;
- double redist = -1;
+ int key = roadIndex * 100 + index;
- laneInfo.road = -1;
- laneInfo.sep = -1;
- laneInfo.no = -1;
+ auto it = CrossingHint.find(key);
- if (ri >= 0) {
- GetLane(laneInfo, car->carXY[car->axial[AXIAL_FRONT]], RoadMap, ri);
+ if (it != CrossingHint.end()) {
+ CrossingHint.erase(it);
+ }
+ CrossingHint.insert(pair<int, int>(key, status));
+}
- int m = RoadMap.roads[ri].rightEdge.size();
- int n = RoadMap.roads[ri].rightEdge[m-1].points.size();
+static int GetCrossingStatus(int roadIndex, int index)
+{
+ int key = roadIndex * 100 + index;
- PointF base;
+ auto it = CrossingHint.find(key);
- base.X = 428922.2985; base.Y = 3292119.5457;
+ if (it != CrossingHint.end()) {
+ return it->second;
+ }
+ return CROSSING_NOT_HINT;
+}
- redist = CalcDistanceReference(car->carXY[car->axial[AXIAL_FRONT]], base,
- RoadMap.roads[ri].rightEdge);
+static void HintCrossing(int roadIndex, road_t &road, const car_model *car, LIST_CAR_MODEL &CarModelList)
+{
+ for (int i = 0; i < road.stopLine.size(); ++i) {
+ PointF point;
+ double distance;
+
+ point.X = road.stopLine[i].line.X1;
+ point.Y = road.stopLine[i].line.Y1;
+
+ distance = CalcDistanceReference(car->carXY[car->axial[AXIAL_FRONT]], point, road.rightEdge);
+
+ if (distance > 10 && distance < 50) {
+ // 鎻愮ず璺彛鎬庝箞璧�
+ if (GetCrossingStatus(roadIndex, i) == CROSSING_NOT_HINT) {
+ if (!road.stopLine[i].tts.empty()) {
+ DEBUG("璺彛鎻愮ず %s", road.stopLine[i].tts.c_str());
+ PlayTTS(road.stopLine[i].tts.c_str());
+ }
+ ChangeCrossingStatus(roadIndex, i, CROSSING_HAS_HINT);
+ }
+ } else if (distance > 55 && GetCrossingStatus(roadIndex, i) != CROSSING_NOT_HINT) {
+ ChangeCrossingStatus(roadIndex, i, CROSSING_NOT_HINT);
+ }
+ }
+}
+
+static map <int, int> TargetReduceRec;
+
+enum {
+ NOT_REDUCE_SPEED,
+ REDUCE_SPEED,
+ STOP_CAR,
+ OVER_SPEED
+};
+
+static void ChangeTargetReduceRec(int roadIndex, int index, int status)
+{
+ int key = roadIndex * 100 + index;
+
+ auto it = CrossingHint.find(key);
+
+ if (it != CrossingHint.end()) {
+ CrossingHint.erase(it);
+ }
+ CrossingHint.insert(pair<int, int>(key, status));
+}
+
+static int GetTargetReduceRec(int roadIndex, int index)
+{
+ int key = roadIndex * 100 + index;
+
+ auto it = CrossingHint.find(key);
+
+ if (it != CrossingHint.end()) {
+ return it->second;
+ }
+ return -1;
+}
+
+void ApproachTarget(road_exam_map &RoadMap, const car_model *car, int roadIndex, double speed, int moveDirect)
+{
+ car_sensor_value_t brk = ReadCarSensorValue(BREAK);
+
+ if (roadIndex < 0 || roadIndex >= RoadMap.roads.size())
+ return;
+
+ for (int n = 0; n < RoadMap.roads[roadIndex].stopLine.size(); ++n) {
+ PointF point;
+ double distance;
+
+ point.X = road.stopLine[i].line.X1;
+ point.Y = road.stopLine[i].line.Y1;
+
+ distance = CalcDistanceReference(car->carXY[car->axial[AXIAL_FRONT]], point, RoadMap.roads[roadIndex].rightEdge);
+
+ if (distance > 1e-3 && distance < LASTEST_BREAK_POINT) {
+ // 璁板綍鍒硅溅锛屽仠杞�
+ if (brk.value == BREAK_ACTIVE) {
+
+ }
+ } else if (distance > LASTEST_BREAK_POINT + 5) {
+
+ }
}
- DEBUG("褰撳墠閬撹矾绱㈠紩 %d, 瑙﹀彂绾㈢嚎 %d lane %d 璺濈 %f %ld", ri, crash, laneInfo.no, redist, AppTimer_GetTickCount() - cts);
+ for (int i = 0; i < RoadMap.specialAreas.size(); i++) {
+ if (RoadMap.specialAreas[i].type == GRID_AREA || RoadMap.specialAreas[i].road != RoadMap.roads[roadIndex].id)
+ continue;
+
+ if (map.specialAreas[i].area.size() == 2 && map.specialAreas[i].leftPoints.size() != 2) {
+ // 璁$畻鐐瑰埌宸︿晶璺竟绾跨殑鍨傜偣
+ int road = 0;
+ for (road = 0; road < map.roads.size(); ++road) {
+ if (map.roads[road].id == map.specialAreas[i].road)
+ break;
+ }
+
+ PointF vPoint = CalcProjectionWithRoadEdge(map.roads[road].leftEdge, map.specialAreas[i].area[0]);
+// DEBUG("璁$畻鍨傜偣1 (%f, %f)", vPoint.X, vPoint.Y);
+
+ map.specialAreas[i].leftPoints.push_back(vPoint);
+
+ vPoint = CalcProjectionWithRoadEdge(map.roads[road].leftEdge, map.specialAreas[i].area[1]);
+// DEBUG("璁$畻鍨傜偣2 (%f, %f)", vPoint.X, vPoint.Y);
+ map.specialAreas[i].leftPoints.push_back(vPoint);
+ }
+
+ if (map.specialAreas[i].type == ZEBRA_CROSSING || map.specialAreas[i].type == BUS_STATION_AREA) {
+// DEBUG("鏂戦┈绾�");
+ Line startLine;
+
+ MakeLine(&startLine, &map.specialAreas[i].area[0], &map.specialAreas[i].leftPoints[0]);
+
+ // 杞﹀ご鍜屾枒椹嚎璺濈涓嶈冻30绫�
+ if (IntersectionOf(extLine, startLine) == GM_Intersection &&
+ IntersectionOfLine(car->carXY[ car->axial[AXIAL_FRONT] ], startLine) == 1 ) {
+ DEBUG("杩涘叆鍑忛�熷尯 %d", map.specialAreas[i].type);
+ if (BreakDone == BREAK_ACTIVE) {
+ map.specialAreas[i].activeBreak = true;
+ }
+ }
+
+ // 璺ㄧ嚎鍚庯紝妫�鏌ュ埞杞﹀姩浣�
+ if (CrashTheLine(startLine, car, CarModelList)) {
+ if (!map.specialAreas[i].activeBreak) {
+ // 涓嶆寜瑙勫畾鍑忛�燂紝涓嶅悎鏍�
+ DEBUG("涓嶆寜瑙勫畾鍑忛��");
+ if (map.specialAreas[i].type == ZEBRA_CROSSING) {
+ AddExamFault(48, rtkTime);
+ } else {
+ AddExamFault(50, rtkTime);
+ }
+ } else {
+ DEBUG("鎸夎瀹氬噺閫�");
+ }
+
+ }
+ } else if (map.specialAreas[i].type == SCHOOL_AREA) {
+ Polygon school;
+// DEBUG("瀛︽牎");
+ school.num = 4;
+ school.point = (PointF *) malloc(school.num * sizeof(PointF));
+
+ school.point[0] = map.specialAreas[i].area[0];
+ school.point[1] = map.specialAreas[i].area[1];
+ school.point[2] = map.specialAreas[i].leftPoints[1];
+ school.point[3] = map.specialAreas[i].leftPoints[0];
+
+ if (IntersectionOf(car->carXY[ car->axial[AXIAL_FRONT] ], &school) == GM_Containment) {
+ if (ConvertMs2KMh(speed) > PASS_SCHOOL_MAX_SPEED) {
+ if (!map.specialAreas[i].overSpeed) {
+ DEBUG("閫氳繃瀛︽牎鍖哄煙瓒呴��");
+ AddExamFault(49, rtkTime);
+ map.specialAreas[i].overSpeed = true;
+ }
+ }
+ }
+
+ free(school.point);
+ }
+ }
+}
+
+
+
+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(CrashLineType, 0, RoadMap, car, CarModelList);
+// lane_t laneInfo;
+// double redist = -1;
+//
+// laneInfo.road = -1;
+// laneInfo.sep = -1;
+// laneInfo.no = -1;
+//
+// if (ri >= 0) {
+// GetLane(laneInfo, car->carXY[car->axial[AXIAL_FRONT]], RoadMap, ri);
+//
+// int m = RoadMap.roads[ri].rightEdge.size();
+// int n = RoadMap.roads[ri].rightEdge[m-1].points.size();
+//
+// PointF base;
+//
+// base.X = 428922.2985; base.Y = 3292119.5457;
+//
+// redist = CalcDistanceReference(car->carXY[car->axial[AXIAL_FRONT]], base,
+// RoadMap.roads[ri].rightEdge);
+// }
+//
+// DEBUG("褰撳墠閬撹矾绱㈠紩 %d, 瑙﹀彂绾㈢嚎 %d lane %d 璺濈 %f %ld", ri, crash, laneInfo.no, redist, AppTimer_GetTickCount() - cts);
UpdateCarSensor(rtkTime);
@@ -1225,15 +1393,27 @@
speed, moveDirect, rtkTime);
// 妫�娴嬬寮�姝よ矾娈碉紝鍏ㄨ溅闇�涓嶅湪鑼冨洿鍐�
+ int oldid = currExamMapIndex;
currExamMapIndex = CalcRoadIndex(currExamMapIndex, RoadMap, car);
+ if (currExamMapIndex >= 0) {
+ HintCrossing(currExamMapIndex, RoadMap.roads[currExamMapIndex], car, CarModelList);
+ }
+
+ if (oldid != currExamMapIndex) {
+ DEBUG("閬撹矾ID鍒囨崲 %d", currExamMapIndex);
+ }
+
+ oldid = CrashLineType;
DetectLine(currExamMapIndex, RoadMap, car, CarModelList, moveDirect, rtkTime);
+
+ if (oldid != CrashLineType) {
+ DEBUG("鍘嬬嚎绫诲瀷鍒囨崲 %d", CrashLineType);
+ }
DetectLane(RoadMap, car, currExamMapIndex, rtkTime);
// 妫�娴嬪帇绾跨姸鎬�
-
-
TestRoadStartCar(car, speed, moveDirect, rtkTime);
if (startCar != START_CAR_DONE)
@@ -1482,84 +1662,6 @@
road.arrivedTail = false;
}
}*/
-
-// 璺彛锛屾彁绀猴紝鍓�30绫宠繘鍏ワ紝 绂诲紑
-// 浜鸿閬擄紝杞︾珯锛屽墠30绫宠繘鍏ワ紝绂诲紑
-// 瀛︽牎锛岃繘鍏ワ紝绂诲紑
-
-map<int, int> CrossingStatus;
-
-static void ChangeCrossingStatus(int roadIndex, int index, int status)
-{
- int key = roadIndex * 100 + index;
-
- auto it = CrossingStatus.find(key);
-
- if (it != CrossingStatus.end()) {
- CrossingStatus.erase(it);
- }
- CrossingStatus.insert(pair<int, int>(key, status));
-}
-
-static int GetCrossingStatus(int roadIndex, int index)
-{
- int key = roadIndex * 100 + index;
-
- auto it = CrossingStatus.find(key);
-
- if (it != CrossingStatus.end()) {
- return it->second;
- }
- return -1;
-}
-
-enum {
- CROSSING_STATUS_INVALID = -1,
- CROSSING_STATUS_GUIDE,
- CROSSING_STATUS_REDUCE_SPEED,
- CROSSING_STATUS_BREAK_CAR,
- CROSSING_STATUS_STOP_CAR
-};
-
-static void CheckCrossing(int roadIndex, road_t &road, const car_model *car, LIST_CAR_MODEL &CarModelList)
-{
- for (int i = 0; i < road.stopLine.size(); ++i) {
- if (CrashTheLine(road.stopLine[i].line, car, CarModelList)) {
- if (road.stopLine[i].stopFlag) {
- if (GetCrossingStatus(roadIndex, i) != CROSSING_STATUS_STOP_CAR) {
-
- }
- } else {
- if (GetCrossingStatus(roadIndex, i) != CROSSING_STATUS_BREAK_CAR) {
-
- }
- }
- ChangeCrossingStatus(roadIndex, i, CROSSING_STATUS_INVALID);
- } else {
-
- }
- PointF point;
- double distance;
-
- point.X = road.stopLine[i].line.X1;
- point.Y = road.stopLine[i].line.Y1;
-
- distance = CalcDistanceReference(car->carXY[car->axial[AXIAL_FRONT]], point, road.rightEdge);
-
- if (distance > 10 && distance < 50) {
- if (GetCrossingStatus(roadIndex, i) == CROSSING_STATUS_INVALID) {
- if (!road.stopLine[i].tts.empty()) {
- PlayTTS(road.stopLine[i].tts.c_str());
- }
- ChangeCrossingStatus(roadIndex, i, CROSSING_STATUS_GUIDE);
- }
- } else if (distance > 0 && distance < 30) {
- if (GetCrossingStatus(roadIndex, i) != 1) {
- ChangeCrossingStatus(roadIndex, i, 1);
- }
- }
- }
-}
static trigger_line_t * EntryItem(int index, road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList)
{
--
Gitblit v1.8.0