麦田物语:基于作物生命周期的状态机教学实践

简介:本资源是一份基于Unity引擎开发的「麦田物语」主题课程设计项目,适用于高校数字媒体、游戏开发或交互设计方向的本科生毕业设计参考与实践学习,聚焦2D角色动画系统构建与场景资源组织。压缩包共2007个文件,体量109.8MB,涵盖370张PNG格式角色与场景贴图、363个Asset资源(含预制体与材质)、189个Anim动画控制器文件(如FallingRight.anim、RotateLeft.anim等典型动作序列)、37个音频文件(WAV/OGG)及少量配置类文本(JSON/TXT)与工程设置文件,完整呈现了Unity项目标准资源分层结构。已有286人学习下载,可直接导入Unity 202x版本复现运行,获取从角色动画状态机搭建、音效触发逻辑、资源命名规范到多层级meta配置的全流程实践素材,特别适合需快速掌握Unity 2D动画集成与毕业设计项目落地的学生参考。

1. 麦田物语主题课程设计项目:不是做游戏,而是用叙事逻辑重构工科教学闭环

“麦田物语”听起来像一款像素风农场模拟游戏——但在这个课程设计项目里,它是一套以农业场景为锚点、以作物生长周期为时间轴、以多学科知识耦合为内核的教学载体。某高校信息类专业在2023级《嵌入式系统设计》与《数据可视化》两门课的联合实训中首次落地该主题:学生不写种田代码,而是用温湿度传感器采集真实盆栽数据,用状态机建模小麦从播种到抽穗的6个生理阶段,再把传感器时序曲线、状态跳转日志、光照补偿算法误差值,全部映射进一个可交互的“麦田沙盘”界面。项目验收时,教师不再看报告页数,而是让学生现场演示:“请调出第3天凌晨2点的土壤墒情异常事件,并解释你当时为什么选择PID而非阈值触发灌溉”。这种设计直击工科实践课的老大难——知识碎片化、验证黑盒化、成果不可演算。它适合两类人:一是想摆脱“点亮LED”式嵌入式入门、需要真实物理约束来倒逼系统思维的本科生;二是正为产教融合课程缺乏可量化过程性评价而发愁的一线教学负责人。核心价值不在“麦田”这个表象,而在它强制把传感器选型、低功耗调度、状态迁移验证、多源数据对齐这四件事拧成一股绳。


2. 用麦田物语框架搭建课程设计骨架:从主题解构到模块拆分

2.1 主题解构:为什么是“麦田”而不是“智能温室”或“智慧大棚”?

“麦田”二字在本项目中是经过刻意降维的物理约束载体。相比“智能温室”(需考虑通风/遮阳/补光多执行器协同),“麦田”聚焦于单一生命周期+单一环境扰动源+可人工干预节点:

  • 生命周期明确:冬小麦典型生育期180±15天,划分为播种→出苗→分蘖→拔节→孕穗→抽穗→灌浆→成熟8个阶段,其中前6个阶段有清晰的形态学判据(如叶龄指数、主茎叶片数),可转化为状态机跳转条件;
  • 扰动源收敛:主要受土壤湿度(TDR传感器)、空气温湿度(DHT22)、光照强度(BH1750)三参数驱动,避免引入CO₂浓度等高成本变量;
  • 人工干预节点可枚举:仅灌溉(继电器控制水泵)、补光(LED灯带PWM调光)、遮阴(步进电机卷帘)三个动作,每个动作有明确触发阈值和持续时间约束。

提示:选题时若替换为水稻,则需增加水位监测模块和淹水/落干循环逻辑,硬件复杂度上升40%;若选番茄,则果实膨大期需引入RGB摄像头识别果径,直接跨入CV领域。麦田的“低维可控性”是课程设计可持续迭代的前提。

2.2 模块拆分:按教学目标反向切割技术栈

本项目采用“三层洋葱模型”组织内容,每层对应不同课程能力目标:

