From 4053e385bb8dc70ad8c8d12eeaec9c10ee87fcb9 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期一, 16 三月 2020 18:06:07 +0800
Subject: [PATCH] 更新地图
---
lib/src/main/cpp/driver_test.cpp | 281 ++++++++++++++++++++++++++++++++++----------------------
1 files changed, 171 insertions(+), 110 deletions(-)
diff --git a/lib/src/main/cpp/driver_test.cpp b/lib/src/main/cpp/driver_test.cpp
index 8d94ecf..f3000a4 100644
--- a/lib/src/main/cpp/driver_test.cpp
+++ b/lib/src/main/cpp/driver_test.cpp
@@ -11,6 +11,10 @@
#include <pthread.h>
#include <cstring>
#include <vector>
+#include <list>
+#include <numeric>
+#include <algorithm>
+
#include "driver_test.h"
#include "defs.h"
#include "Geometry.h"
@@ -84,6 +88,43 @@
Polygon map2;
} MapList[MAP_LIST_SIZE];
+struct trigger_line {
+ int mapId;
+ Line tirgger;
+};
+
+struct road_exam_parent_map {
+ int id;
+ int type;
+ Polygon map;
+ int redLineNum;
+ Polygon *redLine;
+ int greenLineNum;
+ Polygon *greenLine;
+ int redAreaNum;
+ Polygon *redArea;
+ int triggerLineNum;
+ struct trigger_line *triggerLine;
+};
+
+static struct road_exam_parent_map * RoadParentMap;
+
+struct road_exam_son_map {
+ int id;
+ int type;
+ char tts[512];
+ Line triggerLine;
+ Line controlLine;
+ Line targetLine;
+ int stop_flag;
+
+ int redLineNum;
+ Polygon *redLine;
+};
+
+typedef list<struct road_exam_son_map *> LIST_ROAD_SON_MAP;
+static LIST_ROAD_SON_MAP RoadSonMapList;
+
static int MapNum = 0;
static int CurrExamMapIndex = -1;
static int CurrEnterMapIndex = -1;
@@ -92,7 +133,10 @@
static int exam_dummy_light;
static car_model *CarModel = NULL;
-static car_model *CarModelPrev = NULL;
+
+typedef list<car_model *> LIST_CAR_MODEL;
+
+static LIST_CAR_MODEL CarModelList;
static struct dummy_light_exam *DummyLightContent;
static int DummyLightContentSize;
@@ -128,7 +172,10 @@
memset(&MapList, 0, sizeof(MapList));
MapNum = 0;
CarModel = NULL;
- CarModelPrev = NULL;
+ CarModelList.clear();
+
+ RoadParentMap = NULL;
+ RoadSonMapList.clear();
CarSensorInit();
@@ -205,6 +252,8 @@
DEBUG("AddMap num %d", MapNum);
}
+
+
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, double antPitch)
@@ -223,24 +272,6 @@
free(CarModel);
CarModel = NULL;
}
-
- if (CarModelPrev != NULL) {
- if (CarModelPrev->body != NULL)
- free(CarModelPrev->body);
- if (CarModelPrev->carDesc != NULL)
- free(CarModelPrev->carDesc);
- if (CarModelPrev->carXY != NULL)
- free(CarModelPrev->carXY);
- free(CarModelPrev);
- CarModelPrev = NULL;
- }
-
- // 浠呭垎閰峜arXY, body鍜宑arDesc鍧囨病鏈�
- CarModelPrev = (car_model *)malloc(sizeof(car_model));
- CarModelPrev->body = NULL;
- CarModelPrev->carDesc = NULL;
- CarModelPrev->pointNum = 0;
- CarModelPrev->carXY = (PointF *) malloc(sizeof(PointF) * pointNum);
CarModel = (car_model *)malloc(sizeof(car_model));
CarModel->basePoint.X = basePoint[0];
@@ -623,19 +654,19 @@
switch (mtype) {
case MAP_TYPE_PARK_BUTTOM:
testing = TestParkBottom(&MapList[CurrExamMapIndex].map,
- CarModel, CarModelPrev, speed, move, rtkTime);
+ CarModel, NULL, speed, move, rtkTime);
break;
case MAP_TYPE_STOP_START:
- testing = TestSAS(&MapList[CurrExamMapIndex].map, CarModel, CarModelPrev, speed, move, rtkTime);
+ testing = TestSAS(&MapList[CurrExamMapIndex].map, CarModel, NULL, speed, move, rtkTime);
break;
case MAP_TYPE_PART_EDGE:
- testing = TestParkEdge(&MapList[CurrExamMapIndex].map, CarModel, CarModelPrev, speed, move, rtkTime);
+ testing = TestParkEdge(&MapList[CurrExamMapIndex].map, CarModel, NULL, speed, move, rtkTime);
break;
case MAP_TYPE_CURVE:
- testing = TestDrivingCurve(&MapList[CurrExamMapIndex].map, &MapList[CurrExamMapIndex].map2, CarModel, CarModelPrev, speed, move, rtkTime);
+ testing = TestDrivingCurve(&MapList[CurrExamMapIndex].map, &MapList[CurrExamMapIndex].map2, CarModel, NULL, speed, move, rtkTime);
break;
case MAP_TYPE_TURN_90:
- testing = TestTurnA90(&MapList[CurrExamMapIndex].map, CarModel, CarModelPrev, azimuth, speed, move, rtkTime);
+ testing = TestTurnA90(&MapList[CurrExamMapIndex].map, CarModel, NULL, azimuth, speed, move, rtkTime);
break;
default:
break;
@@ -715,21 +746,51 @@
main_ant_coord.X = RtkBuffer[p1].x;
main_ant_coord.Y = RtkBuffer[p1].y;
- // 淇濆瓨涓婁竴涓溅韬疆寤撶偣
- if (CarModelPrev->pointNum > 0) {
- CarModelPrev->pointNum = CarModel->pointNum;
- CarModelPrev->basePoint = CarModel->basePoint;
- for (int i = 0; i < CarModel->pointNum; ++i) {
- CarModelPrev->carXY[i] = CarModel->carXY[i];
- }
- }
UpdateCarBodyCoord(RtkBuffer[p1].heading, RtkBuffer[p1].pitch, RtkBuffer[p1].roll, main_ant_coord, CarModel);
- if (CarModelPrev->pointNum == 0) {
- CarModelPrev->pointNum = CarModel->pointNum;
- CarModelPrev->basePoint = CarModel->basePoint;
- for (int i = 0; i < CarModel->pointNum; ++i) {
- CarModelPrev->carXY[i] = CarModel->carXY[i];
- }
+
+ car_model *newModel = (car_model *)malloc(sizeof(car_model));
+
+ newModel->basePoint = CarModel->basePoint;
+ newModel->axial[0] = CarModel->axial[0];
+ newModel->axial[1] = CarModel->axial[1];
+ newModel->left_front_tire[0] = CarModel->left_front_tire[0];
+ newModel->left_front_tire[1] = CarModel->left_front_tire[1];
+ newModel->right_front_tire[0] = CarModel->right_front_tire[0];
+ newModel->right_front_tire[1] = CarModel->right_front_tire[1];
+ newModel->left_rear_tire[0] = CarModel->left_rear_tire[0];
+ newModel->left_rear_tire[1] = CarModel->left_rear_tire[1];
+ newModel->right_rear_tire[0] = CarModel->right_rear_tire[0];
+ newModel->right_rear_tire[1] = CarModel->right_rear_tire[1];
+ newModel->bodyNum = CarModel->bodyNum;
+ newModel->body = (int *) malloc(sizeof(int) * newModel->bodyNum);
+ for (int i = 0; i < newModel->bodyNum; ++i) {
+ newModel->body[i] = CarModel->body[i];
+ }
+ newModel->pointNum = CarModel->pointNum;
+ newModel->carXY = (PointF *) malloc(sizeof(PointF) * newModel->pointNum);
+ for (int i = 0; i < newModel->pointNum; ++i) {
+ newModel->carXY[i] = CarModel->carXY[i];
+ }
+ newModel->carDesc = NULL;
+ newModel->antPitch = CarModel->antPitch;
+ newModel->yaw = CarModel->yaw;
+ newModel->pitch = CarModel->pitch;
+
+ CarModelList.push_front(newModel);
+ while (CarModelList.size() > 25) {
+ DEBUG("鍒犻櫎灏剧粨鐐�");
+ car_model *ptr = CarModelList.back();
+
+ if (ptr->body != NULL)
+ free(ptr->body);
+ if (ptr->carXY != NULL)
+ free(ptr->carXY);
+ if (ptr->carDesc != NULL)
+ free(ptr->carDesc);
+
+ free(ptr);
+
+ CarModelList.pop_back();
}
// 璁$畻閫熷害(绫�/绉�)銆佸墠杩涘悗閫�
@@ -801,77 +862,74 @@
{
// 杞︾殑鏈�鍓嶇偣鏄惁杩涘叆鍦板浘
for (int i = 0; i < mapNum && car != NULL; ++i) {
-// if (mapList[i].type == MAP_TYPE_STOP_START) {
-// // 鏋勯�犺櫄鎷熺殑宸︿笂瑙掔偣
-// double x9, y9, xo, yo;
-//
-// bool enter = false;
-//
-// xo = (mapList[i].map.point[0].X + mapList[i].map.point[7].X) / 2;
-// yo = (mapList[i].map.point[0].Y + mapList[i].map.point[7].Y) / 2;
-//
-// x9 = 2*xo - mapList[i].map.point[8].X;
-// y9 = 2*yo - mapList[i].map.point[8].Y;
-//
-// Polygon map;
-//
-// map.num = 4;
-// map.point = (PointF *) malloc(map.num * sizeof(PointF));
-//
-// map.point[0] = mapList[i].map.point[0];
-// map.point[1] = mapList[i].map.point[8];
-// map.point[2] = mapList[i].map.point[7];
-// map.point[3].X = x9;
-// map.point[3].Y = y9;
-//
-// if (IntersectionOf(car->carXY[ car->axial[AXIAL_FRONT] ], &map) == GM_Containment) {
-// Line enterLine1;
-//
-// MakeLine(&enterLine1, &(map.point[0]), &(map.point[3]));
-//
-// if (DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], enterLine1) > 0.1)
-// enter = true;
-// }
-//
-// free(map.point);
-//
-// if (enter) return i;
-// }
-// if (mapList[i].type == MAP_TYPE_CURVE) {
-//
-// }
-// if (mapList[i].type == MAP_TYPE_PARK_BUTTOM) {
-// if (IntersectionOf(car->carXY[ car->axial[AXIAL_FRONT] ], &mapList[i].map) == GM_Containment) {
-// Line enterLine1, enterLine2;
-//
-// MakeLine(&enterLine1, &(mapList[i].map.point[0]), &(mapList[i].map.point[1]));
-// MakeLine(&enterLine2, &(mapList[i].map.point[6]), &(mapList[i].map.point[7]));
-//
-// if (DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], enterLine1) > 0.1 &&
-// DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], enterLine2) > 0.1)
-// return i;
-// }
-// }
-// if (mapList[i].type == MAP_TYPE_PART_EDGE) {
-// if (IntersectionOf(car->carXY[ car->axial[AXIAL_FRONT] ], &mapList[i].map) == GM_Containment) {
-// Line enterLine;
-//
-// MakeLine(&enterLine, &(mapList[i].map.point[0]), &(mapList[i].map.point[1]));
-//
-// if (DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], enterLine) > 0.1)
-// return i;
-// }
-// }
-// if (mapList[i].type == MAP_TYPE_TURN_90) {
-// if (IntersectionOf(car->carXY[ car->axial[AXIAL_FRONT] ], &mapList[i].map) == GM_Containment) {
-// Line enterLine1;
-//
-// MakeLine(&enterLine1, &(mapList[i].map.point[0]), &(mapList[i].map.point[1]));
-//
-// if (DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], enterLine1) > 0.1)
-// return i;
-// }
-// }
+ if (mapList[i].type == MAP_TYPE_STOP_START) {
+ // 鏋勯�犺櫄鎷熺殑宸︿笂瑙掔偣
+ double x9, y9, xo, yo;
+
+ bool enter = false;
+
+ xo = (mapList[i].map.point[0].X + mapList[i].map.point[7].X) / 2;
+ yo = (mapList[i].map.point[0].Y + mapList[i].map.point[7].Y) / 2;
+
+ x9 = 2*xo - mapList[i].map.point[8].X;
+ y9 = 2*yo - mapList[i].map.point[8].Y;
+
+ Polygon map;
+
+ map.num = 4;
+ map.point = (PointF *) malloc(map.num * sizeof(PointF));
+
+ map.point[0] = mapList[i].map.point[0];
+ map.point[1] = mapList[i].map.point[8];
+ map.point[2] = mapList[i].map.point[7];
+ map.point[3].X = x9;
+ map.point[3].Y = y9;
+
+ if (IntersectionOf(car->carXY[ car->axial[AXIAL_FRONT] ], &map) == GM_Containment) {
+ Line enterLine1;
+
+ MakeLine(&enterLine1, &(map.point[0]), &(map.point[3]));
+
+ if (DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], enterLine1) > 0.1)
+ enter = true;
+ }
+
+ free(map.point);
+
+ if (enter) return i;
+ }
+ if (mapList[i].type == MAP_TYPE_PARK_BUTTOM) {
+ if (IntersectionOf(car->carXY[ car->axial[AXIAL_FRONT] ], &mapList[i].map) == GM_Containment) {
+ Line enterLine1, enterLine2;
+
+ MakeLine(&enterLine1, &(mapList[i].map.point[0]), &(mapList[i].map.point[1]));
+ MakeLine(&enterLine2, &(mapList[i].map.point[6]), &(mapList[i].map.point[7]));
+
+ if (DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], enterLine1) > 0.1 &&
+ DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], enterLine2) > 0.1)
+ return i;
+ }
+ }
+ if (mapList[i].type == MAP_TYPE_PART_EDGE) {
+ if (IntersectionOf(car->carXY[ car->axial[AXIAL_FRONT] ], &mapList[i].map) == GM_Containment) {
+ Line enterLine;
+
+ MakeLine(&enterLine, &(mapList[i].map.point[0]), &(mapList[i].map.point[1]));
+
+ if (DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], enterLine) > 0.1)
+ return i;
+ }
+ }
+ if (mapList[i].type == MAP_TYPE_TURN_90) {
+ if (IntersectionOf(car->carXY[ car->axial[AXIAL_FRONT] ], &mapList[i].map) == GM_Containment) {
+ Line enterLine1;
+
+ MakeLine(&enterLine1, &(mapList[i].map.point[0]), &(mapList[i].map.point[1]));
+
+ if (DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], enterLine1) > 0.1)
+ return i;
+ }
+ }
if (mapList[i].type == MAP_TYPE_CURVE) {
Line startLine;
Line carAxial;
@@ -1008,6 +1066,9 @@
{
carModel->basePoint = main_ant;
+ carModel->yaw = azimuth;
+ carModel->pitch = pitch;
+
pitch = pitch - carModel->antPitch;
for (int i = 0; i < carModel->pointNum; ++i) {
--
Gitblit v1.8.0