长短高低轴
需要先进行说明的是,这一部分其实有很大概率是不会使用到的,但是其中的思想有部分是可以借鉴的
先看代码:
if(Track_Armor[0].world_position[2] > Track_Armor[1].world_position[2]){
if(R_1 > R_2) OB[tracking_id].Data_record[HIGH*LONG]++; // 高长轴
else OB[tracking_id].Data_record[HIGH*SHORT]++; // 高短轴
} else{
if(R_1 > R_2) OB[tracking_id].Data_record[LOW*LONG]++; // 矮长轴
else OB[tracking_id].Data_record[LOW*SHORT]++; // 矮短轴
}
OB[tracking_id].High_LOW_difference = abs(Track_Armor[0].world_position[2]-Track_Armor[1].world_position[2]);
OB[tracking_id].center_Z = (Track_Armor[0].world_position[2]+Track_Armor[1].world_position[2])/2;
/** 判断长短轴 */
if(OB[tracking_id].Observe_OK && tracker_state == TRACKING){
double All = OB[tracking_id].Data_record[HIGH*LONG]+OB[tracking_id].Data_record[HIGH*SHORT]+OB[tracking_id].Data_record[LOW*LONG]+OB[tracking_id].Data_record[LOW*SHORT];
OB[tracking_id].HIGH_LONG_pro = (OB[tracking_id].Data_record[HIGH*LONG]+OB[tracking_id].Data_record[LOW*SHORT])/All; // 高长轴概率
OB[tracking_id].LOW_LONG_pro = (OB[tracking_id].Data_record[LOW*LONG]+OB[tracking_id].Data_record[HIGH*SHORT])/All; // 矮长轴概率
// std::cout << "HIGH*LONG: " << OB[tracking_id].HIGH_LONG_pro << " "
// << "LOW*LONG: " << OB[tracking_id].LOW_LONG_pro << std::endl;
/** 更新装甲板(初始化) */
if(!OB_Track[tracking_id].is_initialized) // 避免出现两个装甲板时直接更新,导致无法检测跳变
OB_Track[tracking_id].update_tracker(matched_armor,t);
}
这一部分的代码会稍微的乱一些,基本也确实没有用上,这里的基本思想是概率统计,我们在进行车的圆心半径计算的时候,我们会得到车的R_1和R_2,通过这个我们可以很好的判断出的谁距离车的圆心会更近,进而判断出长短轴,你也是这么想的对吧,那就错了
你需要记住的一点是,观测数据是存在误差的,我们只是简单的通过一张2D图像(相机图像),来计算我们所有的数据,相机的像素是160像素,精度其实没有我们想的那么高,在整个计算过程中,我们的数据存在不小的误差,所以需要"滤波"的加入,或许你会觉得我们可以采用别的更好的算法来解决这个问题,但是时间与我们而已是宝贵的,我们每一帧的计算需要压缩在20ms左右,哪怕是这样帧率也不算高
所以我们需要更加“取巧”和快速的方法,这个就是一个快速的取巧方法,虽然我们的计算有时候是存在误差的,但是总体的数据趋势可以告诉我们答案,所以我们通过记录装甲板的一个长短轴判断次数,可以较为不错的得到我们想要的结果
这里就是更新当前的长短轴的部分,逻辑都比较好理解
OB_Track[tracking_id].update_tracker(enemy_armor, t); // 更新长短轴跟踪器
// 判断跟踪装甲板长短轴
if(OB_Track[tracking_id].HeightState == HIGH){
if(OB[tracking_id].HIGH_LONG_pro > OB[tracking_id].LOW_LONG_pro) OB_Track[tracking_id].axesState = LONG;
else OB_Track[tracking_id].axesState = SHORT;
}
else if(OB_Track[tracking_id].HeightState == LOW){
if(OB[tracking_id].HIGH_LONG_pro > OB[tracking_id].LOW_LONG_pro) OB_Track[tracking_id].axesState = SHORT;
else OB_Track[tracking_id].axesState = LONG;
}
update_tracker是SpinTracker(陀螺状态的跟踪器)的更新状态函数
关于高低轴的部分就不需要特殊处理了,直接判断z轴的高度然后进行维护就行了,这里不再赘述了
感谢观看