2023电赛综合测评B题国一方案:STM32F4多通道信号采集与实时控制实战

简介:这份资源是2023年全国大学生电子设计竞赛综合测评B题的国一获奖方案,面向备战电赛的本科生、电子设计爱好者及需要同轴电缆检测参考设计的开发者。方案围绕同轴电缆长度与终端负载检测装置展开,主控采用梁山派开发板,开发环境为STM32CubeMX、CLion与OpenOCD组合。技术实现上,长度测量运用TDR时域反射法,误差小于0.5cm;电阻负载采用分压法,误差小于0.1Ω;电容负载借助NE555振荡电路,误差小于1pF,完整覆盖题目对开路、电阻与电容负载的判断与测量要求。资源包共228个文件,包含72个h头文件、38个c源文件与38个obj中间文件,另有png原理图、xlsx测试数据、pdf文档及bin、hex固件等,压缩包约22.64MB,工程结构完整可直接编译复现。目前已有3437人学习下载,适合对照赛题要求理解TDR测长、分压测阻与振荡测容的工程落地思路,快速搭建验证环境并查漏补缺。

1. 从一块板子到国一方案:2023年电赛综合测评B题到底考了什么

2023年电赛综合测评B题,当年让不少队伍在实验室熬到凌晨三点。题目核心并不复杂——用一块主控板完成多通道信号采集、实时处理与输出控制,但真正拉开差距的是“综合”二字:它把模拟前端、数字控制、人机交互和电源完整性揉在一道题里,要求你在有限时间内搭出一套能跑、能测、能演示的完整系统。这份国一方案的价值就在这儿,它不是零散代码片段,而是一套经过实测验证的工程框架,包含主控逻辑、外设驱动、关键算法和调试记录。适合正在备战电赛的学生、需要快速搭建STM32综合项目的工程师,以及想看看“国一水平”到底长什么样的从业者。STM32在这里不是噱头,是实打实承担了采样时序调度、PWM输出和串口屏交互三块硬任务。

2. 方案拆解:主控选型、任务调度与信号链设计

2.1 为什么是STM32F4而不是F1或H7

当年综合测评现场,主控选型直接决定后面三小时是调参还是调命。这份方案用的是STM32F407,不是F103,也不是H743。原因很具体:F4系列有FPU和DSP指令集,做滑动平均、FFT或者PID整定时,浮点运算不会像F1那样靠软件模拟拖垮时序;同时F4的主频168MHz足够在单周期内完成ADC采样触发和PWM占空比更新,不需要额外CPLD。H7性能更强,但当年开发板价格和供货都不友好,综合测评这种限时任务,选一个“够用且资料多”的型号比追新更划算。

常见做法是先用CubeMX把时钟树和引脚分配拉出来,再手动补外设初始化。我一般会先把ADC、DAC、TIM和USART的底层配置写成独立文件,避免在main.c里堆成山。下面这段是ADC多通道扫描+DMA搬运的核心配置,直接决定采样是否丢点:

// adc_config.c // 使用ADC1扫描模式,规则通道顺序:IN0(PA0) -> IN1(PA1) -> IN2(PA2) // DMA2 Stream0 搬运,半字对齐,循环模式 void ADC_Init(void) { ADC_CommonInitTypeDef adc_common; ADC_InitTypeDef adc_init; DMA_InitTypeDef dma_init; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); // DMA配置:外设到内存,循环模式,优先级高 DMA_StructInit(&dma_init); dma_init.DMA_Channel = DMA_Channel_0; dma_init.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; dma_init.DMA_Memory0BaseAddr = (uint32_t)adc_buffer; dma_init.DMA_DIR = DMA_DIR_PeripheralToMemory; dma_init.DMA_BufferSize = ADC_CHANNEL_NUM * SAMPLE_DEPTH; dma_init.DMA_PeripheralInc = DMA_PeripheralInc_Disable; dma_init.DMA_MemoryInc = DMA_MemoryInc_Enable; dma_init.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; dma_init.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; dma_init.DMA_Mode = DMA_Mode_Circular; dma_init.DMA_Priority = DMA_Priority_High; DMA_Init(DMA2_Stream0, &dma_init); DMA_Cmd(DMA2_Stream0, ENABLE); // ADC通用配置:独立模式,预分频4 ADC_CommonStructInit(&adc_common); adc_common.ADC_Mode = ADC_Mode_Independent; adc_common.ADC_Prescaler = ADC_Prescaler_Div4; adc_common.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; adc_common.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&adc_common); // ADC1配置:扫描模式,连续转换,外部触发TIM2 ADC_StructInit(&adc_init); adc_init.ADC_Resolution = ADC_Resolution_12b; adc_init.ADC_ScanConvMode = ENABLE; adc_init.ADC_ContinuousConvMode = ENABLE; adc_init.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising; adc_init.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2; adc_init.ADC_DataAlign = ADC_DataAlign_Right; adc_init.ADC_NbrOfConversion = ADC_CHANNEL_NUM; ADC_Init(ADC1, &adc_init); // 规则通道顺序配置 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_84Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_84Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_84Cycles); ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE); ADC_SoftwareStartConv(ADC1); }

