Delete .gitignore
对应赛题: 面向智能机器人的 AIOS(高校赛题,原文见大赛官网;本仓库不转载赛题文件) 一句话: 在一台百元级开源机器人(LicheeRV Nano / AKA-00,SG2002 / CV181x)上,用自研的 StarryOS 操作系统基座跑通「摄像头 → JPEG 硬解 → 量化 ACT 推理 → 差速底盘」的端侧闭环, 让机器人自己看球、跟着把球保持在画面水平中心;从数据采集、仿真生成、训练、量化到 NPU 部署,整条链路都落在几百元的硬件上、都在端侧完成。
决赛提交仓库,目录按大赛《决赛作品提交说明》组织:源码在 src/,文档在 docs/,测试与验证材料在 tests/,可复现交付物在 demo/, 答辩 PPT 在 presentation/(演示视频见 §15 的网盘包),作品原创承诺书在 根目录。
src/
docs/
tests/
demo/
presentation/
按赛题《面向智能机器人的 AIOS》(基于 RK3588 / SG2002 开发板):
把上面的赛题翻译成可执行的技术目标,我们理解它是四件事:
tgoskits
src/os
src/scripts/axbuild
src/platforms
pseudofs
/dev/cvi-tpu0
/dev/cvi-usb-camera0
/dev/cvi_vc_dec0
/dev/ttyS1
/dev/ttyS2
/dev/ion
/dev/pinmux
src/os/StarryOS/kernel/src/pseudofs/dev
src/drivers/**
src/thirdparty/sg200x-bsp
cvimodel
src/tools/tpu
src/apps/starry/aka00-act-tpu
tests/logs/board-act40-baseline.md
src/apps/starry/master-compe-tennis
src/tools/esp32_base_control
src/apps/starry/aka00-*
src/tools/sim
src/tools/
src/os/StarryOS/configs/board/
一句话总结契合度: 我们把赛题的”内核迁移 + 外设驱动 + NPU 推理链路”这三件地基活做扎实, 并在”端侧 AI 应用”这一层给出了两条能上板跑通的完整路线——初赛的 YOLO + 状态机 + 抓取, 与决赛的 量化 ACT + 方向伺服闭环;两条路线的能力边界(抓取 vs 只跟方向)在本文里都写清楚。
把”模仿学习(ACT,Action Chunking Transformer)策略”真正搬进一块单核 RISC-V + 小 NPU 的嵌入式板子,并跑成一台能自己看球转的机器人。整条链路都在端侧:板子自己抓 UVC 相机、 自己硬解 JPEG、自己量化推理、自己驱动底盘;网络只用于把画面 / 结果看出去(可选)。
工作分三层,每层都能独立构建与验证:
src/drivers
┌──────────────────────────────────────────────────────────────────────────────┐ │ 数据与模型流水线(开发期,x86 主机) │ │ Three.js 仿真 → 示范数据(frames/*.jpg + actions.jsonl) │ │ → 训练 ACT(PyTorch) → 导出 ONNX(IR 9) → TPU-MLIR → cvimodel(BF16/INT8) │ └──────────────────────────────────────────────────────────────────────────────┘ │ cvimodel + 静态 ELF + rootfs ▼ ┌──────────────────────────────────────────────────────────────────────────────┐ │ 端侧策略闭环(SG2002 运行态,单核 C906) │ │ UVC 640x480 MJPEG ─► JPU 硬解 ─► YUV→RGB + 缩放 160x120 + 归一化 │ │ ─► NPU(INT8 cvimodel) ─► 动作块(20,2) 取第 0 拍 ─► 匀速轮速 ─► 底盘 │ └──────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────────────────┐ │ 操作系统与驱动基座(StarryOS,Rust 组件化内核) │ │ WiFi(aic8800) · USB 主机(DWC2) · UVC 相机 · UART1/2 · JPU/VDEC · NPU · ION │ │ 板级构建 / 启动 / 出卡(upstream axbuild + 本项目板级配置) │ └──────────────────────────────────────────────────────────────────────────────┘
UVC 640x480 MJPEG ← 一个循环里只抓一次 ├─ 原始 JPEG 原样透传给 /stream 客户端(纯透传,不解码/不重编码)──► WiFi 浏览器 └─ JPU 硬解 → YUV→RGB+缩放+归一化 160x120 → ACT(int8) → 左右轮速 → 底盘(ESP32)
同一份 JPEG 既推流又喂控制,所以浏览器里看到的就是机器人正在看的那一帧。
时间从初赛算起(本仓库首条提交 2026-07-24)。以下里程碑与 src/ 里的源码、 tests/ 里的日志一一对应,可逐条复核。
在 SG2002 上先做一条传统视觉 + 规则的完整闭环:
产出:src/apps/starry/master-compe-tennis——能检测网球、跟踪并把球抓起来的机器人。
把 OS 基座迁到上游 tgoskits 基线,并集中啃板级驱动:
ax-net
axbuild
sg200x-bsp
为把量化 ACT 搬上板做”隔离变量”的实验台(src/apps/starry/aka00-act-tpu):
aka00-act-robot
aka00-act-cam
aka00-act-web
master-compe-tennis
web-ctl
(画面, 动作)
esp32_base_control
mem-probe
aic8800_fw
tpu
ai-chat
sim
这一节只写有意义的探索:哪些路走通了、哪些被证伪、结论是什么。所有数字都能在 tests/ 或 src/ 里复核。
AA 55
clock-frequency
src/os/StarryOS/configs/board/licheerv-nano-sg2002.dtb
clock-frequency = 25,804,800
DLL=14, DLF=0
MJPEG_PIC_STATUS
INT_JPU_BIT_BUF_EMPTY
Poisoned → EIO
DONE → ERROR → BIT_BUF_EMPTY
GBU_TT_CNT
IssueStop
CompleteStop
EINVAL
ETIMEDOUT
cvi-jpu: recovered JPU after a failed decode
SEND_STREAM
EOPNOTSUPP
cvi_vdec.rs
PIXEL_FORMAT_YUV_PLANAR_420
validate_layout
PIXEL_FORMAT_*
frame_info
pixel_format
StorageFull
0x21 = 4:2:2
把 PyTorch 里的 ACT 编成 cvimodel 并部署到板端,踩到三个必须处理的点:
MultiheadAttention
Split
operand ...in_proj_weight not found
src/tools/sim/export_onnx.py
--asymmetric
run_calibration
--bc
l -= 0.0111; r -= 0.0390
另外:**cvimodel 的 md5 每次重新构建都不一样(codegen 会把构建时间戳和 tpu-mlir 版本号写进文件)。所以校验认体积 + 逐帧误差**,别拿 md5 当身份。
episode_NNN/{frames/*.jpg, actions.jsonl, meta.json}
preserveDrawingBuffer
toDataURL
在另一项比赛(全国大学生计算机系统能力大赛 OS 功能挑战赛道)里,我们做过一版基于 SD 卡预录制帧 + QEMU 基线的 ACT 推理优化:QEMU 上横评 ncnn / ONNX Runtime / tract, 把 ORT + INT8 压进 256 MB 内存;板上用 ADMA2 DMA + 双缓冲把单帧从 550 ms 压到约 126 ms。
这份工作只作为”外部参考 / 对照”出现,不属于本次作品的开发历程(它的输入是预先录好的 数据集,不接摄像头、不做实时闭环)。它的数字仅在 §12.3 与我们的端到端链路做横向参考。
src/apps/starry/aka00-act-robot
src/apps/starry/aka00-act-cam
src/apps/starry/aka00-act-web
src/tools/web-ctl
src/tools/{mem-probe,ai-chat,qperf,tennis,tpu-docs,aic8800_fw}
构建镜像(宿主机):Docker(docker context 用 default),容器用 ghcr.io/rcore-os/tgoskits-container:latest(内含 RISC-V 交叉工具链);宿主需要 mkimage dumpimage dtc sfdisk mformat mcopy mmd。
docker context
default
ghcr.io/rcore-os/tgoskits-container:latest
mkimage dumpimage dtc sfdisk mformat mcopy mmd
交叉编译板端 app:Xuantie-900 GCC + 预编译 SG200x SDK,在 src/apps/starry/aka00-tennis-yolo/ 下按它的 scripts/setup.sh 安装。
src/apps/starry/aka00-tennis-yolo/
scripts/setup.sh
编译模型:只用官方 sophgo/tpuc_dev 镜像,tpu_mlir 装在挂载卷的 venv 里。
sophgo/tpuc_dev
tpu_mlir
仿真与训练:Node(headless Chromium / Playwright)跑仿真,Python + PyTorch 训练, 详见 src/tools/sim/README.md。
src/tools/sim/README.md
组装 SD 卡镜像:内核由上游 axbuild + 本项目板级配置(src/os/StarryOS/configs/board/、 src/apps/starry/*/board-aka-00-sg2002.toml)出,再与基线 rootfs、厂商 fip.bin 一起 打成 SD 卡镜像;rootfs 与 fip.bin 随 SG200x SDK 获取。评审可直接烧写 demo/ 提供的 成品镜像,跳过这一步。
src/apps/starry/*/board-aka-00-sg2002.toml
fip.bin
大文件(不进仓库,走网盘):交付镜像、INT8 模型、数据集;清单见 §15。
# 1) 交叉编译板端 app(仓库内直接可跑,需要 Xuantie-900 GCC + 预置 SG200x SDK) cd src/apps/starry/aka00-act-web && make # 2) ONNX → cvimodel(只用官方 sophgo/tpuc_dev 镜像) ./src/tools/tpu/build_cvimodel.sh # 3) 组装 SD 卡镜像(内核 + rootfs + /actexp /robot /cam /web):内核来自上游 axbuild, # 再与基线 rootfs、厂商 fip.bin 打包;需要厂商 fip.bin 与基线 rootfs。 # 评审可直接烧写 demo/ 提供的成品镜像,跳过这一步。
# 烧卡(镜像下载见 §15) sudo dd if=sg2002_act.img of=/dev/sdX bs=4M status=progress conv=fsync && sync # 板上:镜像开机自启推理监视(轮子先按住) cd /web && ./run.sh # 串口会打 http://<板子IP>/ # 浏览器打开 → 看到左右轮速与 20 拍动作块 → 按「开始」才驱动 # 想跑带画面的版本 cd /cam && ./run.sh # http://<板子IP>/ 直接看 MJPEG 画面
# 板端 app 的本机桩测试(不需要板子) cd src/apps/starry/aka00-act-web && ./test/http_test.sh cd src/apps/starry/aka00-act-cam && ./test/http_test.sh # 板上对照实验:/actexp/run_1..run_6,日志喂 scripts/summarize.py 出报告 # (原始日志已整理到 tests/logs/,见 §12) # 模型逐帧误差:src/tools/tpu/eval_cvimodel.py # 闭环评测(仿真里与专家同种子对比):cd src/tools/sim && node eval_policy.mjs
详细索引见 tests/README.md。
tests/README.md
口径说明: 本节板端数字以 tests/logs/board-act40-baseline.md(原始串口日志 tests/logs/board-act40-baseline.raw.txt)为准。注意 SD 卡存在周期性停顿(实测每约 10 帧出现一次 ~270–290 ms 的读盘尖峰),因此 read 的均值会被尖峰拉高;同时”单帧”(主线程一次迭代)与”整段 吞吐”是两笔不同的账。我们两个都列,避免用一个数字掩盖另一个。
tests/logs/board-act40-baseline.raw.txt
read
模型:ACT40,约 40.9 M 参数,输入 [1,3,120,160](160×120 观测),输出 [1,20,2](20 拍动作块)。
[1,3,120,160]
[1,20,2]
交付版用 INT8 + 零偏修正。逐帧比对工具:src/tools/tpu/eval_cvimodel.py。
src/tools/tpu/eval_cvimodel.py
六档的设计是每档只比上一档多一个变量(1→2 量化、2→3 双缓冲、4→5 解码器、5→6 输入源):
读表要点:
档 1(bf16 + raw 串行)的脚本在仓库里(run_1_bf16_serial.sh),但本次日志未包含它的 板端分档数字;BF16 的精度见 §12.1。模型加载 6 次实测 10.54–10.63 s(38 MiB cvimodel, 含 ION 分配)。
run_1_bf16_serial.sh
赛题要求”与 Linux 基线对比”,本版未做同板对比(驱动能力尚未对齐,见 §1.3)。
这些数字来自多轮数据 / 场景设计迭代(不同结构的数据集),不是同一次受控对比; 早期的数据 / 场景设计下居中率低得多,说明”数据与场景设计”才是策略能不能学的关键。 真机验证为定性:烧录交付镜像、网页按「开始」后,机器人能稳定识别并跟踪球。
作品原创承诺书.pdf
大赛要求的决赛成片 presentation/决赛演示视频.mp4 在本目录保留一份;其余 演示视频与 PPT 整页设计原图作为 presentation/ 的网盘包上传,见 presentation/README.md:
presentation/决赛演示视频.mp4
presentation/README.md
/web
决赛演示视频.mp4
act推理小车.mp4
初赛yolo夹取.mp4
讲解视频.mp4
备注: act小车_控制台对照.mov 与 决赛演示视频.mp4 是同一段内容(车 + 控制台 对照),保留其一即可。
act小车_控制台对照.mov
大文件不进 Git(大赛禁用 Git LFS),按目录各打一个包:
demo-deliverables.zip
sg2002_act.img
act40_int8/bf16.cvimodel
datasets/
88rv
presentation-material.zip
d8pw
两个包解压后各自是一个同名目录(demo-deliverables/、presentation-material/), 放进对应目录即可对上文中所有相对路径。说明书与 PPT 用的插图不需要额外的网盘包: 它们已直接嵌在四份 PDF 与 答辩PPT.pptx 里。
demo-deliverables/
presentation-material/
答辩PPT.pptx
各包的清单、md5 与用法分别见 demo/README.md 与 presentation/README.md。
demo/README.md
第三方代码 / 模型 / 数据与许可证、以及生成式 AI / 代码补全 / 检索等工具的使用情况, 逐项列于 docs/人工智能及第三方工具使用说明.pdf。摘要:
docs/人工智能及第三方工具使用说明.pdf
stb_image
本作品的操作系统基座是上游 tgoskits(StarryOS)。板级适配中遇到的问题基本都落在驱动与 板级配置里,我们就在那一层修,并把可复用的部分回馈上游。下面三组工作都在 src/ 里可以 直接对照。
JTAG_CPU_TMS
JTAG_CPU_TCK
src/os/StarryOS/configs/board/aka-00-sg2002.dtb
licheerv-nano-sg2002.dtb
src/drivers/ax-driver/src/serial/ns16550.rs
0x64
0x68
O_NONBLOCK + VMIN=0 + VTIME=0
main
00..FF
INIT → ACK → CONFIG → ACK → SET_SPEEDS
板载网卡是 SDIO full-MAC 架构:扫描、认证、关联与四步握手的中继都由固件完成,主机 侧必须自己组装 sm_connect_req(含 RSN IE)、从 M1 推导 PMK/PTK、校验 M2/M3 的 MIC、计算 M4 的 MIC,再自己安装 PTK/GTK——**任何一环缺失,外观上都只是”连不上”**。我们在 src/drivers/net/aic8800/ 上补齐了这些环节:
sm_connect_req
src/drivers/net/aic8800/
00:ff:ff:ff:ff:ff
MFPC
MFPR
/chosen/rng-seed
验证:WPA/WPA2 混合模式 AP 与纯 CCMP 手机热点都跑通——完成关联与四步握手、安装密钥、 拿到 DHCP 租约、ARP 连通,板上自带的网页服务(web-ctl / /web)可访问。
BIT_BUF_EMPTY
src/drivers/vpu/sg200x-jpu/
src/os/StarryOS/kernel/src/pseudofs/dev/cvi_vdec.rs
src/os/StarryOS/kernel/src/pseudofs/dev/cvi_usb_camera.rs
src/os/StarryOS/kernel/src/pseudofs/dev/
.its
src/scripts/axbuild/
以上改动均在 src/ 内,可逐条对照;其中 UART1 时钟修复已合并进上游 main(PR #1714)。
照着做就能重现。最快的是 A(直接用成品镜像,不编译任何东西,也是评审口径); B 从源码重建板端程序与模型;C 复核测试与实验数据。每一步都给出期望结果, 对不上时先看 §18.5。
root@starry:/root #
dd
src/apps/starry/aka00-tennis-yolo/scripts/setup.sh
# 1) 从 §15.3 的 demo-deliverables.zip 取 sg2002_act.img,先核对体积与 md5 ls -l sg2002_act.img # 2 576 351 232 B md5sum sg2002_act.img # d139bc11011b2e0c1aa0541faca79ddc # 2) 烧写并回读校验 sudo dd if=sg2002_act.img of=/dev/sdX bs=4M status=progress conv=fsync && sync sudo head -c 2576351232 /dev/sdX | md5sum # 应等于上面那个 md5
http://<板子IP>/
--start-paused
cd /cam && ./run.sh
cd /actexp && ./run_1_bf16_serial.sh
./run_6_int8_camera_jpu.sh
./scripts/summarize.py
以下命令都从仓库根目录开始:
# 1) 编译板端 app(Xuantie-900 GCC + SG200x SDK 由 setup.sh 装好) cd src/apps/starry/aka00-tennis-yolo && ./scripts/setup.sh # 只需一次 cd ../aka00-act-web && make # → act_web,静态 RISC-V ELF ≈3.2 MB cd ../aka00-act-cam && make # → act_cam 同理;/robot、/tpu 的 app 各自 make cd "$(git rev-parse --show-toplevel)" # 回到仓库根目录 # 2) 编模型(只用官方 sophgo/tpuc_dev 镜像,ONNX 取自数据集包的 datasets/sim-5/) ./src/tools/tpu/build_cvimodel.sh # BF16(默认编完在 20 帧上比对 ONNX ↔ cvimodel) ./src/tools/tpu/build_cvimodel.sh -q INT8 # INT8(同上,--eval-num 0 可关掉比对) # 3) 组装 SD 卡镜像:内核来自上游 axbuild + 本项目板级配置,再与基线 rootfs、 # 厂商 fip.bin 打包(详见 §8 / §9)。评审可直接用 A 的成品镜像跳过这一步。
以下命令同样从仓库根目录开始。
本机桩测试(不需要板子,用桩相机 / 桩 JPU / 桩底盘 / 桩 CVRuntime 顶替)
cd src/apps/starry/aka00-act-web && ./test/http_test.sh # 期望末行 ALL PASSED cd ../aka00-act-cam && ./test/http_test.sh # 期望末行 ALL PASSED
覆盖:页面为纯数字(无 <img> / 无 /stream)、/status 的左右轮速与 20 拍动作块、 /go 与 /stop、--start-paused 不驱动、/speed?v=N 实时改速、第二个流客户端返回 503、 首帧与源 JPEG 逐字节一致。前置条件是 §18.0 里那份 TPU SDK(setup.sh 装好即可)。
<img>
/stream
/status
/go
/stop
/speed?v=N
setup.sh
模型逐帧误差(宿主机,需要 §18.1 的 ONNX 与编出来的 cvimodel)
build_cvimodel.sh 编完就会自动比对一次(报绝对误差、余弦与转弯帧方向一致率)。 要单独重跑,在 TPU-MLIR 容器里执行(cvimodel 需要 model_runner + cmodel 模拟器):
build_cvimodel.sh
model_runner
python3 src/tools/tpu/eval_cvimodel.py \ --onnx src/tools/tpu/build/act40.onnx \ --cvimodel src/tools/tpu/build/act40_int8.cvimodel \ --dataset <解压后的数据集>/datasets/sim-5 --num 20
仿真闭环评测(宿主机):策略通过 HTTP 暴露给 Node 侧的评测脚本,跑同一批种子与专家对比。
cd src/tools/sim npm install # playwright + three(只需一次) python3 -m venv .venv && .venv/bin/pip install torch numpy pillow # 只需一次 .venv/bin/python policy_server.py \ --model <解压后的数据集>/datasets/sim-5/act.pt --act --port 9300 & node eval_policy.mjs --episodes 10 --steps 120 --policy http://127.0.0.1:9300
policy_server.py --model 指向训练好的权重:ACT 用 datasets/sim-5/act.pt(加 --act), 逐帧 BC 基线用 datasets/sim-4/policy.pt。两个权重都在 demo-deliverables.zip 里, 把 <解压后的数据集> 换成解压出来的 datasets/ 路径即可。
policy_server.py --model
datasets/sim-5/act.pt
--act
datasets/sim-4/policy.pt
<解压后的数据集>
d139bc11011b2e0c1aa0541faca79ddc
ALL PASSED
src/apps/starry/aka00-*/test/http_test.sh
src/tools/sim/eval_policy.mjs
/cam
--ssid
--password
--cipher
--no-chassis
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
端侧具身智能网球机器人 —— 面向 AI 教育机器人的策略闭环
决赛提交仓库,目录按大赛《决赛作品提交说明》组织:源码在
src/,文档在docs/,测试与验证材料在tests/,可复现交付物在demo/, 答辩 PPT 在presentation/(演示视频见 §15 的网盘包),作品原创承诺书在 根目录。目录
1. 赛题要求、我们的理解与契合度
1.1 赛题要求(要点)
按赛题《面向智能机器人的 AIOS》(基于 RK3588 / SG2002 开发板):
1.2 我们的理解
把上面的赛题翻译成可执行的技术目标,我们理解它是四件事:
1.3 与赛题的契合度(逐条对照)
tgoskits基线)+ 本项目板级适配src/os、src/scripts/axbuild、src/platformspseudofs下的设备节点:/dev/cvi-tpu0、/dev/cvi-usb-camera0、/dev/cvi_vc_dec0、/dev/ttyS1、/dev/ttyS2、/dev/ion、/dev/pinmuxsrc/os/StarryOS/kernel/src/pseudofs/devsrc/drivers/**、src/thirdparty/sg200x-bspcvimodel(BF16 / INT8),板上/dev/cvi-tpu0前向src/tools/tpu、src/apps/starry/aka00-act-tpucvimodel在板上加载约 10.6 s(含 ION 分配)tests/logs/board-act40-baseline.md/dev/ttyS1→ ESP32-C3 差速底盘(AA55 协议);/dev/ttyS2→ ZP10S 舵机总线src/apps/starry/master-compe-tennis、src/tools/esp32_base_controlsrc/apps/starry/master-compe-tennis、初赛演示视频src/apps/starry/aka00-*、§5、§12src/tools/sim、src/tools/tpusrc/tools/、src/os/StarryOS/configs/board/、tests/、demo/一句话总结契合度: 我们把赛题的”内核迁移 + 外设驱动 + NPU 推理链路”这三件地基活做扎实, 并在”端侧 AI 应用”这一层给出了两条能上板跑通的完整路线——初赛的 YOLO + 状态机 + 抓取, 与决赛的 量化 ACT + 方向伺服闭环;两条路线的能力边界(抓取 vs 只跟方向)在本文里都写清楚。
2. 项目简介与应用场景
2.1 项目简介
把”模仿学习(ACT,Action Chunking Transformer)策略”真正搬进一块单核 RISC-V + 小 NPU 的嵌入式板子,并跑成一台能自己看球转的机器人。整条链路都在端侧:板子自己抓 UVC 相机、 自己硬解 JPEG、自己量化推理、自己驱动底盘;网络只用于把画面 / 结果看出去(可选)。
工作分三层,每层都能独立构建与验证:
src/os、src/drivers、src/scripts/axbuild):在 SG2002 上把 WiFi、JPU(JPEG 硬解)、VDEC、UVC 相机、TPU 设备、板级构建打通,并修掉几个会”永久卡死” 的坑。src/apps/starry/aka00-*):量化 ACT 推理 + 相机输入 + 底盘控制, 提供”纯机器人””带画面(MJPEG 推流)””只出数字(不推流)”三种成品形态。src/tools/sim、src/tools/tpu):Three.js 纯 Web 仿真生成示范 数据 → 训练 ACT → 导出 ONNX → 编成cvimodel部署到板子。2.2 应用场景
3. 系统架构与数据流
3.1 三层结构
3.2 板端数据流(成品形态)
同一份 JPEG 既推流又喂控制,所以浏览器里看到的就是机器人正在看的那一帧。
4. 研发历程(里程碑)
M1|初赛:网球检测与抓取机器人(2026-07-24 → 07-29)
在 SG2002 上先做一条传统视觉 + 规则的完整闭环:
/dev/ttyS1→ ESP32-C3 底盘(AA55),/dev/ttyS2→ ZP10S 舵机总线, 实现三段式抓取动作;产出:
src/apps/starry/master-compe-tennis——能检测网球、跟踪并把球抓起来的机器人。M2|迁移到上游基线 + 板级驱动打通(2026-09-14 → 09-19)
把 OS 基座迁到上游
tgoskits基线,并集中啃板级驱动:/dev/cvi-tpu0设备节点;ax-net队列运行时调整;axbuild板级构建与启动流程;sg200x-bsp0.7.1 的本地 fork,修 DWC2 等时通道语义。M3|板端 ACT 实验台(2026-09-20 → 09-24)
为把量化 ACT 搬上板做”隔离变量”的实验台(
src/apps/starry/aka00-act-tpu):M4|三个成品形态(2026-09-25 → 09-29)
aka00-act-robot:摄像头 → 量化 ACT → 底盘,每帧重规划 + 匀速轮速;aka00-act-cam:一体成品——同一份 JPEG 既推流成 MJPEG 网页,又喂推理;aka00-act-web:推理监视——网页只看推理结果(左右轮速 + 20 拍动作块),不推流;master-compe-tennis决赛版(决策与状态机)+ 构建 / 测试 / 文档。M5|数据与模型流水线 + 配套工具(2026-09-29 → 10-04)
web-ctl:板端网页遥控 + 数据录制((画面, 动作)成对记录);esp32_base_control:ESP32-C3 双路编码电机控制器 + AA55 串口协议;mem-probe:缓存属性 / 访存带宽对照实验;aic8800_fw:WiFi 固件 crate;tpu:ONNX → cvimodel 编译流水线(BF16 / INT8,含逐帧误差比对);ai-chat:板端 ↔ DeepSeek 桥;sim:Three.js 纯 Web 仿真场景与示范数据生成;sim:ACT 训练与 ONNX 导出、逐帧 BC 基线、闭环评测与诊断、sim-to-real 测试图集。M6|板端六档实测与交付(2026-10-05 → 10-06)
tests/logs/board-act40-baseline.md);5. 关键技术点与试错记录
5.1 串口:UART1 的时钟不是 25 MHz(DTS 修正)
AA 55帧头)正常,之后字节开始错位。clock-frequency时回退到 25 MHz 默认值,产生约 3.2% 的波特率误差——115200 的 帧跑几个字节就漂移出采样窗口。src/os/StarryOS/configs/board/licheerv-nano-sg2002.dtb)里为 UART1 补上正确的clock-frequency = 25,804,800,与 Linux 内核实测的DLL=14, DLF=0对齐,波特率回到精确的 115200。5.2 JPU:坏帧只丢一帧,而不是”永久毒死一块板”
MJPEG_PIC_STATUS的INT_JPU_BIT_BUF_EMPTY)。旧逻辑会空转到 poll 上限,然后把解码器永久置毒——之后 每一帧都直接Poisoned → EIO,只能重启板子。DONE → ERROR → BIT_BUF_EMPTY顺序分派;GBU_TT_CNT)连续 50k 次不前进“判定为截断帧;IssueStop/CompleteStop握手 + 软件复位,并把 DMA 缓冲回收复用;EINVAL(截断)/ETIMEDOUT(真超时),channel 不用重建; 一轮 300 帧只丢个别帧、正常跑完,自愈成功时内核打印cvi-jpu: recovered JPU after a failed decode。5.3 VDEC ABI 层解禁任意色度布局(相机小档位可用)
SEND_STREAM直接EOPNOTSUPP(errno 95)。cvi_vdec.rs的 ABI 层把输出钉死在PIXEL_FORMAT_YUV_PLANAR_420,布局检查直接拒了。 旁证:UVC 协商把小档位的等时带宽从 1024 B/µframe 降到 128。validate_layout改为接受任何能映射成厂商PIXEL_FORMAT_*的平面布局;frame_info按实际布局回报pixel_format(4:2:0→13、4:2:2→12、4:4:4→14);StorageFull/ ENOSPC);0x21 = 4:2:2,据此定位根因; 修复后 640×480 等档位稳定出帧。5.4 量化 ACT 的三件事(ONNX IR、校准集、零偏)
把 PyTorch 里的 ACT 编成
cvimodel并部署到板端,踩到三个必须处理的点:MultiheadAttention在权重上切 Q/K/V 的Split漏进转换器,报operand ...in_proj_weight not found。src/tools/sim/export_onnx.py导出时已自动降到 9。--asymmetric、 TPU-MLIR 自带的run_calibration(含--bc)也都试过,没用(数值逐位相同)。l -= 0.0111; r -= 0.0390扣掉后,样本外 mean|err| 0.025 → 0.0116。5.5 单核流水线的边界:它是”延迟工具”,不是”吞吐工具”
5.6 真机采不出示范数据 → 改用仿真造数据
(画面, 动作),输出格式与真机录制同构(episode_NNN/{frames/*.jpg, actions.jsonl, meta.json})。preserveDrawingBuffer,否则浏览器合成一次后缓冲区被清空,toDataURL抓到的全是空白(第一版数据集整片白图就是这个原因);5.7 与上一代 / 外部参考工作的关系(分开说明)
在另一项比赛(全国大学生计算机系统能力大赛 OS 功能挑战赛道)里,我们做过一版基于 SD 卡预录制帧 + QEMU 基线的 ACT 推理优化:QEMU 上横评 ncnn / ONNX Runtime / tract, 把 ORT + INT8 压进 256 MB 内存;板上用 ADMA2 DMA + 双缓冲把单帧从 550 ms 压到约 126 ms。
这份工作只作为”外部参考 / 对照”出现,不属于本次作品的开发历程(它的输入是预先录好的 数据集,不接摄像头、不做实时闭环)。它的数字仅在 §12.3 与我们的端到端链路做横向参考。
6. 主要功能
src/apps/starry/aka00-act-robotsrc/apps/starry/aka00-act-camsrc/apps/starry/aka00-act-websrc/apps/starry/aka00-act-tpusrc/apps/starry/master-compe-tennissrc/tools/web-ctlsrc/tools/simsrc/tools/tpucvimodel(BF16/INT8),含逐帧误差比对src/tools/esp32_base_controlsrc/tools/{mem-probe,ai-chat,qperf,tennis,tpu-docs,aic8800_fw}7. 系统环境
tgoskits基线,本项目做板级适配)/dev/cvi-tpu0)、JPU/VDEC(JPEG 硬解,/dev/cvi_vc_dec0)、UVC 相机(/dev/cvi-usb-camera0)/dev/ttyS1,AA55 协议);ZP10S 舵机总线(/dev/ttyS2,初赛抓取用)8. 依赖要求
构建镜像(宿主机):Docker(
docker context用default),容器用ghcr.io/rcore-os/tgoskits-container:latest(内含 RISC-V 交叉工具链);宿主需要mkimage dumpimage dtc sfdisk mformat mcopy mmd。交叉编译板端 app:Xuantie-900 GCC + 预编译 SG200x SDK,在
src/apps/starry/aka00-tennis-yolo/下按它的scripts/setup.sh安装。编译模型:只用官方
sophgo/tpuc_dev镜像,tpu_mlir装在挂载卷的 venv 里。仿真与训练:Node(headless Chromium / Playwright)跑仿真,Python + PyTorch 训练, 详见
src/tools/sim/README.md。组装 SD 卡镜像:内核由上游
axbuild+ 本项目板级配置(src/os/StarryOS/configs/board/、src/apps/starry/*/board-aka-00-sg2002.toml)出,再与基线 rootfs、厂商fip.bin一起 打成 SD 卡镜像;rootfs 与fip.bin随 SG200x SDK 获取。评审可直接烧写demo/提供的 成品镜像,跳过这一步。大文件(不进仓库,走网盘):交付镜像、INT8 模型、数据集;清单见 §15。
9. 构建方法
10. 运行方法
11. 测试方法
详细索引见
tests/README.md。12. 性能与精度数据
12.1 模型与量化精度
模型:ACT40,约 40.9 M 参数,输入
[1,3,120,160](160×120 观测),输出[1,20,2](20 拍动作块)。12.2 板端六档对照(相机 / 解码 / 流水线)
六档的设计是每档只比上一档多一个变量(1→2 量化、2→3 双缓冲、4→5 解码器、5→6 输入源):
读表要点:
12.3 与外部参考工作的横向参考
12.4 闭环效果(仿真,同种子对比)
13. 已知限制
cvimodel在板上加载约 10.6 s(含 ION 分配)。14. 未来展望
15. 交付物与外部链接清单
15.1 仓库内交付物
src/docs/tests/demo/presentation/作品原创承诺书.pdf(根目录)15.2 演示材料(成片在
presentation/,其余走网盘)大赛要求的决赛成片
presentation/决赛演示视频.mp4在本目录保留一份;其余 演示视频与 PPT 整页设计原图作为presentation/的网盘包上传,见presentation/README.md:/web推理监视仪表盘(左右轮意图、20 拍动作块、帧率 / 推理耗时、轮速滑杆),左右同步(21.4 s,1920×1080,大赛要求的成片)决赛演示视频.mp4act推理小车.mp4初赛yolo夹取.mp4讲解视频.mp415.3 网盘包(按目录打包,大文件不进 Git)
大文件不进 Git(大赛禁用 Git LFS),按目录各打一个包:
demo-deliverables.zipsg2002_act.img+act40_int8/bf16.cvimodel+datasets/88rvpresentation-material.zipd8pw两个包解压后各自是一个同名目录(
demo-deliverables/、presentation-material/), 放进对应目录即可对上文中所有相对路径。说明书与 PPT 用的插图不需要额外的网盘包: 它们已直接嵌在四份 PDF 与答辩PPT.pptx里。16. 第三方组件与 AI 工具使用
第三方代码 / 模型 / 数据与许可证、以及生成式 AI / 代码补全 / 检索等工具的使用情况, 逐项列于
docs/人工智能及第三方工具使用说明.pdf。摘要:stb_imagev2.30(public domain / MIT)——JPEG 软件解码(对照路线);sg200x-bsp0.7.1(MIT)的本地 fork——仅改动 DWC2 等时通道一处;cvimodel(来源 BattiestStone4/akars)——传统视觉对照路线;17. 开源贡献与操作系统能力增强
本作品的操作系统基座是上游
tgoskits(StarryOS)。板级适配中遇到的问题基本都落在驱动与 板级配置里,我们就在那一层修,并把可复用的部分回馈上游。下面三组工作都在src/里可以 直接对照。17.1 串口:修正板级设备树的 UART1 输入时钟,打通底盘通信
/dev/ttyS1)。初赛阶段 TX 方向帧头AA 55之后 字节开始错位、RX 方向一个字节都收不到;而同一块板子刷 Linux 时 UART1 收发正常—— 这个对照把问题从”接线 / 电平”一步推到系统侧。clock-frequency时回退到 25 MHz 常量,约 3.2% 的波特率误差让每帧跑几个字节就漂出采样窗口;另外 UART1 的 TX/RX 复用在JTAG_CPU_TMS/JTAG_CPU_TCK上,需要单独配置引脚复用。src/os/StarryOS/configs/board/aka-00-sg2002.dtb、licheerv-nano-sg2002.dtb)的 UART1 节点补上正确的clock-frequency,驱动侧src/drivers/ax-driver/src/serial/ns16550.rs优先读取 DTB 的值;引脚复用经/dev/pinmux配置(0x64/0x68写 6);用户态串口统一用O_NONBLOCK + VMIN=0 + VTIME=0轮询。main**;同一轮里上游对 UART 中断调度的重构(PR #1675)也消除了旧基线上 “非 console UART 收不到 RX 中断”的问题。00..FF循环 5 遍)零错误、接收 256 字节准确率 99.6%; 与 ESP32 底盘的握手INIT → ACK → CONFIG → ACK → SET_SPEEDS全部通过、电机按指令转动。17.2 WiFi:把板载 AIC8800D80 的整条链路做通
板载网卡是 SDIO full-MAC 架构:扫描、认证、关联与四步握手的中继都由固件完成,主机 侧必须自己组装
sm_connect_req(含 RSN IE)、从 M1 推导 PMK/PTK、校验 M2/M3 的 MIC、计算 M4 的 MIC,再自己安装 PTK/GTK——**任何一环缺失,外观上都只是”连不上”**。我们在src/drivers/net/aic8800/上补齐了这些环节:sm_connect_req的 BSSID 偏移(33;写成 34 会让通配地址变成00:ff:ff:ff:ff:ff,表现为”换一个 AP 就连不上”);MFPC、不声明MFPR; 在混合模式 AP 下让 TKIP 组密钥(32 B GTK)与 CCMP 单播共存;/chosen/rng-seed;验证:WPA/WPA2 混合模式 AP 与纯 CCMP 手机热点都跑通——完成关联与四步握手、安装密钥、 拿到 DHCP 租约、ARP 连通,板上自带的网页服务(
web-ctl//web)可访问。17.3 其它驱动与系统能力增强
BIT_BUF_EMPTY已置位且消费位计数不前进即判为截断帧,失败后 STOP 握手 + 软复位并回收 DMA 缓冲——坏帧只丢一帧,不再”一次丢微帧永久毒死解码器”(§5.2)src/drivers/vpu/sg200x-jpu/pixel_format,缓冲按最坏情况开——相机小档位(UVC 低分辨率常给 4:2:2)因此可用(§5.3)src/os/StarryOS/kernel/src/pseudofs/dev/cvi_vdec.rssrc/os/StarryOS/kernel/src/pseudofs/dev/cvi_usb_camera.rssrc/thirdparty/sg200x-bsp(本地 fork)/dev/cvi-tpu0、/dev/cvi-usb-camera0、/dev/cvi_vc_dec0、/dev/ttyS1、/dev/ttyS2、/dev/ion、/dev/pinmuxsrc/os/StarryOS/kernel/src/pseudofs/dev/.its/ 启动参数),使内核能出卡并在真机启动src/os/StarryOS/configs/board/、src/scripts/axbuild/18. 复现手册
18.0 需要什么
/dev/ttyS1;不接也能跑(只推流 / 只出数字)root@starry:/root #dd+ 浏览器;B 还要 Docker 与 Xuantie-900 GCC + SG200x TPU SDK(src/apps/starry/aka00-tennis-yolo/scripts/setup.sh自动下载并校验 SHA-256);C 的仿真评测还要 Node + Playwright18.1 A. 直接跑成品(最快,评审口径)
http://<板子IP>/;镜像开机自启/web(推理监视,不推流画面), 而且带--start-paused——相机与推理照跑,轮子是按住的。cd /cam && ./run.sh(会接管相机,见 §18.5)。cd /actexp && ./run_1_bf16_serial.sh…./run_6_int8_camera_jpu.sh, 日志用./scripts/summarize.py汇总,或直接对照tests/logs/board-act40-baseline.md。18.2 B. 从源码重建
以下命令都从仓库根目录开始:
18.3 C. 跑测试与实验
以下命令同样从仓库根目录开始。
本机桩测试(不需要板子,用桩相机 / 桩 JPU / 桩底盘 / 桩 CVRuntime 顶替)
覆盖:页面为纯数字(无
<img>/ 无/stream)、/status的左右轮速与 20 拍动作块、/go与/stop、--start-paused不驱动、/speed?v=N实时改速、第二个流客户端返回 503、 首帧与源 JPEG 逐字节一致。前置条件是 §18.0 里那份 TPU SDK(setup.sh装好即可)。模型逐帧误差(宿主机,需要 §18.1 的 ONNX 与编出来的 cvimodel)
build_cvimodel.sh编完就会自动比对一次(报绝对误差、余弦与转弯帧方向一致率)。 要单独重跑,在 TPU-MLIR 容器里执行(cvimodel 需要model_runner+ cmodel 模拟器):仿真闭环评测(宿主机):策略通过 HTTP 暴露给 Node 侧的评测脚本,跑同一批种子与专家对比。
18.4 期望值速查(对不上就是环境或版本问题)
d139bc11011b2e0c1aa0541faca79ddcdemo/README.mddemo/README.mdALL PASSEDsrc/apps/starry/aka00-*/test/http_test.shtests/logs/board-act40-baseline.mdsrc/tools/sim/eval_policy.mjs18.5 常见问题
/cam起不来/dev/cvi-usb-camera0是独占的:/web(自启)与/cam一次只能跑一个,先停一个再启另一个--ssid/--password/--cipher)--no-chassis可显式指定