目录

知微智居 — 面向 AIoT 的多传感器感知与自主决策家居 Agent

基于 openvela 的新平台适配与 AI Agent 智能应用开发(第三届中国研究生操作系统 开源创新大赛 · 应用创新赛道)

知微智居取意”见微知著”——从细微的环境传感信号中洞察需求,主动完成决策与 控制。作品将 openvela 深度适配到 Allwinner R528(Gemini-S1)开发板,并在该平台 上基于 openvela 内置 AI Agent 框架,开发了一个能”感知环境 → 自主推理 → 联动家电“的智能家居管家:温湿度、光照、空气质量等多路传感器经 uORB 汇聚,用户 通过语音或文字下达指令,Agent 调用自定义硬件工具完成灯光调节、空调红外控制等操作。

作品亮点

  • 多传感器环境感知:SHTC3 温湿度、LTR553 光照/接近、SGP30 空气质量(CO₂/TVOC) 经 uORB 消息总线统一汇聚与综合诊断。
  • AI Agent 硬件联动:27 个自定义 C 语言 Tool + 45 个 Markdown Skill,覆盖环境 诊断、RGB 灯控、空调红外场景收发等,注册进 openvela Agent 工具系统。
  • 红外空调控制:原创红外场景管理服务,支持遥控信号学习、A/B 双份持久化与重放, 实测可发射红外并控制空调等家电响应; 语音可按温度/模式(制冷、除湿、送风)匹配并发送对应场景。
  • 语音交互:接入 ASR/TTS,支持”打开空调””设置为 22 度””根据环境帮我处理”等 中文语音指令,管家语音应答并播报实际执行的模式与温度。
  • 环境自适应决策:一句”根据环境帮我处理”即可让 Agent 读取环境、调节灯光,并在 室温超过阈值时自动发送制冷场景——一次多工具协作的端到端闭环。
  • LVGL 图形界面:SPI 屏上显示环境仪表盘、时间与空调管理界面。

平台与移植路径

项目 规格
开发板 Allwinner R528 / Gemini-S1
主控 ARM Cortex-A7 双核 @ 1.2GHz,128MB DDR3,256MB SPI NAND
无线 Realtek RTL8733BS(SDIO WiFi + 蓝牙)
显示 SPI LCD(ILI9341)+ 触摸

移植采用路径 B(已有平台深度适配):在 openvela vendor 层提供的 R528 芯片支持 之上,完成 openvela 独有框架适配(AI Agent / LVGL / uORB / 蓝牙),并新增 NuttX 上游不存在的外设驱动(SGP30 空气质量、红外收发场景链路等)。详见 移植指南

文档

文档 内容
快速上手 硬件连接、编译、打包、烧录、WiFi/LLM/语音配置、命令速查
端到端演示记录 实机运行日志:多工具协作的多步推理闭环演示
移植指南 BSP 结构、启动链、框架适配、新增驱动
代码原创说明 第三方库引用与代码来源
可执行文件说明 烧录镜像信息、烧录方法、重新构建

可执行文件下载

烧录镜像(约 26 MB)作为本仓库发行版(Release)附件发布:

  • 文件:rtos_nuttx_r528s3-gemini-s1_uart0_128Mnand.img
  • SHA256:d214d4f6c972c5dc256c6fbbfc6791279b44029bca31c487a86d73472020455a
  • 获取方式:仓库页面右侧「发行版」→ 下载附件

烧录步骤与首次配置见可执行文件说明

目录结构

packages/ai_agent/                     # openvela AI Agent 框架 + 本队自定义 Tool/Skill
├── src/tools/                         # 自定义 C 语言硬件工具(空调、环境等)
├── src/voice/                         # 语音 ASR/TTS 集成
└── ...
vendor/allwinnertech/
├── apps/                              # 板级应用
│   ├── ir_scene_manager/              # 【原创】红外场景管理服务
│   ├── env_housekeeper/               # 【原创】环境管家核心
│   ├── luncher_mini/                  # LVGL 主界面(环境仪表盘 + 空调管理)
│   ├── led_rgb/ ltr553/ shtc3/ ...    # 传感器/外设应用
│   └── ir_gpio_test/                  # 【原创】红外发射硬件诊断
├── boards/r528/r528s3-gemini-s1/      # 板级 BSP(Kconfig/defconfig/链接脚本/启动)
└── chips/r528/.../hal/source/         # 外设驱动
    ├── sensor/sgp30/                  # 【新增】SGP30 空气质量 uORB 驱动
    ├── cir_tx/ cir_rx/                # 红外发射/接收驱动
    └── sensor/temperature、als/       # SHTC3、LTR553
docs/                                  # 移植指南、赛题说明、代码原创说明

编译与烧录

# 在完整 openvela 源码树中,将本仓库内容按上述路径放置后配置构建
./build.sh r528s3-gemini-s1:nsh_minidisplay

# 产物经 USB Type-C 烧录到 SPI NAND
# 串口 UART2(115200)可见启动日志与 NSH 提示符

注:本仓库为参赛作品源码集,需置于 openvela 完整源码树(含 nuttx 内核与 vendor 芯片支持)对应目录下编译。LLM / 语音服务的 API Key 需自行申请并配置(密钥文件 agent_config.h 按约定不纳入版本库)。

使用示例(语音 / 文字指令)

指令 行为
打开空调 / 关闭空调 发送默认开机 / 关机红外场景,语音播报模式与温度
空调设置为 22 度 匹配并发送已学习的 22 度制冷场景
空调除湿 / 送风 发送对应模式场景
根据环境帮我处理 读取环境 → 调节灯光 + 室温超阈值时自动制冷(多工具协作)
帮我看看当前环境 综合诊断并语音播报温湿度、光照、空气质量