层级模块名称对应课程能力目标技术实现要点学时占比
内层(感知层)土壤墒情动态建模嵌入式系统:ADC采样精度控制、传感器校准、低功耗休眠唤醒STM32F103C8T6 + TDR探头(0-100%含水率量程),采样间隔设为10分钟,深度睡眠电流<10μA30%
中层(决策层)生育期状态机引擎软件工程:有限状态机设计、事件驱动编程、状态持久化C语言实现FSM,状态跳转条件存储在EEPROM中,支持断电续跑;关键状态(如“拔节期开始”)需连续3次采样满足阈值才触发40%
外层(呈现层)麦田沙盘可视化数据可视化:时序数据渲染、状态变迁图谱、异常事件标注Python Flask后端 + ECharts前端,时序曲线支持缩放/拖拽,状态变迁用甘特图展示,异常事件自动打标并关联原始传感器数据包30%

注意:不强制要求联网。所有数据本地存储在SD卡(FAT32格式),可视化界面通过USB虚拟串口接收设备上传的JSON数据包(含时间戳、各传感器值、当前状态码),规避Wi-Fi模块稳定性问题——这是某实验室在2022年春季学期翻车后定下的铁律。

2.3 硬件选型血泪经验:为什么坚持用TDR而非电容式土壤传感器?

曾有小组选用GY-271电容式传感器,结果在第三周出现批量漂移:

  • 现象:同一盆栽,上午读数65%,下午突降至32%,且无法通过校准恢复;
  • 原因:电容式传感器电极易受土壤电解质沉积影响,尤其在施肥后盐分富集区,介电常数发生非线性偏移;
  • 解决:更换为SMT100 TDR探头(德国IMKO),其电磁波传播时间测量原理对电解质不敏感,实测连续运行60天漂移<2%。

提示:TDR探头需配套专用信号调理电路(如TDR100模块),不能直接接STM32的ADC引脚。某同学曾将TDR输出的0-2.5V模拟信号直连PA0,导致ADC参考电压被拉低,全系统时钟紊乱——这是硬件接口规范意识缺失的典型代价。


3. 在STM32上实现麦田状态机:从状态定义到EEPROM持久化

3.1 状态定义:用作物生理学约束替代主观命名

状态命名必须可验证、可追溯、可证伪。例如:

// 错误示范:状态名模糊,无法对应农学标准 typedef enum { STAGE_IDLE, // 闲置?什么闲置? STAGE_GROWING, // 生长?哪部分生长? STAGE_READY // 准备好?准备什么? } crop_stage_t; // 正确示范:状态名=农学术语+可测判据 typedef enum { STAGE_SEEDING, // 播种期:系统初始化完成,未检测到出苗信号 STAGE_EMERGENCE, // 出苗期:连续24h土壤温度>5℃且湿度>60%,且摄像头识别到绿色像素占比>5% STAGE_TILLERING, // 分蘖期:叶龄指数≥2.5(通过叶片计数算法计算) STAGE_JOINTING, // 拔节期:茎秆高度日增长量≥1.2cm(超声波测距) STAGE_BOOTING, // 孕穗期:空气湿度日均值<40%且持续48h(诱导穗分化) STAGE_HEADING // 抽穗期:摄像头识别到穗状结构(Hough变换检测直线簇) } crop_stage_t;

3.2 状态跳转逻辑:用“双阈值+滞环”对抗传感器噪声

以“出苗期→分蘖期”跳转为例,若仅用叶龄指数>2.5作为条件,传感器瞬时抖动会导致状态反复横跳:

// 原始逻辑(危险!) if (leaf_age_index > 2.5f) { current_stage = STAGE_TILLERING; } // 改进逻辑:滞环防抖 + 时间窗口确认 #define TILLERING_THRESHOLD_HIGH 2.5f #define TILLERING_THRESHOLD_LOW 2.3f #define CONFIRM_DURATION_MS 300000 // 5分钟确认窗口 static uint32_t tillering_start_ms = 0; static bool in_confirmation = false; if (leaf_age_index >= TILLERING_THRESHOLD_HIGH && !in_confirmation) { tillering_start_ms = HAL_GetTick(); in_confirmation = true; } else if (leaf_age_index < TILLERING_THRESHOLD_LOW) { in_confirmation = false; // 低于下限,重置确认 } else if (in_confirmation && (HAL_GetTick() - tillering_start_ms) >= CONFIRM_DURATION_MS) { current_stage = STAGE_TILLERING; in_confirmation = false; // 记录跳转事件到SD卡 log_stage_transition(STAGE_EMERGENCE, STAGE_TILLERING); }

