新闻详情

新闻详情

首页 / 资讯中心 / 详情

红外超声与光电编码器融合的室内移动小车定位系统

发布时间:2026/9/19 20:40:41来源:尧图网络
红外超声与光电编码器融合的室内移动小车定位系统
简介这份PDF资料围绕室内移动小车定位系统展开重点讲解红外超声三边测距与光电编码器测距相结合的实现方案适合机器人、自动化或嵌入式方向的学生及技术人员阅读。资源共1个文件为PDF格式压缩包大小约424KB内容精炼、配图完整便于快速学习。文中从红外超声测距原理、三边定位算法、光电编码器测距原理入手详细说明系统硬件结构、软件设计和三种定位策略尤其针对红外超声存在测量盲区的问题给出了引入光电编码器后实现绝对定位与实时状态监控的解决思路。读者可从中获得传感器选型、信号处理延时补偿、双轮编码器航位推算以及多单元串口通信等关键知识点。目前已有93人学习适合用作课程设计、项目开发或科研参考。1. 室内移动小车定位最常用的是红外超声和光电编码器两种传感器红外超声三边测距靠参考点同时发射红外光和超声波目标点测量两者的到达时间差得到距离后由三个参考点解出坐标。这个方案在开阔空间很稳定但现场跑起来最容易出问题的是盲区——小车某个角度收不到三个参考点的信号坐标直接解不出来。光电编码器装在轮轴上通过脉冲计数推算车轮移动距离和方向属于相对定位没有盲区但误差会一路累积。把红外超声和光电编码器叠在一起用超声波定期给出绝对坐标编码器在盲区时间段补位移正好消掉对方的短板。这套基于 SST89E564RD 的室内移动小车定位系统从时间差测距、码盘计数、同步协议到融合状态机都能按可复现的流程走一遍。2. 红外超声三边测距时间差测距与坐标解算2.1 时间差测距为什么红外光的传播时间可以忽略红外光速约 3×10^8 m/s超声波在空气中约 340 m/s。室内定位的距离一般只有几米红外光走完这段距离只要几十纳秒而超声波需要几毫秒到几十毫秒。所以工程上让红外光和超声波同时从参考点发出目标点先收到红外光触发单片机内部计数器开始计时再收到超声波时停止计数得到时间差 t。距离公式写成d v * t n其中 v 是超声波速n 是系统器件延迟误差补偿项。n 不是忽略不计的小量红外接收管、超声波接收头、比较器、单片机中断响应都会产生固定的延迟如果不补偿测距结果会整体偏大。实际做法是先测一个已知距离反推 n 值再写进程序。布置参考点时三个点不要放在近似一条直线上否则解算矩阵接近奇异距离测量的小误差会被放大成坐标的大偏移。室内定位一般把 A、B、C 固定在天花板或墙面上方并建立统一坐标系参考点 z 坐标不同会让方程组是三维的如果全部贴地平面定位反而更简单。2.2 三边测距的坐标解算设参考点 A、B、C 的坐标分别为 (x1,y1,z1)、(x2,y2,z2)、(x3,y3,z3)目标点到三点的测量距离为 d1、d2、d3。三个球面方程(x - xi)^2 (y - yi)^2 (z - zi)^2 di^2把第 2、3 个方程分别减去第 1 个方程二次项被消掉得到线性方程组解出三个量的代数解。这个数学过程不复杂但放到 8 位单片机上要控制浮点预算。参数典型取值说明红外光速3×10^8 m/s时间差计时的起点超声波速340 m/s20℃温度每升 1℃ 约 0.6m/s延迟补偿 n现场标定决定测距偏置单位米参考点数量3空间/2平面地面水平时二维定位只需 2 个2.3 Python 验证解算逻辑在上 564RD 之前我一般先把解算逻辑放到 Python 里跑一遍确认公式和边界条件没有错。下面的函数用线性化消除平方项import numpy as np def trilaterate(points, distances): # points: (3,3) 参考点坐标每行一个点 # distances: (3,) 目标点到三个参考点的距离 base points[0] A 2 * (points[1:] - base) b distances[0]**2 - distances[1:]**2 \ np.sum(points[1:]**2, axis1) - np.sum(base**2) coord, _, _, _ np.linalg.lstsq(A, b, rcondNone) return coord代码先用第 1 个点作为基准把后两个方程减去基准方程消掉二次项得到线性化后的 A 和 b。np.linalg.lstsq 返回最小二乘解能处理三个球面不完全交于一点的情况。points 对应 A、B、Cdistances 是 d1、d2、d3。返回值 coord 是目标点坐标。在 PC 上验证过的同一套公式可以再用定点数改写后移植到 564RD或者在离线阶段用这个函数生成距离-坐标查表减少单片机的实时计算量。3. 光电编码器测距从光栅盘到轮式里程计3.1 光栅盘和 A/B 相输出光电编码器由光栅盘和光电检测装置组成。光栅盘是在一定直径的圆板上等分开若干个长方形孔与电机同轴旋转。红外发光二极管发出的光透过孔洞照到光敏传感器被遮挡时输出电平翻转形成脉冲。光敏传感器内部沿垂直方向排了两个光敏晶体管 A 和 B安装位置错开所以输出的两路脉冲存在固定相位差。A 相先跳变还是 B 相先跳变就对应了码盘的正转和反转。判断方向最常用的是“A 相跳变时看 B 相电平”A 相跳变沿B 相电平方向上升沿高正转上升沿低反转下降沿高反转下降沿低正转如果不在中断里做方向判断只数脉冲个数小车倒退会被当成前进这会直接污染后面的融合计算。3.2 脉冲数如何换算成位移每个脉冲对应轮子走过的弧长由译码轮开孔数和轮子半径共同决定。设译码轮每转产生 N 个脉冲轮子半径为 r一段时间内计数器的变化量为 ticks那么轮子移动的距离是distance (ticks / N) * 2 * PI * r注意 ticks 必须是带符号的正数代表前进负数代表倒退。比如译码轮每转 20 个脉冲轮子半径 5cm那么每个脉冲对应弧长约 1.57cm一百个脉冲就是 1.57m。换算时不要忘记符号否则左右轮位移比较会得到相反的方向结论。参数示例值说明译码轮开孔数 N20~100光栅盘等分开孔数量轮距 d0.2 m左右轮中心距轮子半径 r按实测影响单脉冲弧长读取周期100ms~1s主控串口同步周期3.3 C51 编码器计数实现564RD 上做编码器计数最常见的是把 A 相接外部中断输入B 相接普通 I/O。中断服务函数里读一次 B 相电平// A 相接 INT0B 相接 P3.3 sbit left_b P3^3; volatile int left_ticks 0; void left_encoder_isr() interrupt 0 { if (left_b) { left_ticks; // B 相高电平正转 } else { left_ticks--; // B 相低电平反转 } }left_ticks 是带符号的累计脉冲数主控制定时读取后清零。这里最关键的是中断服务函数里必须同时完成方向和计数不能在主循环里判断方向否则小车在急停或者倒车瞬间会丢脉冲。安装编码器时还要保证译码轮与轮轴同轴装偏了每个脉冲对应的弧长就不是常数现场标定通常让小车走一段已知直线距离反算出每脉冲对应的毫米数比直接套轮径公式更可靠。3.4 左右轮位移与航向变化同轴二轮驱动小车的两个轮子轨迹总是平行ab 连线垂直于运动方向。左右轮在同一时间内的位移分别为 ΔL 和 ΔR如果两个值相等小车走直线如果不相等小车转弯且向位移小的一侧转弯。两个轮子的位移差与转弯角度相关差值越大单位时间内的转角越大。用光电编码器测出位移后再交给主控就能在小车处于盲区时延续上一时刻坐标继续推算当前坐标。这个推算在短距离内可用但距离一长轮子打滑、倾角变化都会让误差叠加所以必须有红外超声的绝对坐标来周期校正。4. 多通道接收与同步架构硬件和协议怎么搭4.1 节点组成和器件选型系统分成三类节点参考节点、目标节点、主控节点。参考节点由一片 SST89E564RD、红外发射管 SE303A、超声波发射头 T40-16 及驱动电路组成。目标节点在小车上有 8 对红外接收管 PH302 和超声波接收头 R40-16每对由一个 564RD 控制8 个接收单元分成两组每组 4 对分别装在小车两个轮子的上方。光电编码器测距单元则由译码轮、光电耦合器和一片 564RD 组成左右轮各一套。最后由一片 564RD 做主控用串口连接所有接收单元与编码器单元。器件型号数量用途红外发射管SE303A每参考点 1 个发出计时起始信号红外接收管PH3028 个接收红外光超声波发射头T40-16每参考点 1 个发射 40kHz 超声波超声波接收头R40-168 个接收 40kHz 超声波接收单元 MCUSST89E564RD8 片测时间差编码器单元 MCUSST89E564RD2 片脉冲计数4.2 为什么是 2 组 4 对还要 45° 向上移动小车的姿态随时在变单个接收头朝上看不一定能收到天花板附近的参考点信号。原设计在每个轮子正上方的一定高度以间隔 90°、与水平面 45° 夹角向上布置 4 对红外超声接收管等于把每个轮子上方的半球方向都覆盖到。多通道同时接收还有一个直接好处单次测量时间大幅缩短。如果只有一个通路就要串行测 8 个距离超声波转一圈要几十毫秒8 路并行后一次定位只等一个最远距离的传播时间小车在测距期间移动的距离也相应减小动态误差更小。4.3 1s 定位周期和 100ms 采集窗口系统上电后参考节点不断向外发射红外和超声波信号每个节点的红外与超声波编码对应节点之间编码不同。普通节点每隔 1s 请求一次定位这个周期不能太长否则小车拐弯时两条轮轴轨迹会不平行。主控收到定时器溢出后通过串口向各单元广播定位信号同时启动内部定时器延时 100ms 后依次读取 8 个超声测距单元的距离值和 2 个光电编码器单元的位移值。100ms 是非常关键的窗口参数。正常测距时超声波在 20℃ 下走 3m 约 8.8ms100ms 足以覆盖绝大多数室内距离。但窗口太长也会有问题容易把下一次发射周期的信号误收进来。原设计的处理是100ms 内只保留第一次出现的有效匹配信号100ms 后还没有就写 0表示该参考方向被遮挡。4.4 模块化接口设计独立单元间的通信用串口比并行总线更稳。每个接收单元和编码器单元都有固定的地址或命令字主控读取数据时可以按地址轮询。下面是一个常见的命令约定命令字节含义返回数据0x10启动一次测距无0x21读超声通道 0距离值毫米0x30读左轮编码器有符号脉冲数0x31读右轮编码器有符号脉冲数实际项目中命令字不一定相同但一定要保证主控先广播“启动测量”再延时足够时间后读取不能边测量边读否则读到的是上一次残值。下面这段 C 代码展示了主控侧广播定位命令和启动采集窗口的流程// 主控串口广播定位命令并控制 100ms 采集窗口 void request_loc(void) { SBUF 0x10; // 广播定位命令 while (!TI); TI 0; // 等待发送完成 start_timer0(); // 启动 100ms 窗口 delay_ms(100); read_pending_channels(); // 依次读取距离和编码器 }SBUF 是串口发送缓冲TI 是发送完成标志TR0 或 start_timer0 负责开启 100ms 定时窗口read_pending_channels 按上面命令表轮询各单元。这样做的目的是让所有超声测距单元和编码器单元在同一时刻开始采样保证后续融合计算里距离和位移对应同一个时间点。5. 融合定位的三种状态机盲区判断与几何求解5.1 三个状态和切换依据整套系统的关键点是把定位拆成三种情况而不是一种算法走到黑。状态条件定位方式状态 Aa、b 两点都能收到 3 个参考点信号红外超声绝对定位状态 Ba、b 中只有一点能收到 3 个参考点信号红外超声 编码器推算状态 Ca、b 都收不到 3 个参考点信号纯编码器推算a、b 是两个驱动轮轮轴正上方的定位点两点之间的距离就是轮距。地面是平面时红外超声本来只需两个参考点就能定二维坐标这里保留 3 个参考点是为了在空间布置上留冗余也方便处理参考点被小车自身遮挡的场景。状态 A 最简单分别求出 a、b 的坐标再取中点作为小车位置用上一时刻两点位置关系和轮距判断航向。真正需要动脑的是状态 B 和状态 C。5.2 状态 B 的几何求解状态 B 发生在只有 b 点能收到 3 个参考点信号、a 点被遮挡的情况下。上一时刻 a、b 的坐标已知当前 b 点由红外超声测到两个轮子的编码器给出位移 ΔL 和 ΔR。由于两个轮子的轨迹始终平行aa′ 与 bb′ 平行ab 垂直于运动方向所以可以用 b 点的当前坐标反推 a 点先求 bb′ 的单位方向向量作为航向再沿垂直方向偏移一个轮距 d就能得到 a 点坐标。下面代码把这个步骤写成一个函数def estimate_a_from_b(b_prev, b_curr, d): direction b_curr - b_prev # b 点航向向量 direction direction / np.linalg.norm(direction) vertical np.array([-direction[1], direction[0]]) return b_curr d * vertical # 沿垂直方向偏移轮距direction 是 b 点上一时刻到当前时刻的单位方向向量vertical 是它的垂直方向用于按轮距 d 反推 a 点。左右轮编码器位移差的作用是修正 direction 的方向符号当两轮位移不等时vertical 的方向会偏向位移短的一侧实际使用前要先用实验标定符号避免 a 点算到车身另一侧。5.3 状态 C 的纯推算状态 C 完全依赖上一时刻 a、b 坐标和编码器位移。因为没有新的绝对位置输入误差会累积所以系统把状态 C 当作最后手段而不是常态。主控在每个 1s 周期里都要检查状态一旦 a、b 任一方向恢复 3 个信号立刻切回绝对定位并利用刚解出的坐标修正累计误差。5.4 五类误差和补偿顺序定位误差主要来自五个方面超声波器件形状和安装位置造成的坐标系偏移、电路延迟、定位期间小车运动造成的动态误差、盲区推算带来的累计误差、温度对声速的影响。补偿顺序建议按硬件到软件的路径推进先标定安装位置和角度再标定电路延迟 n然后把声速修正为环境温度下的真实值最后处理动态误差。实测中先把前三项做完再把速度调到 0.2m/s、轮距 0.2m 的条件系统精度能做到 3cm。6. 现场调试靶向用已知距离标定时间差补偿6.1 固定声速反推延迟补偿 n最容易被忽视的是 n。一开始先把温度固定在 20℃声速写死为 340m/s选 0.5m、1.0m、1.5m 三个已知距离测几组时间差反推 n。如果算出来的 n 在不同距离下基本稳定说明时间差测量路径没问题如果 n 波动很大先查红外接收头是否提前触发或者接收电路的比较器阈值太低。标定完成后再把 n 和声速修正公式一起写进主控初始化代码。步骤做法判断标准1固定环境温度 20℃温度计记录2分别测已知距离记录 t 值3计算 n波动小于 2mm4写入程序参数每次上电同步6.2 用 U 形轨迹验证 3cm 精度验证定位不自欺要用固定速度和重复轨迹。先在地面画直线和 U 形弯让小车以 0.2m/s 速度跑上位机记录每秒定位结果和地面标尺对照。U 形弯能同时触发三种状态直道是状态 A弯道内侧可能进入状态 B遮挡严重时进入状态 C。数据导出来后统计状态 B 和状态 C 的占比如果状态 C 占了大半说明参考点布局不够密优先调整接收单元的 45° 倾角而不是调算法参数。3cm 精度是在室内、轮距 0.2m、速度 0.2m/s 的前提下测出来的速度提上去后动态误差会变差不能照搬参数。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

