From 25bdbfbf6f4c9f1530be74fc194ad1dd0a13e8c9 Mon Sep 17 00:00:00 2001 From: fctom1215 <fctom1215@outlook.com> Date: 星期日, 08 三月 2020 23:12:49 +0800 Subject: [PATCH] 角度修正。 --- lib/src/main/cpp/test_items/driving_curve.cpp | 289 +++++++++++++++++++++++++---------------------- lib/src/main/cpp/driver_test.cpp | 24 +--- lib/src/main/cpp/master/comm_if.cpp | 9 + lib/src/main/cpp/driver_test.h | 3 lib/src/main/cpp/test_items/driving_curve.h | 1 5 files changed, 171 insertions(+), 155 deletions(-) diff --git a/lib/src/main/cpp/driver_test.cpp b/lib/src/main/cpp/driver_test.cpp index 4ee19db..c961a25 100644 --- a/lib/src/main/cpp/driver_test.cpp +++ b/lib/src/main/cpp/driver_test.cpp @@ -202,7 +202,7 @@ void SetCarMeasurePoint(double *basePoint, int *axial, int *left_front_tire, int *right_front_tire, int *left_rear_tire, int *right_rear_tire, - int *body, int bodyNum,double (*point)[2], int pointNum) + int *body, int bodyNum,double (*point)[2], int pointNum, double antPitch) { DEBUG("鍔犲叆杞﹁締淇℃伅 pointNum %d", pointNum); @@ -264,6 +264,8 @@ CarModel->body[i] = body[i]; } } + + CarModel->antPitch = antPitch; CarModel->pointNum = pointNum; CarModel->carDesc = (struct car_desc_ *)malloc(sizeof(struct car_desc_) * pointNum); @@ -962,23 +964,7 @@ free(map.point); } if (mapList[index].type == MAP_TYPE_CURVE) { - Line carAxial; - Line scanLine; - - MakeLine(&carAxial, &car->carXY[car->axial[AXIAL_FRONT]], &car->carXY[car->axial[AXIAL_REAR]]); - - int startL = 0, startR = 0; - while (startL < mapList[index].map.num || startR < mapList[index].map2.num) { - MakeLine(&scanLine, &mapList[index].map.point[startL], &mapList[index].map.point[startR]); - if (IntersectionOf(scanLine, carAxial) == GM_Intersection) { - break; - } - if (startL < mapList[index].map.num) - startL++; - if (startR < mapList[index].map2.num) - startR++; - } - ret = true; + ret = ExitDrivingCurveArea(&mapList[index].map, &mapList[index].map2, car); } return ret; @@ -1032,6 +1018,8 @@ { carModel->basePoint = main_ant; + pitch = pitch - carModel->antPitch; + for (int i = 0; i < carModel->pointNum; ++i) { double qrx = carModel->carDesc[i].distance * sin(toRadians(carModel->carDesc[i].angle)); double qry = diff --git a/lib/src/main/cpp/driver_test.h b/lib/src/main/cpp/driver_test.h index 307db69..c411cf2 100644 --- a/lib/src/main/cpp/driver_test.h +++ b/lib/src/main/cpp/driver_test.h @@ -37,6 +37,7 @@ int bodyNum; int *body; int pointNum; + double antPitch; struct car_desc_ *carDesc; // 缁忕幇鍦烘祴閲忕偣璁$畻鍚庣殑鍊� PointF *carXY; // 璁$畻鍚庣殑杞﹁韩鍚勭偣鍧愭爣 } car_model; @@ -85,7 +86,7 @@ void AddMap(int id, int type, const double (*map)[2], int pointNum, const double (*map2)[2], int pointNum2); void SetCarMeasurePoint(double *basePoint, int *axial, int *left_front_tire, int *right_front_tire, int *left_rear_tire, int *right_rear_tire, - int *body, int bodyNum, double (*point)[2], int pointNum); + int *body, int bodyNum, double (*point)[2], int pointNum, double antPitch); void SetSensorCfg(int (*sensor)[3], int sensorNum); int GetSensorValidLevel(void); void GetSensorCfg(int gpio, int &func, bool &lvl); diff --git a/lib/src/main/cpp/master/comm_if.cpp b/lib/src/main/cpp/master/comm_if.cpp index 3c227c9..3ee83da 100644 --- a/lib/src/main/cpp/master/comm_if.cpp +++ b/lib/src/main/cpp/master/comm_if.cpp @@ -564,6 +564,8 @@ int bodyNum = 0; int *body = NULL; int pointNum = 0; + double antPitch = 0; + double (*point)[2] = NULL; if (doc.HasMember("main_ant")) { @@ -656,8 +658,13 @@ } } + if (doc.HasMember("ant_pitch")) { + const Value& s = doc["ant_pitch"]; + antPitch = s.GetDouble(); + } + SetCarMeasurePoint(basePoint, axial, left_front_tire, right_front_tire, - left_rear_tire, right_rear_tire, body, bodyNum, point, pointNum); + left_rear_tire, right_rear_tire, body, bodyNum, point, pointNum, antPitch); if (body != NULL) delete []body; if (point != NULL) delete []point; diff --git a/lib/src/main/cpp/test_items/driving_curve.cpp b/lib/src/main/cpp/test_items/driving_curve.cpp index 6884863..7a33a68 100644 --- a/lib/src/main/cpp/test_items/driving_curve.cpp +++ b/lib/src/main/cpp/test_items/driving_curve.cpp @@ -15,10 +15,6 @@ #define DEBUG(fmt, args...) LOGD("<driving_curve> <%s>: " fmt, __func__, ##args) -enum { - DRIVING_ON_CURVE -}; - const uint32_t STOP_CAR_TIME = D_SEC(2); static bool testing = false; @@ -27,15 +23,16 @@ static bool reportStopCarTimeout; static int prevMoveDirect; static bool crashRedLine; -static struct calc_zone_t { +static struct scan_window_t { int leftStart; int leftEnd; int rightStart; int rightEnd; -} calcZone; +} scanWindow; -static bool CrashRedLine(const Polygon *map, const Polygon *map2, const car_model *car, struct calc_zone_t *zone); -static bool ExitArea(const Polygon *map, const Polygon *map2, const car_model *car); +static bool UpdateStartLine(struct scan_window_t *zone, const Polygon *map, const Polygon *map2, const Polygon *tireRect); +static bool UpdateEndLine(bool mode, struct scan_window_t *zone, const Polygon *map, const Polygon *map2, const Polygon *tireRect); +static bool CrashRedLine(const Polygon *map, const Polygon *map2, const car_model *car, struct scan_window_t *zone); void StartDrivingCurve(int moveDirect, const struct RtkTime *rtkTime) { @@ -50,141 +47,31 @@ reportStopCarTimeout = false; crashRedLine = false; - calcZone.leftStart = calcZone.leftEnd = calcZone.rightStart = calcZone.rightEnd = 0; + scanWindow.leftStart = scanWindow.leftEnd = scanWindow.rightStart = scanWindow.rightEnd = 0; } int TestDrivingCurve(const Polygon *map, const Polygon *map2, const car_model *car, const car_model *carPrev, double speed, int moveDirect, const struct RtkTime *rtkTime) { - Line start, end; - Line axial; + Polygon tireRect; - MakeLine(&axial, &car->carXY[car->axial[AXIAL_FRONT]], &car->carXY[car->axial[AXIAL_REAR]]); + MakePolygon(&tireRect, {car->carXY[car->left_front_tire[TIRE_OUTSIDE]], + car->carXY[car->right_front_tire[TIRE_OUTSIDE]], + car->carXY[car->right_rear_tire[TIRE_OUTSIDE]], + car->carXY[car->left_rear_tire[TIRE_OUTSIDE]]}); -// DEBUG("START 绾� %d -- %d", calcZone.leftStart, calcZone.rightStart); -// DEBUG("END 绾� %d -- %d", calcZone.leftEnd, calcZone.rightEnd); - - MakeLine(&start, &map->point[calcZone.leftStart], &map2->point[calcZone.rightStart]); - - if (IntersectionOf(start, axial) == GM_None) { - // 鍚戣捣鐐规煡鎵� - int tempLeft = calcZone.leftStart, tempRight = calcZone.rightStart; - - while (calcZone.leftStart > 0 || calcZone.rightStart > 0) { - if (calcZone.leftStart > 0) - tempLeft = calcZone.leftStart - 1; - if (calcZone.rightStart > 0) - tempRight = calcZone.rightStart - 1; -// DEBUG("START 鍚戣捣鐐规煡鎵� %d -- %d", tempLeft, tempRight); - MakeLine(&start, &map->point[tempLeft], &map2->point[tempRight]); - - if (IntersectionOf(start, axial) == GM_Intersection) { - // 淇濇寔涔嬪墠鐨勭嚎 - break; - } else { - calcZone.leftStart = tempLeft; - calcZone.rightStart = tempRight; - - if (calcZone.leftStart == calcZone.leftEnd && calcZone.rightStart == calcZone.rightEnd) { - // 杞﹁締涓㈠け锛岄噸鏂版悳绱� - calcZone.leftStart = calcZone.rightStart = 0; - calcZone.leftEnd = calcZone.rightEnd = 0; - - DEBUG("杞﹁締涓㈠け锛岄噸鏂版悳绱�"); - - while (calcZone.leftStart < map->num || calcZone.rightStart < map2->num) { - MakeLine(&start, &map->point[calcZone.leftStart], &map2->point[calcZone.rightStart]); - - if (IntersectionOf(start, axial) == GM_Intersection) { - while (calcZone.leftStart < map->num || calcZone.rightStart < map2->num) { - MakeLine(&start, &map->point[calcZone.leftStart], &map2->point[calcZone.rightStart]); - if (IntersectionOf(start, axial) == GM_None) { - break; - } - if (calcZone.leftStart < map->num) - calcZone.leftStart++; - if (calcZone.rightStart < map2->num) - calcZone.rightStart++; - } - break; - } - - calcZone.leftEnd = calcZone.leftStart; - calcZone.rightEnd = calcZone.rightStart; - - if (calcZone.leftStart < map->num) - calcZone.leftStart++; - if (calcZone.rightStart < map2->num) - calcZone.rightStart++; - } - - if (calcZone.leftStart >= map->num && calcZone.rightStart >= map2->num) { - // 绂诲紑鍦哄湴 - DEBUG("绂诲紑鏇茬嚎鍦哄湴"); - testing = false; - goto TEST_END; - } - - break; - } - } - } - } else { - // 鍚戠粓鐐规煡鎵� - do { - if (calcZone.leftStart >= map->num && calcZone.rightStart >= map2->num) { - break; - } - if (calcZone.leftStart < map->num) - calcZone.leftStart++; - if (calcZone.rightStart < map2->num) - calcZone.rightStart++; -// DEBUG("START 鍚戠粓鐐规煡鎵� %d -- %d", calcZone.leftStart, calcZone.rightStart); - MakeLine(&start, &map->point[calcZone.leftStart], &map2->point[calcZone.rightStart]); - } while (IntersectionOf(start, axial) == GM_Intersection); + // 鏇存柊杞﹀ご鎵弿绾� + if (!UpdateStartLine(&scanWindow, map, map2, &tireRect)) { + DEBUG("绂诲紑鍦哄湴"); + testing = false; + goto TEST_END; } - MakeLine(&end, &map->point[calcZone.leftEnd], &map2->point[calcZone.rightEnd]); + // 鏇存柊杞﹀熬鎵弿绾� + UpdateEndLine(false, &scanWindow, map, map2, &tireRect); - if (IntersectionOf(end, axial) == GM_None) { - // 鍚戠粓鐐规煡鎵� - int tempLeft = calcZone.leftEnd, tempRight = calcZone.rightEnd; - while (calcZone.leftEnd < map->num || calcZone.rightEnd < map2->num) { - if (calcZone.leftEnd >= map->num && calcZone.rightEnd >= map2->num) { - break; - } - if (calcZone.leftEnd < map->num) - tempLeft = calcZone.leftEnd + 1; - if (calcZone.rightEnd < map2->num) - tempRight = calcZone.rightEnd + 1; -// DEBUG("END 鍚戠粓鐐规煡鎵� %d -- %d", tempLeft, tempRight); - MakeLine(&end, &map->point[tempLeft], &map2->point[tempRight]); + DEBUG("scanWindow leftStart %d leftEnd %d rightStart %d rightEnd %d", scanWindow.leftStart, scanWindow.leftEnd, scanWindow.rightStart, scanWindow.rightEnd); - if (IntersectionOf(end, axial) == GM_Intersection) { - // 淇濇寔涔嬪墠鐨勭嚎 - break; - } else { - calcZone.leftEnd = tempLeft; - calcZone.rightEnd = tempRight; - } - } - } else { - // 鍚戣捣鐐规煡鎵� - do { - if (calcZone.leftEnd == 0 && calcZone.rightEnd == 0) { - break; - } - if (calcZone.leftEnd > 0) - calcZone.leftEnd--; - if (calcZone.rightEnd > 0) - calcZone.rightEnd--; -// DEBUG("END 鍚戣捣鐐规煡鎵� %d -- %d", calcZone.leftEnd, calcZone.rightEnd); - MakeLine(&end, &map->point[calcZone.leftEnd], &map2->point[calcZone.rightEnd]); - } while (IntersectionOf(end, axial) == GM_Intersection); - } - - DEBUG("calcZone leftStart %d leftEnd %d rightStart %d rightEnd %d", calcZone.leftStart, calcZone.leftEnd, calcZone.rightStart, calcZone.rightEnd); - - if (CrashRedLine(map, map2, car, &calcZone)) { + if (CrashRedLine(map, map2, car, &scanWindow)) { if (!crashRedLine) { crashRedLine = true; // 杞﹁疆鍘嬭竟绾匡紝涓嶅悎鏍� @@ -217,10 +104,142 @@ } TEST_END: + CleanPolygon(&tireRect); return testing ? 1 : 0; } -static bool ExitArea(const Polygon *map, const Polygon *map2, const car_model *car) +static bool UpdateStartLine(struct scan_window_t *zone, const Polygon *map, const Polygon *map2, const Polygon *tireRect) +{ + Line start; + + bool update = true; + int direct = 0; + int tempLeft = scanWindow.leftStart, tempRight = scanWindow.rightStart; + + while (update) { + update = false; + MakeLine(&start, &map->point[scanWindow.leftStart], &map2->point[scanWindow.rightStart]); + + if (IntersectionOf(start, tireRect) == GM_None) { + if (direct != 1) { + direct = -1; + // 鍏ュ満鏂瑰悜鎵弿 + tempLeft = scanWindow.leftStart; + tempRight = scanWindow.rightStart; + + if (scanWindow.leftStart > 0) { + update = true; + scanWindow.leftStart--; + } + if (scanWindow.rightStart > 0) { + update = true; + scanWindow.rightStart--; + } + + if (scanWindow.leftStart <= scanWindow.leftEnd && scanWindow.rightStart <= scanWindow.rightEnd) { + DEBUG("杞﹁締涓㈠け锛岄噸鏂版悳绱� %d %d", scanWindow.leftStart, scanWindow.rightStart); + + // 杞﹁締涓㈠け锛岄噸鏂版悳绱� + update = false; + scanWindow.leftEnd = scanWindow.rightEnd = 0; + + if (UpdateEndLine(true, &scanWindow, map, map2, tireRect)) { + DEBUG("鍖归厤鎴愬姛 %d %d", scanWindow.leftStart, scanWindow.leftEnd); + direct = 0; + update = true; + } else { + DEBUG("鍖归厤澶辫触"); + return false; + } + } + } + } else { + if (direct != -1) { + // 鍑哄満鏂瑰悜鎵弿 + direct = 1; + if (scanWindow.leftStart < map->num - 1) { + update = true; + scanWindow.leftStart++; + } + if (scanWindow.rightStart < map2->num - 1) { + update = true; + scanWindow.rightStart++; + } + } else { + scanWindow.leftStart = tempLeft; + scanWindow.rightStart = tempRight; + } + } + } + + return true; +} + +static bool UpdateEndLine(bool mode, struct scan_window_t *zone, const Polygon *map, const Polygon *map2, const Polygon *tireRect) +{ + bool update = true; + bool crash = false; + + int direct = 0; + int tempLeft = zone->leftEnd; + int tempRight = zone->rightEnd; + + Line end; + + while (update) { + update = false; + MakeLine(&end, &map->point[zone->leftEnd], &map2->point[zone->rightEnd]); + + if (IntersectionOf(end, tireRect) == GM_None) { + if (direct != -1) { + // 鍑哄満鏂瑰悜鎵弿 + direct = 1; + tempLeft = zone->leftEnd; + tempRight = zone->rightEnd; + + if (zone->leftEnd < map->num - 1) { + update = true; + zone->leftEnd++; + } + if (zone->rightEnd < map2->num - 1) { + update = true; + zone->rightEnd++; + } + } + } else { + if (!crash) { + crash = true; + if (mode) { + zone->leftStart = zone->leftEnd; + zone->rightStart = zone->rightEnd; + + + DEBUG("绗竴娆℃帴瑙� %d %d %d", zone->leftStart, zone->leftEnd, tempLeft); + } + } + + if (direct != 1) { + // 鍏ュ満鏂瑰悜鎵弿 + direct = -1; + if (zone->leftEnd > 0) { + update = true; + zone->leftEnd--; + } + if (zone->rightEnd > 0) { + update = true; + zone->rightEnd--; + } + } else { + zone->leftEnd = tempLeft; + zone->rightEnd = tempRight; + } + } + } + + return crash; +} + +bool ExitDrivingCurveArea(const Polygon *map, const Polygon *map2, const car_model *car) { // 鍏ㄨ溅閮介渶涓嶅湪鍦板浘涓� bool ret = false; @@ -257,7 +276,7 @@ } // 杞﹁疆鏄惁鍘嬭竟绾� -static bool CrashRedLine(const Polygon *map, const Polygon *map2, const car_model *car, struct calc_zone_t *zone) +static bool CrashRedLine(const Polygon *map, const Polygon *map2, const car_model *car, struct scan_window_t *zone) { bool ret = false; diff --git a/lib/src/main/cpp/test_items/driving_curve.h b/lib/src/main/cpp/test_items/driving_curve.h index 57f3daa..22c7181 100644 --- a/lib/src/main/cpp/test_items/driving_curve.h +++ b/lib/src/main/cpp/test_items/driving_curve.h @@ -11,6 +11,7 @@ using namespace std; void StartDrivingCurve(int moveDirect, const struct RtkTime *rtkTime); +bool ExitDrivingCurveArea(const Polygon *map, const Polygon *map2, const car_model *car); int TestDrivingCurve(const Polygon *map, const Polygon *map2, const car_model *car, const car_model *carPrev, double speed, int moveDirect, const struct RtkTime *rtkTime); -- Gitblit v1.8.0