这段代码里三个参数最要命:ADC_SampleTime_84Cycles决定了采样保持时间,信号源内阻大时采样时间不够会直接导致读数跳变;DMA_Mode_Circular保证缓冲区满了自动覆盖,不会因为忘记重启DMA而丢数据;ADC_ExternalTrigConv_T2_CC2把采样时刻和PWM周期硬绑定,避免软件触发带来的抖动。当年有队伍用软件触发ADC,结果输出波形上一直有低频包络,查了两小时才发现是采样时刻和PWM不同步。

2.2 任务调度:裸机时间片还是RTOS

综合测评B题对实时性要求不算极端,但任务不少:ADC采样、按键扫描、OLED刷新、串口命令解析、PID计算。这份方案用的是裸机时间片轮询,没有上FreeRTOS。理由很实在:RTOS会引入任务切换开销和栈溢出风险,而测评现场调试时间有限,裸机逻辑更透明。具体做法是用SysTick做1ms基准,每个任务按计数器分频执行:

// scheduler.c // 1ms SysTick中断中维护软定时器 volatile uint32_t tick_1ms = 0; void SysTick_Handler(void) { tick_1ms++; } // 主循环中的时间片调度 void main_loop(void) { static uint32_t last_adc = 0, last_key = 0, last_oled = 0, last_pid = 0; while (1) { uint32_t now = tick_1ms; // 1ms周期:PID计算 if (now - last_pid >= 1) { pid_calculate(); last_pid = now; } // 5ms周期:按键扫描 if (now - last_key >= 5) { key_scan(); last_key = now; } // 20ms周期:OLED刷新 if (now - last_oled >= 20) { oled_refresh(); last_oled = now; } // 100ms周期:串口上报 if (now - last_adc >= 100) { uart_report(); last_adc = now; } } }

时间片轮询的关键是每个任务执行时间必须远小于其周期。比如PID计算放在1ms任务里,实际执行不能超过200us,否则会挤占后续任务。当年调的时候用GPIO翻转+示波器测过每个任务的执行时间,OLED刷新最耗时,因为I2C速率只有400kHz,刷一屏要8ms左右,所以给了20ms周期。如果换成SPI屏,可以压到2ms以内,周期也能缩短。

2.3 信号链:从传感器到输出端的完整路径

这道题的前端信号来自外部模拟源,经过运放调理后进ADC。方案里运放用的是轨到轨CMOS运放,单电源3.3V供电,增益设为2倍,把0~1.65V的输入抬到0~3.3V满量程。这里有个细节:ADC参考电压直接用VDDA,没有外挂REF芯片,因为F4的VDDA在板子上已经做了LC滤波,实测噪声在±2LSB以内,够用。输出端用TIM1的互补PWM经过RC低通滤波还原模拟量,截止频率设在1kHz,比PWM频率低两个数量级,纹波能压到10mV以下。

整个信号链的延迟主要来自RC滤波和PID计算周期。如果题目要求相位滞后小,可以把RC截止频率提高,但纹波会变大,需要折中。当年实测从ADC采样到PWM更新,总延迟约1.2ms,对于综合测评的指标要求是够的。

3. 关键模块实现:PID、串口屏与数据记录

3.1 增量式PID的参数整定与抗积分饱和

方案里的控制算法用的是增量式PID,不是位置式。增量式的好处是输出只与最近三次误差有关,不需要累加历史误差,天然抗积分饱和,而且切换手动/自动时冲击小。核心代码就十几行,但参数整定花了最久:

// pid.c // 增量式PID,输出限幅,积分分离 typedef struct { float Kp, Ki, Kd; float err[3]; // err[0]=当前, err[1]=上次, err[2]=上上次 float out; float out_max, out_min; } PID_Inc; float pid_inc_calc(PID_Inc *pid, float setpoint, float feedback) { float delta; pid->err[2] = pid->err[1]; pid->err[1] = pid->err[0]; pid->err[0] = setpoint - feedback; // 积分分离:误差大时不加积分,防止超调 if (fabs(pid->err[0]) > 50.0f) { delta = pid->Kp * (pid->err[0] - pid->err[1]) + pid->Kd * (pid->err[0] - 2*pid->err[1] + pid->err[2]); } else { delta = pid->Kp * (pid->err[0] - pid->err[1]) + pid->Ki * pid->err[0] + pid->Kd * (pid->err[0] - 2*pid->err[1] + pid->err[2]); } pid->out += delta; // 输出限幅 if (pid->out > pid->out_max) pid->out = pid->out_max; if (pid->out < pid->out_min) pid->out = pid->out_min; return pid->out; }

参数整定顺序是:先Kp到临界振荡,取振荡周期的1/2作为积分时间,再微调Kd。当年用继电器自整定法粗调了一轮,然后手动细调。注意fabs(err[0]) > 50.0f这个阈值是根据ADC量程定的,如果量程改了,阈值也要跟着改,否则积分分离会失效。

3.2 串口屏交互:用USART+DMA做无阻塞刷新

综合测评现场需要实时显示波形和参数,方案里用的是串口屏,通过USART2发送指令。如果直接用HAL_UART_Transmit阻塞发送,刷一屏要几十毫秒,PID周期会被拉长。所以这里用了DMA发送+环形缓冲区:

// uart_screen.c // USART2 TX使用DMA1 Stream6,环形缓冲区 #define TX_BUF_SIZE 512 static uint8_t tx_buf[TX_BUF_SIZE]; static volatile uint16_t tx_head = 0, tx_tail = 0; void screen_send_cmd(const uint8_t *cmd, uint16_t len) { for (uint16_t i = 0; i < len; i++) { uint16_t next = (tx_head + 1) % TX_BUF_SIZE; if (next == tx_tail) break; // 缓冲区满,丢弃 tx_buf[tx_head] = cmd[i]; tx_head = next; } // 如果DMA空闲,启动发送 if (DMA_GetCurrDataCounter(DMA1_Stream6) == 0) { uint16_t tail = tx_tail; uint16_t head = tx_head; uint16_t send_len = (head >= tail) ? (head - tail) : (TX_BUF_SIZE - tail + head); if (send_len > 0) { DMA_Cmd(DMA1_Stream6, DISABLE); DMA_SetCurrDataCounter(DMA1_Stream6, send_len); DMA_Cmd(DMA1_Stream6, ENABLE); tx_tail = head; } } }

环形缓冲区的容量512字节是按屏幕指令长度估的,一条画点指令约8字节,一屏200个点就是1600字节,所以实际会分多次发送。DMA发送完成中断里要记得重新检查缓冲区,否则最后一段数据会卡住。当年踩过的坑是DMA发送完成中断优先级设低了,被ADC中断打断后没及时重启,屏幕刷新出现撕裂。

3.3 数据记录:用Flash模拟EEPROM存关键参数

测评现场经常需要掉电保存PID参数和校准系数。F4内部Flash擦写次数约1万次,不能频繁写,所以方案里用了一个简单的磨损均衡策略:把Flash最后一页分成4个扇区,轮流写,每个扇区记录一个版本号,上电时读版本号最高的那个。代码不复杂,但要注意Flash擦除必须按扇区操作,写之前先解锁。

// flash_param.c // 参数结构体,固定16字节对齐 typedef struct { uint32_t magic; // 0x50415241 "PARA" float Kp, Ki, Kd; float calib_gain, calib_offset; uint32_t version; uint32_t crc; } ParamBlock; // 保存参数:找到最旧扇区擦除后写入 void param_save(ParamBlock *p) { uint32_t addr = find_oldest_sector(); FLASH_Unlock(); FLASH_EraseSector(addr); p->version++; p->crc = crc32((uint8_t*)p, sizeof(ParamBlock) - 4); for (uint32_t i = 0; i < sizeof(ParamBlock); i += 4) { FLASH_ProgramWord(addr + i, *(uint32_t*)((uint8_t*)p + i)); } FLASH_Lock(); }

CRC校验不能省,当年有一次Flash写入过程中断电,上电后读出来的参数全是0xFF,PID直接失控。加了CRC之后,校验失败就加载默认参数,至少系统能跑起来。

4. 避坑与排查:那些年综合测评现场翻过的车

4.1 现象:ADC读数周期性跳动,输出波形有低频包络

原因:ADC采样时刻和PWM周期不同步,导致采样点落在开关噪声的不同相位上。解决:把ADC外部触发源改成TIM2的CC2事件,让采样时刻固定在PWM周期中点,避开开关瞬间。同时ADC采样时间从15周期加到84周期,让采样保持电容充分充电。