EndNote样式自定义全攻略:打造符合GB/T 7714的参考文献格式 2026/9/19 21:37:51

EndNote样式自定义全攻略:打造符合GB/T 7714的参考文献格式

1. 样式体系设计与改动逻辑1.1 一个参考文献样式到底由哪几块拼出来端Note里的样式(Style)不是一张简单的“格式模板”,它是一套完整规则集,决定了两个地方的显示效果:一个是正文里的引文标记,另一个是文末…

阅读更多 →
从原始数据到PDF:Python实现电机与拖动实验报告自动化 2026/9/19 21:37:51

从原始数据到PDF:Python实现电机与拖动实验报告自动化

简介:电机与拖动实验报告.pdf是一份面向电气工程、自动化等专业学生的实验教学参考资料。该报告围绕三相异步电动机的启动、调速与参数测量,详细介绍了直接启动与降压启动方式、电压调节对转速和转矩的影响、负载增加时电枢电流与转速的变化规律&#xf…

阅读更多 →
Python解析Word期末试卷:从.doc到JSON的结构化转换与批量生成 2026/9/19 21:37:51

Python解析Word期末试卷:从.doc到JSON的结构化转换与批量生成

简介:这是一份人教版七年级英语期末试题文档,面向七年级学生、家长及英语教师,适用于期末复习自测、模拟考试和命题参考。试卷内容完整,涵盖听力、词语释义和单项填空等模块,并附有听力稿,方便自主听练与课…

