#include "Arith_EOController.h" #include "Arith_CoordModule.h" #include "Arith_ImgOperate.h" #include "opencv2/opencv.hpp" //////////////////////////////////////////////////////////////////////////////// //--函数定义 //////////////////////////////////////////////////////////////////////////////// /********************************************************** * 函数名称:CMD_GetCommand() * 功能描述:获取并响应任务机命令 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 调用关系:无 * 其它说明:无 **********************************************************/ void Arith_EOController::CMD_GetCommand(void) { //系统初始化 if (GLB_CMD_SYSINITIAL == g_GLB_stCommand.ubCmd) { g_GLB_bInitialize = FALSE;//初始化状态标记为:未初始化 } else { g_GLB_bInitialize = TRUE;//初始化状态标记为:已初始化 } //g_GLB_stPara.bHasRrObj = g_GLB_stCommand.unUpdateRrObj; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ //记录最后一次指令 if (LockMode::LOCK_NONE != g_GLB_stCommand.ubCmd) { g_GLB_stCommand.ubCmdLast = g_GLB_stCommand.ubCmd; } // 记录输出当前帧指令 memcpy(&g_GLB_stCommand_Pre, &g_GLB_stCommand, sizeof(GLB_PCCOMMAND)); } /********************************************************** * 函数名称:CMD_RespondCommand() * 功能描述:响应控制指令 * 输入参数:SINT32 nWidth -- 图像宽度 * SINT32 nHeight -- 图像高度 * 输出参数:无 * 返 回 值:无 * 调用关系:无 * 其它说明:无 **********************************************************/ void Arith_EOController::CMD_RespondCommand(void) { //// 场景模式切换 //switch (g_GLB_stCommand.ubMutiTrack) //{ //case 1: // g_GLB_stPara.bMutiTrack = false; // break; //case 2: // g_GLB_stPara.bMutiTrack = true; // break; //default: // break; //} //++++++++++++++1.响应系统工作模式指令+++++++++++++++++++ if (g_GLB_stCommand.ubSysStatusCmd != g_GLB_stPara.nSysMode) { switch (g_GLB_stCommand.ubSysStatusCmd) { // 空闲模式 case GLB_SYS_WAIT: g_GLB_stPara.nSysMode = GLB_SYS_WAIT; g_GLB_stPara.nStatus = GLB_STATUS_WAIT; //清空算法输出 GLB_InitOutputs(); break; // 扫描模式 case GLB_SYS_FSCAN: g_GLB_stPara.nSysMode = GLB_SYS_FSCAN; // 强制切换为搜索 g_GLB_stPara.nStatus = GLB_STATUS_FSCAN; //清空算法输出 GLB_InitOutputs(); break; // 无人值守模式(演示样机状态) case GLB_SYS_AUTO: g_GLB_stPara.nSysMode = GLB_SYS_AUTO; // 已在跟踪状态则忽略 if (g_GLB_stPara.nStatus != GLB_STATUS_TRACK) { g_GLB_stPara.nStatus = GLB_STATUS_SEARCH; //清空算法输出 GLB_InitOutputs(); } break; case GLB_SYS_STARE: g_GLB_stPara.nSysMode = GLB_SYS_STARE; // 强制切换为搜索 g_GLB_stPara.nStatus = GLB_STATUS_SEARCH; //清空算法输出 GLB_InitOutputs(); break; case GLB_SYS_SCAN: g_GLB_stPara.nSysMode = GLB_SYS_SCAN; // 强制切换为搜索 g_GLB_stPara.nStatus = GLB_STATUS_SCAN; //清空算法输出 GLB_InitOutputs(); break; default: break; } } // 场景模式切换 if (g_GLB_stCommand.ubScenCmd != g_GLB_stPara.nWorkScene && g_GLB_stCommand.ubScenCmd!=GLB_SCEN_NONE) { g_GLB_stPara.nWorkScene = g_GLB_stCommand.ubScenCmd; m_SceneType = g_GLB_stCommand.ubScenCmd; //清空算法输出 GLB_InitOutputs(); // 清空锁定指令 g_GLB_stPara.stLockCtrl = LOCK_NONE; g_GLB_stPara.bEnForceGuide = false; // 如果在跟踪模式,直接切回搜索 // 否则当前帧的跟踪信息已经清空了无法正常到下一帧 if (g_GLB_stPara.nStatus == GLB_STATUS_TRACK || g_GLB_stPara.nStatus == GLB_STATUS_MOTRACK) { g_GLB_stPara.nStatus = GLB_STATUS_SEARCH; } } //++++++++++++++2.响应跟踪器工作状态指令+++++++++++++++++++ //锁定/解锁:01目标锁定/修正攻击点,02目标解锁。 switch (g_GLB_stCommand.ubCmd) { //目标锁定/修正攻击点 case LockMode::LOCK_POINT: g_GLB_stPara.bEnForceGuide = TRUE; g_GLB_stCommand.bGuideUpDate = TRUE; CMD_OnTrack(LockMode::LOCK_POINT); break; // 框选(强制) case LockMode::LOCK_RECT: CMD_OnTrack(LockMode::LOCK_RECT); break; //目标解锁 case LockMode::LOCK_UNLOCK: CMD_OnCancelTrack(); g_GLB_stPara.bEnForceGuide = FALSE; break; // 引导 ON // case GLB_CMD_GUIDE_ON: // g_GLB_stPara.bEnRadarGuide = TRUE; // break; // // 引导 OFF // case GLB_CMD_GUIDE_OFF: // g_GLB_stPara.bEnRadarGuide = FALSE; // break; //其它 default: // break; } // 外引导多目标处理 if (g_GLB_stPara.bEnRadarGuide) { // 在导引有效期内暂时切换为自动锁定 g_GLB_stPara.bSelectObjManual = false; // 引导更新处理 if (g_GLB_stCommand.bGuideUpDate) { g_GLB_stPara.bGuideUpDate = true; g_GLB_stPara.nGuideLastTime = 500; //导引信息有效期,在此期间会不断尝试自动锁定导引区域目标 // 引导更新自动下发 LockMode::LOCK_AUTO 锁定模式 g_GLB_stPara.stLockCtrl = LockMode::LOCK_AUTO; // 读取外部引导的多目标 memcpy(g_GLB_stPara.targetGuide, g_GLB_stCommand.target, sizeof(TargetGuide)* GUIDE_TARGET_NUM); } else { g_GLB_stPara.bGuideUpDate = false; g_GLB_stPara.nGuideLastTime--; } if (g_GLB_stPara.nGuideLastTime < 0) { //清空目标检测结果 //关闭导引 g_GLB_stPara.bEnRadarGuide = false; // 关闭自动锁定 g_GLB_stPara.bSelectObjManual = true; // 自动锁定清除锁定标记 if (g_GLB_stPara.stLockCtrl == LockMode::LOCK_AUTO) { g_GLB_stPara.stLockCtrl = LockMode::LOCK_NONE; } } // 接受导引期间收到锁定指令,直接响应锁定,不再等待自动锁定,否则显得很呆// by wcw04046 @ 2021/11/25 if (g_GLB_stCommand.unSetLockPosX != 0 && g_GLB_stCommand.unSetLockPosY != 0) { g_GLB_stPara.bSelectObjManual = true; } // 更新引导信息在当前帧图像信息 for (size_t i = 0; i < GUIDE_TARGET_NUM; i++) { TargetGuideInner* pGuideInfo = &g_GLB_stPara.targetGuide[i]; // 批号0为无效目标 if (pGuideInfo->ID == 0) { memset(pGuideInfo, 0, sizeof(TargetGuide));//清除目标 continue; } // 稳定系到图像坐标系 POINT32F imgPos = getImagePosFromStablePole(pGuideInfo->stTargetPole, g_GLB_stInput.stCamera, g_GLB_stInput.servoInfo, g_GLB_stInput.afPlatformRPY, g_GLB_stInput.setupErr); pGuideInfo->ptGuidePOS.x = (int)imgPos.x; pGuideInfo->ptGuidePOS.y = (int)imgPos.y; ////判断雷达引导位置是否在视场内 if (!IMGO_IsPoint32FOutImg(g_GLB_stInput.nImageWidth, g_GLB_stInput.nImageHeight, imgPos)) { pGuideInfo->bGuidePosInFOV = true; } else { pGuideInfo->bGuidePosInFOV = false; } } } else { // 关闭自动锁定 g_GLB_stPara.bSelectObjManual = true; } // 强制提取 if (g_GLB_stPara.bEnForceGuide) { // 引导更新处理 if (g_GLB_stCommand.bGuideUpDate) { g_GLB_stPara.bGuideUpDate = true; g_GLB_stPara.nGuideLastTime = 3 * GLB_FRM_FREQ; //半自动截获有效期--3s g_GLB_stPara.stLockCtrl = LockMode::LOCK_POINT; } else { g_GLB_stPara.bGuideUpDate = false; g_GLB_stPara.stLockCtrl = LockMode::LOCK_POINT; g_GLB_stPara.nGuideLastTime--; } if (g_GLB_stPara.nGuideLastTime < 0) { //关闭导引 g_GLB_stPara.bEnForceGuide = false; // 清除锁定标记 if (g_GLB_stPara.stLockCtrl = LockMode::LOCK_POINT) { g_GLB_stPara.stLockCtrl = LockMode::LOCK_NONE; } } //g_GLB_stPara.ubLockID = g_GLB_stCommand.ubSetID; ////实际锁定点坐标(实际锁定点X坐标、实际锁定点Y坐标) //g_GLB_stPara.ptLockPos.x = g_GLB_stCommand.unSetLockPosX; //g_GLB_stPara.ptLockPos.y = g_GLB_stCommand.unSetLockPosY; ////锁定波门尺寸(宽度、高度) //g_GLB_stPara.snLockBoxSize.w = g_GLB_stCommand.unSetLockBoxW; //g_GLB_stPara.snLockBoxSize.h = g_GLB_stCommand.unSetLockBoxH; //g_GLB_stPara.snLockBoxSize.s = g_GLB_stCommand.unSetLockBoxW * g_GLB_stCommand.unSetLockBoxH; } // 指令响应完成后弹起 CMD_CleanUpPCCommand(); } /********************************************************** * 函数名称:CMD_CleanUpPCCommand() * 功能描述:初始化PC机到跟踪板的控制命令 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 调用关系:无 * 其它说明:无 **********************************************************/ void Arith_EOController::CMD_CleanUpPCCommand(void) { memset(&g_GLB_stCommand, 0, sizeof(GLB_PCCOMMAND)); } /********************************************************** * 函数名称:CMD_OnTrack() * 功能描述:按下锁定键: 开始跟踪,或修正跟踪 * 输入参数:是否需要强制锁定 * 输出参数:无 * 返 回 值:无 * 调用关系:无 * 其它说明:无 **********************************************************/ void Arith_EOController::CMD_OnTrack(LockMode mode) { g_GLB_stPara.stLockCtrl = mode; g_GLB_stPara.ubLockID = g_GLB_stCommand.ubSetID; //实际锁定点坐标(实际锁定点X坐标、实际锁定点Y坐标) g_GLB_stPara.ptLockPos.x = g_GLB_stCommand.unSetLockPosX; g_GLB_stPara.ptLockPos.y = g_GLB_stCommand.unSetLockPosY; //锁定波门尺寸(宽度、高度) /*g_GLB_stPara.snLockBoxSize.w = g_GLB_stCommand.unSetLockBoxW; g_GLB_stPara.snLockBoxSize.h = g_GLB_stCommand.unSetLockBoxH; g_GLB_stPara.snLockBoxSize.s = g_GLB_stCommand.unSetLockBoxW * g_GLB_stCommand.unSetLockBoxH;*/ } /********************************************************** * 函数名称:CMD_OnCancelTrack() * 功能描述:按下解锁键: 停止跟踪 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 调用关系:无 * 其它说明:无 **********************************************************/ void Arith_EOController::CMD_OnCancelTrack(void) { //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ //置解锁标志为真 g_GLB_stPara.stLockCtrl = LOCK_NONE; // 释放所有跟踪器 //GLB_Release_Trackers(g_GLB_stPara.nPipeMaxNum); LOG_DEBUG("CMD_OnCancelTrack:nStatus:{},unSetCancleMode:{}", g_GLB_stPara.nStatus, g_GLB_stCommand.unSetCancleMode); if (0 == g_GLB_stCommand.unSetCancleMode) {// 解锁对应点跟踪器 POINT32S ptCanclePos = { g_GLB_stCommand.unSetCanclePosX ,g_GLB_stCommand.unSetCanclePosY }; GLB_Cancle_Point(g_GLB_stPara.nPipeMaxNum,ptCanclePos); g_GLB_stPara.bEnRadarGuide = false; } if (1 == g_GLB_stCommand.unSetCancleMode) { // 释放所有跟踪器 GLB_Release_Trackers(g_GLB_stPara.nPipeMaxNum); //清空算法输出结果 //memset(&g_GLB_stOutput, 0, sizeof(GLB_OUTPUT)); } //跟踪状态下,当接收到解锁指令后,下一帧跟踪器返回待命状态 if (GLB_STATUS_TRACK == g_GLB_stPara.nStatus || GLB_STATUS_LOST == g_GLB_stPara.nStatus || (GLB_STATUS_MOTRACK == g_GLB_stPara.nStatus && 1 == g_GLB_stCommand.unSetCancleMode)) { g_GLB_stPara.nStatus = GLB_STATUS_SEARCH; } else { return; //非跟踪状态不响应 } //清空导引信息 g_GLB_stPara.bEnRadarGuide = false; memset(g_GLB_stPara.targetGuide, 0, sizeof(TargetGuide) * GUIDE_TARGET_NUM); //清空算法输出结果 memset(&g_GLB_stOutput, 0, sizeof(GLB_OUTPUT)); }