energy changed

This commit is contained in:
sun
2019-07-13 10:27:27 +08:00
parent 6cafefd7bd
commit 95eb65e6f0
5 changed files with 38 additions and 37 deletions

View File

@@ -79,7 +79,7 @@ struct EnergyPartParam {
float FLOW_STRIP_CONTOUR_INTERSETION_AREA_MIN;//流动条占旋转矩形面积比最小值 float FLOW_STRIP_CONTOUR_INTERSETION_AREA_MIN;//流动条占旋转矩形面积比最小值
float TWIN_ANGEL_MAX;//两个理论上相等的角度在计算时具有的可能最大差值 float TWIN_ANGEL_MAX;//两个理论上相等的角度在计算时具有的可能最大差值
long INTERSETION_CONTOUR_AREA_MIN;//扇叶与装甲板匹配时的最小重合面积 long TARGET_INTERSETION_CONTOUR_AREA_MIN;//扇叶与装甲板匹配时的最小重合面积
long TARGET_CHANGE_DISTANCE_MAX;//目标未更改时,目标装甲板中心与原目标装甲板中心的距离变化最大值 long TARGET_CHANGE_DISTANCE_MAX;//目标未更改时,目标装甲板中心与原目标装甲板中心的距离变化最大值
long TWIN_POINT_MAX;//两个点相同时距离最大值 long TWIN_POINT_MAX;//两个点相同时距离最大值

View File

@@ -59,7 +59,7 @@ bool Energy::findTargetInFlowStripFan() {
if (rotatedRectangleIntersection(armors.at(i), flow_strip_fan, intersection) == 0) if (rotatedRectangleIntersection(armors.at(i), flow_strip_fan, intersection) == 0)
continue;//返回0表示没有重合面积 continue;//返回0表示没有重合面积
double cur_contour_area = contourArea(intersection); double cur_contour_area = contourArea(intersection);
if (cur_contour_area < energy_part_param_.INTERSETION_CONTOUR_AREA_MIN) if (cur_contour_area < energy_part_param_.TARGET_INTERSETION_CONTOUR_AREA_MIN)
continue; continue;
else { else {
target_armor = armors.at(i); target_armor = armors.at(i);

View File

@@ -60,17 +60,17 @@ void Energy::initEnergy() {
// 此函数对能量机关参数进行初始化 // 此函数对能量机关参数进行初始化
// --------------------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------------------------------
void Energy::initEnergyPartParam() { void Energy::initEnergyPartParam() {
gimble_energy_part_param_.GRAY_THRESH = 225; gimble_energy_part_param_.GRAY_THRESH = 160;
gimble_energy_part_param_.SPLIT_GRAY_THRESH = 180; gimble_energy_part_param_.SPLIT_GRAY_THRESH = 180;
gimble_energy_part_param_.FAN_GRAY_THRESH = 75; gimble_energy_part_param_.FAN_GRAY_THRESH = 75;
gimble_energy_part_param_.ARMOR_GRAY_THRESH = 80; gimble_energy_part_param_.ARMOR_GRAY_THRESH = 80;
gimble_energy_part_param_.FAN_CONTOUR_AREA_MAX = 17000; gimble_energy_part_param_.FAN_CONTOUR_AREA_MAX = 6600;
gimble_energy_part_param_.FAN_CONTOUR_AREA_MIN = 0; gimble_energy_part_param_.FAN_CONTOUR_AREA_MIN = 0;
gimble_energy_part_param_.FAN_CONTOUR_LENGTH_MIN = 70; gimble_energy_part_param_.FAN_CONTOUR_LENGTH_MIN = 56;
gimble_energy_part_param_.FAN_CONTOUR_LENGTH_MAX = 100; gimble_energy_part_param_.FAN_CONTOUR_LENGTH_MAX = 88;
gimble_energy_part_param_.FAN_CONTOUR_WIDTH_MIN = 30; gimble_energy_part_param_.FAN_CONTOUR_WIDTH_MIN = 21;
gimble_energy_part_param_.FAN_CONTOUR_WIDTH_MAX = 60; gimble_energy_part_param_.FAN_CONTOUR_WIDTH_MAX = 40;
gimble_energy_part_param_.FAN_CONTOUR_HW_RATIO_MAX = 4; gimble_energy_part_param_.FAN_CONTOUR_HW_RATIO_MAX = 4;
gimble_energy_part_param_.FAN_CONTOUR_HW_RATIO_MIN = 1; gimble_energy_part_param_.FAN_CONTOUR_HW_RATIO_MIN = 1;
gimble_energy_part_param_.FAN_NON_ZERO_RATE_MAX = 0.8; gimble_energy_part_param_.FAN_NON_ZERO_RATE_MAX = 0.8;
@@ -78,19 +78,19 @@ void Energy::initEnergyPartParam() {
gimble_energy_part_param_.ARMOR_CONTOUR_AREA_MAX = 100000; gimble_energy_part_param_.ARMOR_CONTOUR_AREA_MAX = 100000;
gimble_energy_part_param_.ARMOR_CONTOUR_AREA_MIN = 0; gimble_energy_part_param_.ARMOR_CONTOUR_AREA_MIN = 0;
gimble_energy_part_param_.ARMOR_CONTOUR_LENGTH_MIN = 13; gimble_energy_part_param_.ARMOR_CONTOUR_LENGTH_MIN = 18;
gimble_energy_part_param_.ARMOR_CONTOUR_WIDTH_MIN = 5; gimble_energy_part_param_.ARMOR_CONTOUR_LENGTH_MAX = 32;
gimble_energy_part_param_.ARMOR_CONTOUR_LENGTH_MAX = 30; gimble_energy_part_param_.ARMOR_CONTOUR_WIDTH_MIN = 10;
gimble_energy_part_param_.ARMOR_CONTOUR_WIDTH_MAX = 20; gimble_energy_part_param_.ARMOR_CONTOUR_WIDTH_MAX = 30;
gimble_energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MAX = 3; gimble_energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MAX = 3;
gimble_energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MIN = 1; gimble_energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MIN = 1;
gimble_energy_part_param_.CENTER_R_CONTOUR_AREA_MAX = 100000; gimble_energy_part_param_.CENTER_R_CONTOUR_AREA_MAX = 100000;
gimble_energy_part_param_.CENTER_R_CONTOUR_AREA_MIN = 0; gimble_energy_part_param_.CENTER_R_CONTOUR_AREA_MIN = 0;
gimble_energy_part_param_.CENTER_R_CONTOUR_LENGTH_MIN = 10; gimble_energy_part_param_.CENTER_R_CONTOUR_LENGTH_MIN = 7;
gimble_energy_part_param_.CENTER_R_CONTOUR_WIDTH_MIN = 10; gimble_energy_part_param_.CENTER_R_CONTOUR_LENGTH_MAX = 19;
gimble_energy_part_param_.CENTER_R_CONTOUR_LENGTH_MAX = 30; gimble_energy_part_param_.CENTER_R_CONTOUR_WIDTH_MIN = 7;
gimble_energy_part_param_.CENTER_R_CONTOUR_WIDTH_MAX = 30; gimble_energy_part_param_.CENTER_R_CONTOUR_WIDTH_MAX = 19;
gimble_energy_part_param_.CENTER_R_CONTOUR_HW_RATIO_MAX = 3; gimble_energy_part_param_.CENTER_R_CONTOUR_HW_RATIO_MAX = 3;
gimble_energy_part_param_.CENTER_R_CONTOUR_HW_RATIO_MIN = 1; gimble_energy_part_param_.CENTER_R_CONTOUR_HW_RATIO_MIN = 1;
gimble_energy_part_param_.CENTER_R_CONTOUR_AREA_RATIO_MIN = 0.7; gimble_energy_part_param_.CENTER_R_CONTOUR_AREA_RATIO_MIN = 0.7;
@@ -98,10 +98,10 @@ void Energy::initEnergyPartParam() {
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_MAX = 17000; gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_MAX = 17000;
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_MIN = 0; gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_MIN = 0;
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_LENGTH_MIN = 90; gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_LENGTH_MIN = 56;
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_WIDTH_MIN = 35; gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_LENGTH_MAX = 88;
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_LENGTH_MAX = 140; gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_WIDTH_MIN = 21;
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_WIDTH_MAX = 60; gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_WIDTH_MAX = 40;
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_HW_RATIO_MAX = 3; gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_HW_RATIO_MAX = 3;
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_HW_RATIO_MIN = 1; gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_HW_RATIO_MIN = 1;
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_RATIO_MAX = 0.55; gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_RATIO_MAX = 0.55;
@@ -111,17 +111,17 @@ void Energy::initEnergyPartParam() {
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_AREA_MAX = 100000; gimble_energy_part_param_.FLOW_STRIP_CONTOUR_AREA_MAX = 100000;
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_AREA_MIN = 0; gimble_energy_part_param_.FLOW_STRIP_CONTOUR_AREA_MIN = 0;
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_LENGTH_MIN = 50; gimble_energy_part_param_.FLOW_STRIP_CONTOUR_LENGTH_MIN = 31;
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_WIDTH_MIN = 3; gimble_energy_part_param_.FLOW_STRIP_CONTOUR_LENGTH_MAX = 57;
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_LENGTH_MAX = 90; gimble_energy_part_param_.FLOW_STRIP_CONTOUR_WIDTH_MIN = 2;
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_WIDTH_MAX = 20; gimble_energy_part_param_.FLOW_STRIP_CONTOUR_WIDTH_MAX = 13;
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_HW_RATIO_MAX = 12; gimble_energy_part_param_.FLOW_STRIP_CONTOUR_HW_RATIO_MAX = 12;
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_HW_RATIO_MIN = 4; gimble_energy_part_param_.FLOW_STRIP_CONTOUR_HW_RATIO_MIN = 4;
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_AREA_RATIO_MIN = 0.5; gimble_energy_part_param_.FLOW_STRIP_CONTOUR_AREA_RATIO_MIN = 0.5;
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_INTERSETION_AREA_MIN = 300; gimble_energy_part_param_.FLOW_STRIP_CONTOUR_INTERSETION_AREA_MIN = 117;
gimble_energy_part_param_.TWIN_ANGEL_MAX = 10; gimble_energy_part_param_.TWIN_ANGEL_MAX = 10;
gimble_energy_part_param_.INTERSETION_CONTOUR_AREA_MIN = 60; gimble_energy_part_param_.TARGET_INTERSETION_CONTOUR_AREA_MIN = 24;
@@ -133,8 +133,8 @@ void Energy::initEnergyPartParam() {
chassis_energy_part_param_.FAN_CONTOUR_AREA_MAX = 17000; chassis_energy_part_param_.FAN_CONTOUR_AREA_MAX = 17000;
chassis_energy_part_param_.FAN_CONTOUR_AREA_MIN = 0; chassis_energy_part_param_.FAN_CONTOUR_AREA_MIN = 0;
chassis_energy_part_param_.FAN_CONTOUR_LENGTH_MIN = 90; chassis_energy_part_param_.FAN_CONTOUR_LENGTH_MIN = 90;
chassis_energy_part_param_.FAN_CONTOUR_WIDTH_MIN = 35;
chassis_energy_part_param_.FAN_CONTOUR_LENGTH_MAX = 140; chassis_energy_part_param_.FAN_CONTOUR_LENGTH_MAX = 140;
chassis_energy_part_param_.FAN_CONTOUR_WIDTH_MIN = 35;
chassis_energy_part_param_.FAN_CONTOUR_WIDTH_MAX = 65; chassis_energy_part_param_.FAN_CONTOUR_WIDTH_MAX = 65;
chassis_energy_part_param_.FAN_CONTOUR_HW_RATIO_MAX = 4; chassis_energy_part_param_.FAN_CONTOUR_HW_RATIO_MAX = 4;
chassis_energy_part_param_.FAN_CONTOUR_HW_RATIO_MIN = 1; chassis_energy_part_param_.FAN_CONTOUR_HW_RATIO_MIN = 1;
@@ -145,8 +145,8 @@ void Energy::initEnergyPartParam() {
chassis_energy_part_param_.ARMOR_CONTOUR_AREA_MAX = 100000; chassis_energy_part_param_.ARMOR_CONTOUR_AREA_MAX = 100000;
chassis_energy_part_param_.ARMOR_CONTOUR_AREA_MIN = 0; chassis_energy_part_param_.ARMOR_CONTOUR_AREA_MIN = 0;
chassis_energy_part_param_.ARMOR_CONTOUR_LENGTH_MIN = 30; chassis_energy_part_param_.ARMOR_CONTOUR_LENGTH_MIN = 30;
chassis_energy_part_param_.ARMOR_CONTOUR_WIDTH_MIN = 15;
chassis_energy_part_param_.ARMOR_CONTOUR_LENGTH_MAX = 50; chassis_energy_part_param_.ARMOR_CONTOUR_LENGTH_MAX = 50;
chassis_energy_part_param_.ARMOR_CONTOUR_WIDTH_MIN = 15;
chassis_energy_part_param_.ARMOR_CONTOUR_WIDTH_MAX = 45; chassis_energy_part_param_.ARMOR_CONTOUR_WIDTH_MAX = 45;
chassis_energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MAX = 3; chassis_energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MAX = 3;
chassis_energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MIN = 1; chassis_energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MIN = 1;
@@ -155,8 +155,8 @@ void Energy::initEnergyPartParam() {
chassis_energy_part_param_.CENTER_R_CONTOUR_AREA_MAX = 100000; chassis_energy_part_param_.CENTER_R_CONTOUR_AREA_MAX = 100000;
chassis_energy_part_param_.CENTER_R_CONTOUR_AREA_MIN = 0; chassis_energy_part_param_.CENTER_R_CONTOUR_AREA_MIN = 0;
chassis_energy_part_param_.CENTER_R_CONTOUR_LENGTH_MIN = 10; chassis_energy_part_param_.CENTER_R_CONTOUR_LENGTH_MIN = 10;
chassis_energy_part_param_.CENTER_R_CONTOUR_WIDTH_MIN = 10;
chassis_energy_part_param_.CENTER_R_CONTOUR_LENGTH_MAX = 30; chassis_energy_part_param_.CENTER_R_CONTOUR_LENGTH_MAX = 30;
chassis_energy_part_param_.CENTER_R_CONTOUR_WIDTH_MIN = 10;
chassis_energy_part_param_.CENTER_R_CONTOUR_WIDTH_MAX = 30; chassis_energy_part_param_.CENTER_R_CONTOUR_WIDTH_MAX = 30;
chassis_energy_part_param_.CENTER_R_CONTOUR_HW_RATIO_MAX = 3; chassis_energy_part_param_.CENTER_R_CONTOUR_HW_RATIO_MAX = 3;
chassis_energy_part_param_.CENTER_R_CONTOUR_HW_RATIO_MIN = 1; chassis_energy_part_param_.CENTER_R_CONTOUR_HW_RATIO_MIN = 1;
@@ -166,8 +166,8 @@ void Energy::initEnergyPartParam() {
chassis_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_MAX = 17000; chassis_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_MAX = 17000;
chassis_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_MIN = 0; chassis_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_MIN = 0;
chassis_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_LENGTH_MIN = 90; chassis_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_LENGTH_MIN = 90;
chassis_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_WIDTH_MIN = 35;
chassis_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_LENGTH_MAX = 140; chassis_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_LENGTH_MAX = 140;
chassis_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_WIDTH_MIN = 35;
chassis_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_WIDTH_MAX = 60; chassis_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_WIDTH_MAX = 60;
chassis_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_HW_RATIO_MAX = 3; chassis_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_HW_RATIO_MAX = 3;
chassis_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_HW_RATIO_MIN = 1; chassis_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_HW_RATIO_MIN = 1;
@@ -179,8 +179,8 @@ void Energy::initEnergyPartParam() {
chassis_energy_part_param_.FLOW_STRIP_CONTOUR_AREA_MAX = 100000; chassis_energy_part_param_.FLOW_STRIP_CONTOUR_AREA_MAX = 100000;
chassis_energy_part_param_.FLOW_STRIP_CONTOUR_AREA_MIN = 0; chassis_energy_part_param_.FLOW_STRIP_CONTOUR_AREA_MIN = 0;
chassis_energy_part_param_.FLOW_STRIP_CONTOUR_LENGTH_MIN = 50; chassis_energy_part_param_.FLOW_STRIP_CONTOUR_LENGTH_MIN = 50;
chassis_energy_part_param_.FLOW_STRIP_CONTOUR_WIDTH_MIN = 3;
chassis_energy_part_param_.FLOW_STRIP_CONTOUR_LENGTH_MAX = 90; chassis_energy_part_param_.FLOW_STRIP_CONTOUR_LENGTH_MAX = 90;
chassis_energy_part_param_.FLOW_STRIP_CONTOUR_WIDTH_MIN = 3;
chassis_energy_part_param_.FLOW_STRIP_CONTOUR_WIDTH_MAX = 20; chassis_energy_part_param_.FLOW_STRIP_CONTOUR_WIDTH_MAX = 20;
chassis_energy_part_param_.FLOW_STRIP_CONTOUR_HW_RATIO_MAX = 12; chassis_energy_part_param_.FLOW_STRIP_CONTOUR_HW_RATIO_MAX = 12;
chassis_energy_part_param_.FLOW_STRIP_CONTOUR_HW_RATIO_MIN = 4; chassis_energy_part_param_.FLOW_STRIP_CONTOUR_HW_RATIO_MIN = 4;
@@ -188,7 +188,7 @@ void Energy::initEnergyPartParam() {
chassis_energy_part_param_.FLOW_STRIP_CONTOUR_INTERSETION_AREA_MIN = 300; chassis_energy_part_param_.FLOW_STRIP_CONTOUR_INTERSETION_AREA_MIN = 300;
chassis_energy_part_param_.TWIN_ANGEL_MAX = 10; chassis_energy_part_param_.TWIN_ANGEL_MAX = 10;
chassis_energy_part_param_.INTERSETION_CONTOUR_AREA_MIN = 60; chassis_energy_part_param_.TARGET_INTERSETION_CONTOUR_AREA_MIN = 60;
chassis_energy_part_param_.TARGET_CHANGE_DISTANCE_MAX = 20; chassis_energy_part_param_.TARGET_CHANGE_DISTANCE_MAX = 20;
chassis_energy_part_param_.TWIN_POINT_MAX = 20; chassis_energy_part_param_.TWIN_POINT_MAX = 20;

View File

@@ -16,7 +16,7 @@ void Energy::run(cv::Mat &gimble_src, cv::Mat &chassis_src) {
if (chassis_src.empty()) if (chassis_src.empty())
run(gimble_src);//仅拥有云台摄像头则调用单摄像头的run函数 run(gimble_src);//仅拥有云台摄像头则调用单摄像头的run函数
else if (isGimble) { else if (isGimble) {
energy_part_param_ = chassis_energy_part_param_; energy_part_param_ = gimble_energy_part_param_;
clearAll(); clearAll();
initImage(gimble_src); initImage(gimble_src);

View File

@@ -29,7 +29,7 @@ using namespace std;
mcu_data mcuData = { // 单片机端回传结构体 mcu_data mcuData = { // 单片机端回传结构体
0, // 当前云台yaw角 0, // 当前云台yaw角
0, // 当前云台pitch角 0, // 当前云台pitch角
ARMOR_STATE, // 当前状态,自瞄-大符-小符 BIG_ENERGY_STATE, // 当前状态,自瞄-大符-小符
0, // 云台角度标记位 0, // 云台角度标记位
1, // 是否启用数字识别 1, // 是否启用数字识别
ENEMY_RED, // 敌方颜色 ENEMY_RED, // 敌方颜色
@@ -63,8 +63,8 @@ int main(int argc, char *argv[]) {
video_gimble = new CameraWrapper(0/*, "armor"*/); video_gimble = new CameraWrapper(0/*, "armor"*/);
video_chassis = new CameraWrapper(1/*, "energy"*/); video_chassis = new CameraWrapper(1/*, "energy"*/);
} else { } else {
video_gimble = new VideoWrapper("/home/sun/项目/RM2019 能量机关视频/小能量机关(红+开灯).mov"); video_gimble = new VideoWrapper("/home/sun/项目/energy_video/energy_test.avi");
video_chassis = new VideoWrapper("/home/sun/项目/RM2019 能量机关视频/小能量机关(红+开灯).mov"); video_chassis = new VideoWrapper("/home/sun/项目/energy_video/energy_test.avi");
} }
if (video_gimble->init()) { if (video_gimble->init()) {
LOGM("video_gimble source initialization successfully."); LOGM("video_gimble source initialization successfully.");
@@ -101,7 +101,8 @@ int main(int argc, char *argv[]) {
if (!from_camera) extract(gimble_src, chassis_src); if (!from_camera) extract(gimble_src, chassis_src);
if (save_video) saveVideos(gimble_src, chassis_src);//保存视频 if (save_video) saveVideos(gimble_src, chassis_src);//保存视频
if (show_origin) showOrigin(gimble_src, chassis_src);//显示原始图像 if (show_origin) showOrigin(gimble_src, chassis_src);//显示原始图像
energy.run(gimble_src, chassis_src); // energy.run(gimble_src, chassis_src);
energy.run(gimble_src);
last_state = mcuData.state;//更新上一帧状态 last_state = mcuData.state;//更新上一帧状态
} else { // 自瞄模式 } else { // 自瞄模式
if (last_state != ARMOR_STATE) { if (last_state != ARMOR_STATE) {