4.2 现象:串口屏刷新时PID输出抖动

原因:串口发送用了阻塞方式,刷屏时CPU被占住,PID计算周期从1ms变成15ms。解决:改用DMA+环形缓冲区,发送不占CPU。另外把屏幕刷新周期从10ms放宽到20ms,减少总线占用。

4.3 现象:上电后系统偶尔不启动,复位才能跑

原因:Flash参数读取时没有校验CRC,读到全0xFF后PID参数变成NaN,后续计算全部异常。解决:加CRC32校验,失败则加载默认参数;同时在参数结构体里加magic word,双重确认。

4.4 现象:PWM输出经过RC滤波后纹波大,万用表读数跳

原因:RC截止频率设得太高,PWM基频泄漏到输出。解决:把截止频率从10kHz降到1kHz,同时把PWM频率从20kHz提高到100kHz,纹波从50mV降到8mV。代价是PWM分辨率从12位降到10位,但综合测评的精度要求10位够用。

4.5 现象:按键偶尔连击,参数被误改

原因:按键扫描周期5ms,但机械按键抖动时间可达10ms。解决:加20ms软件消抖,同时用状态机区分短按和长按。长按进入参数修改模式,短按切换显示页面,避免误触。

5. 进阶技巧:用DMA双缓冲和定时器级联把采样率再提一档

如果题目对采样率有更高要求,比如需要做音频段FFT,单缓冲DMA就不够了。常见做法是开DMA双缓冲模式,一半填满时触发中断处理,另一半继续采集,实现无缝衔接。F4的DMA支持双缓冲,配置时把DMA_Mode设为DMA_Mode_DoubleBuffer,然后指定DMA_Memory1BaseAddr和DMA_Memory0BaseAddr两个缓冲区。中断里用DMA_GetCurrentMemoryTarget()判断当前在哪个缓冲区,处理另一个即可。

另一个技巧是定时器级联:用TIM2做主定时器,TIM3从模式触发ADC,TIM4再触发DAC输出。这样采样、计算、输出三个环节用硬件定时器串起来,CPU只负责在中断里搬数据,抖动能压到纳秒级。当年实测这套级联方案,采样率稳定在200kHz,FFT分辨率做到10Hz,足够应付综合测评里任何信号分析需求。

// tim_cascade.c // TIM2主定时器,更新事件触发TIM3 void TIM2_Master_Init(void) { TIM_TimeBaseInitTypeDef tb; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructInit(&tb); tb.TIM_Prescaler = 0; tb.TIM_Period = 839; // 168MHz / 840 = 200kHz tb.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &tb); TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); TIM_Cmd(TIM2, ENABLE); } // TIM3从模式,触发源ITR1(TIM2),触发后输出OC2给ADC void TIM3_Slave_Init(void) { TIM_TimeBaseInitTypeDef tb; TIM_OCInitTypeDef oc; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructInit(&tb); tb.TIM_Period = 1; // 每个触发脉冲产生一次OC tb.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &tb); TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1); TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger); TIM_OCStructInit(&oc); oc.TIM_OCMode = TIM_OCMode_PWM1; oc.TIM_OutputState = TIM_OutputState_Enable; oc.TIM_Pulse = 1; TIM_OC2Init(TIM3, &oc); TIM_Cmd(TIM3, ENABLE); }

这套级联的坑在于触发极性:TIM2的更新事件默认是上升沿,如果TIM3的从模式设成TIM_SlaveMode_Trigger,会在每个上升沿复位计数器,配合TIM_Pulse=1就能在固定相位输出OC脉冲。当年调的时候忘了设TIM_SelectInputTrigger,结果TIM3一直不触发,查了半天参考手册才发现ITR映射关系搞错了。

从那以后我每次上电第一件事就是拿示波器看TIM2和TIM3的波形,确认触发链路通了再往下调。希望帮到你。

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

相关新闻

SpringBoot+Vue构建媒体活动推荐系统:推荐策略、冷启动与权限设计

SpringBoot+Vue构建媒体活动推荐系统:推荐策略、冷启动与权限设计

媒体活动推荐系统这个题目&#xff0c;听起来像是“活动报名网站加了个热门列表”&#xff0c;但你真正动手做的时候会发现&#xff0c;最难的部分根本不是增删改查&#xff0c;而是“推荐”这两个字怎么落地。这篇聊聊我基于SpringBoot Vue做的一个媒体活动推荐系统&#xff…

