RT-Thread ENV工具入门:从安装到配置驱动开发

废话不多说,直接进入正题。很多玩RT-Thread的朋友第一次听说ENV工具时,心里多半是拒绝的:明明Keil/IAR的图形界面用得挺顺手,为什么还要去敲命令行?我最初也这么想,直到手动维护一个带Wi-Fi、文件系统、多种传感器驱动的工程时,被几百个源文件整破防了,老老实实捡起ENV才把工作效率拉回来。

ENV是RT-Thread官方提供的命令行配置与构建工具,核心就三件事:用menuconfig界面剪裁配置内核和组件、用scons自动生成和编译IDE工程、用pkgs一条命令管理软件包。这篇入门教程不多讲理论,重点是让你把ENV正确装好、跑通第一条命令、理解它到底在帮你做什么,适合第一次接触ENV、以及想从“手动管理工程”切换到“配置驱动工程”的开发者。

1. 先搞清楚ENV是什么,再决定要不要装

1.1 一个命令行工具为什么能抢IDE的活

先讲个场景:你想给现有RT-Thread工程加一个传感器软件包。传统做法是去网上把源码下载下来,解压、把几十个.c文件拖进工程,手动添加头文件路径、手工粘贴宏定义,还要处理依赖的其他组件。工程小的时候无所谓,但当你同时加LCD驱动、文件系统、网络协议栈的时候,这套手动流程基本就失控了。漏一个头文件路径或宏定义,报错信息能给你绕上半天。

ENV做的事情,是把“这个工程需要哪些源码文件、需要定义哪些宏、需要引用哪些头文件”这种元信息,用一种可配置的方式集中管理。你只需要通过menuconfig把选项勾上,scons会自动根据配置去组织编译,IDE工程也可以一键生成。简单说:你不再用手去拖动源文件,而是用配置描述工程。

1.2 ENV工具包里到底装了什么

很多人误以为ENV是单独一个软件,其实它是一个把好几样东西打包在一起的便携环境,主要包含四块:

组件作用
Python环境scons脚本和pkgs脚本都依赖Python运行
SCons构建引擎读取SConstruct/SConscript脚本,根据配置生成编译规则
menuconfig配置工具基于Kconfig语法渲染出来的图形化配置界面
pkgs软件包管理脚本自动拉取、解压、更新RT-Thread软件包

你不需要分别安装这些东西,ENV工具包解压后已经把便携版Python、git、scons等内置好了。这解释了一个常见疑问:为什么命令要在一个专门的窗口里敲?因为env.bat启动脚本会临时把工具包里的python、git、scons路径加入当前会话的环境变量,只有在这个窗口里,scons、menuconfig、pkgs这些命令才指到正确的程序。

1.3 安装前的自查清单

安装ENV本身不难,但有几个前置条件建议提前确认,能省掉后面很多坑:

  • 操作系统:Windows 7以上,推荐64位Windows 10/11。官网也提供Linux下的env.sh脚本,本文以Windows为主。
  • 解压路径:必须是纯英文路径,不要放中文目录,也不要放带空格的目录(比如Program Files都建议避开)。这是入门阶段最常见的报错来源。
  • 网络:软件包拉取需要能访问代码托管平台。内网环境要提前准备离线包方案。
  • 编译器:ENV没有强制绑定编译器,但最终要把代码变成固件,你至少要有一种:arm-none-eabi-gcc工具链,或者MDK自带的ARM编译器,或者IAR。建议新手先装好MDK,再用scons --target=mdk5生成工程来编译,后续再考虑纯命令行编译。

自查完毕就可以下载ENV工具包了。下载位置在RT-Thread官网的“文档中心-工具”页面,或者代码仓库的release列表里,找到env-windows-v1.x.zip这类文件。下载后解压到自定目录,比如D:\tools\env。

2. 安装和第一次启动:我踩过的那些坑

2.1 解压路径的“洁癖”要求

解压这一步看起来最没技术含量,实际最容易给新手埋雷。我见过有人直接解压到C:\下载\ENV工具\目录,结果双击env.bat窗口一闪而过,怎么都启动不了。原因就是路径里有中文和空格,批处理脚本在设置环境变量时被截断了。

