news 2026/10/14 17:39:10

STM32三路超声波跟随小车实战:从传感器布局到状态机控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32三路超声波跟随小车实战:从传感器布局到状态机控制

简介:STM32三路超声波自动跟随小车项目是一套基于STM32微控制器的完整嵌入式工程资源,面向电子竞赛备赛者、课程设计学生以及智能车入门开发者,解决三路超声波测距与自动跟随控制的问题。核心包含STM32底层驱动、三路超声波数据采集与跟随策略,可从源码层面理解信号采集到电机控制的完整链路。压缩包共309个文件,整体8.45MB,既包含C/H源码与Keil工程配置,也包括编译生成的hex、axf烧录文件,以及调试脚本、映射文件、说明文档等,便于直接打开工程查看或烧录验证。已有2403人学习下载,在同类资源中具有较高的参考价值。使用这套资源,可以学习多超声波避障与跟随布局、GPIO和定时器配置、PWM电机控制以及常见跟随算法的参数调整方法;工程内保留的中间文件和调试信息,也能帮助理解编译链接流程和问题定位思路,适合在此基础上二次开发或移植到其他STM32型号。

1. 三路超声波跟随小车:这个标题背后是什么,值不值得动手

STM32三路超声波自动跟随小车,听起来像是一个课设或者毕设题目,但拆开看,它其实是「移动机器人避障跟随」这个方向里性价比最高的一条入门路径。所谓三路,是指车头左、中、右各装一颗超声波传感器,通过对三颗传感器测距结果的比对,判断目标物体或人在哪个方位,进而控制小车转向和前进后退,实现自动跟随。核心控制器用 STM32,常见的是 STM32F103C8T6 这颗经典芯片,搭配 L298N 或者 TB6612 驱动直流减速电机,整套物料成本在百元级别,却能覆盖传感器采集、数据处理、电机控制、逻辑状态机这几块嵌入式核心技能。

这篇笔记要讲的就是一个可以用手头零件完整复现的方案。从三颗超声波怎么布局、数据怎么融合,到跟随逻辑的状态机怎么写、PID 参数怎么试,再到实际跑起来之后最常见的翻车点,一次讲清楚。适合正在做课设的学生、想入门嵌入式控制但没有方向的开发者,以及想把「能跑」升级成「跟得稳」、但又不想直接上视觉方案的人。需要说明的是,我这里描述的是这个标题背后最通用的实现路径,不是某个特定压缩包的源码解析,思路和代码可以照着搭,但不要指望复制粘贴就能跑。

2. 硬件选型与三路超声波的安装布局:为什么是三颗而不是一颗

2.1 核心器件清单与选型理由

先把手头需要的物料列清楚。主控用 STM32F103C8T6 最小系统板,淘宝上十几块钱一块,48 脚封装,72MHz 主频,足够跑三路超声波的采集和电机控制逻辑,不需要上 F4 系列。电机驱动选 L298N 还是 TB6612?L298N 便宜但压降大、发热明显,TB6612 体积小、效率高、逻辑电压兼容性好,我的建议是直接选 TB6612,尤其是你用 3.7V 锂电池组供电的时候,L298N 的压降会让电机转速明显变软。电机选用带编码器的直流减速电机是更好的选择,但标题里既然没提编码器,用普通 TT 电机也完全可以跑通,只是测速闭环做不了。

传感器是三路 HC-SR04 超声波模块。选它不是因为精度好,而是因为便宜、资料多、新手最容易上手。要注意 HC-SR04 的工作电压是 5V,但 STM32 的 GPIO 是 3.3V 逻辑,所以 Trig 和 Echo 引脚之间需要做电平匹配。常见做法是 Trig 直接由 STM32 的 3.3V GPIO 输出,Echo 返回的 5V 高电平通过电阻分压或者直接串一个 1k 电阻进 STM32 的输入引脚,虽然不太规范,但多数情况下 STM32 的引脚容忍 5V,串电阻是为了保险。我一般会在 Echo 线上串 1k 电阻,实测长时间运行没出过问题。

