diff --git a/armor/src/armor_finder/anti_top/anti_top.cpp b/armor/src/armor_finder/anti_top/anti_top.cpp index 97a1feb..67e79e4 100644 --- a/armor/src/armor_finder/anti_top/anti_top.cpp +++ b/armor/src/armor_finder/anti_top/anti_top.cpp @@ -38,6 +38,14 @@ void ArmorFinder::antiTop() { // 通过两次装甲角度为零的时间差计算陀螺旋转周期 // 根据旋转周期计算下一次装甲出现在角度为零的时间点 if (getPointLength(last_box.getCenter() - target_box.getCenter()) > last_box.rect.height * 1.5) { + /* PID相关控制 */ + sum_yaw = sum_pitch = 0; + double dx = target_box.rect.x + target_box.rect.width / 2 - IMAGE_CENTER_X; + double dy = target_box.rect.y + target_box.rect.height / 2 - IMAGE_CENTER_Y; + double yaw = dx; + double pitch = dy; + /* PID相关控制 */ + auto front_time = getFrontTime(time_seq, angle_seq); auto once_periodms = getTimeIntervalms(front_time, last_front_time); // if (abs(once_periodms - top_periodms[-1]) > 50) { diff --git a/armor/src/armor_finder/armor_finder.cpp b/armor/src/armor_finder/armor_finder.cpp index 96fd655..245c8ca 100644 --- a/armor/src/armor_finder/armor_finder.cpp +++ b/armor/src/armor_finder/armor_finder.cpp @@ -54,7 +54,11 @@ ArmorFinder::ArmorFinder(uint8_t &color, Serial &u, const string ¶s_folder, anti_switch_cnt(0), classifier(paras_folder), contour_area(0), - tracking_cnt(0) { + tracking_cnt(0), + last_yaw(0), + last_pitch(0), + sum_yaw(0), + sum_pitch(0) { } void ArmorFinder::run(cv::Mat &src) { @@ -75,6 +79,9 @@ void ArmorFinder::run(cv::Mat &src) { tracker->init(src, target_box.rect); state = TRACKING_STATE; tracking_cnt = 0; + last_yaw = target_box.rect.x + target_box.rect.width / 2 - IMAGE_CENTER_X; + last_pitch = target_box.rect.y + target_box.rect.height / 2 - IMAGE_CENTER_Y; + sum_yaw = sum_pitch = 0; LOGM(STR_CTR(WORD_LIGHT_CYAN, "into track")); } } @@ -82,6 +89,8 @@ void ArmorFinder::run(cv::Mat &src) { case TRACKING_STATE: if (!stateTrackingTarget(src) || ++tracking_cnt > 100) { // 最多追踪100帧图像 state = SEARCHING_STATE; + last_yaw = last_pitch = 0; + sum_yaw = sum_pitch = 0; LOGM(STR_CTR(WORD_LIGHT_YELLOW, "into search!")); } break; @@ -93,6 +102,11 @@ end: if(is_anti_top) { // 判断当前是否为反陀螺模式 antiTop(); }else if(target_box.rect != cv::Rect2d()) { + if(last_box.rect == cv::Rect2d()) { // 如果上一帧没有目标装甲板 + sum_yaw = sum_pitch = 0; + last_yaw = target_box.rect.x + target_box.rect.width / 2 - IMAGE_CENTER_X; + last_pitch = target_box.rect.y + target_box.rect.height / 2 - IMAGE_CENTER_Y; + } anti_top_cnt = 0; time_seq.clear(); angle_seq.clear(); diff --git a/main.cpp b/main.cpp index 13c9dc3..52ce99b 100644 --- a/main.cpp +++ b/main.cpp @@ -44,7 +44,9 @@ WrapperHead *video = nullptr; // 云台摄像头视频源 Serial serial(115200); // 串口对象 uint8_t last_state = ARMOR_STATE; // 上次状态,用于初始化 // 自瞄主程序对象 -ArmorFinder armor_finder(mcu_data.enemy_color, serial, PROJECT_DIR"/tools/para/", mcu_data.anti_top); +uint8_t enemy_color = ENEMY_BLUE;//RED ro BLUE +uint8_t forced_anti_top = 1; +ArmorFinder armor_finder(enemy_color, serial, PROJECT_DIR"/tools/para/", forced_anti_top); // 能量机关主程序对象 Energy energy(serial, mcu_data.enemy_color); diff --git a/others/include/camera/camera_define.h b/others/include/camera/camera_define.h index 1f56316..101fe3b 100644 --- a/others/include/camera/camera_define.h +++ b/others/include/camera/camera_define.h @@ -662,4 +662,4 @@ typedef void (*CAMERA_PAGE_MSG_PROC)(CameraHandle hCamera,UINT MSG,UINT uParam,P #define CAMERA_MEDIA_TYPE_RGB16_PLANAR (CAMERA_MEDIA_TYPE_COLOR | CAMERA_MEDIA_TYPE_OCCUPY48BIT | 0x0024) -#endif \ No newline at end of file +#endif