社区贡献

本作品在平台适配过程中开发的通用传感器驱动,已回馈给 openvela 上游社区, 共提交 3 个 PR

PR 标题 内容
#1 drivers/sensors: add SGP30 uORB driver SGP30 空气质量传感器(CO₂eq / TVOC)uORB 驱动
#2 drivers/sensors: add LTR553 uORB driver LTR553 光照 + 接近传感器双通道 uORB 驱动
#3 drivers/sensors: add SHTC3 uORB driver SHTC3 温湿度传感器 uORB 驱动

目标仓库均为 openvela/nuttxdev 分支。三个驱动合计新增约 2900 行原创代码, 为 openvela 补齐了三款上游此前不支持(或缺少 uORB 接口)的常用环境传感器。

PR #1 — SGP30 uORB 驱动

上游已有 SGP30 的字符设备驱动(sgp30.c),但缺少接入 uORB 传感器框架 的实现。本 PR 补齐这一能力:

 drivers/sensors/sgp30_uorb.c   | 新增 617 行
 drivers/sensors/sgp30.c        | +50   (新增 sgp30_measure_for_service)
 include/nuttx/sensors/sgp30.h  | +52   (质量枚举、快照结构、函数声明)
 drivers/sensors/Kconfig        | +19
 drivers/sensors/Make.defs      | +4
 drivers/sensors/CMakeLists.txt | +6/-1

为何需要 uORB 版:SGP30 依赖持续 1 Hz 采样维持其内部基线补偿算法,而字符 设备接口仅在 read() 时测量,无法保证采样节奏。uORB 版以独立内核线程按固定 周期采样并发布 SENSOR_TYPE_CO2 / SENSOR_TYPE_TVOC 两个 topic。

两种接口由 CONFIG_SENSORS_SGP30_UORB 二选一编译,沿用上游 BMP180 驱动 (bmp180.c / bmp180_uorb.c)的既有惯例。

PR #2 — LTR553 uORB 驱动

上游支持同厂的 LTR308 环境光传感器(ltr308_uorb.c),但完全没有 LTR553 支持。LTR553 在单一封装内集成环境光与红外接近两个通道,本 PR 为其提供驱动:

 drivers/sensors/ltr553_uorb.c   | 新增 1027 行
 include/nuttx/sensors/ltr553.h  | 新增
 drivers/sensors/Kconfig         | +26
 drivers/sensors/Make.defs       | +4
 drivers/sensors/CMakeLists.txt  | +4

单个内核线程轮询设备并发布两个 topic(SENSOR_TYPE_LIGHT 含 lux 与原始红外 通道、SENSOR_TYPE_PROXIMITY 含近似距离),两通道共用一组 I2C 事务与一次唤醒。 照度按数据手册的 CH0/CH1 比值分段公式换算。

PR #3 — SHTC3 uORB 驱动

上游已支持多款 Sensirion 温湿度传感器(sht21.csht3x.csht4x.c),但 没有 SHTC3 —— 该型号使用不同的命令集,并采用 wake/sleep 低功耗模型:

 drivers/sensors/shtc3_uorb.c   | 新增 1224 行
 include/nuttx/sensors/shtc3.h  | 新增
 drivers/sensors/Kconfig        | +9
 drivers/sensors/Make.defs      | +4
 drivers/sensors/CMakeLists.txt | +4

发布 SENSOR_TYPE_AMBIENT_TEMPERATURESENSOR_TYPE_RELATIVE_HUMIDITY 两个 topic。实现要点:

  • 电源管理:SHTC3 默认处于睡眠态,每次测量前需唤醒。驱动跟踪睡眠状态并在 测量前后收发唤醒/睡眠命令,以降低空闲功耗。
  • 数据完整性:每次 I2C 读取均按数据手册做 CRC-8 校验(多项式 0x31),校验 失败时上报错误而非发布脏数据。
  • 故障恢复:测量失败时先尝试软复位再放弃,避免总线瞬时干扰导致传感器卡死。
  • 双通道独立:温度与湿度各自持有工作队列项,两个 topic 可独立启用与调速。

共同的工程约束

  • 纯新增、零侵入:对既有文件的改动全部是新增,未修改或删除任何既有函数, 现有用户不受影响。
  • 无平台耦合:仅依赖 NuttX 标准接口(i2c_mastersensors/sensor.hkthreadmutex),可用于任意支持 I2C 的 NuttX 平台。
  • 代码规范:经 nuttx/tools/uncrustify.cfg 官方配置格式化,nxstyle 检查 零报错;提交均含 DCO Signed-off-by 签名。
  • 实机验证:三个驱动均在 Allwinner R528(Gemini-S1)开发板实测通过。SGP30 验证了 1 Hz 发布节奏与 warm-up → valid 状态转换;LTR553 验证了手部靠近时接近 读数随距离变化、遮挡时照度读数下降;SHTC3 验证了温湿度读数在数据手册量程内 正常发布。

参考资料

本作品基于 openvela 开发,移植与适配参考以下官方资源:

资源 地址
openvela 源码 https://github.com/open-vela (Gitee: https://gitee.com/open-vela ,GitCode: https://gitcode.com/open-vela
openvela 官网 https://openvela.com/
openvela 文档站 https://doc.openvela.com
openvela AI Agent 文档 源码仓 packages/ai_agent/docs/(架构、工具列表、Skills、CLI、通道说明)
NuttX 移植指南 https://nuttx.apache.org/docs/latest/guides/porting.html
现有 BSP 参考 源码仓 nuttx/boards/ 目录

基线版本:openvela manifest trunk-5.4

许可证

本作品以 Apache License 2.0 开源,详见 LICENSE。第三方库引用与代码 来源说明见 代码原创说明

关于
2.9 GB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号