我的电磁障碍方案
本帖最后由 yiran_Fantasy 于 2024-8-20 06:54 编辑上次发了一个帖子,问问大家的障碍方案,这次给出我的障碍方案细节
过障碍物大家都是使用tof测距或者超声波测距,当发现测距值小于某一阈值时,认为这是一个障碍物,做出相应的处理。但是,比赛过程中有很多时候会误判,将场地里其他的道具误认为是障碍物,如锥桶、坡道侧面、场地边缘等,好在障碍物一般会放在一个比较长的直道上,解决方式是加一些限定条件,我的处理方式是:当检测到障碍物距离小于600毫米,并且现在车在走直道,判断方式多样,可以是差比和小于一个很小的阈值,或者中间电感很小(取决于中间电感的放置方式,竖着放的话,直道为0),并且设置一个标志位用于检测是否通过了一次障碍,过了一次障碍之后,将这个标志位置1,表示再也不会再判断障碍物,只有这个标志为0才可以做出障碍物处理。下面给出判断处理代码:
<font color="#000000">/***** 3.障碍物处理 ******/
//距离小于阈值,并且在走直线
if(dl1b_distance_mm<AVOID_DIS_MIN && Middle_Adc>-5 && Middle_Adc<5) turn_avoid_flag = 1;//置障碍标志
if(turn_avoid_flag==1 || turn_avoid_flag==2)
{
Aviod_encoder +=(temp_left_pluse+temp_right_pluse)/2; //累计编码值
if(Aviod_encoder>= AVOID_TURN_QUIT && turn_avoid_flag==1) turn_avoid_flag=2; //编码值大于驶 离障碍阈值转到状态2
else if(Aviod_encoder>AVIOD_TURN_BUCK && turn_avoid_flag==2) //状态2
{
Aviod_encoder = 0;
turn_avoid_flag = 0; //清空标志位
Avoid_Count+=1;
if(Avoid_Count>=1)
One_avoid_flag = 1; //只过一次障碍标志位置1,以后也不会再进行环岛处理
}
刚刚只是给出了障碍的判断,并没有进行通过处理,我的处理方式是,有障碍物时是状态1,控制电机差速先往一个方向驶离障碍物(我使用右转驶离),并累计路程,路程到一定值时跳转到状态2,状态2下控制电机差速左转驶回赛道(左转驶回赛道),并在期间累计路程,路程到达一定值时,清空标志位,并置位只过一次障碍的标志位,这一步在置位标志位时已经进行。下面给出过障碍代码:
else if(turn_avoid_flag !=0 && (outtrack_flag ==0 || outtrack_flag ==1) && One_avoid_flag!=1)//过障碍物处理
{
if(turn_avoid_flag==1) //状态1,电机固定偏差驶离赛道
{
Round_PWM_L = PID_Calculate(&pid_motor_left,Left_motor.get_encoder_speed,AVOID_SPEED_QUIT_L);
Round_PWM_R = PID_Calculate(&pid_motor_right,Right_motor.get_encoder_speed,AVOID_SPEED_QUIT_R);
Motor_Left_Command(Round_PWM_L);
Motor_Right_Command(Round_PWM_R);
}
else if(turn_avoid_flag==2) //状态2,驶回赛道
{
Round_PWM_L = PID_Calculate(&pid_motor_left,Left_motor.get_encoder_speed,AVOID_SPEED_BACK_L);
Round_PWM_R = PID_Calculate(&pid_motor_right,Right_motor.get_encoder_speed,AVOID_SPEED_BACK_R);
Motor_Left_Command(Round_PWM_L);
Motor_Right_Command(Round_PWM_R);
}
页:
[1]