阅读更多 →
32位Windows系统下载谷歌浏览器Chrome 109完整指南 2026/9/19 21:37:51

32位Windows系统下载谷歌浏览器Chrome 109完整指南

1. 32位Windows系统下载谷歌浏览器的完整思路拆解1.1 为什么32位系统找Chrome安装包这么费劲先说一个很多人不知道的事实:谷歌官方从Chrome 110版本开始,就彻底停止了对32位Windows系统的支持。也就是说,你现在打开谷歌官网,它自动…

阅读更多 →
五年级数学因数倍数与图形变换能力诊断图谱 2026/9/19 21:37:51

五年级数学因数倍数与图形变换能力诊断图谱

简介:本资源是一份面向小学五年级学生的数学单元测试题精选文档,紧扣人教版五年级下册第一、二单元核心内容,聚焦因数与倍数(含质数、合数、2/3/5的倍数特征)、轴对称图形、平移、旋转与对称变换等重难点知识&#xff…

阅读更多 →
单词拆分(Word Break)全解:从指数级递归到 Trie 优化的六种 DP 方案 2026/9/19 21:34:50

单词拆分(Word Break)全解:从指数级递归到 Trie 优化的六种 DP 方案

单词拆分(Word Break)全解:从指数级递归到 Trie 优化的六种 DP 方案 【免费下载链接】leetcode Leetcode solutions 项目地址: https://gitcode.com/GitHub_Trending/leetcode1/leetcode 本篇技术指南围绕 LeetCode 139「单词拆分」&a…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