参数说明:

  • TILLERING_THRESHOLD_HIGH/Low构成滞环宽度(0.2),避免噪声触发;
  • CONFIRM_DURATION_MS是农学依据——小麦分蘖启动需持续有效积温,5分钟是传感器采样周期(10分钟)的半窗,确保判据不被单次异常覆盖;
  • log_stage_transition()不仅写SD卡,还通过串口发送JSON包(含时间戳、前/后状态、触发时叶龄指数),供可视化层消费。

3.3 EEPROM状态持久化:断电不丢状态的核心机制

状态机必须支持意外断电后恢复,否则整个生命周期跟踪失效。STM32F103的EEPROM模拟需注意:

// 使用ST官方HAL库的FLASH模拟EEPROM(地址0x0801F800起,预留2KB) #define EEPROM_ADDR_STAGE 0x0801F800 #define EEPROM_ADDR_TIMESTAMP 0x0801F804 // 写入当前状态(原子操作) void eeprom_save_stage(crop_stage_t stage) { HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR); // 先擦除整页(1KB) FLASH_ErasePage(EEPROM_ADDR_STAGE); // 再写入状态码(4字节)和时间戳(4字节) HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, EEPROM_ADDR_STAGE, (uint32_t)stage); HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, EEPROM_ADDR_TIMESTAMP, HAL_GetTick()); HAL_FLASH_Lock(); } // 启动时读取状态 crop_stage_t eeprom_load_stage(void) { uint32_t saved_stage = *(uint32_t*)EEPROM_ADDR_STAGE; // 验证有效性:状态码必须在合法范围内 if (saved_stage >= STAGE_SEEDING && saved_stage <= STAGE_HEADING) { return (crop_stage_t)saved_stage; } else { return STAGE_SEEDING; // 默认回退到初始态 } }

关键细节:

  • 必须整页擦除再写入,否则旧数据残留导致状态错乱;
  • 写入前需清除所有FLASH标志位,否则HAL_FLASH_Program可能卡死;
  • 状态码验证必不可少——某次因电源跌落导致FLASH写入中断,EEPROM中存入0xFFFFFFFF,若不校验会进入非法状态。

4. 麦田沙盘可视化:用ECharts实现可验证的农事过程回溯

4.1 数据协议设计:让嵌入式端与Web端解耦

摒弃HTTP API,采用轻量级串口透传协议,降低嵌入式端负担:

[HEADER][TIMESTAMP][STAGE][TEMP][HUMI][LIGHT][SOIL][CRC] 0x55 4B 1B 2B 2B 2B 2B 1B
  • HEADER=0x55:帧头,避免串口误触发;
  • TIMESTAMP:32位毫秒时间戳(从系统启动开始),Web端转换为北京时间;
  • STAGE:1字节状态码(0x00=SEEDING…0x05=HEADING);
  • TEMP/HUMI/LIGHT/SOIL:各2字节无符号整数,实际值=读数×0.1(如TEMP=256→25.6℃);
  • CRC:8位累加和(不含HEADER和CRC自身)。

Python解析脚本(Flask后端):

# app.py from flask import Flask, render_template, jsonify import serial import threading import time app = Flask(__name__) data_buffer = [] # 存储最近1000条数据 def read_serial(): ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1) while True: if ser.in_waiting >= 14: # 完整帧长度 frame = ser.read(14) if frame[0] == 0x55: ts = int.from_bytes(frame[1:5], 'little') stage = frame[5] temp = int.from_bytes(frame[6:8], 'little') * 0.1 humi = int.from_bytes(frame[8:10], 'little') * 0.1 light = int.from_bytes(frame[10:12], 'little') soil = int.from_bytes(frame[12:14], 'little') * 0.1 # 存入缓冲区(线程安全) data_buffer.append({ 'time': time.time(), # 用于前端时间轴 'timestamp': ts, 'stage': stage, 'temp': temp, 'humi': humi, 'light': light, 'soil': soil }) if len(data_buffer) > 1000: data_buffer.pop(0) threading.Thread(target=read_serial, daemon=True).start() @app.route('/api/data') def get_data(): return jsonify(data_buffer[-200:]) # 返回最近200条供前端渲染

