跟踪器新增判断
/** 出现新增装甲板 */
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];
}
}
这一段代码就自行观看即可,可以看到,目前的陀螺判断条件是比较苛刻的
这一部分的优化方向就可以放宽陀螺判断、增加陀螺判断条件,优化奖惩机制