我的建议是:解压到类似D:\env、D:\tools\env、C:\env这种短路径。解压完成后,打开目录看一眼,里面应该有env.bat、packages、tools、git、python等文件和目录,说明解压完整。

2.2 env.bat的启动逻辑:为什么要双击它

env.bat不是让你配置一次系统环境变量就完事的工具,它每次使用前都要先跑一下。原因是它会把内部工具的路径追加到当前这个命令行窗口的PATH里,这个PATH只对当前窗口有效,关闭窗口就失效。这样设计有个好处:不在系统里污染环境变量,你需要用ENV时打开一个新窗口,不想用了直接关掉即可。

正确的启动方式有两种:

  • 直接在env目录里双击env.bat,会弹出一个特意配置过的命令行窗口。
  • 先打开cmd,然后执行call D:\env\env.bat(替换成你自己的路径),当前窗口被初始化成ENV环境。

这里有一个新手最容易忽略的点:如果你双击env.bat后窗口一闪而过,说明启动脚本执行报错了。最快定位方式是打开cmd,手动执行上面的call命令,这样报错信息会停在屏幕上,而不是一闪而过。

2.3 用三个命令确认安装成功

成功进入ENV窗口后,依次敲下面三个命令:

python --version scons --version git --version

正常情况下能看到对应的版本号。如果python报错或者scons显示“不是内部或外部命令”,说明当前窗口没有正确继承环境变量,回头检查你的启动步骤。

还可以敲pkgs --help看看软件包管理命令的帮助信息,里面会列出--update、--upgrade等常用子命令,有输出就代表ENV核心功能已经就绪。

3. 第一次完整配置:从源码到IDE工程

3.1 RT-Thread源码和ENV的分工

很多新手会混淆一件事:ENV和RT-Thread源码是什么关系?其实它们是分开的。ENV是工具,RT-Thread源码是工程项目。ENV不附带一套RT-Thread源码,你需要先自己拿一份源码。

获取源码推荐用代码仓库克隆:

git clone https://gitee.com/rt-thread/rt-thread.git

克隆完成后,RT-Thread源码目录下有一个bsp目录,里面按厂商和芯片型号分好了很多开发板工程。每个BSP目录都是一个独立工程,里面有SConstruct、SConscript、Kconfig这几个关键文件,ENV就是靠这些脚本和配置描述文件来理解这个工程的。

3.2 menuconfig的界面逻辑:Kconfig到rtconfig.h的链路

进入某个BSP目录后执行menuconfig,你会看到一个全屏的配置界面。第一次看会有点懵,但它的操作逻辑很统一:

  • 上下键移动光标
  • 回车进入子菜单
  • 按空格或Y选中某个配置项,按N取消
  • 按/搜索配置项
  • 按ESC或Q退出,退出时提示是否保存,选Y保存

这里要理解一条数据链路,理解了它你就能看懂ENV后半部分的所有行为:

menuconfig展示的选项来自Kconfig文件。BSP目录下的Kconfig会向上include整个RT-Thread内核、组件、软件包目录里的Kconfig,最终形成一棵配置树。你在menuconfig里勾选的结果,保存后写进.config文件;同时ENV会根据.config自动生成rtconfig.h。而这个rtconfig.h会以头文件形式参与每个源文件的编译,里面全是#define RT_USING_FINSH这样的宏。

这条链路解释了为什么很多教程让你“改完配置要重新编译才生效”:因为rtconfig.h被改了,而它是编译器判断代码分支的开关。

3.3 用scons一键生成MDK/IAR工程

menuconfig保存退出后,BSP目录里会多出.config和rtconfig.h。这时候你还在BSP目录下,执行:

scons --target=mdk5 -s

-s参数是静默模式,不让它把底层命令全滚屏打出来。如果一切正常,BSP目录下会生成一个project.uvprojx,直接用MDK打开编译下载就行。想生成IAR工程就换:

scons --target=iar -s

