资讯详情

动态汽车衡软件算法:胎压形变与车速检测实战

📅 2026/10/18 2:20:30 | 华诺云谱 👁 阅读
动态汽车衡软件算法:胎压形变与车速检测实战
简介《动态汽车衡系统胎压形变及车速检测设计软件部分》是一份完整的毕业设计论文文档面向电气工程及其自动化、电子信息等专业学生针对汽车超载监测中动态汽车衡称重准确度受轮胎形变影响的问题给出基于51内核单片机、红外光传感和模拟数字电子技术的软件系统设计方案。资源为单个doc文件大小约1.21MB内容包含任务书、中英文摘要、目录和正文查阅方便。已有129人学习。文档重点介绍了车胎受压变形参数算法、车速算法、双四位LED显示、标准RS232半双工通信及可靠性设计并展示了毕业设计的时间安排、工作量要求和论文写作框架。通过阅读可掌握MCS-51单片机应用、信号处理、实时系统设计等方法尤其能借鉴胎压形变检测与车速计算的实现思路适合作为课程设计、毕业设计和同类课题的参考模板。1. 动态汽车衡软件部分在解决什么问题从一段波形里同时“算”出胎压形变和车速动态汽车衡的软件部分表面上是“采信号、算重量、发报文”的一套程序但进过现场的人都清楚真正的难点隐藏在波形里。车辆碾过秤台的那几百毫秒中胎压偏高时轮胎接地面积小、应力集中轴载波形窄而高胎压低时接地面积大、应力平摊波形宽而矮车速再一变这段波形被整体拉伸或压缩峰值和宽度都在动。静态称重能做到±0.1%的精度动态称重整车±5%的指标却常常因为胎压和车速波动直接翻车差距几乎全部落在软件算法上。所以这个《动态汽车衡系统胎压形变及车速检测设计软件部分》课题本质是一套包含车速估计、胎压形变特征提取和重量修正算法的信号处理软件而不是一个写界面的工程。它适合正在做汽车衡课题的学生、计量检测行业的软件工程师以及想把手头现场数据吃透的运维人员。2. 软件架构先从信号链讲起采样、滤波与轮轴识别从软件侧看动态汽车衡的输入不是“重量”而是一段或多段携带时间戳的电压波形。传感器输出经过变送器进入ADC之后软件第一件事不是称重而是把波形洗干净再从里面识别出一辆车上先后碾过的每一根轴。这个阶段做错后面所有胎压修正和车速检测都是白搭。我一般先用Python在离线波形上验证算法再移植到现场的C/Qt程序里因为Python调试波形时画图太方便现场版本里真正难缠的往往是边界条件和异常数据而不是算法本身。2.1 模块划分一个最小可用的动态汽车衡软件要有哪几块一个最小可用的软件至少由六块组成按数据流向排序数据采集、信号调理、轮轴识别、车速估计、重量解算与胎压形变修正、通信与落盘。我习惯先把模块边界定下来避免联调阶段模块之间互相甩锅。每块模块的职责可以按下表拆分模块输入输出关键职责数据采集ADC原始帧带时间戳的波形序列环形缓冲、时间戳、异常帧剔除信号调理波形序列干净波形低通滤波、削顶检测、零点漂移校正轮轴识别干净波形轮轴事件表动态阈值、波峰波谷、最小轴距判定车速估计轮轴事件表或双传感器波形车速、加速度互相关或轴距法、速度平滑与拒绝重量解算与胎压修正轮轴事件表、车速轴重、整车重峰值或面积积分、胎压修正表补偿通信与落盘解算结果报文、本地记录校验和、超限判断、数据回放数据流的顺序是严格的ADC原始帧只能被消费一次但滤波后的干净波形会被复用两次一次做轮轴识别一次做重量积分。代码实现里波形数据用视图传递避免大数组反复拷贝。所有模块的输出都带时间戳因为后续车速估计要用两个传感器的时延对齐重量积分也要靠车速把时间域换算成距离域。2.2 原始波形处理与轮轴识别的原型代码下面这段Python代码完成了两件事一阶IIR低通滤波和基于动态阈值的轮轴事件识别。它不依赖任何特定硬件型号波形数据可以从文本文件或数据库读入非常适合做算法原型验证。import numpy as np def lowpass_iir(x, alpha0.2): 一阶IIR低通滤波。 alpha0.2、采样率400Hz时截止频率约12Hz。 轴载信号的主要带宽集中在0.1~20Hz12Hz可以保留波峰特征。 y np.empty_like(x) y[0] x[0] for i in range(1, len(x)): y[i] alpha * x[i] (1 - alpha) * y[i - 1] return y def find_axle_events(sig, fs400.0, thr_factor2.0, min_gap_s0.15): 动态阈值轮轴识别。 基线取0.5秒滑动均值阈值基线thr_factor*无车段噪声标准差。 返回每个轴事件的起止点、峰值点和幅值。 win int(0.5 * fs) base np.convolve(sig, np.ones(win) / win, modesame) noise_std np.std(sig[:int(0.2 * fs)]) thr base thr_factor * noise_std events [] in_event False start 0 last_end -2 * int(min_gap_s * fs) for i in range(len(sig)): if sig[i] thr[i] and not in_event: if (i - last_end) int(min_gap_s * fs): continue in_event True start i elif sig[i] thr[i] and in_event: in_event False last_end i peak_idx start int(np.argmax(sig[start:i])) events.append({ start: start, end: i, peak: peak_idx, amp: sig[peak_idx], }) return events这一段代码里thr_factor控制识别灵敏度太小会把噪声毛刺当成轴太大又会漏掉轻轴min_gap_s的作用是合并同一轴两个轮胎带来的连续脉冲避免把一根轴拆成两根。返回值里的start和end决定了后面重量积分的窗口peak则用于峰值法和峰宽统计。调试时我建议把识别结果直接画在滤波波形上凡是识别出的轴事件用竖线标出来一眼就能看出来参数合不合理。2.3 轮轴识别里最容易错的两个参数第一个参数是min_gap_s。现场同一轴的两个轮胎脉冲间隔会随车速变化低速大车可能到0.3秒高速小车可能只有0.05秒。如果按最高车速80km/h和最小轴间距1.3m计算双联轴最小间隔约0.058秒min_gap_s设置成0.15就会把相邻轴吞掉。我一般先根据目标车型的轴距表和速度上限算出下界再留20%余量而不是拍脑袋定一个0.15固定值。第二个参数是动态阈值的基线窗口长度。0.5秒窗口在低速重车场景下会把整个波形抬得很高导致轴的边缘毛刺突破阈值进而产生假轴事件。处理办法是在轮轴识别之后再加一道合并逻辑如果两个事件的峰值间隔小于某个极小值就按同一个轴处理取幅度更大的那个作为主事件两个峰都保留用于后续双胎特征分析。提示轮轴识别的结果直接影响轴距法测速和重量积分窗口。上线前一定要先用“空秤无车”数据跑一遍确认没有任何假事件再上车实测。3. 胎压形变修正算法为什么称重结果跟着轮胎胎压走很多刚接触动态汽车衡的人会问称重和胎压有什么关系做个静态实验就明白了。同一辆车停在秤台上轮胎放气到半压和打到标准胎压秤台读数几乎不变但只要车滚动起来胎压对重量信号的影响立刻显现。滚动中低胎压轮胎的形变恢复有滞后接地区域变大轴载波形被拉宽、压矮高胎压则相反。这个差异如果不修正低速大吨位车辆很容易超差。3.1 胎压形变与波形特征的对应关系软件部分“检测”胎压形变并不是去读取轮胎上的气压计而是从波形里提取两个特征等效接地长度和波形偏度。等效接地长度等于脉冲宽度乘以车速物理含义是轮胎与秤台的接触长度波形偏度用归一化三阶矩计算反映波形前后不对称程度低胎压时轮胎后沿的形变恢复滞后会让波形出现明显拖尾偏度变大。这两个特征组合起来可以区分“胎压低”和“载重大”两种容易混淆的情况。载重大时波形整体抬高但接地长度增长有限胎压低时峰值变化不大宽度却显著展宽。在面积积分法的框架里波形展宽意味着积分时间变长如果不做修正低速低胎压车辆会多算出一块重量。这里的修正逻辑要分速度区间。低速时胎压形变对波形的影响最明显修正系数要大一些高速时动态载荷主导胎压的影响被压缩修正系数趋近于零。所以修正表不能是一维的“查接地长度”至少要按车速分段组织。3.2 提取形变特征并输出修正系数的代码下面是提取形变特征和查表修正的核心代码。table是一个按速度区间和接地长度区间组织的二维修正表现场实现里用线性插值表里的系数来自标准车标定数据不是通用经验值。def extract_shape_features(wave, event, fs, speed_kmh): 从轮轴事件波形里提取胎压形变特征。 wave: 完整滤波后的波形序列 event: find_axle_events 返回的轮轴事件 seg wave[event[start]:event[end]] if len(seg) 3: return None peak event[amp] thr_half peak * 0.5 over_idx np.where(seg thr_half)[0] if len(over_idx) 0: return None width_pts over_idx[-1] - over_idx[0] speed_ms speed_kmh / 3.6 Lg width_pts / fs * speed_ms # 等效接地长度单位米 mean np.mean(seg) std np.std(seg) if std 1e-9: skew 0.0 else: skew np.mean(((seg - mean) / std) ** 3) # 波形偏度 return {Lg: Lg, skew: skew, width_pts: width_pts, peak: peak} def apply_tire_correction(wave, event, fs, speed_kmh, table, Lg_ref): 查修正表输出重量修正系数。 Lg_ref标定时基准胎压下同一轴型的接地长度。 table二维查表结构按speed和Lg两个维度索引。 feat extract_shape_features(wave, event, fs, speed_kmh) if feat is None: return 1.0 k lookup_2d(table, speed, Lg, speed_kmh, feat[Lg]) skew_k lookup_2d(table, speed, Lg, speed_kmh, feat[skew]) factor 1.0 k * (feat[Lg] - Lg_ref) / Lg_ref skew_k * feat[skew] return max(0.95, min(1.05, factor))lookup_2d是二维插值查表函数现场实现里用双线性插值即可。Lg_ref是标定车在标准充气压力下的接地长度每类轴型一个基准值。修正系数限制在±5%以内防止极端胎压下修正过头。一个典型的修正表结构如下速度区间等效接地长度小于0.25m0.25~0.35m大于0.35m5~20 km/h-0.8%01.2%20~40 km/h-0.5%00.8%40~80 km/h-0.2%00.4%表里的正负号表示修正方向接地长度大于基准说明胎压低或波形展宽要加回一部分重量接地长度小于基准说明胎压偏高要减去一部分。实际项目里这张表必须用标定车数据生成不能直接照抄。3.3 为什么不直接读胎压传感器现场车辆来源复杂乘用车、载货车、半挂车的标准胎压各不相同软件拿到一个绝对气压值也无法判断它是否偏离该车型的基准。更麻烦的是胎压传感器数据与秤台波形在时间轴上不同步滚动中的胎压和静态胎压也有差异。把胎压影响吸收到波形形变特征里再用标定表修正是工程上最可靠的做法不需要额外硬件也不依赖车型数据库。4. 车速检测实现双传感器互相关与单秤台轴距法车速在动态汽车衡软件里有双重作用一是把波形时间域换算成距离域二是参与重量积分的速度归一化。车速误差1%就会直接带进重量误差1%所以车速检测的精度要求其实和称重精度同量级。常见的工程方案有两种双传感器互相关测速和单秤台轴距法测速。前者精度高需要两个独立传感区后者省硬件但对低速波形重叠很敏感。4.1 双传感器互相关测速抗噪声、不依赖轮轴识别双排传感器秤台天然具备测速条件车轴先后压过两个传感区两路波形之间的时间延迟乘以传感器中心间距就是车速。直接找延迟的可靠办法是互相关它本质上是对两段波形做滑动点积噪声会被平均掉比简单的过零检测稳得多。def speed_by_correlation(x, y, fs, sensor_gap, max_delay_ms500): 双传感器互相关测速。 x、y为两路滤波后的传感器波形sensor_gap为传感区中心间距单位米。 max_delay int(max_delay_ms / 1000 * fs) scores [] for d in range(-max_delay, max_delay 1): if d 0: s np.sum(x[:len(x) - d] * y[d:]) else: s np.sum(x[-d:] * y[:len(y) d]) scores.append(s) scores np.array(scores) best_idx np.argmax(scores) # 抛物线插值把延迟精度提高到亚采样级 if 0 best_idx len(scores) - 1: s0, s1, s2 scores[best_idx - 1], scores[best_idx], scores[best_idx 1] denom s0 - 2 * s1 s2 if abs(denom) 1e-12: best_idx 0.5 * (s0 - s2) / denom delay_s (best_idx - max_delay) / fs if delay_s 0: return 0.0, delay_s, best_idx speed_ms sensor_gap / delay_s return speed_ms * 3.6, delay_s, best_idx这里的搜索范围max_delay_ms直接决定最低可测车速。传感器间距1米、采样率400Hz、最大延迟500ms时最低速度约7.2km/h现场如果要求支持5km/h低速车需要放宽到700ms。抛物线插值很重要400Hz采样下单个采样点误差对应约1.44km/h的速度误差插值后能压到0.1km/h量级。两路波形进入互相关前必须经过相同的低通滤波器否则滤波器相位差会成为稳定误差源。4.2 单秤台轴距法测速与低速波形重叠问题只有一排传感区时常见做法是轴距法利用轮轴识别结果取相邻两个轴事件峰值的时间差再除以该轴型对应的标准轴距。软件里维护一个轴距表双联轴取1.3m三联轴取1.3m加1.3m。这个方案的成本低但误差全部来自轮轴识别和时间戳精度。低速通过时前后轴波形重叠峰值位置被相邻轴污染时间差测出来偏大速度偏小重量就跟着偏大。处理办法是对速度序列做后处理滑动中值滤波加加速度拒绝门限。中值滤波能剔除单点跳变加速度门限能防止车辆加减速过程中把错误速度当成有效值。现场实测中如果连续两次过车的速度差值换算成加速度超过0.5g基本可以判定其中一次识别有问题软件应丢弃本次结果并等待下一辆车。测速方案硬件要求抗噪声能力低速表现速度精度双传感器互相关双排传感区强好0.1km/h量级单秤台轴距法单排传感区中差波形重叠依赖轮轴识别质量选型建议很直接新设计的秤台优先保证双传感区硬件条件存量改造项目只能用轴距法时要把轮轴识别参数调到最稳的状态并接受低速段精度下降的代价。5. 动态汽车衡软件联调异常五个典型翻车现场与排查思路这一章写的都是我在多个项目里见过的真实异常模式。这些坑有规律可循排起来不算玄学但第一次踩到确实很费时间。联调阶段建议保留完整的波形落盘遇到问题能离线回放而不是让车反复过秤。5.1 重车低速碾压波形削顶积分重量严重偏大现象满载车以5km/h左右的速度通过轴重比同车40km/h通过时大了10%以上数据超差明显。原因低速时轴载作用时间变长传感器信号被变送器限幅波形顶部出现长时间平顶。面积积分法把这段被限幅的“假面积”也积了进去重量自然偏大。解决软件里检测限幅状态当波形连续50ms处于满量程附近时打削顶标志。积分时改用去顶补偿用未限幅的上升沿和下降沿拟合出理论峰值按梯形面积补偿缺失部分而不是直接积分整个平顶区间。这也是轮轴识别里必须保留事件起止点的原因没有完整的波形窗口就无法做这种补偿。5.2 双联轴被识别成单轴整车重量忽大忽小现象同一辆车某次报了六个轴次另一次只有五个总重量随轴次跳变最大能差到十几吨。原因低通滤波器的截止频率压得太低把双联轴之间本来就不深的波谷直接填平或者min_gap_s设得太大把第二个轴事件合并进了前一个事件。解决先把滤波截止频率从8Hz提高到12Hz左右再观察波形确认波谷恢复出来然后按目标车型的轴距和最高车速重新计算min_gap_s。高车速下轴间隔小低速下间隔大安全做法是设置两组参数按当前估计车速动态切换。5.3 高速过车时互相关测速偶尔跳变重量剧烈震荡现象车速值偶尔跳到200km/h同一辆车前后两次过秤重量相差巨大。原因车辆急加速或减速时波形非平稳互相关函数在错误位置出现假峰搜索窗口太长时相邻轴的波形也可能被框进同一个窗口产生第二个峰值候选。解决对速度序列做滑动中值滤波并加“轴距一致性”拒绝逻辑。用本次速度反推相邻轴事件的实测轴距如果不在已知轴型表的合理范围内判为无效速度采用上一辆车的有效速度或轴距法兜底。另一个实用技巧是输出互相关系数峰值质量分数低于阈值时直接标记异常。5.4 白天正常晚上零点漂移空秤重量从0变成0.2t现象凌晨或午后空车通过时系统报出0.1~0.3吨的重量白天却完全正常。原因环境温度变化导致传感器和变送器零点漂移软件没有校零机制基线漂移被当成有效载荷计算。解决在软件里加空秤态识别。当连续60秒波形均方差低于阈值时判定为无车状态自动采集当前基线做零点补偿并把每个通道的漂移曲线定时落盘。漂移数据一个月归档一次可以提前发现传感器老化趋势。这个坑实现成本很低但必须在设计期预留校零接口系统性补丁最麻烦。5.5 胎压修正表换车型后反而引入更大误差现象修正表在标定车上效果很好换了轻卡或半挂车以后重量误差反而变大。原因修正表按某一轴型的接地长度区间标定单胎、双胎、宽基胎的接地特征差异很大同一个表当然不能跨轴型通用。解决修正表按轴型分组单轴、双联轴、三联轴各建各的表。软件在轮轴识别阶段输出轴型标签查表时带上轴型维度。如果数据量不足以覆盖多种轴型至少保证标定车轴型和实际使用对象轴型一致再逐步扩充。别指望一张表打天下这是这类项目里最容易被低估的坑。6. 把算法钉死在现场标定矩阵、离线回放与“跑六遍”的习惯算法原型跑通只是第一步真正让动态汽车衡过检的是现场标定和数据验证方法。标定车要按照载荷、速度、胎压三个维度打矩阵每组状态重复多次数据才有统计意义。载荷状态5km/h20km/h40km/h60km/h80km/h空载3次3次3次3次3次半载3次3次3次3次3次满载3次3次3次3次3次胎压状态再分标准、低压、高压三档实际跑车次数在这个矩阵的基础上还要乘3。每一组数据都记录环境温度、波形文件、车速估计值和最终重量结果。标定完成后用评估脚本统计重复性和最大偏差不要只看平均误差标准差才是算法稳定性的真实体现。def evaluate_runs(records): records: 同一辆车同一状态下多次过秤的重量结果列表 mean_w np.mean(records) std_w np.std(records) dev (records - mean_w) / mean_w * 100 print(f均值: {mean_w:.3f}t, 标准差: {std_w:.3f}t, 最大偏差: {np.max(np.abs(dev)):.2f}%)离线回放是排查问题的关键工具。现场程序要把ADC原始数据和事件标记一起落盘回到办公室用同一段波形反复调整修正系数不需要车再上秤台。我的工作习惯是拿到新秤台数据先看标准差和最大偏差而不是平均误差每个速度点至少跑六遍六遍里只要有一遍数据离谱就说明算法边界还没摸清白天和晚上各跑一轮因为温度漂移和胎压形变的耦合问题往往在低温时段才现形。这套流程能赶走大部分玄学问题希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