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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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