跟踪器新增判断

/** 出现新增装甲板 */
    if(new_armors){
        auto same_armors_number = trackers_map.count(armor_id);    // 相同的装甲板数量
        /** 如果有2个跟踪器 */
        if (same_armors_number == 2) {
            SpinTracker *new_tracker = nullptr;                                 // 新跟踪器
            SpinTracker *last_tracker = nullptr;                                // 旧跟踪器
            double new_armor_center;                                            // 新跟踪器中心x值
            double last_armor_center;                                           // 旧跟踪器中心x值

            auto candiadates = trackers_map.equal_range(armor_id);  // 获取同类型的装甲板
            /** 循环遍历跟踪器 */
            for (auto iter = candiadates.first; iter != candiadates.second; ++iter) {
                // 若未完成初始化则视为新增tracker
                if (!(*iter).second.is_initialized) {
                    new_tracker = &(*iter).second;
                } else {
                    last_tracker = &(*iter).second;
                }
            }
            /** 判断有新旧跟踪器 */
            if (new_tracker != nullptr && last_tracker != nullptr) {
                // 获取新旧装甲板的中心x值
                new_armor_center = new_tracker->last_armor.center.x;
                last_armor_center = last_tracker->last_armor.center.x;

                auto spin_movement = new_armor_center - last_armor_center;  // 中心x坐标: 新 - 旧
                if (abs(spin_movement) > 10) {
                    // 若无该元素则插入新元素
                    if (spin_score_map.count(armor_id) == 0) {
                        spin_score_map[armor_id] = 1000 * spin_movement / abs(spin_movement);
                    }
                    // 若已有该元素且目前旋转方向与记录不同,则对目前分数进行惩罚
                    else if (spin_movement * spin_score_map[armor_id] < 0) {
                        spin_score_map[armor_id] *= 0.3;
//                        std::cout << "-----------新旧装甲板判定---------" << std::endl;
//                        std::cout << "new_tracker_x:" << new_tracker->last_armor.center.x << std::endl;
//                        std::cout << "last_tracker_x:" << last_tracker->last_armor.center.x << std::endl;
//                        std::cout << "new_armors:" << new_armors << std::endl;
                    }
                    // 若已有该元素则更新元素
                    else {
                        spin_score_map[armor_id] = spin_max_r_multiple * spin_score_map[armor_id];
                    }
                }
            }
        }
    }

这个模块有点冗杂,实际上可以尝试去进行解耦,接下来就解析一下代码


首先进入条件就是(new_armors == true)然后判断当前跟踪ID的跟踪器是否有两个

if(new_armors){
        auto same_armors_number = trackers_map.count(armor_id);    // 相同的装甲板数量
        /** 如果有2个跟踪器 */
        if (same_armors_number == 2) {
            SpinTracker *new_tracker = nullptr;                                 // 新跟踪器
            SpinTracker *last_tracker = nullptr;                                // 旧跟踪器
            double new_armor_center;                                            // 新跟踪器中心x值
            double last_armor_center;                                           // 旧跟踪器中心x值

通过判断是否完成初始化来判断新旧跟踪器,当然用时间戳也是可以的,这也是一个优化方向,update_tracker函数调用过就会将is_initialized标志位置为true

/**
 *  函数名: update_tracker
 *  传入: Armor &new_armor int timestamp          (装甲板,时间戳)
 *  传出: bool                                    (布尔变量)
 *  功能: 通过传入装甲板和时间戳,更新当前对象的最后装甲板和时间戳,将初始装甲板设为true
 */
bool SpinTracker::update_tracker(const Armor &new_armor, chrono_time timestamp) {

    is_initialized = true;                          // 初始化状态为true
    last_armor = new_armor;                         // 更新本次装甲板
    last_timestamp = timestamp;                     // 更新本次装甲板的时间戳

    return true;
}
            auto candiadates = trackers_map.equal_range(armor_id);  // 获取同类型的装甲板
            /** 循环遍历跟踪器 */
            for (auto iter = candiadates.first; iter != candiadates.second; ++iter) {
                // 若未完成初始化则视为新增tracker
                if (!(*iter).second.is_initialized) {
                    new_tracker = &(*iter).second;
                } else {
                    last_tracker = &(*iter).second;
                }
            }

这里通过获取新旧跟踪器的装甲板中心坐标,判断陀螺方向,同时进行分数的加减,不过这里的加减机制是值得优化的

        std::map<int,double> spin_score_map;            // 记录各装甲板小陀螺可能性分数,大于0为顺时针旋转,小于0为逆时针旋转             


        /** 判断有新旧跟踪器 */
            if (new_tracker != nullptr && last_tracker != nullptr) {
                // 获取新旧装甲板的中心x值
                new_armor_center = new_tracker->last_armor.center.x;
                last_armor_center = last_tracker->last_armor.center.x;

                auto spin_movement = new_armor_center - last_armor_center;  // 中心x坐标: 新 - 旧
                if (abs(spin_movement) > 10) {
                    // 若无该元素则插入新元素
                    if (spin_score_map.count(armor_id) == 0) {
                        spin_score_map[armor_id] = 1000 * spin_movement / abs(spin_movement);
                    }
                    // 若已有该元素且目前旋转方向与记录不同,则对目前分数进行惩罚
                    else if (spin_movement * spin_score_map[armor_id] < 0) {
                        spin_score_map[armor_id] *= 0.3;
//                        std::cout << "-----------新旧装甲板判定---------" << std::endl;
//                        std::cout << "new_tracker_x:" << new_tracker->last_armor.center.x << std::endl;
//                        std::cout << "last_tracker_x:" << last_tracker->last_armor.center.x << std::endl;
//                        std::cout << "new_armors:" << new_armors << std::endl;
                    }
                    // 若已有该元素则更新元素
                    else {
                        spin_score_map[armor_id] = spin_max_r_multiple * spin_score_map[armor_id];
                    }
                }

这一段代码就自行观看即可,可以看到,目前的陀螺判断条件是比较苛刻的

这一部分的优化方向就可以放宽陀螺判断、增加陀螺判断条件,优化奖惩机制

results matching ""

    No results matching ""