这个命令的原理是:scons读取SConstruct和SConscript脚本,结合rtconfig.h里定义的开关宏,动态决定生成工程时需要包含哪些源文件、配置哪些预定义宏。也就是说,你改完menuconfig配置后再生成一次工程,工程里的文件列表会自动跟着变化。

3.4 命令行直接编译的完整链路

不习惯用IDE对编译过程做太多控制的话,完全可以用命令行直接出固件。同样在BSP目录下:

scons -j8

-j8表示8线程并行编译,编译完成后会在BSP目录生成rtthread.elf、rtthread.bin等镜像文件。之后用你常用的烧录工具把bin下载到开发板。

如果编译过程中想看具体的编译命令细节,可以加--verbose:

scons -j8 --verbose

新手排错时建议打开,能清楚看到每一个源文件实际被编译时用的头文件搜索路径和宏定义,很多“头文件找不到”的问题一眼就能看出来。

4. 软件包管理才是ENV的杀手锏

4.1 软件包机制解决什么问题

RT-Thread的软件包体系和Linux的包管理器思路有点像,但更轻量。它把各种常见功能模块——传感器驱动、网络协议、文件系统、图形界面、AI框架等——拆成一个个独立仓库。你在menuconfig里勾选想要的功能,保存后执行pkgs --update,工具会自动把这些仓库里的代码拉取到本地packages目录,并纳入构建系统。

这个机制解决的最大痛点是依赖关系。一个网络软件包往往依赖日志组件、内存管理组件,手动安装很容易漏;但通过menuconfig勾选时,Kconfig会同时展示依赖项,配置系统会帮你做完整性约束。

4.2 pkgs --update到底干了什么

在menuconfig里勾完软件包并保存后,执行:

pkgs --update

这个过程一般会有这些动作:

  1. 读取.config文件,找出所有被勾选的软件包名称和版本号。
  2. 根据软件包索引(在ENV工具目录的packages下)去远程仓库clone对应代码。
  3. 把下载的软件包解压或克隆到packages/<包名>目录。
  4. 生成或更新软件包的SConscript脚本,让构建系统能发现它们。

如果拉取不成功,很可能是网络或索引问题。先确认git --version有输出,再看网络能否正常访问代码托管平台。国内网络环境建议优先使用配置的镜像仓库地址。

4.3 日常维护:升级、更新索引、清理缓存

用一段时间后,你会发现ENV本身和软件包索引都需要更新。常用的维护命令就这几个:

pkgs --upgrade

pkgs --upgrade用来升级ENV工具本身的脚本和软件包索引。它不会动你已经clone到BSP目录下的源码,只更新索引信息,所以可以放心定期执行。

pkgs --list

pkgs --list列出当前menuconfig配置里已经选中的软件包清单,配合.config文件能把你的工程配置看得很清楚。

pkgs --update

这个命令还有一个用法:如果BSP的packages目录里已有某些包,但你在menuconfig里把它们取消勾选了,执行pkgs --update时工具会提示删除不再需要的包。所以它既是安装命令,也是清理命令。

日常维护建议养成一个习惯:改完menuconfig,先pkgs --update,再scons -c清理旧产物,最后scons -j8重新编译。scons -c是清理命令,能避免旧的目标文件和新的配置冲突。

5. 一个完整实战:从零配置出能跑的最小工程

5.1 准备BSP目录

这一步以某个基于Cortex-M4内核的开发板为例。进入RT-Thread源码后,找到对应的BSP目录,例如bsp/stm32/stm32f407-atk-explorer这种格式。不同开发板目录名不同,但你只要找和自己板子对应的那个就行。

进入目录前可以先ls看一眼里面是否有SConstruct和Kconfig。这两个文件是ENV工作的前提:前者告诉scons怎么构建,后者告诉menuconfig显示哪些菜单。

cd D:\workspace\rt-thread\bsp\stm32\stm32f407-atk-explorer

5.2 menuconfig里到底要怎么选

