陀螺分数维护
/**
* 函数名: UpdateSpinScore
* 传入: 无
* 传出: 无
* 功能: 自然衰减状态分数,将分数低于阈值的去除,高于最大阈值的限制在最大值,维护反陀螺map
*/
/** 对陀螺分数map进行维护和判断 */
UpdateSpinScore();
这个部分会对陀螺的分数进行相应的维护,同时对陀螺的状态进行更新
首先就是遍历spin_score_map的分数记录,如果不存在跟踪ID的分数记录,就设置为未知状态,否则获取陀螺状态
// spin_score_map记录各装甲板小陀螺可能性分数,大于0顺时针旋转,小于0为逆时针旋转
for (auto score = spin_score_map.begin(); score != spin_score_map.end();){
SpinHeading spin_status; // 记录陀螺状态(未知,顺时针,逆时针)
/** spin_status_map不存在跟踪ID元素 */
if (spin_status_map.count((*score).first) == 0)
spin_status = UNKNOWN;
else
spin_status = spin_status_map[(*score).first];
接下去就对分数进行维护,对分数较低的陀螺,直接移除陀螺状态记录和分数记录,这个也有一定的弊端,有可能导致陀螺状态的清零,重新恢复陀螺判断需要一定时间,所以对于阈值的设定有比较高的要求
对陀螺分数的自然衰减的话,对于陀螺状态是有判断的,目的在于敌方退出陀螺状态的时候,可以快速退出陀螺状态,在判断陀螺模式的时候,可以加快陀螺的判断,所以有不同的衰减率设置,当然这个设置多少比较好,目前没有明确的测试数据可以验证
衰减的思路就是如此,这一部分也是值得优化的,对于这个分数机制是否有更优解,就需要去思考了
/** 陀螺分数过低 */
if (abs((*score).second) <= spin_judge_low_threshold && spin_status != UNKNOWN){
/** 将储存数据清空 */
spin_status_map.erase((*score).first); // 删除陀螺状态记录
score = spin_score_map.erase(score); // 删除陀螺分数记录
continue; // 跳转下一次循环
}
/** 陀螺分数自然衰减 */
if (spin_status != UNKNOWN)
(*score).second = 0.933 * (*score).second;
else
(*score).second = 0.987 * (*score).second;
这个是异常数据的处理,有时候会出现诸如无穷大,无穷小的情况,这个时候就直接将对应的陀螺分数记录删除
至于为什么出现的原因,大概是前面的某个地方条件判断不够严谨或者出现了特殊情况,可以深究一下
/** 异常情况处理 */
if (abs((*score).second) < 20 || isnan((*score).second)){
spin_status_map.erase((*score).first);
score = spin_score_map.erase(score);
continue;
}
这个地方就会对陀螺的状态进行判断了,这个部分就不多说了
/** 陀螺情况判别 */
if (abs((*score).second) >= spin_judge_high_threshold){
// 根据分数的正负判断陀螺方向
(*score).second = spin_judge_high_threshold * abs((*score).second) / (*score).second;
if ((*score).second > 0){
spin_status_map[(*score).first] = CLOCKWISE;
}
else if((*score).second < 0){
spin_status_map[(*score).first] = COUNTER_CLOCKWISE;
}
}
++score;