陀螺分数维护

/**
 *  函数名: 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;

results matching ""

    No results matching ""