4.2 ECharts配置:突出农事逻辑而非炫技

重点实现三个农学友好视图:

  • 时序主图:X轴为时间,Y轴左为温湿度(双Y轴),右为土壤湿度,用虚线标出各阶段理论阈值带(如分蘖期要求土壤湿度60-80%);
  • 状态甘特图:X轴时间,Y轴为状态名称,每段色块宽度=该状态持续时长,鼠标悬停显示触发条件详情;
  • 异常事件面板:自动聚类偏离理论阈值的点(如土壤湿度连续3次<40%且处于孕穗期),点击可定位到原始数据包。

关键配置片段(echarts.js):

// 甘特图配置 const ganttOption = { tooltip: { formatter: params => { const data = params.data; return `状态:${stageMap[data.stage]}<br/>` + `起始:${formatTime(data.start)}<br/>` + `持续:${Math.round((data.end - data.start)/3600)}小时<br/>` + `触发条件:${triggerConditions[data.stage]}`; } }, series: [{ type: 'gantt', data: ganttData.map(item => ({ value: [item.start, item.end, item.stage], itemStyle: { color: stageColors[item.stage] } })) }] };

stageMap和triggerConditions是硬编码的农学规则字典,例如:

const triggerConditions = { 0: "系统初始化完成", 1: "土壤温度>5℃且湿度>60%持续24h", 2: "叶龄指数≥2.5(基于叶片计数)", 3: "茎秆日增长≥1.2cm(超声波测距)" };

提示:所有阈值必须与嵌入式端代码严格一致。某小组前端显示“已进入拔节期”,但嵌入式端因浮点精度问题实际未跳转,导致师生质疑系统可靠性——最终发现是前端用>=2.5而嵌入式用>2.5001,统一改为>=2.5000后解决。


5. 避坑指南:麦田物语项目中高频翻车的5个现场

5.1 现象:SD卡频繁写失败,日志文件损坏

  • 原因:STM32的SPI接口未配置DMA,每次写入都阻塞主循环,当传感器采样与SD卡写入同时发生时,SPI时钟被拉长导致CRC校验失败;同时,FAT32文件系统未启用_USE_FASTSEEK,小文件追加写入效率低下。
  • 解决:① SPI配置DMA双缓冲(HAL_SPI_TransmitReceive_DMA);② FatFs配置_USE_FASTSEEK=1;③ 关键日志改用环形缓冲区+定时刷盘(每30秒或缓冲区满50条时批量写入)。

5.2 现象:状态机在“孕穗期”无限循环,无法进入“抽穗期”

  • 原因:农学规则设定“孕穗期需空气湿度<40%持续48h”,但实验箱内加湿器故障导致湿度始终在38-42%间波动,系统在阈值线上反复横跳;且未设置超时强制跳转机制。
  • 解决:① 所有状态跳转必须配置最大驻留时间(如孕穗期最长72h,超时则强制进入抽穗期);② 增加湿度变化率判据(dH/dt < -0.1%/h)辅助判断真实干燥趋势。

5.3 现象:ECharts甘特图时间轴错乱,显示“2023-01-01 00:00”而非真实时间

  • 原因:嵌入式端发送的是相对时间戳(HAL_GetTick()),Web端直接当作Unix时间戳渲染;且未处理32位溢出(约49.7天后HAL_GetTick()归零)。
  • 解决:① 嵌入式端增加绝对时间同步指令(上位机发送NTP时间,MCU校准内部RTC);② Web端解析时,若检测到时间戳<1000000000(2001年),则视为相对时间,叠加启动时间戳修正。

