找回密码
 立即注册
查看: 269|回复: 0

我的电磁障碍方案

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-01-14 09:01:32

11

主题

7

回帖

450

积分

中级会员

积分
450
发表于 2024-8-20 06:54:36 | 显示全部楼层 |阅读模式
本帖最后由 yiran_Fantasy 于 2024-8-20 06:54 编辑

上次发了一个帖子,问问大家的障碍方案,这次给出我的障碍方案细节



过障碍物大家都是使用tof测距或者超声波测距,当发现测距值小于某一阈值时,认为这是一个障碍物,做出相应的处理。但是,比赛过程中有很多时候会误判,将场地里其他的道具误认为是障碍物,如锥桶、坡道侧面、场地边缘等,好在障碍物一般会放在一个比较长的直道上,解决方式是加一些限定条件,我的处理方式是:当检测到障碍物距离小于600毫米,并且现在车在走直道,判断方式多样,可以是差比和小于一个很小的阈值,或者中间电感很小(取决于中间电感的放置方式,竖着放的话,直道为0),并且设置一个标志位用于检测是否通过了一次障碍,过了一次障碍之后,将这个标志位置1,表示再也不会再判断障碍物,只有这个标志为0才可以做出障碍物处理。下面给出判断处理代码:
  1. <font color="#000000">/***** 3.障碍物处理 ******/
  2.         //距离小于阈值,并且在走直线
  3. if(dl1b_distance_mm<AVOID_DIS_MIN && Middle_Adc>-5 && Middle_Adc<5)   turn_avoid_flag = 1;  //置障碍标志
  4. if(turn_avoid_flag==1 || turn_avoid_flag==2)  
  5. {
  6.     Aviod_encoder +=(temp_left_pluse+temp_right_pluse)/2;        //累计编码值
  7.     if(Aviod_encoder>= AVOID_TURN_QUIT && turn_avoid_flag==1) turn_avoid_flag=2; //编码值大于驶 离障碍阈值转到状态2
  8. else if(Aviod_encoder>AVIOD_TURN_BUCK && turn_avoid_flag==2)         //状态2
  9. {
  10.     Aviod_encoder = 0;         
  11.     turn_avoid_flag = 0;   //清空标志位
  12.     Avoid_Count+=1;
  13.     if(Avoid_Count>=1)      
  14.     One_avoid_flag = 1;     //只过一次障碍标志位置1,以后也不会再进行环岛处理
  15. }  
复制代码


刚刚只是给出了障碍的判断,并没有进行通过处理,我的处理方式是,有障碍物时是状态1,控制电机差速先往一个方向驶离障碍物(我使用右转驶离),并累计路程,路程到一定值时跳转到状态2,状态2下控制电机差速左转驶回赛道(左转驶回赛道),并在期间累计路程,路程到达一定值时,清空标志位,并置位只过一次障碍的标志位,这一步在置位标志位时已经进行。下面给出过障碍代码:


  1. else if(turn_avoid_flag !=0 && (outtrack_flag ==0 || outtrack_flag ==1) && One_avoid_flag!=1)  //过障碍物处理
  2. {
  3.    if(turn_avoid_flag==1)   //状态1,电机固定偏差驶离赛道
  4.    {
  5.        Round_PWM_L = PID_Calculate(&pid_motor_left,Left_motor.get_encoder_speed,AVOID_SPEED_QUIT_L);
  6.        Round_PWM_R = PID_Calculate(&pid_motor_right,Right_motor.get_encoder_speed,AVOID_SPEED_QUIT_R);
  7.        Motor_Left_Command(Round_PWM_L);
  8.        Motor_Right_Command(Round_PWM_R);
  9.    }
  10.    else if(turn_avoid_flag==2)   //状态2,驶回赛道
  11.    {
  12.       Round_PWM_L = PID_Calculate(&pid_motor_left,Left_motor.get_encoder_speed,AVOID_SPEED_BACK_L);
  13.       Round_PWM_R = PID_Calculate(&pid_motor_right,Right_motor.get_encoder_speed,AVOID_SPEED_BACK_R);
  14.       Motor_Left_Command(Round_PWM_L);
  15.       Motor_Right_Command(Round_PWM_R);
  16.   }
复制代码





障碍判断.png
电子爱好者,电子世界的小白一枚
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:25 , Processed in 0.149668 second(s), 48 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表