rm_vision/tasks/omniperception/decider.hpp
2025-12-15 02:33:20 +08:00

96 lines
3.3 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef OMNIPERCEPTION__DECIDER_HPP
#define OMNIPERCEPTION__DECIDER_HPP
#include <Eigen/Dense> // 必须在opencv2/core/eigen.hpp上面
#include <iostream>
#include <list>
#include <unordered_map>
#include "detection.hpp"
#include "io/camera.hpp"
#include "io/command.hpp"
#include "io/usbcamera/usbcamera.hpp"
#include "tasks/auto_aim/armor.hpp"
#include "tasks/auto_aim/target.hpp"
#include "tasks/auto_aim/yolo.hpp"
namespace omniperception
{
class Decider
{
public:
Decider(const std::string & config_path);
io::Command decide(
auto_aim::YOLO & yolo, const Eigen::Vector3d & gimbal_pos, io::USBCamera & usbcam1,
io::USBCamera & usbcam2, io::Camera & back_cammera);
io::Command decide(
auto_aim::YOLO & yolo, const Eigen::Vector3d & gimbal_pos, io::Camera & back_cammera);
io::Command decide(const std::vector<DetectionResult> & detection_queue);
Eigen::Vector2d delta_angle(
const std::list<auto_aim::Armor> & armors, const std::string & camera);
bool armor_filter(std::list<auto_aim::Armor> & armors);
void set_priority(std::list<auto_aim::Armor> & armors);
//对队列中的每一个DetectionResult进行过滤同时将DetectionResult排序
void sort(std::vector<DetectionResult> & detection_queue);
Eigen::Vector4d get_target_info(
const std::list<auto_aim::Armor> & armors, const std::list<auto_aim::Target> & targets);
void get_invincible_armor(const std::vector<int8_t> & invincible_enemy_ids);
void get_auto_aim_target(
std::list<auto_aim::Armor> & armors, const std::vector<int8_t> & auto_aim_target);
private:
int img_width_;
int img_height_;
double fov_h_, new_fov_h_;
double fov_v_, new_fov_v_;
int mode_;
int count_;
auto_aim::Color enemy_color_;
auto_aim::YOLO detector_;
std::vector<auto_aim::ArmorName> invincible_armor_; //无敌状态机器人编号,英雄为1哨兵为6
// 定义ArmorName到ArmorPriority的映射类型
using PriorityMap = std::unordered_map<auto_aim::ArmorName, auto_aim::ArmorPriority>;
const PriorityMap mode1 = {
{auto_aim::ArmorName::one, auto_aim::ArmorPriority::second},
{auto_aim::ArmorName::two, auto_aim::ArmorPriority::forth},
{auto_aim::ArmorName::three, auto_aim::ArmorPriority::first},
{auto_aim::ArmorName::four, auto_aim::ArmorPriority::first},
{auto_aim::ArmorName::five, auto_aim::ArmorPriority::third},
{auto_aim::ArmorName::sentry, auto_aim::ArmorPriority::third},
{auto_aim::ArmorName::outpost, auto_aim::ArmorPriority::fifth},
{auto_aim::ArmorName::base, auto_aim::ArmorPriority::fifth},
{auto_aim::ArmorName::not_armor, auto_aim::ArmorPriority::fifth}};
const PriorityMap mode2 = {
{auto_aim::ArmorName::two, auto_aim::ArmorPriority::first},
{auto_aim::ArmorName::one, auto_aim::ArmorPriority::second},
{auto_aim::ArmorName::three, auto_aim::ArmorPriority::second},
{auto_aim::ArmorName::four, auto_aim::ArmorPriority::second},
{auto_aim::ArmorName::five, auto_aim::ArmorPriority::second},
{auto_aim::ArmorName::sentry, auto_aim::ArmorPriority::third},
{auto_aim::ArmorName::outpost, auto_aim::ArmorPriority::third},
{auto_aim::ArmorName::base, auto_aim::ArmorPriority::third},
{auto_aim::ArmorName::not_armor, auto_aim::ArmorPriority::third}};
};
enum PriorityMode
{
MODE_ONE = 1,
MODE_TWO
};
} // namespace omniperception
#endif