ESP-VISION代码怎么组织、分发、更新?软件包管理完全指南
文章目录
- ESP-VISION代码怎么组织、分发、更新?软件包管理完全指南
- 一、写在前面:你写的代码放在哪
- 二、三种部署方式对比
- 三、文件系统结构
- 3.1 导入优先级
- 3.2 SD卡路径
- 四、软件包组织
- 4.1 模块与软件包结构
- 4.2 用mpremote管理文件
- 4.3 用mpremote mip安装软件包
- 五、冻结到固件
- 5.1 开发板manifest
- 5.2 冻结自定义包
- 5.3 重新构建
- 六、部署策略选择
- 推荐组合
- 七、package.json vs manifest.py
- 八、一个产品部署模板
- 参考链接
- 总结与下篇预告
一、写在前面:你写的代码放在哪
在桌面Python上,你写代码、pip install依赖、跑起来,从不关心代码放在哪。但ESP-VISION不一样——你的代码可能放在Flash里、SD卡里、甚至直接编译进固件里。放哪决定了启动速度、更新方式和内存占用。
今天这篇文章,把ESP-VISION的软件包管理讲透。
二、三种部署方式对比
| 属性 | /lib 下的 .py | /lib 下的 .mpy | 冻结到固件 |
|---|---|---|---|
| 存储位置 | 可写文件系统 | 可写文件系统 | 固件Flash镜像 |
| 导入行为 | 导入时编译 | 无需编译,直接加载 | 直接执行冻结字节码 |
| 运行时RAM | 字节码+对象占RAM | 字节码+对象占RAM | 常量可保留在Flash |
| 更新方式 | 替换文件或mpremote | 替换兼容的.mpy文件 | 重新构建烧录固件 |
| 主要用途 | 开发+频繁更新 | 导入开销低+可替换 | 稳定产品依赖+启动模块 |
三、文件系统结构
ESP-VISION将内部Flash文件系统挂载到/,并将/lib加入sys.path:
/ # 内部Flash文件系统根目录 ├── boot.py # 启动脚本(先于main.py执行) ├── main.py # 应用入口 ├── README.txt # 默认说明文件 ├── lib/ # 第三方库(sys.path已包含) │ ├── my_vision/ # 你的视觉库 │ │ ├── __init__.py │ │ ├── pipeline.py │ │ └── transport.py │ └── asyncio/ # 冻结的asyncio ├── sdcard/ # SD卡(需手动挂载) │ ├── models/ # AI模型文件 │ └── data/ # 数据文件 └── flash/ # Flash存储3.1 导入优先级
当前目录 → 冻结模块(.frozen) → /lib重要:同名文件系统软件包不能覆盖冻结软件包。如果你在/lib放了一个和冻结包同名的包,导入的仍然是冻结版本。
3.2 SD卡路径
SD卡挂载到/sdcard,但不会自动加入sys.path:
importsys sys.path.append("/sdcard/lib")frommy_vision.pipelineimportVisionPipeline四、软件包组织
4.1 模块与软件包结构
# 标准Python包结构my_vision/__init__.py pipeline.py transport.py# 导入frommy_vision.pipelineimportVisionPipeline pipeline=VisionPipeline()4.2 用mpremote管理文件
# 列出开发板上的文件mpremote connect /dev/ttyACM0ls/# 上传文件mpremote connect /dev/ttyACM0cpmy_script.py :/main.py# 上传整个目录mpremote connect /dev/ttyACM0cp-rmy_vision/ :/lib/my_vision/# 下载文件mpremote connect /dev/ttyACM0cp:/main.py ./backup_main.py# 删除文件mpremote connect /dev/ttyACM0rm/main.py4.3 用mpremote mip安装软件包
# 安装MicroPython软件包到/libmpremote connect /dev/ttyACM0 mipinstall--target=/lib<PACKAGE># 安装特定版本mpremote connect /dev/ttyACM0 mipinstall--target=/lib<PACKAGE>@<VERSION># 从package.json安装mpremote connect /dev/ttyACM0 mipinstall--target=/lib ./package.json⚠️注意:ESP-VISION默认固件不支持设备端mip(
import mip会报ImportError)。必须通过主机端mpremote安装。
五、冻结到固件
对于稳定的产品依赖和启动模块,应该冻结到固件中:
5.1 开发板manifest
ESP-VISION将开发板manifest保存在boards/<BOARD>/manifest.py。
5.2 冻结自定义包
# 在boards/<BOARD>/manifest.py中添加package("my_vision",base_path="$(ESP_VISION_ROOT)/boards/<BOARD>/packages",)文件夹结构:
boards/<BOARD>/packages/my_vision/ __init__.py pipeline.py transport.py5.3 重新构建
# 修改manifest后需要重新配置和构建idf.py--board<BOARD>reconfigure idf.py--board<BOARD>build idf.py--board<BOARD>flash六、部署策略选择
推荐组合
| 代码类型 | 部署方式 | 理由 |
|---|---|---|
| 启动模块(boot.py/main.py) | 冻结到固件 | 稳定、启动快 |
| 框架扩展(视觉库) | 冻结到固件 | 稳定依赖 |
| 产品脚本 | 冻结到固件或/lib | 取决于更新频率 |
| 配置文件 | /lib | 需要现场修改 |
| AI模型 | SD卡 / Flash | 体积大,独立更新 |
| 图像/视频资源 | SD卡 | 体积大 |
七、package.json vs manifest.py
很多人搞混这两个文件:
| 文件 | 用途 | 阶段 |
|---|---|---|
| package.json | mip安装时描述文件和依赖 | 运行时/设备预配置 |
| manifest.py | 固件构建时嵌入模块 | 构建时 |
两者不能相互替代。package.json用于mip,manifest.py用于固件冻结。
八、一个产品部署模板
# boards/<BOARD>/manifest.py# 冻结产品核心模块# 框架依赖freeze("$(MPY_DIR)/tools",opt=3)# 自定义视觉库package("my_vision",base_path="$(ESP_VISION_ROOT)/boards/<BOARD>/packages")# 产品启动脚本freeze("$(ESP_VISION_ROOT)/boards/<BOARD>/packages/main.py")# 部署流程# 1. 构建固件(包含冻结模块)idf.py--boardESP32_P4X_EYE build# 2. 烧录固件idf.py--boardESP32_P4X_EYE-p/dev/ttyACM0 flash# 3. 上传配置文件mpremote connect /dev/ttyACM0cpconfig.json :/config.json# 4. 上传AI模型到SD卡# (手动拷贝到SD卡)参考链接
- ESP-VISION 软件包与部署
- MicroPython 软件包管理
- MicroPython manifest文档
总结与下篇预告
软件包管理的核心决策:频繁改的放/lib,稳定依赖冻结到固件,大文件放SD卡。别混淆package.json和manifest.py——前者给mip用,后者给固件构建用。
下篇是本系列的最后一篇——启动流程与架构全景。从按下复位键到你的main.py开始执行,中间发生了什么?ESP-VISION的分层架构又是怎么设计的?一篇文章讲清楚。
作者:码农阿虎
关键词:软件包管理、mpremote、mip、固件冻结、manifest