// // Created by YY on 2023/4/20. // #include "teach.h" #include "../jni_log.h" #include "../driver_test.h" #include "../native-lib.h" #include #include #include #define DEBUG(fmt, args...) LOGD(" <%s>: " fmt, __func__, ##args) typedef struct { int id; std::string tts; int stage; int refer; // 车身某点,某某事件 PointF point; // 采集点经过坐标变换后得到 } point_tip_t; typedef struct { int id; std::string tts; int stage; int refer; // 车身某点,某某事件 double distance; Line line; // 采集点经过坐标变换后得到 } line_tip_t; typedef struct { int item; std::vector tips; } teach_tips_t; typedef struct { }; teach_tips_t all; void testAll(void) { all.item = MAP_TYPE_PARK_BUTTOM; point_tip_t p1 = { .id = 1, .tts = "提示一", .stage = 2, .refer = 1, .point = {.X = 4.396647, .Y = 4.967977} }; point_tip_t p2 = { .id = 2, .tts = "提示二", .stage = 2, .refer = 1, .point = {.X = 1.352043, .Y = 3.434146} }; point_tip_t p3 = { .id = 3, .tts = "提示三", .stage = 2, .refer = 1, .point = {.X = 1.042866, .Y = 0.124397} }; point_tip_t p4 = { .id = 4, .tts = "提示四", .stage = 2, .refer = 1, .point = {.X = 1.037644, .Y = -4.675115} }; all.tips.push_back(p1); all.tips.push_back(p2); all.tips.push_back(p3); all.tips.push_back(p4); } class Foobar { public: int id; double distance; Foobar(int id, double distance): id(id), distance(distance) {} ~Foobar() = default; bool operator<(const Foobar &bar) { if (this->distance < bar.distance) { return true; } return false; } bool static decrease(const Foobar &foo1, const Foobar &foo2) { if (foo1.distance > foo2.distance) { return false; } return true; } }; std::vector status; // 当前项目阶段发生变化时,产生的点位提示 void LoadStageTips(prime_t &prime) { DEBUG("LoadStageTips %d", prime.examing_area.stage); std::vector().swap(status); // 以2号点(左侧车库入口角)为原点 double dx = std::get(prime.maps)[prime.examing_area.idx].points[2].X; double dy = std::get(prime.maps)[prime.examing_area.idx].points[2].Y; // 以2---->3线为-Y轴,旋转 double angle = YawOf(std::get(prime.maps)[prime.examing_area.idx].points[2], std::get(prime.maps)[prime.examing_area.idx].points[3]); if (angle > 180) { angle = angle - 180; } else { angle = angle + 180; } // 记录车辆位置经过坐标变换后的值 PointF car = {.X = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->axial[AXIAL_FRONT]].X - dx, .Y = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->axial[AXIAL_FRONT]].Y - dy}; car = rotatePoint(car, {.X = 0,.Y = 0}, angle); // 需按照距离远近递增排序 for (int i = 0; i < all.tips.size(); ++i) { if (all.tips[i].stage == prime.examing_area.stage) { DEBUG("Add %d: %f", i, DistanceOf(car, all.tips[i].point)); status.push_back(Foobar(i, DistanceOf(car, all.tips[i].point))); } } if (status.size() > 0) { std::sort(status.begin(), status.end(), Foobar::decrease); for (auto st: status) { DEBUG("%d: %f", st.id, st.distance); } } } void teach(prime_t &prime) { if(status.size() == 0) return; PointF car; PointF &teach_point = all.tips[status.front().id].point; switch (prime.examing_area.type) { case MAP_TYPE_PARK_BUTTOM: { // 以2号点(左侧车库入口角)为原点 double dx = std::get(prime.maps)[prime.examing_area.idx].points[2].X; double dy = std::get(prime.maps)[prime.examing_area.idx].points[2].Y; // 以2---->3线为-Y轴,旋转 double angle = YawOf(std::get(prime.maps)[prime.examing_area.idx].points[2], std::get(prime.maps)[prime.examing_area.idx].points[3]); if (angle > 180) { angle = angle - 180; } else { angle = angle + 180; } // 记录车辆位置经过坐标变换后的值 car = {.X = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->axial[AXIAL_FRONT]].X - dx, .Y = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->axial[AXIAL_FRONT]].Y - dy}; car = rotatePoint(car, {.X = 0,.Y = 0}, angle); break; } case MAP_TYPE_PARK_EDGE: break; case MAP_TYPE_RIGHT_CORNER: break; case MAP_TYPE_UPHILL: break; case MAP_TYPE_CURVE: break; default:break; } double dis = DistanceOf(car, teach_point); DEBUG("XY(%f,%f, dis = %f)", car.X, car.Y, dis); if (dis < status.front().distance) { status.front().distance = dis; } else if (dis > status.front().distance && dis - status.front().distance > 0.05) { // 提示 PlayTTS(all.tips[status.front().id].tts, nullptr); status.erase(status.begin()); } }