供电方案直接影响稳定性。STM32 最小系统板的 3.3V 由板载 LDO 提供,但超声波模块的 5V 不能从 STM32 的 3.3V 取,因为 HC-SR04 在发射超声波瞬间电流能到 30mA 左右,三颗同时工作会拖垮 3.3V 的稳压。我一般用一节 18650 锂电池或两节串联的 3.7V 电池组给电机供电,同时用一个 5V 升压模块给超声波模块供电,STM32 再从 5V 取电或者单独用一节小电池。电池共用的情况下,电机启动瞬间的电压跌落是导致单片机复位的头号原因,后面避坑章节会细说。

2.2 三路传感器的布局:距离、角度、高度各是多少

三路传感器怎么摆,直接决定跟随效果。最常见的布局是车头一字排开:左侧传感器朝左前方偏 30 度左右,中间传感器正前方,右侧传感器朝右前方偏 30 度左右。这里有个关键点:传感器之间横向间距要拉开,至少 8 到 10 厘米,如果挨得太近,左右两路的测距结果差异不明显,方向判断就会迟钝。安装高度上,传感器离地 8 到 15 厘米比较合适,太低了容易把地面反射当成障碍物,太高了跟小朋友或者宠物的时候容易瞄不到目标。

角度的选择有一个免费的公式可以算:假设小车正前方 30 厘米处站着一个人,三颗传感器的间距是 10 厘米,那么左右传感器到目标的距离比中间传感器长大约 sqrt(30^2 + 10^2) - 30 = 1.6 厘米。HC-SR04 的测量分辨率大概是 0.3 厘米,这个差异是能分辨出来的。但如果你把传感器安装成完全朝向正前方,左右两颗测到的距离几乎一样,方向判断就会失灵。所以安装时的偏角不是可选项,是必选项。

还有一种变体布局是前三后一,即车尾也装一颗,用来实现倒车绕过障碍物。这个后面在避障逻辑里会提到,但标题既然只说跟随,我先按三颗前置来展开。安装固定建议用 3D 打印的支架,没有打印条件就直接用热熔胶固定在车头,关键是保证三颗传感器朝向固定,不要在小车震动时松动。

2.3 超声波测量的时序:单路触发与三路轮询的取舍

HC-SR04 的工作时序不复杂:给 Trig 引脚一个 10 微秒以上的高电平脉冲,模块内部会自动发射 8 个 40kHz 的方波,然后 Echo 引脚输出高电平,高电平持续时间就是声波往返的时间。距离 = 高电平时间 * 声速 / 2,声速取 340m/s,除以 2 是因为声波走了一个来回。

三路传感器共用一个触发逻辑时,千万不能让三颗同时触发。因为 HC-SR04 发射的超声波主瓣比较宽,左右两颗同时发射时,中间那颗可能会收到别人的反射波,导致测距值突然跳变到 2 米甚至更远。我一般让三颗传感器按顺序轮询,每颗测量间隔 20 毫秒左右,一颗一颗来。整个轮询周期在 60 毫秒左右,对跟随控制来说完全够用,人的行走速度每秒一米左右,60 毫秒的延迟对应 6 厘米的位移,可接受。

时序实现上,用 STM32 的定时器输入捕获来测量 Echo 高电平时长是标准做法,但新手阶段用 GPIO 电平轮询加DWT->CYCCNT或者HAL_GetTick()也行,精度在跟随场景足够。我自己写的底层函数里,用定时器输入捕获为主,IO 轮询作为备选方案,这样在调试环境复杂时有个对比参照。

3. 三路测距数据的读取与滤波:从原始值到稳定距离

3.1 最小代码框架:STM32 上三路超声波轮询采集

先给出一份可以在 STM32F103 上直接跑通的轮询采集代码,基于 HAL 库。这里假设 Trig 引脚接 PA0、PA1、PA2,Echo 引脚接 PA3、PA4、PA5,定时器用 TIM2 的通道 1 做输入捕获。实际上你完全可以用不同的引脚,只要改 GPIO 宏定义就行。

