智能车竞赛新宠:手把手教你用RT1021和MicroPython搞定循迹算法(附完整代码)

发布时间:2026/6/2 4:12:48

智能车竞赛新宠:手把手教你用RT1021和MicroPython搞定循迹算法(附完整代码) 智能车竞赛新宠手把手教你用RT1021和MicroPython搞定循迹算法附完整代码全国大学生智能汽车竞赛作为国内最具影响力的高校科技赛事之一每年都吸引着无数热爱嵌入式开发的学子参与。今年镜头组新增的NXP-MicroPython赛道凭借其低门槛和高效率的特点迅速成为参赛队伍的热门选择。本文将基于恩智浦RT1021核心板和MicroPython开发环境带你从零实现一套完整的智能车循迹算法。1. 硬件平台搭建与开发环境配置1.1 RT1021核心板特性解析恩智浦i.MX RT1021跨界MCU以其500MHz主频和丰富的外设资源为MicroPython运行提供了充足的性能保障。核心板主要资源包括处理器Cortex-M7内核支持硬件浮点运算内存256KB SRAM 8MB QSPI Flash关键外设4路UART接口2路SPI接口2路I2C接口16路PWM输出8路12位ADC# 检测核心板基础功能 import machine print(CPU频率:, machine.freq()/1000000, MHz) print(内存信息:, machine.mem_info())1.2 开发环境快速部署推荐使用Thonny作为MicroPython开发IDE其内置的REPL交互环境特别适合硬件调试安装Thonny最新版建议v4.1通过Type-C连接核心板在工具→选项→解释器中选择MicroPython(Generic)端口选择对应的COM口注意首次连接需等待驱动自动安装若识别失败可尝试按住核心板BOOT键再上电2. 传感器数据采集与处理2.1 多通道ADC采样优化循迹小车通常使用红外对管或线性CCD作为赛道检测传感器。以常见的TSL1401线性CCD为例from seekfree import TSL1401 ccd TSL1401(1) # 使用SPI1接口 while True: data ccd.read() # 获取128像素点灰度值 threshold sum(data)/len(data) # 动态阈值计算 binary [1 if x threshold else 0 for x in data]数据处理技巧采用滑动窗口滤波消除噪声动态阈值适应不同光照条件边缘检测算法增强赛道边界识别2.2 电机编码器反馈处理精确的速度测量对PID控制至关重要from smartcar import encoder enc_left encoder(1) # 编码器1接左电机 enc_right encoder(2) def get_speed(): left enc_left.get_speed() # 脉冲数/采样周期 right enc_right.get_speed() return (left right)/23. 循迹控制算法实现3.1 赛道中心线提取算法基于二值化传感器数据计算赛道偏差def get_deviation(binary_data): center_sum 0 weight_sum 0 for i, val in enumerate(binary_data): if val 1: center_sum i * 10 # 10mm间距 weight_sum 1 if weight_sum 0: return None # 丢失赛道 return center_sum/weight_sum - 640 # 640为赛道中心3.2 增量式PID控制器实现class PID: def __init__(self, Kp, Ki, Kd): self.Kp, self.Ki, self.Kd Kp, Ki, Kd self.last_error 0 self.integral 0 def update(self, error, dt): derivative (error - self.last_error) / dt self.integral error * dt output self.Kp*error self.Ki*self.integral self.Kd*derivative self.last_error error return output pid PID(0.5, 0.01, 0.2) # 需根据实际调试4. 电机控制与系统整合4.1 PWM电机驱动实现from machine import PWM pwm_left PWM(1, freq1000) # PWM通道1 pwm_right PWM(2, freq1000) def set_motor_speed(left, right): pwm_left.duty(int(left * 1023 / 100)) # 0-100%转0-1023 pwm_right.duty(int(right * 1023 / 100))4.2 主控制循环架构import utime def main(): pid PID(0.5, 0.01, 0.2) while True: start utime.ticks_ms() # 获取传感器数据 ccd_data ccd.read() speed get_speed() # 计算控制量 deviation get_deviation(ccd_data) if deviation is None: set_motor_speed(0, 0) # 停止 continue steer pid.update(deviation, 0.02) # 20ms周期 base_speed 30 # 基础速度% # 差速转向 set_motor_speed(base_speed - steer, base_speed steer) # 固定频率控制 elapsed utime.ticks_diff(utime.ticks_ms(), start) utime.sleep_ms(max(20 - elapsed, 0)) main()5. 调试技巧与性能优化5.1 实时数据可视化调试利用核心板板载LCD显示调试信息from display import LCD lcd LCD() def show_debug(deviation, steer, speed): lcd.clear() lcd.text(Dev:{:4}.format(deviation), 0, 0) lcd.text(Str:{:4.1f}.format(steer), 0, 16) lcd.text(Spd:{:3}.format(speed), 0, 32)5.2 参数整定经验先调P增大P值直到小车开始振荡再调D加入D项抑制振荡最后调I小量I值消除静差速度环单独PID控制电机转速典型参数范围参数转向控制速度控制Kp0.3-0.81.0-2.0Ki0-0.020.05-0.1Kd0.1-0.30.5-1.06. 完整代码架构示例# main.py import utime from machine import PWM from smartcar import encoder from seekfree import TSL1401 from display import LCD class PID: # ... PID实现同上 ... class SmartCar: def __init__(self): self.ccd TSL1401(1) self.enc_left encoder(1) self.enc_right encoder(2) self.pwm_left PWM(1, freq1000) self.pwm_right PWM(2, freq1000) self.lcd LCD() self.steer_pid PID(0.5, 0.01, 0.2) self.speed_pid PID(1.5, 0.05, 0.8) def run(self): while True: start utime.ticks_ms() # 数据采集 ccd_data self.ccd.read() speed (self.enc_left.get_speed() self.enc_right.get_speed())/2 # 循迹控制 deviation self.get_deviation(ccd_data) if deviation is None: self.stop() continue steer self.steer_pid.update(deviation, 0.02) target_speed 30 # 基础速度 speed_correct self.speed_pid.update( target_speed - speed, 0.02) # 电机输出 left target_speed speed_correct - steer right target_speed speed_correct steer self.set_motor(left, right) # 调试显示 self.show_debug(deviation, steer, speed) # 固定周期 elapsed utime.ticks_diff(utime.ticks_ms(), start) utime.sleep_ms(max(20 - elapsed, 0)) # 其他方法实现...在实际比赛中这套系统经过调参后可以在标准赛道上达到2.5m/s的稳定速度。关键是要根据赛道特征动态调整PID参数特别是遇到急弯时需要适当降低基础速度。

相关新闻