2026/10/21 3:45:30 阅读更多 →
NTIRE 2026高效超分冠军方案全解析:结构、训练与部署

NTIRE 2026高效超分冠军方案全解析:结构、训练与部署

NTIRE 2026 的 Efficient Super-Resolution 赛道榜单刚出来时&#xff0c;群里讨论最多的不是 PSNR 又涨了多少&#xff0c;而是冠军方案在参数、计算量和推理耗时都被严格限制的前提下&#xff0c;怎么把质量指标和主观效果同时拉开的。这个赛道跟普通超分比赛最大的区别&…

2026/10/21 3:45:30 阅读更多 →
Git提交规范与自动化发版:Conventional Commits+commitlint+husky+standard-version实战

Git提交规范与自动化发版:Conventional Commits+commitlint+husky+standard-version实战

要我说&#xff0c;能把 Git 提交这件事从一个"个人随手记"变成"团队可追溯、机器可解读"的工程化能力&#xff0c;靠的不是给每个人发一份《提交规范文档》&#xff0c;而是把规范嵌进工具链里&#xff0c;让不规范的提交根本过不去。这个项目标题看起来就…

2026/10/21 3:45:30 阅读更多 →

最新新闻

视频配乐生成中的三大对齐:语义、时间与节奏

视频配乐生成中的三大对齐:语义、时间与节奏

视频配乐生成这个方向&#xff0c;最难的地方从来不是“让模型会作曲”——现在的音频生成模型各有各的强项&#xff0c;旋律、音色、和声做得都挺像样。但我自己做了几年多模态生成项目之后最大的感受是&#xff1a;配乐的核心危机&#xff0c;在于“对齐”。生成的音乐单独听…

2026/10/21 4:33:49 阅读更多 →
深度学习图像搜索引擎实战:预训练CNN特征提取与FAISS向量检索

深度学习图像搜索引擎实战:预训练CNN特征提取与FAISS向量检索

1. 项目概述与整体设计思路1.1 图像搜索引擎到底在做什么先把这个项目的本质说清楚。所谓深度学习图像搜索算法&#xff0c;核心就一句话&#xff1a;给定一张查询图片&#xff0c;系统能从成千上万张图库里找出与之内容最相似的图片。这个场景在生活里太常见了——淘宝拍图找同…

2026/10/21 4:33:49 阅读更多 →
DDD战略设计:统一语言与限界上下文驱动的微服务拆分

DDD战略设计:统一语言与限界上下文驱动的微服务拆分

1. 战略设计到底要解决什么问题先说一个我观察到的现象。很多团队做系统架构&#xff0c;一上来就画微服务拆分图、设计数据库表、定义接口协议&#xff0c;忙活几个月&#xff0c;系统上线了&#xff0c;维护半年发现不对劲&#xff1a;业务一变更就要改一串服务&#xff0c;跨…

2026/10/21 4:33:49 阅读更多 →
即时通讯图片上传失败报错2400排查指南:凭证与链路配置全解析

即时通讯图片上传失败报错2400排查指南:凭证与链路配置全解析

1. 从一次深夜报错说起&#xff1a;2400到底卡在哪做即时通讯功能开发的人&#xff0c;大概率都绕不开一个经典场景&#xff1a;一对一聊天里发图片。文字消息跑得挺顺&#xff0c;一旦用户点开相册选张图&#xff0c;点发送&#xff0c;界面转圈&#xff0c;然后弹出一个冷冰冰…

2026/10/21 4:33:49 阅读更多 →
OpenCV Mat统计小于0个数:类型、连续性与高效实现

OpenCV Mat统计小于0个数:类型、连续性与高效实现

看到这个标题——opencv mat 统计小于0的个数——你可能觉得这就是个遍历计数的小问题。我一开始也这么认为&#xff0c;结果真上手的时候&#xff0c;被 Mat 的类型、通道数、连续性轮番招呼了一遍。OpenCV 的 Mat 不是一个简单的一维数组&#xff0c;它背后有内存布局、数据类…

2026/10/21 4:33:49 阅读更多 →
从囤积资料到掌握技能:个人技能管理闭环方法论

从囤积资料到掌握技能:个人技能管理闭环方法论

你有没有过这种感觉&#xff1a;收藏夹里躺了几百个教程&#xff0c;网盘里存了一堆学习资料&#xff0c;每天刷各种干货文章&#xff0c;觉得自己一直在"学东西"&#xff0c;可真到了要用的时候&#xff0c;却发现自己什么都不会&#xff1f;我太熟悉这种状态了。前…

2026/10/21 4:32:49 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于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/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →