自动驾驶算法开发
01-红外循迹
02-红外循迹+超声波避障
03-红外循迹+超声波避障+交通标志识别(USB)
04-车道线检测(USB)
05-车道线检测+交通标志识别(USB)
06-命令
07-连接指南
08-竞赛文档
本文档使用 MrDoc 发布
-
+
首页
01-红外循迹
## 红外循迹 ### 一、认识红外辐射 >红外线传感器是利用红外线来进行数据处理的一种传感器。它利用了某些检测元件对光、热敏感性来加以利用。例如,具有红外传感器的望远镜可以检测隐藏在角落的人体表面温度。红外线:介于可见光和微波之间、波长范围为0.76-1000微米的红外波段的电磁波。它能够与大多数分子发生共振现象,具有热效应;衍射能力强,穿透云雾的能力强。红外辐射:所有物体都以一定程度上发射红外线,其强度与物体的温度有关 红外线可以被物体反射、吸收或透过,这取决于物体的材质和表面状态。当红外线照射到物体表面时,一部分红外线会被物体吸收,一部分会被物体反射。红外传感器就是利用这种反射原理来检测物体的位置和方向。 ### 二、认识红外传感器  >红外循迹传感器通常由发射器和接收器两部分组成,发射器会发射一束红外线,这束红外线会照射到地面或其他物体表面。接收器会接收反射回来的红外线,然后将信号传输到控制器中进行处理。当物体表面是白色或亮色时,反射回来的红外线较强,接收器会收到一个较大的信号﹔当物体表面是黑色或暗色时,反射回来的红外线较弱,接收器会收到一个较小的信号。通过比较接收器接收到的信号大小,就可以判断物体的位置和方向。 小车配套的红外循迹传感器由4个红外传感器组成,并通过其连接到主控的GPIO引脚进行通信。需要使用GPIO库来读取传感器的状态,小车主控连接4个红外传感器的GPIO比引脚号分别是444、496、443、510。 #### 红外传感器GPIO引脚编号对应表 <div style="text-align: center"> <table style="display: inline-table; margin: 0 auto"> <tr> <td></td><td></td><td></td><td></td><td></td> </tr> <tr> <td>传感器编号</td> <td>1</td> <td>2</td> <td>3</td> <td>4</td> </tr> <tr> <td>GPIO引脚号</td> <td>444</td> <td>496</td> <td>443</td> <td>510</td> </tr> </table> </div> >使用不同的端口号初始化4个红外传感器对象,就可以读取四个红外传感器的状态。可以根据这些传感器的状态来控制小车的行驶方向,例如,如果中间两个传感器检测到了黑线(返回值为1),而两边的传感器没有检测到(返回值为0),则小车向前直行;如果左边的传感器检测到了黑线(返回值为1),而右边的传感器没有检测到(返回值为0),则小车向左转,以此类推。 #### 红外传感器的初始化和状态读取程序如下: from sensor import Infrared if __name__ == "__main__": infrared1 = Infrared(444) infrared2 = Infrared(496) infrared3 = Infrared(443) infrared4 = Infrared(510) while True: io1_status = infrared1.Read_Status() io2_status = infrared2.Read_Status() io3_status = infrared3.Read_Status() io4_status = infrared4.Read_Status() print(io1_status, io2_status, io3_status, io4_status) ### 三、程序流程  ### 四、程序实现 from time import sleep from bot.utils import Voice from tool import * import time import os import sys import numpy as np from bot.ugv import Motor from sensor import Infrared if __name__ == "__main__": # 定义红外循迹传感器引脚(从左到右排列) io1 = 444 # 最左侧传感器 io2 = 496 # 左中间传感器 io3 = 443 # 右中间传感器 io4 = 510 # 最右侧传感器 # 定义基础行驶速度(PWM值) speed = 2500 # 获取当前脚本所在目录路径 pwd = os.path.dirname(os.path.abspath(__file__)) print(f"当前应用路径: {pwd}") # 初始化语音提示系统 voice_ = Voice() try: # 初始化四个红外传感器对象 infrared1 = Infrared(io1) infrared2 = Infrared(io2) infrared3 = Infrared(io3) infrared4 = Infrared(io4) except Exception as e: # 传感器初始化失败时播放错误提示音并退出 voice_.send(250) print(f"初始化传感器异常: {e}") sys.exit(1) # 初始化电机控制对象(参数分别对应左前、左后、右前、右后电机) Control_Motor = Motor(0, 0, 0, 0) # 设置初始速度(左右轮相同) Control_Motor.GS_run(speed, speed) # 转弯标志计数器(用于处理全白或全黑情况) flag_turn = 0 # 行驶状态标志(0=偏左,1=偏右) status_run = 0 # 播放系统启动成功提示音 voice_.send(115) try: # 主控制循环 while True: try: # 读取四个红外传感器的状态(0=检测到黑线,1=检测到白线) io1_status = infrared1.Read_Status() io2_status = infrared2.Read_Status() io3_status = infrared3.Read_Status() io4_status = infrared4.Read_Status() # 打印当前传感器状态,用于调试 print(f"传感器状态: {io1_status}, {io2_status}, {io3_status}, {io4_status}") # ================ 循迹控制逻辑 ================ # 情况1:最左传感器检测到黑线,说明车体偏右,需要左转 if io1_status == 0 and io4_status == 1: # 左电机减速,右电机加速,实现左转修正 speed_L = speed - 1000 speed_R = speed + 1000 Control_Motor.Advance() # 设置为前进模式 Control_Motor.GS_run(speed_L, speed_R) # 应用速度调整 flag_turn = 0 # 重置转弯标志 status_run = 0 # 标记为偏左状态 # 情况2:最右传感器检测到黑线,说明车体偏左,需要右转 elif io4_status == 0 and io1_status == 1: # 左电机加速,右电机减速,实现右转修正 speed_L = speed + 1000 speed_R = speed - 1000 Control_Motor.Advance() # 设置为前进模式 Control_Motor.GS_run(speed_L, speed_R) # 应用速度调整 flag_turn = 0 # 重置转弯标志 status_run = 1 # 标记为偏右状态 # 情况3:中间两个传感器同时检测到黑线,说明车体居中直行 elif (io2_status == 0 and io3_status == 0) and (io1_status == 1 or io4_status == 1): # 左右电机保持相同速度,直线前进 speed_L = speed speed_R = speed Control_Motor.Advance() # 设置为前进模式 Control_Motor.GS_run(speed_L, speed_R) # 应用速度调整 flag_turn = 0 # 重置转弯标志 # 情况4:左中传感器检测到黑线,右中检测到白线,轻微左转 elif (io2_status == 0 and io3_status == 1) and (io1_status == 1 or io4_status == 1): # 左电机轻微减速,右电机轻微加速,实现轻微左转 speed_L = speed - 500 speed_R = speed + 500 Control_Motor.GS_run(speed_L, speed_R) # 应用速度调整 Control_Motor.Advance() # 设置为前进模式 flag_turn = 0 # 重置转弯标志 status_run = 0 # 标记为偏左状态 # 情况5:右中传感器检测到黑线,左中检测到白线,轻微右转 elif (io2_status == 1 and io3_status == 0) and (io1_status == 1 or io4_status == 1): # 左电机轻微加速,右电机轻微减速,实现轻微右转 speed_L = speed + 500 speed_R = speed - 500 Control_Motor.GS_run(speed_L, speed_R) # 应用速度调整 Control_Motor.Advance() # 设置为前进模式 flag_turn = 0 # 重置转弯标志 status_run = 1 # 标记为偏右状态 # 情况6:所有传感器都检测到白线(可能是遇到十字路口或终点) elif io1_status == 1 and io2_status == 1 and io3_status == 1 and io4_status == 1: # 连续多次检测到全白时执行转弯操作 if flag_turn > 20: speed_L = 1500 speed_R = 1500 Control_Motor.GS_run(speed_L, speed_R) # 根据之前的行驶状态决定左转还是右转 if status_run == 0: Control_Motor.Rotate_Left() # 左转 else: Control_Motor.Rotate_Right() # 右转 flag_turn = flag_turn + 1 # 增加转弯标志计数 else: # 其他情况(如检测到全黑),停止机器人 Control_Motor.Stop() # 检查是否有用户输入的退出指令(按下'q'键) if has_digit_input() == 'q': break except KeyboardInterrupt: # 捕获Ctrl+C中断信号,优雅退出 break finally: # 程序结束时的资源清理 Control_Motor.close() # 关闭电机控制 infrared1.close() # 关闭红外传感器1 infrared2.close() # 关闭红外传感器2 infrared3.close() # 关闭红外传感器3 infrared4.close() # 关闭红外传感器4 voice_.send(4) # 播放结束提示音 voice_.close() # 关闭语音系统 print("系统安全关闭")
gdsoke
2025年6月26日 12:02
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码