进入目录后执行menuconfig,你会看到第一层菜单大致有:内核、组件、软件包、设备驱动等。以配置一个带FinSH控制台和虚拟传感器的最小工程为例,按这几个方向做选择:

  • Kernel配置:如果只是跑通功能,保持默认即可。想了解每个参数含义时按/输入关键字搜索,比如搜索stack可以看到线程栈相关的所有配置。
  • Components配置:找到Command Shell相关的菜单,确认FinSH命令行组件被选中。FinSH是RT-Thread的命令行交互shell,板上跑起来后你会看到msh>提示符,输入help可以看到支持的命令。
  • RT-Thread online packages配置:进入后能看到分类菜单,比如传感器类、网络类、文件系统类。光标移动到目标包上按空格选中。选中的包名字前面会带*号。

这里的操作顺序很重要:先把所有想勾的东西一次性勾完,最后统一退出保存。因为menuconfig每次进入重选都要重新生成配置,没必要来回进出。

5.3 保存、拉包、生成工程、编译烧录

保存退出menuconfig后,按顺序执行下面四条命令:

pkgs --update scons -c scons --target=mdk5 -s

第一步拉取刚才选中的软件包。第二步清理可能存在的旧编译产物。第三步生成MDK工程。之后直接打开目录下生成的project.uvprojx,在MDK里编译下载。

习惯纯命令行的话,把第三步换成scons -j8直接编译固件,然后自己用烧录工具下载。烧录成功后打开串口终端,如果你选了FinSH组件,串口上应该能看到RT-Thread的logo信息和msh>命令行提示符。开发板此刻相当于已经跑起了一个最小的RT-Thread系统。

5.4 改配置以后如何正确重建

这是入门阶段最常见的困惑:我换了一个传感器,或者加了一个软件包,为什么编译出来没变化?

我先说结论:只要动过menuconfig,就必须重新走一遍“保存-拉包-清理-编译”的完整链路。具体来说,改完配置后先退出保存,然后执行pkgs --update更新软件包,接着执行scons -c清掉旧产物,再重新生成工程或编译。三步都做全了,新的配置才会被完整地带进构建系统。

缺少pkgs --update会导致新勾选的软件包没有下载到本地;缺少scons -c会导致旧的编译中间产物和新配置混在一起,出现一些非常难查的偶发报错。

6. 入门阶段最常见的6个问题与排查思路

6.1 问题速查表

现象原因处理方式
env.bat双击后窗口闪退路径含中文或空格、Python组件损坏用cmd手动call env.bat看报错;解压到纯英文短路径
提示scons不是内部或外部命令没有在env.bat启动的窗口里执行命令必须通过env.bat启动会话后再敲scons
提示No SConstruct file found在错误目录里执行了scons先cd到某个BSP目录,再执行scons
编译报cannot open source file "rtthread.h"rtconfig.h未生成或头文件路径异常先执行menuconfig并保存;再scons -c清理后重新编译
pkgs --update拉包失败或卡住网络无法访问代码托管平台、git未安装检查git版本;配置镜像源;确认网络后重试
多线程编译偶发报错依赖顺序问题或主机内存不足改用scons -j1或-j4,先确认能通过再开多线程

6.2 排查实例:scons找不到编译器

很多人在where arm-none-eabi-gcc这个命令上吃过亏。scons编译时报错提示找不到arm-none-eabi-gcc,去官网下载了编译器,装完还是报同样错误。

原因是scons在PATH里找可执行文件,而ENV窗口的PATH是由env.bat初始化的。你在Windows“系统环境变量”里改的PATH,在当前ENV窗口里不会自动生效。解决办法有两个:

  • 重新启动一个ENV窗口再试。
  • 在BSP目录下直接在命令行设置环境变量:
set RTT_EXEC_PATH=D:\gcc-arm-none-eabi\bin

关键是要把RTT_EXEC_PATH指向真正存在arm-none-eabi-gcc.exe的bin目录。设置后再scons -j8,就不会再报这个错。

如果你不想折腾gcc工具链,还有个最省事方案:直接用scons --target=mdk5 -s生成MDK工程,改到MDK里编译。这样scons不直接调用gcc,编译器由MDK负责,绕开了工具链路径问题。

6.3 排查实例:pkgs拉包拉不下来

