哨兵决策说明
1.击打优先级
对于全自动机器人来说,同时识别到多个敌方机器人之后判断优先击打哪个极为重要。
上赛季思路:
- 不击打工程机器人
- 按一定的规则分配权重计算优先级
- 不击打远距离(敌方高地之后)敌人
权重计算优先级:根据不同的兵种
,敌方车辆与哨兵之间的距离
设置不同的权重,最终综合分析进行筛选
本赛季建议:
- 可结合敌方车辆剩余血量进行优先级计算
- 结合雷达针对雷达划定的敏感区域来综合判断击打目标
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();