#define TRIG_LEFT_PIN GPIO_PIN_0 #define TRIG_CENTER_PIN GPIO_PIN_1 #define TRIG_RIGHT_PIN GPIO_PIN_2 #define TRIG_PORT GPIOA #define ECHO_LEFT_PIN GPIO_PIN_3 #define ECHO_CENTER_PIN GPIO_PIN_4 #define ECHO_RIGHT_PIN GPIO_PIN_5 #define ECHO_PORT GPIOA static uint32_t echo_start_tick = 0; static uint32_t echo_end_tick = 0; // 给一路超声波发送 10us 以上的触发脉冲 static void ultrasonic_trigger(GPIO_TypeDef *port, uint16_t pin) { HAL_GPIO_WritePin(port, pin, GPIO_PIN_SET); delay_us(12); // HC-SR04 要求 Trig 高电平至少 10us HAL_GPIO_WritePin(port, pin, GPIO_PIN_RESET); } // 读取单路距离,超时返回 -1,单位 cm float ultrasonic_read_once(GPIO_TypeDef *trig_port, uint16_t trig_pin, GPIO_TypeDef *echo_port, uint16_t echo_pin) { ultrasonic_trigger(trig_port, trig_pin); uint32_t timeout = 100000; // 约 100ms 超时保护 while (HAL_GPIO_ReadPin(echo_port, echo_pin) == GPIO_PIN_RESET) { if (--timeout == 0) return -1.0f; } echo_start_tick = DWT->CYCCNT; timeout = 100000; while (HAL_GPIO_ReadPin(echo_port, echo_pin) == GPIO_PIN_SET) { if (--timeout == 0) return -1.0f; } echo_end_tick = DWT->CYCCNT; uint32_t diff_tick = echo_end_tick - echo_start_tick; float seconds = (float)diff_tick / (float)SystemCoreClock; float distance = seconds * 340.0f / 2.0f * 100.0f; // 米转厘米 return distance; } // 三路轮询:左 -> 中 -> 右,每次间隔 20ms void ultrasonic_poll_all(float *dist_left, float *dist_center, float *dist_right) { *dist_left = ultrasonic_read_once(TRIG_PORT, TRIG_LEFT_PIN, ECHO_PORT, ECHO_LEFT_PIN); delay_ms(20); *dist_center = ultrasonic_read_once(TRIG_PORT, TRIG_CENTER_PIN, ECHO_PORT, ECHO_CENTER_PIN); delay_ms(20); *dist_right = ultrasonic_read_once(TRIG_PORT, TRIG_RIGHT_PIN, ECHO_PORT, ECHO_RIGHT_PIN); delay_ms(20); }

这段代码里有几个地方要特别注意。第一,DWT->CYCCNT是 Cortex-M3 内核自带的周期计数器,在启动时先使能DWT->CTRL |= 1,否则读出来永远是 0。第二,delay_us不能用 HAL 的HAL_Delay,因为 HAL_Delay 最小单位是 1ms,触发脉冲要求 10 微秒,所以必须自己写一个基于 SysTick 的微秒延时。第三,超时保护很重要,如果超声波模块没有收到回波,Echo 引脚会一直保持高电平,没有 timeout 程序就卡死了。

轮询顺序上,中间传感器放在第二位,而不是第一或第三,是因为左右两颗先测,可以更快拿到用于方向判断的两侧数据,中心值晚 20 毫秒拿到不影响整体逻辑。如果你追求对称,也可以左中右顺序,差异很小。

3.2 数据滤波:中值滤波为什么比均值滤波更适合超声波

超声波原始数据里有两种典型噪声:随机抖动和固定跳变。固定跳变指的是某一瞬间测到 2 米多远的异常值,大概率是声波打到了远处物体或者被其他传感器串扰。均值滤波对随机抖动有效,但一个异常值就能把结果拉偏很多。中值滤波对付跳变效果更好,因为它本质上是选样本里的中间值,哪怕有一个样本是 200 厘米,只要另外两个是 20 和 21,结果就是 21,异常值被直接丢弃。