5.4 现象:TDR传感器读数随电池电压下降而系统性偏高

  • 原因:TDR探头激励电压由MCU的VDD提供,当锂电池从4.2V放电至3.4V时,电磁波传播速度变化导致时间测量偏差,换算含水率时未补偿电压系数。
  • 解决:① 在TDR信号调理电路中加入稳压源(如TPS7A20);② 若用VDD直供,则在软件中建立电压-偏差查表(实测3.3V~4.2V区间偏差0.8%~3.2%)。

5.5 现象:多组并行测试时,USB虚拟串口被系统识别为同一COM口,后加载的设备无法通信

  • 原因:STM32的USB CDC描述符中iSerialNumber字段未唯一化,Windows将其视为同一设备反复枚举。
  • 解决:① 修改usbd_cdc_if.c中的USBD_CDC_Interface_fops,在CDC_Control_FS()中动态生成序列号(如取芯片UID后4字节);② 或更简单:每组设备烧录前,用ST-Link Utility修改Flash中指定地址的序列号字符串。

6. 进阶技巧:用麦田物语项目训练“可验证的工程直觉”

6.1 构建农学-工程映射表:让每个代码分支都有农学依据

不要让if (soil_moisture < 40)这种代码裸奔。我要求学生提交的每个状态跳转条件,必须附带一张映射表:

代码位置农学依据来源实测验证方法典型偏差范围
stage == STAGE_BOOTING && air_humi < 40《作物栽培学》P172:小麦孕穗期需控水促穗分化在恒温箱中设置35%、40%、45%三组湿度,观察穗原基分化速率±2.3%(RH传感器精度)
leaf_age_index >= 2.5《小麦生理学》图5-3:冬小麦分蘖盛期叶龄指数分布人工计数10株植株叶片,与算法输出对比±0.15(叶片边缘识别误差)

这张表强迫学生离开IDE去翻教材、查文献、做对照实验。某次答辩中,A同学因无法说明STAGE_HEADING的触发阈值为何设为“穗长≥3cm”(实际农学标准是“剑叶完全展开”),被当场要求暂停开发,先去农场蹲点三天记录真实抽穗过程——这比任何代码审查都有效。

6.2 设计“后悔药”机制:给不可逆操作加人工确认环

灌溉、补光、遮阴都是物理世界动作,一旦误触发可能毁掉整盆作物。我在状态机中强制加入三级确认:

  1. 预警层:当预测1小时内将触发灌溉时,在串口打印[WARN] Irrigation predicted in 45min: soil=38%, threshold=40%;
  2. 拦截层:实际触发前,检查GPIO引脚是否被外部开关短接到地(硬件确认键),否则跳过;
  3. 审计层:每次执行后,将动作、参数、前后传感器值写入独立审计日志(audit_20231015.log),供教师回溯。

我的习惯是:在项目启动时,用万用表蜂鸣档测试所有执行器线路,确保继电器输出端与水泵之间串联一个物理按钮开关。这不是冗余,而是把“工程师对物理世界的敬畏”焊进硬件里。去年有组学生因忘记装这个开关,深夜自动灌溉导致水漫实验台——他们因此记住了比任何状态机都深刻的教训:在真实世界里,没有Ctrl+Z。

希望帮到你。

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

相关新闻

Python变量作用域陷阱:为什么读取不报错但赋值就崩

Python变量作用域陷阱:为什么读取不报错但赋值就崩

1. 这个看似“常识”的规则&#xff0c;为什么90%的Python开发者都踩过坑&#xff1f;你有没有写过这样的代码&#xff1f;counter 0def increment():counter 1 # 报错&#xff1a;UnboundLocalError: local variable counter referenced before assignmentreturn counterin…

2026/10/20 23:09:33 阅读更多 →
AI应用架构师的落地策略:从定义正确问题到价值验证

AI应用架构师的落地策略:从定义正确问题到价值验证

开头这些年&#xff0c;我给不少企业做过AI落地方案&#xff0c;发现一个很有意思的现象&#xff1a;市面上谈“AI应用架构师”这个角色的&#xff0c;十有八九都在讲技术栈、讲模型微调、讲算法精度。但你真跑到一家想要数字化转型的企业里去&#xff0c;老板拍着桌子跟你说“…

