核心能力
能听 · 会回应 · 有生命感
一台机器人要让人觉得"活着",只需要三件事:听见你、回应你、让你看见它在感受。其余的一切工程,都是为了这三件事安全、自然、不打断地发生。
听见你
当你开口,它立刻知道。不是等你说完一句话才反应 —— 从你发出第一个音节的瞬间,它就已经在听。静音与起音的边沿,它比你更敏感。
回应你
它不只是回答问题。它用声音回应你,同时用表情告诉你 —— 它在思考、在高兴、在为你担心。17 种情绪表情覆盖从平静到兴奋的完整光谱,每一轮对话都有温度。
触碰世界
转头、亮灯、判断声音从哪个方向来 —— 身体层为每个动作留了真实的执行入口。它先在双麦拾音通道的电平差里,粗粗反演出声源大概在哪个方位(左 / 中 / 右三档,随起音事件一起上路,没加一条新契约);再把"向左转""看看门口"这类话术归一成一个舵机转向意图、下发到对应角度。感知、认知、执行三模块在这条链上接力,让它的回应不只在屏幕上。整条链已在六真进程仿真侧走通,真麦克风与真舵机尚未上板。不是冰冷的机械臂,是奔着有生命感去设计的小家伙。
崩溃不传染
六个模块各自独立运行,一个出了问题,其余照常工作。它不会因为一个功能的故障就彻底沉默。
进程级隔离安全兜底
即使"大脑"宕机,它的保护机制依然运转。急停、限位、低电关断 —— 这些决策不依赖任何上层模块,在最底层守护。
基座守护契约不变
模块之间用一份不可变的契约对话。格式只增不改,就像两个人之间的约定 —— 一旦定下,绝不反悔。
契约先行系统架构
三层分离,互不牵绊
业务在模块里,守护在基座里,硬件差异在 OS 层消化。换一块板只需写一份装配单,不改一行应用代码 —— 这是它能从桌面走到产线的前提。下面 16 个方格每一个都能点:右侧小标签写的是它在 HEAD 的真实状态,点下去会放出这个模块的一条真实主题。
总线实况 · 点上面任意一个模块
这一跳,走的是哪条主题、哪几个格位
模块之间零直连:一切经基座转发。选一个模块,下面把它的代表性一跳逐跳放完 —— 主题名取自 contracts/topics.toml(28 条),格位取自 contracts/slots.toml(21 格),消息头是那份冻结的 128B 契约。
设计原则
- 模块之间零直连,只通过事件总线对话
- 高频控制闭环留在本地,不占用总线带宽
- 守护逻辑在基座,不依赖任何业务模块
- 换板不改代码,换 OS 不改模块
硬件参数
- SoC:RK3566(Rockchip,ADR-0001 选型)
- 体积约束:约 0.5L,掌心大小
- 待机功耗目标:< 1W
- 音频:16kHz / 单声道 / 16bit PCM 采集
换一块板,全部动作写在两份数据文件里
"三层分离"真正兑现的地方在这里。rock3 把"这台机器人有什么"从代码里抽出来,落成两份纯数据:能力格坐标系 contracts/slots.toml 声明整机所有能力位,装配单 profiles/<机型>.toml 把格位绑到具体模块。任何"需要改 rock3 代码才能换板"的现状,都按待修的泛化欠账处理 —— 这是架构文档写死的判据,不是宣传语。
-
白拿上游发行版 —— Debian / Armbian / Alpine,能跑标准 rootfs 的板直接进下一步。发行版覆盖不到时切保底轨 Buildroot,
base/os的 defconfig + genimage 出冻结镜像。双轨之间没有第三轨:Yocto 后期再评估。 -
rock3 本体就这么多:
rrd+ HAL 后端 +contracts/+ 安装器,deb 为主形态一次装完。六个模块另走 OCI 镜像 —— OCI 只是分发格式,rrd始终是模块生命周期的唯一所有者,不引容器编排层。 -
[os]选轨,[bindings]把身体层与认知层格位绑到模块,[faces]裁剪每个模块在本机型启用的能力面。启动时rrd读 profile + 探测硬件(device-tree、sysfs、ALSA 枚举)做匹配,缺格置 Degraded 而不是启动失败。换机型裁剪能力面 = 只改这一个文件。
base 5 · body 12 · cognition 4
default / distro 机:格位 → 模块
每模块在本机型启用的格
装错格位 CI 直接判红
这一步今天走到哪
已落盘坐标系与装配单在 HEAD 有实体:contracts/slots.toml(21 格,只增不改、不留空格)+ profiles/default.toml 与 profiles/distro.toml(各 16 条绑定 / 6 张能力面,纯数据零逻辑,不写启动序)。
已落盘查册门契约守护:基础层 5 格与 base_capabilities 白名单逐条钉死等价(第二份白名单不存在)、21 格 (name, layer) 形状 pin、模块 manifest 的 provides / depends 双侧查册、default 与 distro 两份装配单同时对表 slots。
已接线rrd 的启动装配链已落地:--profile 装机正门读装配单、探测硬件、按 faces 决定起谁,缺格逐格点名 fail-closed(不带病起,也不连坐下游)。今天的 profile 已经是被执行的数据,不只是被门禁校验的数据。
过桥板已实测基座 payload 层在树莓派(aarch64 / Debian 13)真板跑通:dpkg -i 装进 deb、postinst 自启、六个模块全 running、denied_publish = 0、sudo reboot 后自恢复 —— "不改一行应用代码,换一块 Layer 0 完全不同的板"这一句,此刻有真板证据。
板上敞口真硬件外设仍是敞口:ALSA 采集回放、GPIO / PWM 舵机与继电器、真电池与链路、显示点阵的真后端都还是 Unsupported,麦克风 / 舵机 / 显示件未采购。上一行"过桥板已实测"测的是基座与模块生命周期,不是外设动作。
未验证保底轨 Buildroot 未做全量构建、目标硬件 Radxa ZERO 3 未采购;OTA 写侧 rr3-ota-ctl switch 恒拒执行,"断电不 brick、坏 slot 自动回滚"目前是设计目标加编译期布局守护,没有任何实板证据。
在线体验
选一句话,看它怎么回应
每一条指令背后,是一条从感知到执行的完整链路。选一条试试 —— 面板会同步展示它经过的模块、对应的主题与完成状态。
示例指令
本轮涉及的模块
对话轮替
本轮已完成
用户说话
处理链路
契约依据 真实主题名
本轮结果 已完成
这一格换成你的声音
音频只在这一个标签页里分析:WebAudio 的 AnalyserNode 每 60ms 取一次时域采样算峰值,不录音、不落盘、不上传,关掉开关就断开采集。它验证的是「声音能驱动表情」这条交互,不代表板上那条 16kHz / 单声道 / 16bit PCM 采集链路 —— 那条只在仿真侧跑过,板上录音从未发生。
协作生态
开源共建,多方协作
洛克三号从第一行代码起就是共建的。芯片平台、开源社区、代码托管、硬件设计 —— 每一环都已经有在场的同行者,也把位置留给下一位。
开发进展
每一步,都看得见
M0–M5 已收口:契约冻结、基座守护能跑、音频整链在仿真侧走通、认知模块把对话回路串起来了,执行 / 连接 / 电源三模块也在仿真侧各就各位;换板这句话更硬了一点 —— 基座 payload 已在过桥真板装起来跑通。下面每一条都区分"代码里有"和"板子上验证过" —— 缺的那一手我们照写。想只看某一类,点上面四枚状态标签。
设计目标
- 不拆机烧录,换板不需要烧录器
- 基座能力 day-one:注册、看门狗、OTA、工厂恢复
- 第一版即含电源管理,待机功耗目标 < 1W
- 断电升级不 brick,坏 slot 自动回滚
文档索引
docs/architecture/目标架构:分层、模块模型、HAL、IPC、数据流contracts/字节级唯一事实源:消息头偏移表与冻结枚举docs/process/adr/17 份架构决策记录docs/process/conventions.md开发规约:分支、提交、检查步骤
参与共建
Issue 是第一入口。我们欢迎每一个认真的建议、每一行有测试的代码。
许可协议筹备中,正式发布前请勿直接复用代码。