ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

TOF传感器数据跳变怎么解决?一种基于滑动平均滤波的代码实现

TOF传感器数据跳变怎么解决?一种基于滑动平均滤波的代码实现 在智慧公厕改造项目中很多集成商都遇到过这样的“灵异事件”明明隔间里没人大屏上却显示“有人”或者人还坐在里面灯和排风却突然关了。这通常不是传感器坏了而是底层的数据清洗逻辑没做好。作为公共机构能碳一体化与智慧公共空间解决方案提供商桐盛科技在研发激光厕位感应器时摒弃了简单的“阈值判断”而是在驱动层植入了复杂的“滑动平均一阶低通滞回防抖”算法。今天我们不谈虚的直接贴出核心驱动代码带大家看看我们是如何在底层解决“数据跳变”和“误报”这两个行业顽疾的。一、 痛点复盘为什么原始TOF数据不能直接用TOFTime of Flight激光传感器虽然精度高但在公厕这种复杂环境水雾、强光、摆动门下原始数据往往带有大量噪声。抖动问题人静止不动时由于呼吸微动测距值会在1500mm和1505mm之间反复横跳。丢包问题偶尔一帧数据丢失距离瞬间变成0或8000mm导致系统误判为“人离开了”。如果直接把原始数据传给上位机体验会非常糟糕。桐盛科技的解决方案是在驱动层把脏数据洗干净只给系统输出“黄金数据”。二、 核心代码解析双重滤波驯服“数据毛刺”请看我们驱动代码中的TOF_ParseFrame函数这里藏着我们处理数据的核心逻辑。我们没有采用简单的单次采样而是设计了“滑动平均 一阶低通”的双重滤波机制。1. 滑动平均滤波去除随机噪声1// 代码片段滑动平均滤波 2static uint16_t filter_buf[FILTER_WINDOW] {0}; // 滑动滤波缓存 3// ... 4if (is_half_valid) { 5 filter_buf[filter_idx] (uint16_t)dis_mm; // 更新缓存 6 // ... 7} 8// 计算滑动平均结果 9sum 0; 10for (i 0; i FILTER_WINDOW; i) { 11 sum filter_buf[i]; 12} 13filtered_dis (uint16_t)(sum / FILTER_WINDOW);解析我们定义了一个长度为3的窗口FILTER_WINDOW每次采集的新数据进入缓存挤掉最老的数据然后取平均值。这能有效抹平那些突如其来的尖峰噪声。2. 一阶低通滤波平滑微动1// 代码片段一阶低通滤波 2#define LOW_PASS_ALPHA 0.7f 3// ... 4low_pass_dis (uint16_t)(LOW_PASS_ALPHA * filtered_dis (1 - LOW_PASS_ALPHA) * last_low_pass_dis); 5last_low_pass_dis low_pass_dis;解析在滑动平均的基础上我们又加了一层低通滤波。通过0.7的系数配置让输出数据带有“惯性”。即使传感器数值瞬间跳变输出值也会平滑过渡彻底解决了“数值乱跳”的问题。三、 业务逻辑植入滞回比较与防抖计数解决了数值跳变还要解决“状态误判”。在公厕场景最怕的就是“人来灯亮人走灯灭”的反复横跳。桐盛科技在代码中引入了滞回比较Hysteresis和防抖计数Debounce机制。1. 滞回比较设立“安全缓冲区”1// 代码片段状态滞回逻辑 2#define HYSTERESIS_THRESH 20 // 状态滞回阈值±20mm 3 4if (current_person_st 1) { 5 // 有人→无人需高度差≤-20mm目标远离≥20mm 6 temp_st (height_diff -HYSTERESIS_THRESH) ? 1 : 0; 7} else { 8 // 无人→有人需高度差≥20mm目标靠近≥20mm 9 temp_st (height_diff HYSTERESIS_THRESH) ? 1 : 0; 10}解析我们不是等到距离完全相等才判断状态切换而是设置了20mm的“死区”。有人变无人必须检测到目标远离超过20mm防止人坐着稍微前倾就被误判为离开。无人变有人必须检测到目标靠近超过20mm防止有人路过门口被误判为入座。2. 强化防抖连续确认机制1// 代码片段强化防抖 2#define STABLE_CNT 3 // 状态切换防抖阈值 3 4if (temp_st current_person_st) { 5 person_stable_cnt 0; 6} else { 7 person_stable_cnt; 8 if (person_stable_cnt STABLE_CNT) { 9 current_person_st temp_st; // 只有连续3次检测一致才真正切换状态 10 person_stable_cnt 0; 11 } 12}解析即使满足了滞回条件我们也不会立即动作。代码要求必须连续3次STABLE_CNT检测到状态一致才会真正翻转current_person_st。这意味着任何持续时间小于3个采样周期的干扰如飞虫飞过、门板震动都会被系统自动忽略。四、 极端情况兜底断线回归与半有效数据最体现桐盛科技“软硬一体”功底的是我们对异常数据的处理逻辑。1// 代码片段数据回归机制 2if (!is_half_valid) { 3 if (dis_status 255) { 4 low_pass_dis set_height; // 未检测目标则强制回归设定高度 5 } else { 6 low_pass_dis last_valid_dis; // 否则沿用历史值 7 } 8}解析场景当传感器被水雾完全遮挡或者线路受到强干扰读不到数据时。策略普通方案可能会输出0或8000导致系统崩溃。而我们的代码会强制让数据回归到“设定高度”即隔间空置时的默认高度。价值这保证了即使传感器短暂失效系统也会认为“隔间是空的”而不是“隔间被一个距离为0的物体占用了”从而避免了死锁。五、 总结细节决定成败从一段几百行的C语言代码中我们看到了桐盛科技对公共机构能碳一体化与智慧公共空间业务的深刻理解数据要稳双重滤波确保上传到云端的每一个距离值都是平滑、可信的。状态要准滞回防抖确保灯光和新风系统的每一次启停都恰到好处不浪费一度电。逻辑要活异常回归机制确保系统在极端环境下依然稳健运行。这就是桐盛科技的“软硬一体”——不仅仅是把硬件和软件拼在一起而是用软件的智慧去弥补硬件的短板用底层的严谨去支撑上层的业务。
返回列表