You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

395 lines
11 KiB

#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));
}