有一次我帮人排查pkgs --update卡死的问题,现象是命令执行后一直停在某个软件包下载,最后超时。第一反应是网络问题,但检查后发现git在系统里根本不可用,而ENV自带的git和系统git又有版本冲突,导致pkgs拉包时走了错误路径。

排查路径可以按这个顺序来:

  1. 先执行git --version,确认git能跑。
  2. 执行pkgs --env,查看当前软件包配置,确认软件包索引仓库地址。
  3. 手动尝试访问代码托管平台的对应仓库,确认网络可达。
  4. 如果确认是网络原因,把软件包索引源切换到国内镜像地址。
  5. 重新执行pkgs --update,再加个耐心,首次拉包要下载索引,时间会比较长。

还有个小技巧:不要把大量软件包一次性全勾上。新手调试阶段一次勾一个,拉包、编译跑通后再加下一个,这样出了问题能迅速定位到是哪个包引起的。

6.4 养成一个排错好习惯:先从“清空重建”开始

我还想提一个在很多教程里不会专门讲的通用排错方法:当你觉得ENV相关的东西怎么都编译不过,配置看起来也没问题,但就是报一些莫名其妙的错时,不要急着改配置,先按这个顺序走一遍:

pkgs --update scons -c scons -j1

-j1的意义是强制单线程编译。多线程并行编译时,输出信息是交错的,一旦出问题很难看出是谁先谁后;单线程编译会把每个源文件的编译过程依次打出来,哪一步断掉一目了然。

这三步跑完,90%的“改了配置后出现怪问题”都能解决。

7. 最后再分享一点我的使用习惯

如果你耐心看到这里,说明你真的准备用ENV了。基于我自己从手动工程切到ENV的经验,最后说三个小习惯,按重要程度排序:

第一,每次都从同一个入口开始工作。我是固定用env.bat启动窗口,所有RT-Thread相关的操作全部在一个会话里完成。不要开三四个cmd窗口来回切换,环境变量串了很容易出问题。

第二,配置改动和拉包是成对动作。menuconfig里选了新包,保存后立刻pkgs --update,不要拖到第二天。因为packages索引每次更新后,旧索引拉下来的包可能和你记忆中的版本对不上。

第三,把工程根目录的rtconfig.h当成“编译开关总表”来看待。你想快速了解这个工程到底开了哪些功能,直接打开rtconfig.h扫一遍#define,信息量比在IDE的魔术棒设置里翻半天还直观。这也是从“IDE使用者”转变为“配置驱动开发者”的第一步。

ENV的入门其实就这么简单:装好、跑通menuconfig、用pkgs拉包、用scons编译或生成工程。剩下就是在实际项目中反复用、反复踩坑、反复理解那套“Kconfig到rtconfig.h再到构建脚本”的逻辑。踩过的坑越多,你就越能体会这个工具到底帮你省了多少事。

相关新闻

AI资讯过载时代的技术主线提炼:从信息筛选到落地行动

AI资讯过载时代的技术主线提炼:从信息筛选到落地行动

每天早上一睁眼&#xff0c;信息流里塞满的全是模型发布、框架更新、应用落地案例&#xff0c;3月28日这天也不例外。我做技术选型和落地评估很多年&#xff0c;看全球AI技术资讯的习惯早就不是“刷标题”了&#xff0c;而是带着几个问题在翻&#xff1a;这条消息解决的是什么场…

2026/10/20 8:03:22 阅读更多 →
Selenium多页面切换实战:窗口句柄机制与踩坑排查指南

Selenium多页面切换实战:窗口句柄机制与踩坑排查指南

刚开始接触Selenium自动化测试的人&#xff0c;十有八九都会在“多页面切换”这件事上栽跟头。我见过太多人写脚本时点开一个新标签页&#xff0c;然后继续用原来的driver去查找元素&#xff0c;结果报了一堆NoSuchElementException&#xff0c;一脸懵地看着浏览器发呆。说穿了…

2026/10/20 8:03:22 阅读更多 →
layui 2.5.6 + ThinkPHP 6.0.2 权限管理后台实战:三层权限模型与避坑指南

