路径感知与自主导航是嵌入式领域的老课题了。

说它门槛不高吧——单片机加传感器阵列,配上闭环控制算法,能沿着预设轨迹跑起来就算入门。说它没东西可挖吧,真想把导航精度、响应速度、复杂路况适应性做好,这里头的门道还真不少。

最近在调一个基于ESP32的巡迹导航平台,感知层用的是五路红外阵列,主控是ESP32-S3。调参的过程中踩了不少坑,也琢磨出一些心得。打算写一个系列文章,从方案论证开始,把感知系统设计、决策算法实现、控制参数整定、工程调试经验都梳理一遍。

这是第一篇,先聊聊为什么选这些方案,后续会逐步展开。


1 项目需求拆解

拿到一个导航机器人的项目,第一件事不是急着画原理图、选芯片,而是把需求理清楚。

1.1 核心目标定义

导航机器人的核心需求说到底就两条:

稳定循迹:机器人能沿着预设的物理轨迹自主行进,无论是直道、弯道还是交叉路口,都要保持可靠的轨迹跟踪能力。

响应及时:感知系统检测到位置偏差后,控制算法要能快速做出反应,不能等偏差积累到很大才去修正。

这两个需求看似简单,背后涉及感知层选型、控制算法设计、执行机构性能等多个维度。

1.2 性能指标量化

把需求翻译成具体参数:

指标 目标值 备注
循迹精度 偏差≤2mm 2cm宽导引线,中心±10%
最高速度 ≥0.5m/s 再快容易失控
弯道通过率 ≥95% 15°弯道连续10次
直角通过率 ≥90% 定点旋转机动
续航时间 ≥30min 2000mAh锂电池

这些指标定了,后续选型才有依据。

1.3 场景特殊性

我这个项目用的是2cm宽黑线作为物理导引。这个参数很关键——线宽直接决定了传感器数量、布局间距、误差量化精度。

  • 线宽2cm,传感器有效检测宽度大概1.5cm左右
  • 五路传感器可以覆盖5×1.5=7.5cm的宽度,容许一定的横向偏差
  • 如果换成1cm窄线,传感器间距要更密;换成3cm宽线,三路就够用

2 技术方案对比

2.1 感知层选型

导航感知方案主要有两类:红外对管和机器视觉。

红外对管方案(TCRT5000)

这套方案我最终选了。

优点:

  • 成本低,一组TCRT5000不到一块钱
  • 响应速度快,几十微秒级别
  • 功耗低,适合电池供电
  • 调试简单,数字量输出直接接GPIO就行

缺点:

  • 只能检测有无反射光,无法识别颜色
  • 受环境光影响,强光直射会干扰

机器视觉方案(OV2640等)

优点:

  • 信息量大,可以做复杂图像处理
  • 不依赖特定颜色的导引线,灰度阈值也能导航
  • 未来可扩展视觉功能

缺点:

  • 处理开销大,单片机跑实时算法吃力
  • 需要额外算力(ESP32勉强能跑)
  • 成本高,一个摄像头模块几十块

我选红外对管的原因很简单:够用就行。2cm导引线循迹是简单场景,没必要上视觉给自己找麻烦。

2.2 主控芯片选型

嵌入式主控三大选择:STM32、Arduino、ESP32。

芯片 优点 缺点
STM32F103 性能强,生态成熟 外设要多,WiFi要额外模块
Arduino (ATmega328P) 简单,库丰富 性能弱,无WiFi
ESP32 双核+WiFi+蓝牙,价格便宜 某些外设要适配

我选了ESP32-S3。理由:

第一,ESP32-S3的算力足够。双核240MHz,跑PID控制绑绑多余。

第二,内置WiFi和蓝牙,后续想做遥控调参、数据回传都很方便。

第三,价格。ESP32-S3模块加上外围电路,整机成本能控制在50块以内。

2.3 执行层驱动方案

直流电机驱动有两类常用芯片:L298N和DRV8833。

L298N太老了,压降大、效率低。实测2A电流时输入输出压降2V以上,7.4V电池到电机端只剩5V多,功率损失三成。

DRV8833是更好的选择:

  • 导通电阻0.35Ω,比L298N的2Ω小很多
  • 最大电流2.5A,持续1.5A
  • 支持PWM调速,最高250kHz

2.4 控制算法选择

导航控制算法常见的有三种:

算法 原理 优缺点
Bang-Bang 非此即彼,偏差大了猛打方向 简单但不稳定,高速必飞线
PID 比例+积分+微分,平滑控制 调参有门槛,但效果好
模糊控制 专家规则,适应性强 设计复杂,适合非线性场景

我选了增量式PID。原因:实现简单、效果好、参数可解释性强。调参虽然要花时间,但有章可循,比拍脑袋试错强。


3 系统架构

3.1 整体框图

┌─────────────┐
│  五路红外   │──────> ESP32-S3 ─────> DRV8833 ─────> 双电机
│  感知阵列   │       (主控)          (驱动)          (执行)
└─────────────┘

信号流很清晰:红外检测导引线位置 → 主控计算偏差 → PID输出控制量 → 驱动芯片调制电机转速 → 电机驱动轮子转动。

3.2 硬件资源分配

功能 引脚 说明
左电机IN1 GPIO6 方向控制
左电机IN2 GPIO7 方向控制
左电机PWM GPIO4 调速
右电机IN1 GPIO15 方向控制
右电机IN2 GPIO16 方向控制
右电机PWM GPIO5 调速
红外L1 GPIO42 左1
红外L2 GPIO41 左2
红外MID GPIO40 中间
红外R2 GPIO39 右2
红外R1 GPIO38 右1

五路红外刚好用完GPIO32~GPIO42这段连续的引脚,板子布线会很规整。

3.3 软件架构

代码采用模块化设计,分层清晰:

层次 函数 职责
感知层 readIR() 读取五路红外电平
决策层 getError() 计算导引线位置偏差
控制层 pidCalculate() PID运算
执行层 setMotor() 电机PWM输出

这样的分层有几个好处:

  • 每一层只关注自己的事,逻辑简单
  • 测试的时候可以单独验证某一层
  • 后续扩展(比如加陀螺仪)只改感知层就行

4 项目预期成果

调到这个程度算是达标:

测试项目 达标标准
直线路段 稳定循迹,偏差≤2mm
10°弯道 正常通过,速度0.4m/s
30°弯道 正常通过,速度0.3m/s
直角弯道 识别后定点旋转,通过率≥90%
连续弯道 S弯不脱线,速度0.3m/s
十字路口 不迷失方向,可预设通过策略

能稳定跑完这些,导航机器人就算合格了。


5 后续内容预告

这篇文章把技术方案定了下来。接下来会按这个顺序展开:

  • 第2篇:感知系统与执行系统硬件设计
  • 第3篇:代码逐行解析,从Motor类到PID控制
  • 第4篇:误差计算与传感器布局优化
  • 第5篇:PID参数整定经验
  • 第6篇:直角识别与定点旋转实现
  • 第7篇:调参工具与调试经验
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