void Tracking(void) //白0 黑1 { static u8 t1 = 0; static u8 t2 = 0; if((left_led == 0)&&(right_led == 0)&&(zhong_led == 1)) //全是白线,或中间检测到黑线 { t1 = 0; t2 = 0; forward(); //调用前进函数 } if(t1==1) { if((left_led == 1)&&(right_led == 1)&&(zhong_led == 1)) //全是黑线 { right(); //调用小车右转函数 while(!zhong_led); delay_ms(20); forward(); } if((left_led == 0)&&(right_led == 0)&&(zhong_led == 0)) //全是白线 { right(); //调用小车右转函数 while(!zhong_led); delay_ms(20); forward(); } } if(t2==1) { if((left_led == 1)&&(right_led == 1)&&(zhong_led == 1)) //全是黑线 { left(); //调用小车左转函数 while(!zhong_led); delay_ms(20); forward(); } if((left_led == 0)&&(right_led == 0)&&(zhong_led == 0)) //全是白线 { left(); //调用小车左转函数 while(!zhong_led); delay_ms(20); forward(); } } if((left_led == 1)&&(right_led == 0)) //左边检测到黑线 { left(); //调用小车左转函数 delay_ms(120); while(!zhong_led); delay_ms(20); forward(); t1 = 1; } if((right_led == 1) && (left_led == 0)) //右边检测到黑线 { right(); //调用小车右转函数 delay_ms(120); while(!zhong_led); delay_ms(20); forward(); t2 = 1; } }
时间: 2024-04-03 22:37:15 浏览: 52
这是一个名为`Tracking`的函数,用于小车的自动跟踪。函数中首先定义了两个静态无符号8位整型变量`t1`和`t2`,用于标记是否需要进行左转或右转。接下来根据三个光电传感器的输出判断小车所处的状态,如果三个传感器都检测到白线或中间传感器检测到黑线,则调用`forward()`函数使小车前进。如果`t1`等于1,表示需要进行左转,此时如果三个传感器都检测到黑线,则调用`right()`函数使小车右转,直到中间传感器检测到黑线,然后延时20毫秒再调用`forward()`函数使小车前进。如果三个传感器都检测到白线,则也调用`right()`函数使小车右转,直到中间传感器检测到黑线,然后延时20毫秒再调用`forward()`函数使小车前进。`t2`的处理与`t1`类似,只是调用的是`left()`函数使小车左转。如果左侧传感器检测到黑线,则调用`left()`函数使小车左转,延时120毫秒等待小车完成转向,然后等待中间传感器检测到黑线,延时20毫秒后再调用`forward()`函数使小车前进,并将`t1`标记为1。如果右侧传感器检测到黑线,则调用`right()`函数使小车右转,延时120毫秒等待小车完成转向,然后等待中间传感器检测到黑线,延时20毫秒后再调用`forward()`函数使小车前进,并将`t2`标记为1。
相关问题
void Tracking_Mode(void) { u8 Get_Black = 0; while(1) { Get_Black = Track_GetState(); //00111----01111-----10111 if((Get_Black == 0X07)||(Get_Black == 0X0F)||(Get_Black == 0X17)) { moter_control(MOVE_LEFT,40);//左转 } //11100----11110-----11101 else if((Get_Black == 0X1C)||(Get_Black == 0X1E)||(Get_Black == 0X1D)) { moter_control(MOVE_RIGTH,40);//右转 } //11011-----11001-----10011 else if((Get_Black == 0X1B)||(Get_Black == 0X19)||(Get_Black == 0X13)||(Get_Black == 0X11)) { moter_control(MOVE_GO,40); } //00000 else if(Get_Black == 0X00) { SysTick_delayms(100); if(Track_GetState() == 0X00) { moter_control(MOVE_STOP,0);//停止 } } } },为什么我在直行的地方加了(Get_Black == 0X11)反而更容易跑出跑道
根据代码,当Get_Black的值为0X11时,会执行直行的代码段。但是,根据你所提供的情况,加入该判断反而更容易跑出跑道,这可能是因为在特定的场景下,该判断条件不适用。
可能的原因是,当车辆行驶在直线上时,传感器可能会受到干扰,导致Get_Black的值出现了偏差。因此,建议你在直行的代码段中加入一些额外的条件,例如判断Get_Black的值是否在某个特定的范围内,或者判断车辆是否在一段时间内保持了直行状态。这些额外的条件将有助于提高代码的稳定性,从而减少跑出跑道的情况。
od = yolov5() cap = cv2.VideoCapture("/content/drive/MyDrive/交通流项目/交通流项目/test_img/1.mp4") # Initialize count count = 0 center_points_prev_frame = [] tracking_objects = {} track_id = 0
这段代码的含义是,使用yolov5模型创建一个对象od,并使用cv2库中的VideoCapture函数读取"/content/drive/MyDrive/交通流项目/交通流项目/test_img/1.mp4"文件的视频流,并创建一个对象cap来存储该视频流。
阅读全文