62 lines
2.6 KiB
C++
62 lines
2.6 KiB
C++
#ifndef AUTO_TRIGGER_H
|
|
#define AUTO_TRIGGER_H
|
|
|
|
#include <armor_finder/armor_finder.h>
|
|
#include <show_images/ballistic_predicition.h>
|
|
#include <config/setconfig.h>
|
|
#include <vector>
|
|
#include <numeric>
|
|
|
|
/**
|
|
* @brief 自动扳机逻辑类,负责发射时机决策。
|
|
*/
|
|
class AutoTrigger {
|
|
public:
|
|
/**
|
|
* @brief 自动扳机决策函数
|
|
* @param armor_finder 当前自瞄主对象 (用于获取历史轨迹)
|
|
* @param v0 弹丸初速度
|
|
* @param gimbal_yaw 当前云台实时自瞄角偏移 (Yaw, 度)
|
|
* @param gimbal_pitch 当前云台实时自瞄角偏移 (Pitch, 度)
|
|
* @return true 目标与预测弹着点重合,建议击发
|
|
*/
|
|
static bool should_fire(const ArmorFinder &armor_finder, double v0, double gimbal_yaw, double gimbal_pitch, double threshold_deg = -1.0) {
|
|
if (armor_finder.history.size() < 3) return false; // 轨迹点不足,不预测
|
|
|
|
// 1. 获取目标当前的 3D 状态 (相对于相机)
|
|
const auto &latest = armor_finder.history.back();
|
|
double dist = latest.pos.z / 100.0; // cm -> m
|
|
|
|
// 2. 估计目标速度 (简单线性回归或两点差分)
|
|
const auto &first = armor_finder.history.front();
|
|
double dt = latest.time - first.time;
|
|
if (dt <= 0) return false;
|
|
|
|
cv::Point3f velocity = (latest.pos - first.pos) * (1.0 / dt); // cm/s
|
|
|
|
// 3. 计算飞行时间 (单位: s)
|
|
double t_flight = BallisticSolver::get_flight_time(dist, -gimbal_pitch, v0, BALLISTIC_K);
|
|
double t_total = t_flight + SYSTEM_DELAY / 1000.0;
|
|
|
|
// 4. 预测目标未来的位置 (cm)
|
|
cv::Point3f pos_pred = latest.pos + velocity * t_total;
|
|
|
|
// 5. 将预测位置映射回像素坐标 (用于判断重合)
|
|
double x_pred_pixel = pos_pred.x * FOCUS_PIXAL / pos_pred.z + IMAGE_CENTER_X;
|
|
double y_pred_pixel = pos_pred.y * FOCUS_PIXAL / pos_pred.z + IMAGE_CENTER_Y;
|
|
|
|
// 6. 推断弹着点偏移 (像素级)
|
|
// 理想打击点应该就在相机中心 (自瞄已经对准补差后的位置)
|
|
// 但是我们需要判断当前云台的 "指向误差" 是否足够小
|
|
double dist_to_center = sqrt(pow(x_pred_pixel - IMAGE_CENTER_X, 2) + pow(y_pred_pixel - IMAGE_CENTER_Y, 2));
|
|
|
|
// 7. 动态阈值判定 (依据目标距离和装甲板大小)
|
|
// 距离越远,允许的像素误差越小
|
|
double threshold = (threshold_deg > 0) ? (threshold_deg * FOCUS_PIXAL * PI / 180.0 / 100.0) : (200.0 / (dist + 0.001));
|
|
|
|
return dist_to_center < threshold;
|
|
}
|
|
};
|
|
|
|
#endif // AUTO_TRIGGER_H
|