// // Created by YY on 2020/3/23. // #include "drive_straight.h" #include "../driver_test.h" #include "../native-lib.h" #include "../jni_log.h" #include "road_exam.h" #include "../master/comm_if.h" #include "../common/apptimer.h" #include "../test_common/odo_graph.h" #include #define DEBUG(fmt, args...) LOGD(" <%s>: " fmt, __func__, ##args) static const double CHECK_STAGE_DISTANCE = 100.0; static const double MAX_OFFSET_DISTANCE = 0.3; static int setup; static double beginOdo; static int yaw_stat; static double offsetBase; static void TtsBack(int seq) { setup = 1; } void StartDriveStraightExam(void) { DEBUG("开始直线行驶"); setup = 0; yaw_stat = 0; PlayTTS("请保持直线行驶", TtsBack); } bool TestDriveStraight(road_exam_map &RoadMap, int roadIndex, const car_model *car, const struct RtkTime *rtkTime) { static double yaw; static Line baseLine; static double offset1, offset2; if (roadIndex < 0 || roadIndex >= RoadMap.roads.size()) return false; if (setup == 1) { // 偏航角平均值 static vector yaws; if (yaw_stat == 0) { yaws.clear(); } yaws.push_back(car->yaw); yaw_stat++; if (yaw_stat == 15) { yaw = AvgYaw(yaws); vector().swap(yaws); DEBUG("创建基线 yaw %f", yaw); PointF extPoint = PointExtend(car->basePoint, 100, yaw); MakeLine(&baseLine, &car->basePoint, &extPoint); beginOdo = ReadOdo(); PointF px = CalcProjectionWithRoadEdge(RoadMap.roads[roadIndex].rightEdge, car->carXY[car->axial[AXIAL_FRONT]]); offsetBase = DistanceOf(px, car->carXY[car->axial[AXIAL_FRONT]]); DEBUG("起点偏离 %f", offsetBase); setup = 2; } } else if (setup == 2) { offset1 = DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], baseLine); if (offset1 > MAX_OFFSET_DISTANCE) { DEBUG("虚拟直线偏移大于30厘米 offset1 = %f", offset1); // // 偏移大于30厘米,不合格 // AddExamFault(30, rtkTime); // return false; } PointF px = CalcProjectionWithRoadEdge(RoadMap.roads[roadIndex].rightEdge, car->carXY[car->axial[AXIAL_FRONT]]); offset2 = DistanceOf(px, car->carXY[car->axial[AXIAL_FRONT]]); if (fabs(offset2 - offsetBase) > MAX_OFFSET_DISTANCE) { DEBUG("直线偏移大于30厘米 offset2 = %f", fabs(offset2 - offsetBase)); // 偏移大于30厘米,不合格 AddExamFault(30, rtkTime); return false; } } if (setup == 2 && ReadOdo() - beginOdo > CHECK_STAGE_DISTANCE) { DEBUG("直线行驶结束 offset1 = %f offset2 = %f", offset1, fabs(offset2 - offsetBase)); PlayTTS("直线行驶结束", NULL); return false; } return true; }