layui 2.5.6 + ThinkPHP 6.0.2 权限管理后台实战:三层权限模型与避坑指南

简介&#xff1a;这是一套基于 layui2.5.6 前端组件库与 ThinkPHP6.0.2 后端框架搭建的权限管理后台源码&#xff0c;面向需要快速构建企业级管理系统的 PHP 开发者&#xff0c;也适合初学者理解前后端协同开发流程。资源包共 1098 个文件&#xff0c;约 6.1MB&#xff0c;以 4…

2026/10/20 8:03:22 阅读更多 →

最新新闻

Agentic RAG 实战指南:从直线管道到多步决策闭环

Agentic RAG 实战指南:从直线管道到多步决策闭环

1. 检索管道的天花板&#xff1a;一次查询解决不了连锁问题做了一段时间 RAG 应用的人&#xff0c;多半都会遇到同一个尴尬时刻&#xff1a;知识库文档放得挺全&#xff0c;向量检索的召回率调得也不算差&#xff0c;但面对稍微复杂一点的问题&#xff0c;系统就开始"答非…

2026/10/20 8:54:27 阅读更多 →
C语言for循环累加求和经典错误剖析:sum=n为何总输出n?

C语言for循环累加求和经典错误剖析:sum=n为何总输出n?

前两天一个刚学 C 语言的朋友发来一段代码&#xff0c;问了一个几乎每个初学者都会问的问题&#xff1a;为什么我算 1 加到 100&#xff0c;sum 输出怎么都是 100&#xff1f;我一看代码就明白了——这是 C 语言累加求和里最典型的经典错误&#xff1a;把循环变量 i 和固定值 n…

2026/10/20 8:54:27 阅读更多 →
Spring-AI MCP源码浅析:从ToolCallback到JSON-RPC的完整链路

Spring-AI MCP源码浅析:从ToolCallback到JSON-RPC的完整链路

我最近在把内部的工单查询接口接进大模型对话流程时&#xff0c;第一次真正把 Spring-AI 的 MCP 源码摊开从头读了一遍。MCP 是 Model Context Protocol 的缩写&#xff0c;它解决的问题很直接&#xff1a;让大模型不只有“生成文本”的能力&#xff0c;还能安全地去调用外部工…

2026/10/20 8:54:27 阅读更多 →
React Native登录页开发:从表单状态到Token闭环的完整指南

React Native登录页开发:从表单状态到Token闭环的完整指南

前两周有个朋友问我&#xff1a;一个登录页到底要开发多久&#xff1f;我说按“两个输入框加一个按钮”算&#xff0c;半天能交&#xff1b;但如果把键盘遮挡、错误提示、重复点击、Token过期、自动填充、无障碍、多端安全区都算进去&#xff0c;一周可能都不宽裕。他愣了一下&…

2026/10/20 8:54:27 阅读更多 →
CTF PWN实战:格式化字符串与栈溢出组合利用Mary_Morton

CTF PWN实战:格式化字符串与栈溢出组合利用Mary_Morton

1. 从一道经典PWN题说起&#xff1a;为什么Mary_Morton值得反复琢磨如果你刚开始接触CTF的PWN方向&#xff0c;或者已经刷了一些基础题但遇到格式化字符串和栈溢出结合的题目就卡壳&#xff0c;那Mary_Morton这道题大概率会成为你绕不过去的一个坎。这道题同时包含格式化字符串…

2026/10/20 8:54:27 阅读更多 →
告别AI工具焦虑:开发者极简工作流如何让效率提升70%

告别AI工具焦虑:开发者极简工作流如何让效率提升70%

大概从某段时间开始&#xff0c;我的信息流里全是各种AI工具的安利帖。今天有人说“用了某助手效率翻倍”&#xff0c;明天有人晒“零代码搭了一个自动化流程”&#xff0c;后天又有人整理出一份几十个工具的清单。作为一个常年写代码、带项目、改文档的人&#xff0c;我一度也…

2026/10/20 8:53:26 阅读更多 →

日新闻

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/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

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

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

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

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

如果你的信息流最近也天天刷到“机器人大脑”这个词&#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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →