🌐课程总览
Agent OS · 基于工业智能体的操作系统开发
15天学习路径🎯 课程核心问题
当 AI 既能帮你写代码、又能驱动机器人自主决策时,机器人软件应该怎么开发?
两大范式升级
- 开发范式升级:不再逐行手写代码,而是用 AI 编程智能体按"规格→计划→实现→验证"工作流开发
- 运行时架构升级:机器人不再是被遥控的执行器,而是一台具身智能体
📋 学习目标矩阵
| # | 目标 | 对应天数 | 产出 |
|---|---|---|---|
| 1 | 理解 Chatbot/Agent/具身智能体区别 | Day 1 | 概念对比文档 |
| 2 | 掌握 AI 编程工作流 | Day 2 | 规格→代码示例 |
| 3 | 搭建 OminiX-API 多模态服务 | Day 3-4 | ASR+LLM+TTS demo |
| 4 | OpenCV 视觉识别 | Day 4-5 | 网球检测程序 |
| 5 | Octos Agent 任务规划 | Day 6-7 | 规划流程设计 |
| 6 | 理解 StarryOS 分层架构 | Day 8-9 | 架构分析报告 |
| 7 | World Model 设计 | Day 9-10 | 状态模型实现 |
| 8 | dora-rs 数据流节点开发 | Day 10-11 | 自定义节点 |
| 9 | 完整任务流水线 | Day 12-13 | 端到端 demo |
| 10 | 失败恢复与重规划 | Day 13-14 | 容错机制 |
| 11 | 项目答辩 | Day 15 | 完整项目+报告 |
📅 15天学习进度
🧠AI 原生开发范式
从手写代码到人机协作编程
🔄 三种编程范式对比
📋 规格驱动开发 (Spec-Driven)
AI 原生开发的核心是规格驱动——你写清楚"要什么",AI 负责"怎么做"。
# 规格示例: 网球检测节点 名称: tennis_detector 输入: camera_frame (RGB, 640x480) 输出: detections [{x, y, confidence, class}] 要求: - 检测黄色球形物体 (HSV 范围: H=20-35, S=100-255, V=100-255) - 最小面积阈值: 500px - 返回置信度 > 0.7 的检测结果 - 处理延迟 < 33ms (30fps) 异常: - 无检测结果 → 返回空列表 - 帧读取失败 → 报错并跳过
✅ 你的角色变化
规格工程师
写清需求、约束、验收标准。AI 依赖你的规格来生成正确代码。
代码评审员
审查 AI 生成的代码,发现逻辑错误、边界情况、安全隐患。
系统架构师
设计整体架构、接口、数据流。AI 负责填充实现细节。
验证工程师
设计测试用例,验证 AI 代码的正确性和鲁棒性。
💡 练习:AI 原生开发与传统 AI 辅助编程的最大区别是?
- A. 使用了更好的大语言模型
- B. 代码生成速度更快
- C. 以规格驱动的系统化工作流替代零散的代码补全
- D. 不再需要程序员
答案 C:AI 原生开发的核心差异在于工作流的系统化——从规格到计划到实现到验证的完整闭环。
🏗️系统总体架构
从用户语音到机器人动作的完整链路
🔗 端到端数据流
📦 各层职责速览
| 层次 | 组件 | 职责 | 技术栈 |
|---|---|---|---|
| 交互层 | OminiX-API | 语音识别、语言理解、语音合成 | ASR/LLM/TTS |
| 认知层 | Octos Agent | 任务理解、规划、工具调用 | LLM + ReAct |
| 记忆层 | World Model | 环境状态、物体位置、置信度 | JSON/Vector DB |
| 运行时 | dora-rs | 数据流图、节点调度 | Rust 数据流 |
| OS层 | StarryOS | POSIX 接口、驱动抽象 | ArceOS 内核 |
| 硬件层 | 辛龙机器人 | 底盘移动、机械臂、夹爪 | 串口/ROS |
💬Chatbot → Agent → 具身智能体
理解三者的本质区别
📊 三者对比
具身智能体的核心特征
- 感知-行动闭环:通过传感器感知物理世界,通过执行器改变物理世界
- World Model:维护环境的内部表示(物体、位置、状态)
- 自主恢复:执行失败时能重新感知、重新规划
💡 练习:AI Agent 相比 Chatbot 的关键区别是?
- A. 更大的上下文窗口
- B. 能调用外部工具并维护记忆
- C. 更快的响应速度
- D. 更好的多语言支持
答案 B:Agent 的核心是工具调用和记忆,使其能与外部世界交互并保持上下文连贯。
🎤OminiX-API 多模态服务
语音识别 + 语言理解 + 语音合成
Day 3-4🔊 三阶段流水线
🛠️ 搭建步骤
# 1. 克隆 OminiX-API git clone https://github.com/OminiX-Team/OminiX-API.git cd OminiX-API # 2. 安装依赖 pip install -r requirements.txt # 3. 配置 ASR export ASR_MODEL=whisper-large-v3 # 4. 配置 LLM export LLM_API_KEY=your_key export LLM_BASE_URL=https://api.openai.com/v1 # 5. 启动服务 python app.py --port 8080 # 6. 测试 curl -X POST http://localhost:8080/asr -F "audio=@test.wav" curl -X POST http://localhost:8080/tts -d '{"text":"收到"}' -o out.wav
💡 关键接口
| 接口 | 方法 | 输入 | 输出 |
|---|---|---|---|
/asr | POST | 音频文件 | { text } |
/llm/chat | POST | { messages } | { reply } |
/tts | POST | { text } | 音频流 |
/pipeline | POST | 音频文件 | { text, intent, audio } |
👁️OpenCV 视觉感知
网球检测与目标识别
Day 4-5🎯 检测流程
HSV 范围: H=20-35 (黄色), S=100-255, V=100-255。形态学: 膨胀→腐蚀 去除噪点。
📝 核心代码
import cv2, numpy as np def detect_tennis_ball(frame): """检测网球,返回 (x, y, radius, confidence) 或 None""" hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) lower = np.array([20, 100, 100]) upper = np.array([35, 255, 255]) mask = cv2.inRange(hsv, lower, upper) kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)) mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if not contours: return None c = max(contours, key=cv2.contourArea) if cv2.contourArea(c) < 500: return None (x, y), r = cv2.minEnclosingCircle(c) return (int(x), int(y), int(r), 0.9)
💡 为什么选择 HSV 而不是 BGR 做颜色过滤?
- A. HSV 计算更快
- B. HSV 图像更清晰
- C. HSV 将颜色(H)与亮度(V)分离,对光照变化更鲁棒
- D. OpenCV 默认使用 HSV
答案 C:HSV 的 H 通道独立于亮度,颜色过滤对光照变化更鲁棒。
🧩Octos Agent 任务规划
ReAct 模式下的任务理解与规划
Day 6-7🔄 ReAct 循环
🛠️ 工具定义示例
tools = [
{"name": "move_base", "desc": "移动底盘到指定位置",
"params": {"x": float, "y": float, "theta": float}},
{"name": "scan_area", "desc": "扫描区域寻找目标",
"params": {"direction": ["left","right","full"]}},
{"name": "pick_object", "desc": "抓取指定位置的物体",
"params": {"x": float, "y": float, "z": float}},
]
🗺️World Model
环境状态的内部表示
Day 9-10📊 数据模型
{
"objects": [{
"id": "tennis_ball_1",
"position": { "x": 1.2, "y": 0.5, "z": 0.05 },
"confidence": 0.92,
"last_seen": "2026-07-06T13:45:00Z",
"status": "visible"
}],
"robot": {
"position": { "x": 0, "y": 0, "theta": 0 },
"arm_state": "home",
"gripper": "open"
},
"task": {
"goal": "pick and place tennis ball",
"current_step": "scanning",
"retries": 0
}
}
🧠 设计原则
时效性
每个观测带时间戳。过期观测应降权或丢弃。
不确定性
置信度量化感知不确定性。低于阈值时触发重新扫描。
一致性
同一物体的多次观测应融合。用加权平均或 EKF。
可查询
Agent 可随时查询"最近的网球在哪"。
⚡dora-rs 数据流
Rust 数据流运行时
Day 10-11📊 数据流图
🦀 自定义 Rust 节点
use dora_node_api::{DoraEvent, DoraOutputSender}; fn main() -> eyre::Result<()> { let (_node, mut events) = dora_node_api::DoraNode::init_from_env()?; let sender = DoraOutputSender::new()?; while let Some(event) = events.recv() { if let DoraEvent::Input { id, data, .. } = event { if id == "camera_frame" { let detections = detect_tennis_ball(&data.try_into()?); sender.send_output("detections", detections)?; } } } Ok(()) }
🌟StarryOS 分层架构
ArceOS 内核 → StarryOS POSIX → dora-rs 应用
🏗️ 三层架构
🔑 各层特点
ArceOS 内核
模块化 Rust unikernel。可选组件:内存管理、文件系统、网络栈。单一地址空间,高性能。
StarryOS
在 ArceOS 上提供 POSIX 兼容接口。进程管理、文件 I/O、设备驱动抽象。
dora-rs 应用
数据流编程模型。节点通过消息传递通信。声明式 YAML 配置数据流图。
🦾机器人技能与动作
移动、扫描、对准、抓取、投放
🎯 技能分解
🔧 关键命令
| 技能 | 底层命令 | 参数 |
|---|---|---|
| 移动 | cmd_vel | linear_x, linear_y, angular_z |
| 扫描 | arm_scan | pan_angle, tilt_angle |
| 对准 | arm_track | target_x, target_y |
| 抓取 | gripper_close | force_limit |
| 投放 | gripper_open | — |
🔗完整任务流水线
从语音指令到机器人动作的端到端实现
Day 12-13🔗 端到端流程
1. 用户说: "帮我把网球捡起来放到盒子里" 2. ASR → 文本: "帮我把网球捡起来放到盒子里" 3. LLM 理解意图 → 结构化任务: {"action": "pick_and_place", "object": "tennis_ball", "destination": "box"} 4. Octos Agent 生成计划: Step 1: scan_area(direction="full") Step 2: move_to(target=ball.position) Step 3: pick_object(ball.position) Step 4: move_to(target=box.position) Step 5: place_object(box.position) 5. dora-rs 逐步执行每个技能 6. World Model 实时更新状态 7. TTS 反馈: "已将网球放入盒中"
🔄失败恢复与重规划
当执行失败时怎么办
⚠️ 常见失败场景
目标丢失
网球被遮挡或移动。解决方案:重新扫描,更新 World Model。
抓取失败
夹爪未对准或力度不够。解决方案:重试,调整姿态。
路径阻塞
前方有障碍物。解决方案:重新规划路径。
记忆过期
目标位置信息过时。解决方案:重新感知,刷新 World Model。
🔄 恢复策略
def execute_with_recovery(plan, max_retries=3): for step in plan: for attempt in range(max_retries): result = execute_step(step) if result.success: world_model.update(result) break elif attempt < max_retries - 1: tts.speak("正在重试...") else: # 重新感知 → 重新规划 new_state = scan_and_update() plan = replan(goal, new_state)
🤖AI 编程工作流
规格 → 计划 → 实现 → 验证
📋 四步工作流
📝 你的职责
- 写规格:用自然语言 + 结构化格式描述"要什么"
- 审计划:检查 AI 的实现计划是否合理
- 评代码:审查 AI 生成的代码,发现 bug 和改进点
- 验结果:运行测试,确认行为符合规格
⚠️ 常见陷阱
- 不写规格直接让 AI 写代码 → 结果不可预测
- 不验证就认为 AI 代码正确 → 隐藏 bug
- 不迭代一次就放弃 → 错过改进机会
🎯项目与答辩
最终交付物清单
📦 交付物清单
| # | 交付物 | 要求 |
|---|---|---|
| 1 | 可运行的机器人系统 | 完成"识别→抓取→投放"任务 |
| 2 | 实验报告 | 架构设计、技术选型、测试结果 |
| 3 | AI 开发日志 | 记录每次 AI 交互的规格、计划、评审 |
| 4 | 系统说明文档 | 部署步骤、接口说明、已知问题 |
| 5 | 答辩演示 | 现场演示 + 回答问题 |
📅 最后3天安排
Day 13: 集成测试
端到端测试、修复 bug、优化性能
Day 14: 文档撰写
实验报告、AI 日志、系统文档
Day 15: 答辩准备
PPT 制作、演示排练、问题准备
🎉 祝你成功!
记住:你不是在手写每一行代码,而是在设计系统、评审 AI、验证结果。这才是 AI 原生开发的精髓。