长短高低轴

需要先进行说明的是,这一部分其实有很大概率是不会使用到的,但是其中的思想有部分是可以借鉴的

先看代码:

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轴的高度然后进行维护就行了,这里不再赘述了

感谢观看

results matching ""

    No results matching ""