2026/10/20 23:08:31 阅读更多 →
context-mode设计模式:用上下文快照与模式契约治理条件分支爆炸

context-mode设计模式:用上下文快照与模式契约治理条件分支爆炸

1. 从“上下文模式”这个命名说起&#xff1a;它到底在解决什么问题第一次看到“context-mode”这个词&#xff0c;很多人会下意识地把它当成某个框架里的配置项&#xff0c;或者某个编辑器插件的开关。但如果你真的在工程一线待过几年&#xff0c;就会发现这个词背后藏着一个非…

2026/10/20 23:08:31 阅读更多 →

最新新闻

AF_XDP 实战指南:Ubuntu 24.04 上基于 eBPF 的高性能包处理

AF_XDP 实战指南:Ubuntu 24.04 上基于 eBPF 的高性能包处理

1. 项目概述&#xff1a;AF_XDP 到底解决什么问题碰上 AF_XDP 这个技术点的人&#xff0c;多半是已经在 Linux 上做高性能包处理&#xff0c;或者被 DPDK 的运维成本折腾过之后&#xff0c;想在内核生态里找个折中方案。AF_XDP 不是一个框架&#xff0c;而是 Linux 内核提供的地…

2026/10/20 23:41:33 阅读更多 →
用Unity打造桌面精灵:透明窗口、鼠标穿透与动画实战

用Unity打造桌面精灵:透明窗口、鼠标穿透与动画实战

简介&#xff1a;这是一份基于Unity引擎开发桌面精灵的完整工程资源&#xff0c;面向希望实现类似QQ宠物透明浮动桌面形象的Unity开发者。资源围绕窗口无边界设置、透明材质渲染、UI布局、Animator动画控制以及鼠标交互事件等关键技术点组织&#xff0c;适合有一定Unity基础、想…

2026/10/20 23:41:33 阅读更多 →
GLSL变量与类型系统详解:从标量到矩阵的Shader避坑指南

GLSL变量与类型系统详解:从标量到矩阵的Shader避坑指南

如果你写过一段时间的着色器&#xff0c;大概率遇到过这种时刻&#xff1a;shader编译失败&#xff0c;错误信息指向某个变量&#xff0c;你盯着那一行看了很久&#xff0c;愣是没发现哪里有问题。我印象最深的一次是在某个延迟渲染demo里&#xff0c;片元着色器把法线数据当成…

2026/10/20 23:41:33 阅读更多 →
C语言是什么?从底层原理到上手路径的全面解析

C语言是什么?从底层原理到上手路径的全面解析

编程这行干久了&#xff0c;总会被外行朋友或刚入行的新人问到同一个问题&#xff1a;“C语言到底是什么&#xff1f;” 每次被问到&#xff0c;我都会愣一下&#xff0c;因为这个问题看似简单&#xff0c;真要一两句话说清楚还挺难。它不像Java能“写安卓APP”&#xff0c;也不…

2026/10/20 23:41:33 阅读更多 →
好写作AI如何用游戏化设计破解写作恐惧,养成写作习惯

好写作AI如何用游戏化设计破解写作恐惧,养成写作习惯

1. 好写作AI到底在做什么&#xff1a;把“写作”变成“练级”1.1 它解决了什么问题&#xff1a;写作恐惧不是懒&#xff0c;是“防御”我见过太多人说自己“不会写”“写不出来”&#xff0c;包括我自己也曾是这样。面对一个空白文档&#xff0c;光标一开一合&#xff0c;脑子里…

2026/10/20 23:41:33 阅读更多 →
华三AC WX5560H AP信道优化实战:解决信号满格却卡顿

华三AC WX5560H AP信道优化实战:解决信号满格却卡顿

前阵子在某园区处理无线投诉时&#xff0c;我碰到一个很典型的场景&#xff1a;AP 装了一堆、信号显示也是满格&#xff0c;但视频会议就是动不动卡成 PPT。当时很多人第一反应是带宽不够&#xff0c;可跑到华三 AC WX5560H 上一看&#xff0c;控制器负载很低&#xff0c;出口带…

2026/10/20 23:40:32 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →