| | |
| | | "item": 1, |
| | | "point": [{ |
| | | "x-y": [-11.9669, 28.013, -11.5114, 27.137, -10.8069, 27.5039, -10.2969, 26.4212, -9.2102, 26.8894, -9.6513, 28.0027, -8.9758, 28.3797, -9.5057, 29.3232] |
| | | }, |
| | | { |
| | | "x-y": [-11.9669, 28.013, -11.5114, 27.137, -10.8069, 27.5039, -10.2969, 26.4212, -9.2102, 26.8894, -9.6513, 28.0027, -8.9758, 28.3797, -9.5057, 29.3232] |
| | | } |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | |
| | | "item": 2, |
| | | "point": [{ |
| | | "x-y": [-11.9669, 28.013, -11.5114, 27.137, -10.8069, 27.5039, -10.2969, 26.4212, -9.2102, 26.8894, -9.6513, 28.0027, -8.9758, 28.3797, -9.5057, 29.3232] |
| | | }, |
| | | { |
| | | "x-y": [-11.9669, 28.013, -11.5114, 27.137, -10.8069, 27.5039, -10.2969, 26.4212, -9.2102, 26.8894, -9.6513, 28.0027, -8.9758, 28.3797, -9.5057, 29.3232] |
| | | } |
| | | } |
| | | ] |
| | | } |
| | | ] |
| | |
| | | int errs = 0; |
| | | |
| | | vector<int> ErrorList; |
| | | |
| | | static Polygon theParkEdgeMap; // ä¾§ä½å车å°å¾ |
| | | static Polygon theTurn90Map; |
| | | static Polygon theSSMap; |
| | | vector<ExamFault> ExamFaultList; |
| | | static int examFaultIndex = 0; |
| | | |
| | | static struct map_list { |
| | | int id; |
| | |
| | | |
| | | static int MapNum = 0; |
| | | |
| | | |
| | | #define CAR_COORD_STORE_SIZE 10 |
| | | |
| | | struct car_coord_ { |
| | | uint32_t uptime; |
| | | double azimuth; |
| | | PointF coord; |
| | | }; |
| | | |
| | | struct car_desc_ { |
| | | double distance; // è·ç¦»ä¸»å¤©çº¿çè·ç¦» |
| | | double angle; // ä»ä¸è½´çº¿éæ¶éå½¢æçè§åº¦ |
| | | }; |
| | | |
| | | struct car_desc_ *CarDesc = NULL; |
| | | |
| | | typedef struct { |
| | | PointF basePoint; |
| | | int axial[2]; |
| | | int left_front_tire[2]; |
| | | int right_front_tire[2]; |
| | | int left_rear_tire[2]; |
| | | int right_rear_tire[2]; |
| | | int pointNum; |
| | | struct car_desc_ *carDesc; |
| | | PointF *carXY; |
| | | } car_model; |
| | | |
| | | static car_model *CarModel = NULL; |
| | | static car_model *CarModelPrev = NULL; |
| | | |
| | | #define MOV_AVG_SIZE 1 |
| | | #define RTK_BUFFER_SIZE 100 |
| | |
| | | |
| | | static uint32_t CalcTimeDiff(const rtk_info *a, const rtk_info *b); |
| | | static void ReadDriverExamPrimerTimeout(union sigval sig); |
| | | static void UpdateCarBodyCoord(double azimuth, PointF main_ant, const car_model *carModel); |
| | | static void UpdateCarBodyCoord(double azimuth, PointF main_ant, car_model *carModel); |
| | | static bool UpdateCarCoord(double &spd, int &mov, int &idx); |
| | | static bool FrontTireEnterArea(const Polygon *car, const Polygon *map); |
| | | |
| | | void DriverTestInit(void) |
| | | { |
| | | TestStart = false; |
| | | memset(&MapList, 0, sizeof(MapList)); |
| | | MapNum = 0; |
| | | CarModel = NULL; |
| | | CarModelPrev = NULL; |
| | | |
| | | RtkBuffer = (rtk_info *) malloc(RTK_BUFFER_SIZE * sizeof(rtk_info)); |
| | | RtkBufferNum = RtkBufferIn = 0; |
| | |
| | | |
| | | void ClearMap(void) |
| | | { |
| | | if (TestStart) return; |
| | | |
| | | for (int i = 0; i < MapNum; ++i) { |
| | | if (MapList[i].map.point != NULL) |
| | | free(MapList[i].map.point); |
| | |
| | | |
| | | AppTimer_delete(ReadDriverExamPrimerTimeout); |
| | | |
| | | if (map == NULL || pointNum == 0) |
| | | if (map == NULL || pointNum == 0 || TestStart) |
| | | return; |
| | | |
| | | MapList[MapNum].id = id; |
| | |
| | | |
| | | void SetCarMeasurePoint(double *basePoint, int *axial, int *left_front_tire, |
| | | int *right_front_tire, int *left_rear_tire, int *right_rear_tire, |
| | | double (*point)[2], int pointNum) |
| | | int *body, int bodyNum,double (*point)[2], int pointNum) |
| | | { |
| | | DEBUG("SetCarMeasurePoint pointNum %d", pointNum); |
| | | |
| | | if (point == NULL || pointNum == 0) return; |
| | | if (point == NULL || pointNum == 0 || TestStart) return; |
| | | |
| | | if (CarModel != NULL) { |
| | | if (CarModel->body != NULL) |
| | | free(CarModel->body); |
| | | if (CarModel->carDesc != NULL) |
| | | free(CarModel->carDesc); |
| | | if (CarModel->carXY != NULL) |
| | |
| | | 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; |
| | | } |
| | | |
| | | 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]; |
| | |
| | | CarModel->left_rear_tire[1] = left_rear_tire[1]; |
| | | CarModel->right_rear_tire[0] = right_rear_tire[0]; |
| | | CarModel->right_rear_tire[1] = right_rear_tire[1]; |
| | | CarModel->pointNum = pointNum; |
| | | |
| | | CarModel->bodyNum = bodyNum; |
| | | if (bodyNum == 0 || body == NULL) { |
| | | CarModel->bodyNum = 6; |
| | | CarModel->body = (int *) malloc(sizeof(int) * 6); |
| | | for (int i = 0; i < 6; ++i) { |
| | | CarModel->body[i] = i; |
| | | } |
| | | } else { |
| | | CarModel->body = (int *) malloc(sizeof(int) * CarModel->bodyNum); |
| | | for (int i = 0; i < CarModel->bodyNum; ++i) { |
| | | CarModel->body[i] = body[i]; |
| | | } |
| | | } |
| | | |
| | | CarModel->pointNum = pointNum; |
| | | CarModel->carDesc = (struct car_desc_ *)malloc(sizeof(struct car_desc_) * pointNum); |
| | | CarModel->carXY = (PointF *) malloc(sizeof(PointF) * pointNum); |
| | | |
| | |
| | | err = true; |
| | | MA_SendExamStatus(0, -2); |
| | | } |
| | | if (!err) |
| | | if (!err) { |
| | | if (!TestStart) { |
| | | ExamFaultList.clear(); |
| | | examFaultIndex = 0; |
| | | |
| | | TestStart = true; |
| | | } |
| | | MA_SendExamStatus(1, 0); |
| | | } |
| | | } |
| | | |
| | | void UpdateRTKInfo(const rtk_info *s) |
| | |
| | | RtkBufferIn = (RtkBufferIn + 1) % RTK_BUFFER_SIZE; |
| | | if (RtkBufferNum < RTK_BUFFER_SIZE) |
| | | RtkBufferNum++; |
| | | } else { |
| | | return; |
| | | } |
| | | |
| | | double speed; |
| | |
| | | RtkBuffer[index].mm, RtkBuffer[index].ss, RtkBuffer[index].dss); |
| | | |
| | | brief.qf = RtkBuffer[index].qf; |
| | | brief.map_id = -1; |
| | | brief.map_id = 863; |
| | | brief.move = move; |
| | | brief.speed = speed; |
| | | brief.speed = speed * 3.6; |
| | | brief.heading = RtkBuffer[index].heading; |
| | | brief.main_ant[0] = RtkBuffer[index].x; |
| | | brief.main_ant[1] = RtkBuffer[index].y; |
| | |
| | | brief.right_rear_tire[0] = CarModel->right_rear_tire[0]; |
| | | brief.right_rear_tire[1] = CarModel->right_rear_tire[1]; |
| | | |
| | | brief.bodyNum = CarModel->bodyNum; |
| | | brief.body = (int *) malloc(sizeof(int) * CarModel->bodyNum); |
| | | for (int i = 0; i < CarModel->bodyNum; ++i) { |
| | | brief.body[i] = CarModel->body[i]; |
| | | } |
| | | |
| | | brief.pointNum = CarModel->pointNum; |
| | | brief.point = (double *) malloc(CarModel->pointNum * 2 * sizeof(double)); |
| | | for (int i = 0, j = 0; i < CarModel->pointNum; ++i) { |
| | |
| | | } |
| | | |
| | | MA_SendCarPosition(&brief); |
| | | |
| | | free(brief.body); |
| | | free(brief.point); |
| | | |
| | | if (TestStart) { |
| | | // TestParkBottom(ErrorList, 0, CarModel, CarModelPrev, speed, move); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | // 妿ä¸å®çæ¶é´é½æ²¡æææå®ä½ï¼å é¤ä¹åçå¼ |
| | | uint32_t tmDiff = CalcTimeDiff(&RtkBuffer[p1], &RtkBuffer[p2]); |
| | | |
| | | DEBUG("tmDiff = %ld, p1 = %d p2 = %d dss = %d dss2 = %d", tmDiff, p1, p2, RtkBuffer[p1].dss, RtkBuffer[p2].dss); |
| | | |
| | | if (tmDiff > D_SEC(5)) { |
| | | if (p1 != 0) |
| | | RtkBuffer[0] = RtkBuffer[p1]; |
| | |
| | | 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, 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]; |
| | | } |
| | | } |
| | | |
| | | // 计ç®é度(ç±³/ç§)ãåè¿åé |
| | | double speed = sqrt(pow(RtkBuffer[p1].x - RtkBuffer[p2].x, 2) + pow(RtkBuffer[p1].y - RtkBuffer[p2].y, 2)) * 1000 / |
| | |
| | | }*/ |
| | | } |
| | | |
| | | void AddExamFault(int wrong, const char *utc) |
| | | { |
| | | if (!TestStart) return; |
| | | |
| | | struct ExamFault fault; |
| | | |
| | | fault.sn = examFaultIndex++; |
| | | strcpy(fault.utc, utc); |
| | | fault.wrong_id = wrong; |
| | | |
| | | ExamFaultList.push_back(fault); |
| | | |
| | | MA_SendExamWrong(ExamFaultList); |
| | | } |
| | | |
| | | car_model_cache_t *GetCarModelCache(int node) |
| | | { |
| | | return NULL; |
| | |
| | | * @param azimuth |
| | | * @param coord |
| | | */ |
| | | static void UpdateCarBodyCoord(double azimuth, PointF main_ant, const car_model *carModel) |
| | | static void UpdateCarBodyCoord(double azimuth, PointF main_ant, car_model *carModel) |
| | | { |
| | | carModel->basePoint = main_ant; |
| | | |
| | | for (int i = 0; i < carModel->pointNum; ++i) { |
| | | double tx = main_ant.X + carModel->carDesc[i].distance*sin(toRadians(azimuth)); |
| | | double ty = main_ant.Y + carModel->carDesc[i].distance*cos(toRadians(azimuth)); |
| | |
| | | #include "Geometry.h" |
| | | #include "rtk_module/rtk.h" |
| | | |
| | | #include <vector> |
| | | |
| | | #define TIRE_OUTSIDE 0 |
| | | #define TIRE_INSIDE 1 |
| | | |
| | | using namespace std; |
| | | |
| | | struct car_desc_ { |
| | | double distance; // è·ç¦»ä¸»å¤©çº¿çè·ç¦» |
| | | double angle; // ä»ä¸è½´çº¿éæ¶éå½¢æçè§åº¦ |
| | | }; |
| | | |
| | | typedef struct { |
| | | PointF basePoint; // ç°åºæµéçä¸»å¤©çº¿åæ |
| | | int axial[2]; |
| | | int left_front_tire[2]; |
| | | int right_front_tire[2]; |
| | | int left_rear_tire[2]; |
| | | int right_rear_tire[2]; |
| | | int bodyNum; |
| | | int *body; |
| | | int pointNum; |
| | | struct car_desc_ *carDesc; // ç»ç°åºæµéç¹è®¡ç®åçå¼ |
| | | PointF *carXY; // 计ç®åç车身åç¹åæ |
| | | } car_model; |
| | | |
| | | // æ»æ° |
| | | // ä¸è½´çº¿åç¹,id 0ï¼ä¸è½´çº¿åç¹id |
| | |
| | | carModelDesc_t *desc; |
| | | } car_model_cache_t; |
| | | |
| | | struct ExamFault { |
| | | int sn; |
| | | char utc[32]; |
| | | int wrong_id; |
| | | }; |
| | | |
| | | //vector<ExamFault> ExamFaultList; |
| | | |
| | | void DriverTestInit(void); |
| | | void ReadDriverExamPrimer(void); |
| | | void ClearMap(void); |
| | | 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, |
| | | double (*point)[2], int pointNum); |
| | | int *body, int bodyNum, double (*point)[2], int pointNum); |
| | | void SetSensorCfg(int (*sensor)[2], int sensorNum); |
| | | void StartDriverExam(int start); |
| | | |
| | | void UpdateRTKInfo(const rtk_info *s); |
| | | void AddExamFault(int wrong, const char *utc); |
| | | |
| | | car_model_cache_t *GetCarModelCache(int node); |
| | | |
| | | #endif //RTKDRIVERTEST_DRIVER_TEST_H |
| | |
| | | #include "../utils/xconvert.h" |
| | | #include "../driver_test.h" |
| | | #include "../defs.h" |
| | | #include "../common/apptimer.h" |
| | | #include "../jni_log.h" |
| | | |
| | | #include <string> |
| | | #include <iostream> |
| | | #include <vector> |
| | | |
| | | #define DEBUG(fmt, args...) LOGD("<comm_if> <%s>: " fmt, __func__, ##args) |
| | | |
| | | using namespace rapidjson; |
| | | using namespace std; |
| | |
| | | SendMsgToMainProc(ID_SM_RTK_BRIEF, sb.GetString()); |
| | | } |
| | | |
| | | void MA_SendExamWrong(vector<int>&err) |
| | | void MA_SendExamWrong(vector<ExamFault> &ExamFaultList) |
| | | { |
| | | StringBuffer sb; |
| | | Writer<StringBuffer> writer(sb); |
| | | |
| | | writer.StartArray(); |
| | | |
| | | for (int i = 0; i < 3; ++i) { |
| | | writer.StartObject(); // Between StartObject()/EndObject(), |
| | | writer.Key("wrong_id"); // output a key, |
| | | writer.Int(i+1); |
| | | writer.EndObject(); |
| | | } |
| | | |
| | | for (vector<ExamFault>::iterator iter = ExamFaultList.begin(); iter != ExamFaultList.end(); ++iter) { |
| | | writer.StartObject(); |
| | | |
| | | writer.Key("sn"); |
| | | writer.Int(iter->sn); |
| | | writer.Key("utc"); |
| | | writer.String(iter->utc); |
| | | writer.Key("wrong_id"); |
| | | writer.Int(iter->wrong_id); |
| | | |
| | | writer.EndObject(); |
| | | } |
| | | |
| | | writer.EndArray(); |
| | | |
| | | SendMsgToMainProc(ID_SM_EXAM_BRIEF, sb.GetString()); |
| | | } |
| | | |
| | | void MA_SendCarPosition(const struct carBrief *brief) |
| | |
| | | writer.Int(brief->right_rear_tire[1]); |
| | | writer.EndArray(); |
| | | |
| | | writer.Key("body"); |
| | | writer.StartArray(); |
| | | for (int i = 0; i < brief->bodyNum; ++i) { |
| | | writer.Int(brief->body[i]); |
| | | } |
| | | writer.EndArray(); |
| | | |
| | | writer.Key("point"); |
| | | writer.StartArray(); |
| | | for (int i = 0; i < brief->pointNum; ++i) { |
| | |
| | | writer.EndArray(); |
| | | writer.EndObject(); |
| | | |
| | | uint32_t a = AppTimer_GetTickCount(); |
| | | SendMsgToMainProc(ID_SM_CAR, sb.GetString()); |
| | | DEBUG("èæ¶ %ld", AppTimer_GetTickCount() - a); |
| | | } |
| | | |
| | | void MA_MainProcMsgEntry(int cmd, const char *value) |
| | |
| | | if (!doc.HasParseError()) { |
| | | double basePoint[2]; |
| | | int axial[2], left_front_tire[2], right_front_tire[2], left_rear_tire[2], right_rear_tire[2]; |
| | | int bodyNum = 0; |
| | | int *body = NULL; |
| | | int pointNum = 0; |
| | | double (*point)[2] = NULL; |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | if (doc.HasMember("body")) { |
| | | const Value& s = doc["body"]; |
| | | if (s.IsArray()) { |
| | | int i = 0; |
| | | bodyNum = s.Size(); |
| | | body = new int[bodyNum]; |
| | | for(Value::ConstValueIterator itr = s.Begin(); itr != s.End(); ++itr) { |
| | | body[i++] = itr->GetInt(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (doc.HasMember("point")) { |
| | | const Value& s = doc["point"]; |
| | | if (s.IsArray()) { |
| | |
| | | } |
| | | |
| | | SetCarMeasurePoint(basePoint, axial, left_front_tire, right_front_tire, |
| | | left_rear_tire, right_rear_tire, point, pointNum); |
| | | left_rear_tire, right_rear_tire, body, bodyNum, point, pointNum); |
| | | |
| | | if (body != NULL) delete []body; |
| | | if (point != NULL) delete []point; |
| | | } |
| | | break; |
| | |
| | | #define MYAPPLICATION2_COMM_IF_H |
| | | |
| | | #include <cstdint> |
| | | #include "../driver_test.h" |
| | | |
| | | struct gpsBrief { |
| | | char utc[32]; |
| | |
| | | int right_front_tire[2]; |
| | | int left_rear_tire[2]; |
| | | int right_rear_tire[2]; |
| | | int *body; |
| | | int bodyNum; |
| | | double *point; |
| | | int pointNum; |
| | | }; |
| | |
| | | void MA_SendGpsBrief(const struct gpsBrief *brief); |
| | | void MA_SendRtkBrief(const struct rtkBrief *brief); |
| | | void MA_SendCarPosition(const struct carBrief *brief); |
| | | |
| | | void MA_SendExamWrong(vector<ExamFault> &ExamFaultList); |
| | | |
| | | #endif //MYAPPLICATION2_COMM_IF_H |
| | |
| | | int ul = ReadSerialPort(RTK_MODULE_UART, (uint8_t *)RxBuf + RxBufLen, sizeof(RxBuf) - RxBufLen); |
| | | RxBufLen += ul; |
| | | |
| | | { |
| | | /*{ |
| | | static char buffd[16384]; |
| | | |
| | | buffd[0] = 0; |
| | |
| | | } |
| | | if (strlen(buffd) > 0) |
| | | DEBUG("%s <- %s", "UART", buffd); |
| | | } |
| | | }*/ |
| | | |
| | | if (RxBufLen > 0) { |
| | | const uint8_t *ptr = parseGPS(RxBuf, RxBuf + RxBufLen); |
| | |
| | | |
| | | // CurrRTKInfo.heading = 60; |
| | | |
| | | static double deg = 0; |
| | | CurrRTKInfo.heading = deg; |
| | | |
| | | deg += 2.0; |
| | | |
| | | if (CurrRTKInfo.hh == hh && CurrRTKInfo.mm == mm && CurrRTKInfo.ss == ss && CurrRTKInfo.dss == dss) { |
| | | PlatformStatusChanged(RTK_UPDATE_EVT, (uint8_t *)&CurrRTKInfo, sizeof(CurrRTKInfo)); |
| | | // UpdateRTKInfo(&CurrRTKInfo); |
| | |
| | | |
| | | void PlatformStatusChanged(uint32_t event, const uint8_t *data, int length) |
| | | { |
| | | pthread_mutex_lock(&events_mutex); |
| | | eventMask |= event; |
| | | pthread_mutex_unlock(&events_mutex); |
| | | |
| | | if (data != NULL && length > 0) { |
| | | int x = BitCount(event-1); |
| | | |
| | |
| | | eventData[x] = malloc(length); |
| | | memcpy(eventData[x], data, length); |
| | | eventDataLength[x] = length; |
| | | |
| | | // DEBUG("ADD %d len %d", x, length); |
| | | } |
| | | |
| | | pthread_mutex_lock(&events_mutex); |
| | | eventMask |= event; |
| | | pthread_mutex_unlock(&events_mutex); |
| | | |
| | | sem_post(&sem_status_changed); |
| | | } |
| | |
| | | |
| | | while (events > 0) { |
| | | int x = BitCount(((events - 1) ^ events) - 1); |
| | | |
| | | // DEBUG("FETCH %d len %d", x, eventDataLength[x]); |
| | | |
| | | PlatformChangeEntry(BV(x), (uint8_t *)eventData[x], eventDataLength[x]); |
| | | if (eventData[x] != NULL) { |
| | | free(eventData[x]); |
| | |
| | | MA_RtkPlatformLogin(data[0]); |
| | | } |
| | | if (events & GPS_UPDATE_EVT) { |
| | | DEBUG("GPS_UPDATE_EVT length %d", length); |
| | | const gpsStatus_t *gps = (gpsStatus_t *)data; |
| | | struct gpsBrief brief; |
| | | |
| | |
| | | RequestRtkDownload(gps, 1); |
| | | } |
| | | if (events & RTK_UPDATE_EVT) { |
| | | DEBUG("RTK_UPDATE_EVT length %d", length); |
| | | const rtk_info *rtk = (rtk_info *)data; |
| | | struct rtkBrief brief; |
| | | |
| | |
| | | |
| | | static void StopCarTimeout(union sigval sig); |
| | | static void LeaveTestAreaLongtime(union sigval sig); |
| | | static void CrossCtrlLine(const Polygon *map, const car_model_cache_t *car); |
| | | static bool EnterParking(const Polygon *map, const car_model_cache_t *car); |
| | | static void CrossCtrlLine(const Polygon *map, const car_model *car, const car_model *prev_car); |
| | | static bool EnterParking(const Polygon *map, const car_model *car); |
| | | static void ParkBottomTimeout(union sigval sig); |
| | | static bool CrashRedLine(const Polygon *map, const car_model_cache_t *car); |
| | | static bool CrashRedLine(const Polygon *map, const car_model *car); |
| | | |
| | | void StartParkBottom(void) |
| | | { |
| | |
| | | currTarget = FIRST_TOUCH_CTRL_LINE; |
| | | leftTireCrossLeftLine = leftTireCrossRightLine = rightTireCrossLeftLine = rightTireCrossRightLine = false; |
| | | |
| | | TextOsd(0, "ParkBottom"); |
| | | DEBUG("StartParkBottom"); |
| | | } |
| | | |
| | | void StopParkBottom(void) |
| | |
| | | AppTimer_delete(LeaveTestAreaLongtime); |
| | | currTarget = NONE; |
| | | |
| | | TextOsd(0, "ParkBottom End"); |
| | | DEBUG("ParkBottom End"); |
| | | } |
| | | |
| | | int TestParkBottom(vector<int>&err, const Polygon *map, const car_model_cache_t *car, double speed, int run_status) |
| | | int TestParkBottom(vector<int>&err, const Polygon *map, const car_model *car, const car_model *carPrev, double speed, int run_status) |
| | | { |
| | | int status = 0; |
| | | |
| | |
| | | if (parkTimeout) { |
| | | // ä¸åæ ¼ï¼å¨ä½è¶
æ¶ |
| | | err.push_back(10); |
| | | |
| | | |
| | | status = -1; |
| | | } |
| | | // æ¯å¦å线 |
| | |
| | | } |
| | | |
| | | if (trigLeaveTestAreaDetect) { |
| | | if (IntersectionOf(car->points[car->desc->front_left_tire[TIRE_OUTSIDE]], map) == GM_Containment && |
| | | IntersectionOf(car->points[car->desc->front_right_tire[TIRE_OUTSIDE]], map) == GM_Containment) { |
| | | if (IntersectionOf(car->carXY[ car->left_front_tire[TIRE_OUTSIDE] ], map) == GM_Containment && |
| | | IntersectionOf(car->carXY[ car->right_front_tire[TIRE_OUTSIDE] ], map) == GM_Containment) { |
| | | trigLeaveTestAreaDetect = false; |
| | | AppTimer_delete(LeaveTestAreaLongtime); |
| | | } |
| | |
| | | if (!((leftTireCrossLeftLine && rightTireCrossLeftLine) || |
| | | (leftTireCrossRightLine && rightTireCrossRightLine))) { |
| | | DEBUG("CrossCtrlLine"); |
| | | CrossCtrlLine(map, car); |
| | | CrossCtrlLine(map, car, carPrev); |
| | | } else if (currTarget == FIRST_TOUCH_CTRL_LINE || currTarget == SECOND_TOUCH_CTRL_LINE) { |
| | | // è·¨è¿æ§å¶çº¿åï¼è½¦è¾æç»ååè¡é©¶ï¼å¤çè¿äºä¹±ææ
åµ |
| | | // æ´ä¸ªè½¦é½ç¦»å¼æµè¯åºåï¼å¦ææç»15ç§ï¼è¿æ²¡åå°æµè¯åºï¼å°±å¿½ç¥è¯¥æµè¯æè
æ·æ±° |
| | | if (leaveTestArea) { |
| | | if (currTarget == FIRST_TOUCH_CTRL_LINE) { |
| | | status = -2; |
| | | TextOsd(0, "æ¥éåºç©ç"); |
| | | DEBUG("æ¥éåºç©ç"); |
| | | } else { |
| | | // ä¸åæ ¼ï¼æªæè§å®çº¿è·¯è¡é©¶ï¼ç´æ¥è·åºæµè¯åºäºï¼ |
| | | err.push_back(6); |
| | | status = -1; |
| | | TextOsd(0, "ç´æ¥è·åºæµè¯åºäº"); |
| | | DEBUG("ç´æ¥è·åºæµè¯åºäº"); |
| | | } |
| | | } else if (!trigLeaveTestAreaDetect) { |
| | | Polygon car_body; |
| | | |
| | | car_body.num = car->desc->body_num; |
| | | car_body.num = car->bodyNum; |
| | | car_body.point = (PointF *) malloc(sizeof(PointF) * car_body.num); |
| | | for (int i = 0; i < car_body.num; ++i) { |
| | | car_body.point[i] = car->points[car->desc->body[i]]; |
| | | car_body.point[i] = car->carXY[car->body[i]]; |
| | | } |
| | | |
| | | if (IntersectionOf(map, &car_body) == GM_None) { |
| | |
| | | parkTimeout = false; |
| | | leftTireCrossLeftLine = leftTireCrossRightLine = rightTireCrossLeftLine = rightTireCrossRightLine = false; |
| | | |
| | | TextOsd(0, "ç¬¬ä¸æ¬¡ååº"); |
| | | DEBUG("ç¬¬ä¸æ¬¡ååº"); |
| | | } else if (the_ctrl_line_crossed > 0) { |
| | | currTarget = SECOND_PARK; |
| | | carParkSuccess = false; |
| | | leftTireCrossLeftLine = leftTireCrossRightLine = rightTireCrossLeftLine = rightTireCrossRightLine = false; |
| | | TextOsd(0, "ç¬¬äºæ¬¡ååº"); |
| | | DEBUG("ç¬¬äºæ¬¡ååº"); |
| | | } else if (currTarget != THIRD_TOUCH_CTRL_LINE) { |
| | | // ä¸åæ ¼ï¼å车åï¼2åè½®æ²¡é©¶è¿æ§å¶çº¿ |
| | | err.push_back(9); |
| | |
| | | status = -1; |
| | | } else if (currTarget == FIRST_PARK) { |
| | | currTarget = SECOND_TOUCH_CTRL_LINE; |
| | | TextOsd(0, "è¿å¦ä¸æ ¹æ§å¶çº¿"); |
| | | DEBUG("è¿å¦ä¸æ ¹æ§å¶çº¿"); |
| | | } else { |
| | | currTarget = THIRD_TOUCH_CTRL_LINE; |
| | | TextOsd(0, "åè¿ç¬¬ä¸æ ¹æ§å¶çº¿"); |
| | | DEBUG("åè¿ç¬¬ä¸æ ¹æ§å¶çº¿"); |
| | | } |
| | | } |
| | | carStopEvent = false; |
| | |
| | | } |
| | | |
| | | // æ£æµ2åè½®æ¯å¦æ£åè¶è¿å·¦å³æ§å¶çº¿ |
| | | static void CrossCtrlLine(const Polygon *map, const car_model_cache_t *car) |
| | | static void CrossCtrlLine(const Polygon *map, const car_model *car, const car_model *prev_car) |
| | | { |
| | | Line leftCtrlLine, rightCtrlLine; |
| | | Line track1; |
| | | PointF p1, p2; |
| | | |
| | | car_model_cache_t *prev_car = GetCarModelCache(1); |
| | | if (prev_car == NULL) |
| | | return; |
| | | |
| | | MakeLine(&leftCtrlLine, &map->point[0], &map->point[1]); |
| | | MakeLine(&rightCtrlLine, &map->point[6], &map->point[7]); |
| | | |
| | | // å·¦åè½®ï¼å轮宽çä¸ç¹ |
| | | p1.X = (car->points[car->desc->front_left_tire[TIRE_OUTSIDE]].X + car->points[car->desc->front_left_tire[TIRE_INSIDE]].X) / 2; |
| | | p1.Y = (car->points[car->desc->front_left_tire[TIRE_OUTSIDE]].Y + car->points[car->desc->front_left_tire[TIRE_INSIDE]].Y) / 2; |
| | | p1.X = (car->carXY[car->left_front_tire[TIRE_OUTSIDE]].X + car->carXY[car->left_front_tire[TIRE_INSIDE]].X) / 2; |
| | | p1.Y = (car->carXY[car->left_front_tire[TIRE_OUTSIDE]].Y + car->carXY[car->left_front_tire[TIRE_INSIDE]].Y) / 2; |
| | | |
| | | p2.X = (prev_car->points[prev_car->desc->front_left_tire[TIRE_OUTSIDE]].X + prev_car->points[prev_car->desc->front_left_tire[TIRE_INSIDE]].X) / 2; |
| | | p2.Y = (prev_car->points[prev_car->desc->front_left_tire[TIRE_OUTSIDE]].Y + prev_car->points[prev_car->desc->front_left_tire[TIRE_INSIDE]].Y) / 2; |
| | | p2.X = (prev_car->carXY[prev_car->left_front_tire[TIRE_OUTSIDE]].X + prev_car->carXY[prev_car->left_front_tire[TIRE_INSIDE]].X) / 2; |
| | | p2.Y = (prev_car->carXY[prev_car->left_front_tire[TIRE_OUTSIDE]].Y + prev_car->carXY[prev_car->left_front_tire[TIRE_INSIDE]].Y) / 2; |
| | | |
| | | MakeLine(&track1, &p1, &p2); |
| | | |
| | |
| | | } |
| | | |
| | | // å³åè½® |
| | | p1.X = (car->points[car->desc->front_right_tire[TIRE_OUTSIDE]].X + car->points[car->desc->front_right_tire[TIRE_INSIDE]].X) / 2; |
| | | p1.Y = (car->points[car->desc->front_right_tire[TIRE_OUTSIDE]].Y + car->points[car->desc->front_right_tire[TIRE_INSIDE]].Y) / 2; |
| | | p1.X = (car->carXY[car->right_front_tire[TIRE_OUTSIDE]].X + car->carXY[car->right_front_tire[TIRE_INSIDE]].X) / 2; |
| | | p1.Y = (car->carXY[car->right_front_tire[TIRE_OUTSIDE]].Y + car->carXY[car->right_front_tire[TIRE_INSIDE]].Y) / 2; |
| | | |
| | | p2.X = (prev_car->points[prev_car->desc->front_right_tire[TIRE_OUTSIDE]].X + prev_car->points[prev_car->desc->front_right_tire[TIRE_INSIDE]].X) / 2; |
| | | p2.Y = (prev_car->points[prev_car->desc->front_right_tire[TIRE_OUTSIDE]].Y + prev_car->points[prev_car->desc->front_right_tire[TIRE_INSIDE]].Y) / 2; |
| | | p2.X = (prev_car->carXY[prev_car->right_front_tire[TIRE_OUTSIDE]].X + prev_car->carXY[prev_car->right_front_tire[TIRE_INSIDE]].X) / 2; |
| | | p2.Y = (prev_car->carXY[prev_car->right_front_tire[TIRE_OUTSIDE]].Y + prev_car->carXY[prev_car->right_front_tire[TIRE_INSIDE]].Y) / 2; |
| | | |
| | | MakeLine(&track1, &p1, &p2); |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | static bool EnterParking(const Polygon *map, const car_model_cache_t *car) { |
| | | static bool EnterParking(const Polygon *map, const car_model *car) { |
| | | bool succ = false; |
| | | |
| | | Polygon parking; |
| | | Polygon car_body; |
| | | |
| | | car_body.num = car->desc->body_num; |
| | | car_body.num = car->bodyNum; |
| | | car_body.point = (PointF *) malloc(sizeof(PointF) * car_body.num); |
| | | for (int i = 0; i < car_body.num; ++i) { |
| | | car_body.point[i] = car->points[car->desc->body[i]]; |
| | | car_body.point[i] = car->carXY[car->body[i]]; |
| | | } |
| | | |
| | | MakePolygon(&parking, {map->point[2], map->point[3], map->point[4], map->point[5]}); |
| | |
| | | return succ; |
| | | } |
| | | |
| | | static bool CrashRedLine(const Polygon *map, const car_model_cache_t *car) |
| | | static bool CrashRedLine(const Polygon *map, const car_model *car) |
| | | { |
| | | bool ret = false; |
| | | |
| | |
| | | |
| | | Polygon car_body; |
| | | |
| | | car_body.num = car->desc->body_num; |
| | | car_body.num = car->bodyNum; |
| | | car_body.point = (PointF *) malloc(sizeof(PointF) * car_body.num); |
| | | for (int i = 0; i < car_body.num; ++i) { |
| | | car_body.point[i] = car->points[car->desc->body[i]]; |
| | | car_body.point[i] = car->carXY[car->body[i]]; |
| | | } |
| | | |
| | | for (int i = 0; i < sizeof(red_lines) / sizeof(red_lines[0]); ++i) { |
| | |
| | | |
| | | void StartParkBottom(void); |
| | | void StopParkBottom(void); |
| | | int TestParkBottom(vector<int>&err, const Polygon *map, const car_model_cache_t *car, double speed, int run_status); |
| | | int TestParkBottom(vector<int>&err, const Polygon *map, const car_model *car, const car_model *carPrev, double speed, int run_status); |
| | | |
| | | #endif //RTKDRIVERTEST_PARK_BOTTOM_H |