哨兵决策说明


哨兵决策说明

1.击打优先级

对于全自动机器人来说,同时识别到多个敌方机器人之后判断优先击打哪个极为重要。

上赛季思路:

  • 不击打工程机器人
  • 按一定的规则分配权重计算优先级
  • 不击打远距离(敌方高地之后)敌人

权重计算优先级:根据不同的兵种,敌方车辆与哨兵之间的距离设置不同的权重,最终综合分析进行筛选

本赛季建议:

  1. 可结合敌方车辆剩余血量进行优先级计算
  2. 结合雷达针对雷达划定的敏感区域来综合判断击打目标

2.发弹控制逻辑

将对连续出现多次的敌方车辆划入击打目标范围内,如只出现十几帧,则没必要击打,会浪费子弹并且会导致云台抖动。然后最主要的就是通用的发弹控制逻辑,就陈君他们那种,不知道咱们队里现在有没有。

3.根据不同的距离使用不同的射频

4.本赛季个人建议

若云台还是绕yaw轴转动

可以考虑哨兵在进攻与防守模式之间使用不同的决策。

进攻时可让云台360°转动,防守时云台180°转动。

鉴于今年规则以及哨兵发弹量的改变,可以尝试在前哨站未破的情况下让哨兵充当干扰敌方打符的角色。

//击打策略模块

    //获取各装甲板距离
    vector<Point2f> _pts;
    vector<Solver> solves;

    int num = 0;
    for (int i = 0; i < _armor_boxes.size(); i++)
    {

        _armor_boxes[i].getPoints(_pts);
        Solver temp_solver;
        temp_solver.solve(_pts, _armor_boxes[i].type);
        solves.push_back(temp_solver);
        _armor_boxes[i].armor_distance = solves[i].distance;
        //cout << "distancesdsdsd" << _armor_boxes[i].armor_distance << endl;
        if (solves[i].distance < 3)
            _armor_boxes[i].ShootParam.k3 = _armor_boxes[i].ShootParam.k3_1;
        else if (solves[i].distance >= 3 && solves[i].distance <= 5)
            _armor_boxes[i].ShootParam.k3 = _armor_boxes[i].ShootParam.k3_2;
        else
            _armor_boxes[i].ShootParam.k3 = _armor_boxes[i].ShootParam.k3_3;

        //兵种识别
        if (_armor_boxes[i].id == 1)
            _armor_boxes[i].ShootParam.k2 = _armor_boxes[i].ShootParam.k2_1;
        else if (_armor_boxes[i].id == 2)
            //_armor_boxes[i].ShootParam.k2 = _armor_boxes[i].ShootParam.k2_2;
        {
            state = ArmorState::LOST;
            return false;
        }
        else if (_armor_boxes[i].id == 3)
            _armor_boxes[i].ShootParam.k2 = _armor_boxes[i].ShootParam.k2_3;
        else if (_armor_boxes[i].id == 4)
            _armor_boxes[i].ShootParam.k2 = _armor_boxes[i].ShootParam.k2_4;
        else if (_armor_boxes[i].id == 5)
            _armor_boxes[i].ShootParam.k2 = _armor_boxes[i].ShootParam.k2_5;
        else
            _armor_boxes[i].ShootParam.k2 = -100;

        //装甲板大小
        if (_armor_boxes[i].type == BIG)
            _armor_boxes[i].ShootParam.k1 = _armor_boxes[i].ShootParam.k1_1;
        else
            _armor_boxes[i].ShootParam.k1 = _armor_boxes[i].ShootParam.k1_2;

        // sum
        _armor_boxes[i].ShootParam.k = _armor_boxes[i].ShootParam.k1 + _armor_boxes[i].ShootParam.k2 + _armor_boxes[i].ShootParam.k3;

        if (_armor_boxes[i].ShootParam.k > _armor_boxes[0].ShootParam.k)
            num = i;
    }

    if (_armor_boxes[num].id > 5 || _armor_boxes[num].id < 1)
    {
        state = ArmorState::LOST;
        return false;
    }
    else
    {
        target = _armor_boxes[num];

        target.timestamp = time_;   
        
        box = armor_boxes[num];
        cout << "shoot_id" << target.id << endl;
    }

    if(solves[num].distance <= 2.5)
    {
        predictor.bullet_speed = predictor.bullet_speed_2;
    }
    else
    {
        predictor.bullet_speed = predictor.bullet_speed_1;
    }
    // end
//距离射频决策模块
   if (detector.target.armor_distance <= 3)
   {
       shoot_time = 100;
       shoot_stage = ShootStage::FIRING_IN_BURSTS_1;
   }
   else if (detector.target.armor_distance >= 5.5)
   {
       shoot_time = 300;
       shoot_stage = ShootStage::DARTLE;
   }
   else if(detector.target.armor_distance == 0)
   {
       shoot_stage = 0;
   }
   else
   {
       shoot_time = 200;
       shoot_stage = ShootStage::FIRING_IN_BURSTS_2;
   }
   cout << "shoot_stage" << shoot_stage << endl;
   send_mutex.unlock();

文章作者: 韵华
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 韵华 !
  目录