我一般做两段滤波:先连续采样 5 次取中值,再做一次简单的滑动平均。注意采样 5 次意味着轮询周期要从 60 毫秒拉长到 300 毫秒,这对跟随响应来说是有些慢的。所以更实际的做法是:正常跟随状态下每路只采 3 次取中值,只有当连续几次中值结果差异超过 10 厘米时才进入慢速重新校准流程。换句话说,滤波的深度要跟随动目标,不能一概而论。

// 三路分别做 3 次采样,取中值作为当前帧距离 void ultrasonic_read_filtered(float *out_left, float *out_center, float *out_right) { float raw[3]; for (int i = 0; i < 3; i++) { ultrasonic_poll_all(&raw[0], &raw[1], &raw[2]); buf_left[i] = raw[0]; buf_center[i] = raw[1]; buf_right[i] = raw[2]; } *out_left = median_of_3(buf_left[0], buf_left[1], buf_left[2]); *out_center = median_of_3(buf_center[0], buf_center[1], buf_center[2]); *out_right = median_of_3(buf_right[0], buf_right[1], buf_right[2]); }

中值滤波后还有一个隐藏问题:当目标在左右传感器之间快速移动时,左右两颗的测距值可能一个极小一个极大,中间值把这种快速变化抹平了,导致方向判断滞后。所以我额外保留了一路「原始差值计数」:如果连续 3 帧中左右距离差的方向一致,就认定目标确实在移动,直接按原始差值加强转向,而不是等滤波结果。这就是后面状态机里会用到的趋势判断。

3.3 温度补偿要不要做:一个很实际的取舍

声速随温度变化的公式是 v = 331.4 + 0.607 * T,T 是摄氏温度。0 度时声速约 331.4 m/s,30 度时约 349.6 m/s,相差约 5.5%。换算到 30 厘米的距离,误差约 1.6 厘米。这个误差对跟随小车来说不致命,但如果你在冬天和夏天用同一套参数,会发现跟随时车子有时偏近有时偏远,其实就是声速变了。

要不要加温度补偿?我的建议是:如果你的使用场景温差超过 10 度,加一个 DS18B20 或者直接用 STM32 内部温度传感器做粗略补偿,代码就一行:

float sound_speed = 331.4f + 0.607f * temperature_celsius; float distance = seconds * sound_speed / 2.0f * 100.0f;

如果只是在室内固定环境做课设展示,可以不补偿,但你要知道这个误差存在,别到时候怀疑是控制逻辑出了问题。

4. 跟随逻辑与状态机设计:让小车像跟屁虫一样自然

4.1 三路距离如何决定小车的动作:一个五状态状态机

有了三路稳定的距离值之后,核心问题就变成了:根据左、中、右三个数字,决定小车是直行、左转、右转、后退还是停止。这个决策用状态机来表达最清晰。我常用的状态机有五个状态:停止、直行、左转、右转、后退。

状态切换的逻辑基于几个关键距离阈值。首先是停止距离,设为 20 厘米,当中间距离小于等于 20 厘米时,说明目标已经靠得很近,继续前进可能会撞上去,此时进入停止状态。其次是跟随距离上限,设为 60 厘米,超过这个距离说明目标跟丢了或者离得太远,小车应当加速前进追赶。在 20 到 60 之间的区间,通过左右距离比较判断转向方向。

typedef enum { ROBOT_STOP = 0, ROBOT_FORWARD, ROBOT_TURN_LEFT, ROBOT_TURN_RIGHT, ROBOT_BACKWARD } robot_state_t; robot_state_t robot_follow_logic(float d_left, float d_center, float d_right) { if (d_center < STOP_DIST_CM) { // 20cm 以内,停车防撞 return ROBOT_STOP; } if (d_center > FOLLOW_DIST_MAX_CM) { // 超过 60cm,目标太远 return ROBOT_FORWARD; } if (d_left - d_right > TURN_DIFF_CM) { // 左侧明显更远,目标在左 return ROBOT_TURN_LEFT; } if (d_right - d_left > TURN_DIFF_CM) { return ROBOT_TURN_RIGHT; } return ROBOT_FORWARD; // 左右距离接近,目标基本在正前方 }

这段逻辑虽然简单,但翻车点很多。第一,阈值不能只靠一个差值判断,因为如果左右两颗传感器安装角度不对称,同一目标在正前方时左右读数可能不是一样的。所以你需要事先校准:让小车正对一面墙,距离 40 厘米,记录左右两颗的读数,算出一个偏置修正量,在逻辑判断前先做差值修正。这就是后面进阶技巧里说的「零位校准」。

第二,差值的阈值TURN_DIFF_CM不能设得太小。HC-SR04 在近距离的测量波动有 ±1 厘米,差值为 1 到 2 厘米时经常是噪声而不是真实的方向偏差。我一般把阈值设在 4 到 6 厘米,让小车在方向偏差明显时才转动,否则保持直行或轻微修正。

4.2 差速转向还是舵机转向:为什么我选差速

自动跟随小车有两种转向方式:一种是保持两个电机同速,靠舵机把前轮或传感器转过去;另一种是差速转向,即左轮和右轮速度不一样,小车自然转弯。前者机械结构复杂,要额外的舵机和控制逻辑,响应也慢;后者在四驱或后驱小车上是天然的选择,通过控制两路 PWM 占空比就能实现不同转弯半径。

我在这个项目里用的是差速转向。具体的控制策略是:直行时左右轮 PWM 占空比相同,取值在 35% 到 55% 之间;左转时左侧轮 PWM 降到直行速度的 50%,右侧轮维持直行速度,这样小车就会向左偏转;右转同理。注意不要在一侧直接给 0,那样虽然转弯半径小,但电机突然停转会造成小车抖动,尤其是电池电压偏低时甚至可能直接让单片机复位。

差速转向还有一个好处是可以在直行状态里加入动态修正。比如中间距离在 20 到 60 之间,左右差值只有 2 厘米,还不到转向阈值时,可以让左侧电机 PWM 略高于右侧 5%,做一个柔性修正,这样小车走的是超大半径的弧线,整体跟随轨迹会更顺滑。

4.3 速度有没有必要做 PID:两个判定条件

很多人在跟随小车上纠结要不要上 PID。我的经验是:如果只是课设演示,速度开环完全够用;但如果想让小车在目标匀速行走时保持稳定距离,而不是忽远忽近地「点头」,那就需要给速度加一个简单的比例控制。严格来讲这算 P 控制,不是完整 PID,但它的作用已经能把跟随距离的波动收敛很多。

// 简单 P 控制:距离越远,PWM 越大;距离太近,PWM 减小甚至回退 float speed_p_control(float d_center) { float error = d_center - TARGET_DIST_CM; // TARGET_DIST_CM 取 35cm float pwm = BASE_PWM_PERCENT + KP * error; if (pwm < MIN_PWM_PERCENT) pwm = MIN_PWM_PERCENT; if (pwm > MAX_PWM_PERCENT) pwm = MAX_PWM_PERCENT; return pwm; }

KP 的取值直接决定控制效果。KP 太小,小车反应迟钝,目标走远了半天不追;KP 太大,小车冲一下就撞上去了。我一般从 0.5 开始试,观察目标在 35 厘米附近走动时小车的跟随曲线,如果出现明显震荡就降一半。这里说的 PWM 百分比对应的是 TIM 定时器输出比较的占空比,不是实际电压,不同电机的死区不一样,驱动电压低时 20% 的 PWM 可能电机根本不转,所以 MIN_PWM 要设成实测能转起来的最小值,通常 20% 左右。

完整的 PID 需要加 I 项来消除静态误差、D 项来抑制超调,但在这种低速跟随场景里,D 项对超声波数据的噪声非常敏感,如果滤波没做好,D 项会让电机嗡嗡发抖。我的建议是新手先只用 P,跑顺了再考虑加 D。

5. 跟随小车常见问题排查:测距跳变、电机堵转、逻辑误判

5.1 现象:小车无故急停或者冲向目标

这个是最常见的翻车现场。表现是:目标明明离小车还有 40 厘米,小车却突然停下,或者反过来,目标就在正前方 30 厘米,小车却猛地向前冲。原因往往不在控制逻辑,而在超声波数据本身。

排查思路按顺序来。第一步,串口打印三路原始距离,观察异常值。如果中间距离在 30 到 45 之间反复横跳,说明传感器自身测量不稳定。原因通常是供电电压偏低,HC-SR04 在低电压下发射功率不足,回波忽强忽弱。第二步,检查 Echo 引脚的电平转换是否可靠,如果串了 1k 电阻后输入高电平只有 2V 左右,STM32 可能识别不了,解决方法是用两个电阻做分压把 5V 降到 3.3V。第三步,确认三颗传感器的 Trig 触发顺序没有重叠,如果有串扰,会出现规律性的跳变值。

解决方向是:单独用 5V 稳压模块给超声波供电,同时把每路采样次数从 1 次提高到 3 次取中值。注意这两件事要一起做,因为滤波只能缓解跳变,不能根治供电问题。

5.2 现象:左右电机转速不一致,小车走不直

小车在直行状态下总是向右偏,这几乎是所有差速小车的宿命。原因是电机制造时的绕组差异、轮胎摩擦力差异、电池电压下降速度快于 PWM 补偿,导致左右轮实际转速不匹配。这个问题在低速时尤其明显。

解决方法是做一轮「开环标定」。把小车架起来,让轮子悬空,给定一个 40% 的 PWM,测量左右轮各转 10 圈的时间,算出偏差系数,然后把偏差补偿写进代码:

// 假设左轮比右轮慢,则把右轮 PWM 乘以补偿系数 float right_pwm_calibrated = right_pwm * (left_time / right_time);

但要注意,架起来的标定没有负载,落地之后摩擦负载不一样,补偿值还要微调。我一般会在小车前面画一条 2 米长的直线,反复调整补偿系数到走偏不超过 10 厘米为止。这个问题如果不在前期解决,后面跟随时会让跟随轨迹变成 S 形。

5.3 现象:低速时电机发出嗡嗡声但不转

这是 PWM 频率和占空比共同作用的结果。STM32 的定时器输出 PWM 频率如果设得太高,比如 20kHz,很多直流减速电机的内部机械结构来不及响应,在小占空比时就会出现只响不转的现象。驱动板的 MOS 管或 H 桥在 PWM 频率过低时又会发热严重。

我用的是 10kHz 到 15kHz 之间的 PWM 频率,在这个频率下电机运转噪声小、发热量可控。同时把最小 PWM 占空比从 0 改成 20%,低于 20% 时直接输出 0 而不是输出一个微小的占空比。这样电机要么不转,要么一转就是有效转速,避免长时间停留在死区里嗡嗡响。如果改完还有声音,检查驱动板的使能引脚是否被拉低,以及同侧两个输入引脚有没有处于同时为高的非法状态。

5.4 现象:一启动电机单片机就重启

这基本可以断定是电源问题,而不是程序 BUG。直流电机的启动电流是正常运转电流的 3 到 5 倍,如果用同一个稳压源同时给单片机和电机供电,电机启动瞬间会把电压拉低,STM32 的复位阈值一旦被触发就重启。超声波模块的读数也会在重启瞬间变成 0 或 -1。

解决思路有三层:第一,动力电源和逻辑电源分开,这是最彻底的做法;第二,在电机电源两端并联一个大电容,比如 470uF 到 1000uF,吸收启动瞬间的电流冲击;第三,给单片机供电加一个 3.3V 的 LDO 并且输入输出都加 10uF 和 100nF 的去耦电容组合。大多数情况下,做到第二层就能解决课设场景下的重启问题。

6. 让跟随更稳的三个进阶调校:零位校准、加速度限制与失稳回退

跟随小车做出来能跑,和跟得顺,之间隔着几个不怎么起眼但效果显著的调校技巧。第一个是前面提过的零位校准。算法逻辑上我们默认左右传感器是对称的,但实际安装时角度和位置总有几毫米偏差,导致目标在正前方时左右读数差出 2 到 5 厘米。我一般会做一个开机校准流程:小车静止,目标放在正前方 40 厘米处,按一下按钮,程序记录下此时的左右差值作为零位偏置,后续所有左右比较都先减掉这个偏置再判断。

第二个技巧是加速度限制。很多小车跟随时一冲一冲,不是逻辑错误,而是速度变化太快。目标突然从 30 厘米走到 80 厘米,PWM 直接从一个低值跳到高值,电机猛加速,底盘前倾,超声波数据波动,然后 PWM 又跌回去,形成一个振荡循环。我做了一个简单的斜坡限制器:目标 PWM 每 50 毫秒最多变化 3%,用代码描述就是:

float pwm_ramp_limit(float target_pwm, float current_pwm, float max_step) { float diff = target_pwm - current_pwm; if (diff > max_step) return current_pwm + max_step; if (diff < -max_step) return current_pwm - max_step; return target_pwm; }

调这个参数要耐心。max_step 设 2%,小车反应慢但极其平顺;设 5%,响应快了但会有轻微顿挫。我最后落在 3% 左右,配合 50 毫秒的定时中断调用,小车从静止到全速大概需要 1 秒,这个加速度体感上刚刚好。

第三个技巧是失稳回退。当目标快速转向或者跑出传感器覆盖范围时,三路距离可能同时接近最大值,此时如果继续前进,小车会朝一个方向疯狂转向而目标已经丢失。我加了一个连续丢目标计数:如果连续 10 帧内中间距离都大于 1.5 米,就进入原地慢转寻目标状态,左右轮反方向转动,车头缓慢扫过前方区域,直到任一传感器重新发现 60 厘米内的目标再恢复正常跟随。这样小车就算跟丢了也不会傻乎乎地往前冲,而是自己找人。

最后说一个我从这个项目里学到的教训:调参一定要在电池电量状态一致的情况下进行。我刚开始调好一套参数,跑了几分钟一切正常,换了一块满电电池后小车变得极其暴躁,回头看才发现之前的参数是在低电量下调的。后来我把所有参数调试固定在一批同电量电池上完成,并记录了电池电压与参数的关系,才彻底摆脱这个困扰。如果你做这个项目,也建议先定好战场条件再开调,不然每次调的都是不同状态下的车。希望这个三路超声波跟随方案能帮到你,从抄作业到真正跑偏,这中间的路本来就是最值钱的。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 17:37:53

RK3308交叉编译ROS环境搭建与部署实践

做语音机器人或者小型服务机器人&#xff0c;很多人第一反应是用树莓派跑ROS&#xff0c;但真正做产品落地时&#xff0c;一颗专用的嵌入式SoC往往更合适。RK3308就是这种定位——四核A35、主频1.3GHz&#xff0c;功耗低&#xff0c;还带了一堆音频接口&#xff0c;专门为智能语…

作者头像 李华
网站建设 2026/10/14 17:37:40

龙芯LoongArch平台死锁分析:从ll/sc失败到锁循环等待

1. 项目概述&#xff1a;一次在龙芯平台上真实发生的死锁现场还原“龙芯平台一次死锁分析过程”——这标题里没有炫技的术语&#xff0c;没有包装过的成果&#xff0c;就六个字加一个“过程”&#xff0c;但对任何在国产CPU生态里摸爬滚打过的系统工程师、内核开发者或嵌入式运…

作者头像 李华
网站建设 2026/10/14 17:37:16

绕线式异步电动机转子串电阻分级起动仿真:建模、参数与避坑指南

简介&#xff1a;这份资源围绕绕线式异步电动机转子串电阻分级起动过程&#xff0c;提供基于MATLAB/Simulink搭建的瞬态仿真模型&#xff0c;面向电气工程、电机控制方向的学生与工程师&#xff0c;用于在实机投运前评估起动电流冲击、优化各级起动电阻并确定断路器闭合时间。模…

作者头像 李华
网站建设 2026/10/14 17:36:25

高强度紧固件迎来价值重估

高强度紧固件正在经历一轮结构性的价值重估。2025年中国高强度紧固件行业市场规模达到641.35亿元&#xff0c;同比增长4%&#xff0c;产量攀升至336.85万吨&#xff0c;需求量达508.4万吨。全球高强度螺栓市场同年销售额约91.25亿美元&#xff0c;预计2032年将达到140亿美元&am…

作者头像 李华