598浏览
查看: 598|回复: 17

[项目] 【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构

[复制链接]
本帖最后由 驴友花雕 于 2026-4-27 09:09 编辑

## 引言:机器人需要怎样的“大脑”?

传统机器人系统,似乎早已固化了“上位机 + 下位机”的分布式架构范式:一台运行 Linux 系统的高性能单板计算机(如树莓派、Jetson),承担着视觉处理、SLAM 建模、路径规划与 AI 交互的“脑力工作”;另一块单片机(STM32、Arduino 等),则专职负责电机控制、传感器采集等实时性要求极高的“体力活”。

这种架构固然能实现复杂功能,但也不可避免地带来了三大痛点:硬件成本居高不下、系统功耗难以控制、多设备协同的复杂度大幅提升,让机器人技术难以走进低成本场景。

而 ESP32‑S3 这类高性能微控制器的出现,彻底打破了这一困局。这款集成双核 Xtensa LX7 @ 240MHz 处理器、向量扩展指令、WiFi/蓝牙双模通信,以及最高 16MB Octal PSRAM 的芯片,让“单芯片机器人”的构想从理论走向现实。MimiClaw 正是这一趋势下的标志性实践——它在一颗成本不足 5 美元的微控制器上,完整实现了“感知(多通道交互)→ 决策(LLM 推理 + 上下文记忆)→ 执行(电机/灯光控制)”的智能体闭环,用极简硬件撬动了机器人 AI Agent 的全面落地。

本文将跳出单纯的代码解读,从机器人学经典范式(感知-规划-行动)的视角,重新审视 MimiClaw 的架构设计,探讨其在教育机器人、桌面级服务机器人、低成本科研平台等领域的应用潜力与工程启示,为嵌入式 AI 机器人的开发提供可借鉴的实战思路。

栏目开篇:
【花雕学编程】从代码到运动:MimiClaw 如何用 ESP32‑S3 微控制器撬动机器人 AI Agent 的全面落地
https://blog.csdn.net/weixin_416 ... 1001.2014.3001.5502

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图1

驴友花雕  高级技神
 楼主|

发表于 2026-4-26 16:17:43

【花雕】嵌入式AI Agent机器人:硬件小车与部署MimiClaw

## 第一部分,搭建一个简单有效硬件小车的实验测试平台

1、小车底盘,选择了一款1.5mm厚的铝合金4WD四轮底盘,比较专业,便于后续二次开发的相关硬件拓展。

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图1

2、二只差速电机,使用了最普通的小减速比48:1的快速TT马达,后续升级再另行更换电动机。

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图2

3、电机驱动模块,使用了手头有的L9110
主要参数
双L9110S芯片的电机驱动
模块供电电压:2.5-12V
适合的电机范围:电机工作电压2.5v-12V之间,最大工作电流0.8A,目前市面上的智能小车电压和电流都在此范围内
可以同时驱动2个直流电机,或者1个4线2相式步进电机。
PCB板尺寸:2.8cm*2.1cm 超小体积,适合组装
设有固定安装孔,直径:3mm

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图3

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-4-26 16:32:41

【花雕】嵌入式AI Agent机器人:硬件小车与部署MimiClaw

本帖最后由 驴友花雕 于 2026-4-27 06:28 编辑

4、主控开发板使用标准的N16R8 ESP32-S3-DevKitC-1,P44脚(最好是选带有WiFi天线接口的,有时信号不理想)

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图3
【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图4

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图5

5、小车动力电源选择了7.4伏的2S锂电

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图2

6、WS2812灯带,9颗灯珠

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图1


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-4-26 16:41:24

【花雕】嵌入式AI Agent机器人:硬件小车与部署MimiClaw

7、44脚的专用ESP32S3 IO扩展板市面上不多,总共找到三种

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图1

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图2

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图3
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-4-26 16:42:42

【花雕】嵌入式AI Agent机器人:硬件小车与部署MimiClaw

8、最后选用的是这款,6.5V---9V电压输入,板载稳压电路,输出3.3V和5V

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图1

9、相关引脚定义说明

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图2

10、实际组装

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图3

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图5

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图4


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-4-26 16:49:45

【花雕】嵌入式AI Agent机器人:硬件小车与部署MimiClaw

本帖最后由 驴友花雕 于 2026-4-27 06:16 编辑

## 第二部分,实际部署迷你小龙虾 mimiclaw

MimiClaw官网与代码仓库
官方网站:https://mimiclaw.io
代码仓库:https://github.com/memovai/mimiclaw
国内镜像:https://gitcode.com/RealGao/mimiclaw

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图1

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图3

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图2

关于部署 MimiClaw 的参考资料:
1、《【花雕动手做】ESP32-S3 成功部署 MimiClaw(迷你小龙虾):本地调用 DeepSeek API 的部分实操记录》
https://blog.csdn.net/weixin_41659040/article/details/159633206
2、《【花雕动手做】ESP32-S3 开发板部署迷你小龙虾 MimiClaw 完整流程+避坑指南》
https://blog.csdn.net/weixin_41659040/article/details/160185171
3、《【花雕动手做】从“能听会算”到“自主行动”:MimiClaw 开启嵌入式 AI 的新篇章》
https://blog.csdn.net/weixin_41659040/article/details/160351859
4、《【花雕动手做】打破AI轻量化极限!MimiClaw:国产EP32S3 芯片上跑的纯C轻量AI Agent》
https://blog.csdn.net/weixin_41659040/article/details/152157480

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-4-26 17:01:50

【花雕】嵌入式AI Agent机器人:硬件小车与部署MimiClaw

## 第一步:部署前准备:硬件与账号

在开始之前,请确保你已准备好以下“物料”:

1、核心开发板:ESP32-S3 N16R8。这是部署成功最关键的一步,必须选用 16MB Flash 和 8MB PSRAM 的版本(如 ESP32-S3-DevKitC-1-N16R8)。容量不足会导致固件烧录失败或设备反复重启。

推荐型号:

乐鑫官方 ESP32-S3-DevKitC-1-N16R8:兼容性最佳,推荐所有开发者使用。

小智AI开发板 (N16R8版本):集成基础外设,新手友好,开箱即用。

行空板K10:DFRobot推出的集成ESP32-S3 N16R8与多种传感器、屏幕、麦克风的学习板。


2、USB数据线:必须支持数据传输。仅充电用的线无法用于烧录,请使用开发板原装线或品牌高速数据线。

3、API密钥 (模型调用):Mimiclaw 调用云端大模型需要API Key。

(1)Anthropic API Key:从 console.anthropic.com 获取。

(2)DeepSeek API Key:从 platform.deepseek.com 获取,价格便宜,非常适合国内用户。

(3)Bot Token (通信渠道):MimiClaw 通过聊天机器人交互。

(4)Telegram Bot Token:在 Telegram 找 @BotFather 创建一个Bot即可获取。

(5)飞书应用凭证:在飞书开放平台创建一个“企业自建应用”,开启机器人能力。需要获取应用的 App ID 和 App Secret。

(6)(可选) 搜索API Key:如需网页搜索功能,可从 app.tavily.com 获取免费的 Tavily API Key。

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图1

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-4-26 17:08:02

【花雕】嵌入式AI Agent机器人:硬件小车与部署MimiClaw

## 第二步:搭建开发环境 (ESP-IDF)

Mimiclaw 基于乐鑫官方开发框架 ESP-IDF v5.5+,推荐使用 v5.5.3 版本。

1、下载安装脚本 (国内用户推荐)
为了获得更快的下载速度,推荐使用乐鑫官方的Gitee镜像安装工具。

  1. git clone https://gitee.com/EspressifSystems/esp-gitee-tools.git
  2. cd esp-gitee-tools
  3. # 运行安装脚本,按提示选择版本 (推荐v5.5.3) 和目标芯片 (esp32s3)
  4. ./install.sh
复制代码


2、激活环境
安装成功后,你需要为每一个新打开的终端窗口激活ESP-IDF环境,才能使用相关命令。

  1. # 将以下命令中的路径替换为你的实际安装路径
  2. . $HOME/esp/esp-idf/export.sh
复制代码


提示:可以将此行添加到你的shell配置文件(如 ~/.bashrc)中,以避免每次手动激活。

3、打开CMD

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图1

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-4-26 17:11:15

【花雕】嵌入式AI Agent机器人:硬件小车与部署MimiClaw

本帖最后由 驴友花雕 于 2026-4-26 17:13 编辑

## 第三步:获取并配置 Mimiclaw

1、克隆项目代码
  1. git clone https://github.com/memovai/mimiclaw.git
  2. cd mimiclaw
复制代码

2、如果克隆失败,可以尝试使用Gitee镜像:

  1. git clone https://gitee.com/vt-developer/mimiclaw.git
复制代码

3、设置目标芯片

  1. idf.py set-target esp32s3
复制代码


4、配置项目密钥
这是核心步骤,需要将你的各种Token和密码填入配置文件。
首先复制模板文件:

  1. cp main/mimi_secrets.h.example main/mimi_secrets.h
复制代码

然后用你习惯的文本编辑器(如 nano, vim, code)打开 main/mimi_secrets.h 文件,填入你的信息。

下面是一个参考配置示例,其中粗体部分是你需要替换的内容:

  1. // main/mimi_secrets.h - 配置示例
  2. // --- 网络 ---
  3. #define MIMI_SECRET_WIFI_SSID "你的WiFi名称"
  4. #define MIMI_SECRET_WIFI_PASS "你的WiFi密码"
  5. // --- 模型 (根据你要使用哪个模型,去掉对应的注释即可) ---
  6. // 如果使用 DeepSeek
  7. #define MIMI_SECRET_API_KEY "sk-你的DeepSeek密钥"
  8. #define MIMI_SECRET_MODEL "deepseek-chat"
  9. #define MIMI_SECRET_MODEL_PROVIDER "openai" // DeepSeek兼容OpenAI接口
  10. // ... 以及在 mimi_config.h 中设置 MIMI_OPENAI_API_URL 为 "https://api.deepseek.com/v1/chat/completions"
  11. // 如果使用 Claude (Anthropic)
  12. // #define MIMI_SECRET_API_KEY "sk-ant-api03-你的Anthropic密钥"
  13. // #define MIMI_SECRET_MODEL_PROVIDER "anthropic"
  14. // --- 通信渠道 (至少选一个) ---
  15. // Telegram
  16. #define MIMI_SECRET_TG_TOKEN "你的Telegram Bot Token"
  17. // 飞书
  18. #define MIMI_SECRET_FEISHU_APP_ID "你的飞书应用App ID"
  19. #define MIMI_SECRET_FEISHU_APP_SECRET "你的飞书应用App Secret"
  20. // --- 可选功能 ---
  21. // 搜索功能
  22. #define MIMI_SECRET_SEARCH_KEY "你的Tavily搜索密钥"
  23. // 代理设置 (国内用户访问Telegram等服务时可能需要)
  24. #define MIMI_SECRET_PROXY_HOST "你的代理服务器地址"
  25. #define MIMI_SECRET_PROXY_PORT "你的代理端口"
复制代码


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-4-26 17:38:56

【花雕】嵌入式AI Agent机器人:硬件小车与部署MimiClaw

## 第四步:编译与烧录

1、编译项目

  1. idf.py build
复制代码

首次编译时间较长,请耐心等待。如果不想每次都从头编译,可跳过 fullclean。

2、将开发板连接到电脑

使用准备好的数据线将ESP32-S3开发板连接至电脑。

3、烧录固件

  1. # 将 /dev/ttyUSB0 替换为你的开发板实际串口号(可通过 ls /dev/tty* 查看,macOS为/dev/cu.*,Windows为COMx等)
  2. idf.py -p /dev/ttyUSB0 flash
复制代码


4、烧录完成后,开发板可能会自动重启。

5、成功部署MimiClaw的串口返回情况

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图1


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-4-26 18:08:45

【花雕】嵌入式AI Agent机器人:硬件小车与部署MimiClaw

## 第五步:启动验证与运行

通过超级终端直接交互
在 mimi> 提示符下可以输入命令:

1、help – 查看所有命令

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图2

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图1

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-4-26 18:20:51

【花雕】嵌入式AI Agent机器人:硬件小车与部署MimiClaw

2、config_show – 查看当前配置

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图1


配置项解读
WiFi 就绪:设备记住了你的 Wi-Fi zhz3,密码也存好了。[build] 意味着它是编译时写进去的,而不是运行中修改的。

模型已切换:这一行 Model: deepseek-chat [NVS] 非常关键。

它证实了你刚才的 set_model 命令不仅生效了,而且已经被保存到了设备内部的 NVS 永久存储区。

即使今天拔电重启,它依然会默认尝试使用 DeepSeek 模型,而非你代码里原本默认的那个。

提供者关系:Provider: openai [build] 说明虽然模型名是 deepseek-chat,但你的 MimiClaw 会把它当成一个兼容 OpenAI 接口的模型来处理。这恰好是调用 DeepSeek 的正确姿势,无需额外改动。

其他空项:Telegram Bot Token 和搜索服务暂时空着,这完全没问题。因为你正在使用飞书通道,所以不需要 TG。搜索也是可选的增强功能,不影响核心对话和机器人控制。

3、实验场景图

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图2

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-4-27 07:29:04

【花雕】嵌入式AI Agent机器人:MimiClaw 的架构与主程序...

## 第三部分,MimiClaw 的架构与主程序概览

这是官方给出的一张手绘架构图


【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图1


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-4-27 07:42:03

【花雕】嵌入式AI Agent机器人:MimiClaw 的架构与主程序...

## 一、为什么你需要懂它的结构?

如果你的目标是让机器人真正理解你、记住你、自主行动,那你迟早要面对代码,进行符合实际使用场景的二次开发。好在 MimiClaw 并没有把复杂性隐藏在黑盒里,它的 mimi 像是精细编排的交响乐,每个函数都承载着一个明确的设计意图。

从之前系列测试与实验中,遇到的飞书连接成功、电机控制正常,再到调用 deepseek-chat 模型时因证书验证失败引发的系统重启,这些经验都指向同一个事实:架构决定了调试的方向。现在我们就结合架构图与 mimi.c 的源码,对 MimiClaw 进行一次彻底的解剖。

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图1

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-4-27 08:45:42

【花雕】嵌入式AI Agent机器人:MimiClaw 的架构与主程序...

## 二、整体架构:四个层次,一个大脑

MimiClaw 的系统可划分为清晰的四层,各层职责明确、协同工作,共同构成机器人的完整“生命体”:

1. 通道层 — 耳朵与嘴巴
Telegram、WebSocket(含飞书)是消息的核心入口。所有用户发送的指令(如“你好[握手]”)都将通过这里进入系统,并送入消息队列排队,等待后续处理,是机器人与外界交互的“桥梁”。

2. 智能体核心 — 大脑的思考与决策
这是 MimiClaw 最核心、最精彩的部分。Agent Loop 作为系统的“心跳”,持续从消息总线拉取消息,结合记忆(SOUL.md、MEMORY.md 等)和可用的技能/工具,判断是直接回答用户指令,还是调用云端 LLM 生成响应,最终将回复推回消息总线。

Tool Registry(工具注册表)中注册了 25 个实用工具,涵盖 LED 控制、电机驱动、文件读写、定时任务等,这些工具相当于机器人的“手和脚”,让思考决策能够转化为实际动作。

3. 增强模块 — 让感官更丰富
该模块为机器人赋予了物理感知能力,使其不再只是对话框中的文字,而是一个有“感知”的物理存在:IMU(惯性测量单元)用于感知设备的摇动、倾角;RGB LED 用于展示系统状态和“情绪”;物理按钮可实现紧急打断或模式切换,提升交互的便捷性和安全性。

4. 存储层 — 记忆的根
存储层是机器人“记忆”的载体,保障数据不丢失:SPIFFS 文件系统存放在 16MB Flash 中,用于存储人格定义、对话历史、技能脚本等核心数据;NVS(非易失性存储)用于保存 Wi-Fi 密码和运行时修改的配置(如通过 set_model deepseek-chat 写入的模型配置)。即使设备意外断电,记忆和配置也能完整保留。

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-4-27 08:49:43

【花雕】嵌入式AI Agent机器人:MimiClaw的架构与主程序...

## 三、mimi() 源码全解:一场精心编排的启动舞步

MimiClaw 主程序 mimi.c 源代码如下:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "freertos/FreeRTOS.h"
  4. #include "freertos/task.h"
  5. #include "esp_log.h"
  6. #include "esp_event.h"
  7. #include "esp_system.h"
  8. #include "esp_heap_caps.h"
  9. #include "esp_spiffs.h"
  10. #include "nvs_flash.h"
  11. #include "mimi_config.h"
  12. #include "bus/message_bus.h"
  13. #include "wifi/wifi_manager.h"
  14. #include "telegram/telegram_bot.h"
  15. #include "llm/llm_proxy.h"
  16. #include "agent/agent_loop.h"
  17. #include "memory/memory_store.h"
  18. #include "memory/session_mgr.h"
  19. #include "gateway/ws_server.h"
  20. #include "cli/serial_cli.h"
  21. #include "proxy/http_proxy.h"
  22. #include "tools/tool_registry.h"
  23. #include "display/display.h"
  24. #include "buttons/button_driver.h"
  25. #include "ui/config_screen.h"
  26. #include "imu/imu_manager.h"
  27. #include "rgb/rgb.h"
  28. #include "skills/skill_loader.h"
  29. static const char *TAG = "mimi";
  30. static esp_err_t init_nvs(void)
  31. {
  32.     esp_err_t ret = nvs_flash_init();
  33.     if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
  34.         ESP_LOGW(TAG, "NVS partition truncated, erasing...");
  35.         ESP_ERROR_CHECK(nvs_flash_erase());
  36.         ret = nvs_flash_init();
  37.     }
  38.     return ret;
  39. }
  40. static esp_err_t init_spiffs(void)
  41. {
  42.     esp_vfs_spiffs_conf_t conf = {
  43.         .base_path = MIMI_SPIFFS_BASE,
  44.         .partition_label = NULL,
  45.         .max_files = 10,
  46.         .format_if_mount_failed = true,
  47.     };
  48.     esp_err_t ret = esp_vfs_spiffs_register(&conf);
  49.     if (ret != ESP_OK) {
  50.         ESP_LOGE(TAG, "SPIFFS mount failed: %s", esp_err_to_name(ret));
  51.         return ret;
  52.     }
  53.     size_t total = 0, used = 0;
  54.     esp_spiffs_info(NULL, &total, &used);
  55.     ESP_LOGI(TAG, "SPIFFS: total=%d, used=%d", (int)total, (int)used);
  56.     return ESP_OK;
  57. }
  58. /* Outbound dispatch task: reads from outbound queue and routes to channels */
  59. static void outbound_dispatch_task(void *arg)
  60. {
  61.     ESP_LOGI(TAG, "Outbound dispatch started");
  62.     while (1) {
  63.         mimi_msg_t msg;
  64.         if (message_bus_pop_outbound(&msg, UINT32_MAX) != ESP_OK) continue;
  65.         ESP_LOGI(TAG, "Dispatching response to %s:%s", msg.channel, msg.chat_id);
  66.         if (strcmp(msg.channel, MIMI_CHAN_TELEGRAM) == 0) {
  67.             telegram_send_message(msg.chat_id, msg.content);
  68.         } else if (strcmp(msg.channel, MIMI_CHAN_WEBSOCKET) == 0) {
  69.             ws_server_send(msg.chat_id, msg.content);
  70.         } else if (strcmp(msg.channel, MIMI_CHAN_SYSTEM) == 0) {
  71.             ESP_LOGI(TAG, "System message [%s]: %.128s", msg.chat_id, msg.content);
  72.         } else {
  73.             ESP_LOGW(TAG, "Unknown channel: %s", msg.channel);
  74.         }
  75.         free(msg.content);
  76.     }
  77. }
  78. void app_main(void)
  79. {
  80.     /* Silence noisy components */
  81.     esp_log_level_set("esp-x509-crt-bundle", ESP_LOG_WARN);
  82.     ESP_LOGI(TAG, "========================================");
  83.     ESP_LOGI(TAG, "  MimiClaw - ESP32-S3 AI Agent");
  84.     ESP_LOGI(TAG, "========================================");
  85.     /* Print memory info */
  86.     ESP_LOGI(TAG, "Internal free: %d bytes",
  87.              (int)heap_caps_get_free_size(MALLOC_CAP_INTERNAL));
  88.     ESP_LOGI(TAG, "PSRAM free:    %d bytes",
  89.              (int)heap_caps_get_free_size(MALLOC_CAP_SPIRAM));
  90.     /* Display + input */
  91.     ESP_ERROR_CHECK(display_init());
  92.     display_show_banner();
  93.     ESP_ERROR_CHECK(rgb_init());
  94.     rgb_set(255, 0, 0);
  95.     button_Init();
  96.     config_screen_init();
  97.     imu_manager_init();
  98.     imu_manager_set_shake_callback(config_screen_toggle);
  99.     /* Phase 1: Core infrastructure */
  100.     ESP_ERROR_CHECK(init_nvs());
  101.     ESP_ERROR_CHECK(esp_event_loop_create_default());
  102.     ESP_ERROR_CHECK(init_spiffs());
  103.     /* Initialize subsystems */
  104.     ESP_ERROR_CHECK(message_bus_init());
  105.     ESP_ERROR_CHECK(memory_store_init());
  106.     ESP_ERROR_CHECK(skill_loader_init());
  107.     ESP_ERROR_CHECK(session_mgr_init());
  108.     ESP_ERROR_CHECK(wifi_manager_init());
  109.     ESP_ERROR_CHECK(http_proxy_init());
  110.     ESP_ERROR_CHECK(telegram_bot_init());
  111.     ESP_ERROR_CHECK(llm_proxy_init());
  112.     ESP_ERROR_CHECK(tool_registry_init());
  113.     ESP_ERROR_CHECK(cron_service_init());
  114.     ESP_ERROR_CHECK(heartbeat_init());
  115.     ESP_ERROR_CHECK(agent_loop_init());
  116.     /* Start Serial CLI first (works without WiFi) */
  117.     ESP_ERROR_CHECK(serial_cli_init());
  118.     /* Start WiFi */
  119.     esp_err_t wifi_err = wifi_manager_start();
  120.     if (wifi_err == ESP_OK) {
  121.         ESP_LOGI(TAG, "Scanning nearby APs on boot...");
  122.         wifi_manager_scan_and_print();
  123.         ESP_LOGI(TAG, "Waiting for WiFi connection...");
  124.         if (wifi_manager_wait_connected(30000) == ESP_OK) {
  125.             ESP_LOGI(TAG, "WiFi connected: %s", wifi_manager_get_ip());
  126.             /* Start network-dependent services */
  127.             ESP_ERROR_CHECK(telegram_bot_start());
  128.             ESP_ERROR_CHECK(agent_loop_start());
  129.             cron_service_start();
  130.             heartbeat_start();
  131.             ESP_ERROR_CHECK(ws_server_start());
  132.             /* Outbound dispatch task */
  133.             xTaskCreatePinnedToCore(
  134.                 outbound_dispatch_task, "outbound",
  135.                 MIMI_OUTBOUND_STACK, NULL,
  136.                 MIMI_OUTBOUND_PRIO, NULL, MIMI_OUTBOUND_CORE);
  137.             ESP_LOGI(TAG, "All services started!");
  138.         } else {
  139.             ESP_LOGW(TAG, "WiFi connection timeout. Check MIMI_SECRET_WIFI_SSID in mimi_secrets.h");
  140.         }
  141.     } else {
  142.         ESP_LOGW(TAG, "No WiFi credentials. Set MIMI_SECRET_WIFI_SSID in mimi_secrets.h");
  143.     }
  144.     ESP_LOGI(TAG, "MimiClaw ready. Type 'help' for CLI commands.");
  145. }
复制代码


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-4-27 08:52:50

【花雕】嵌入式AI Agent机器人:MimiClaw的架构与主程序...

完整的 mimi.c 本质上是上述架构图的线性实现,这里将其拆分为 5 个有明确意图的启动阶段,清晰看懂机器人的“启动逻辑”。

阶段一:硬件感官就绪 —— Wi-Fi 未连,感官先活
  1. display_init(); display_show_banner();   // 屏幕亮起,打出 Logo
  2. rgb_init(); rgb_set(255, 0, 0);          // 红灯:系统启动中
  3. button_Init();                           // 物理按钮就绪
  4. imu_manager_init();                      // 运动传感器开始工作
  5. imu_manager_set_shake_callback(config_screen_toggle); // 摇一摇切配置页
复制代码

这 5 行代码蕴含着重要的设计理念:机器人应像生物一样,即使“大脑”(联网功能)尚未上线,感官和基础反射也要先正常工作。在烧录固件后等待 Wi-Fi 连接的几十秒内,设备会通过红灯和屏幕向用户传递“正在启动、正常运行”的信号,提升用户体验。

阶段二:基础地基 —— 搭建系统骨架
  1. init_nvs();                        // 1. 键值库:记住你的 ApiKey
  2. esp_event_loop_create_default();   // 2. 事件循环:组件间的邮局
  3. init_spiffs();                     // 3. 文件系统:灵魂和记忆的硬盘
复制代码

这三步是整个系统的“骨架”,缺一不可:没有 NVS,Wi-Fi 密码每次重启都需重新输入;没有事件循环,飞书 WebSocket 无法实现异步通信;没有 SPIFFS,SOUL.md 等核心文件无处存放,机器人也就没有了“灵魂”和“记忆”。

阶段三:大脑初始化 —— 服务全部“插上电”
  1. message_bus_init();      // 神经:消息总线
  2. memory_store_init();     // 记忆:加载 MEMORY.md 等
  3. skill_loader_init();     // 技能:加载可热插拔的扩展
  4. session_mgr_init();      // 会话:管理多轮对话上下文
  5. // ...
  6. llm_proxy_init();        // LLM 代理:包装 API 调用
  7. tool_registry_init();    // 工具:注册 25 个执行函数
  8. cron_service_init();     // 定时:计划任务
  9. heartbeat_init();        // 心跳:存活报告
  10. agent_loop_init();       // 主循环:Agent 决策任务
复制代码

注意此处仅执行“初始化(init)”,未执行“启动(start)”。这种“初始化与启动分离”的设计,使得系统可在离线状态下完成所有核心组件的初始化,待 Wi-Fi 就绪后,再一键启动所有依赖网络的功能,提升系统灵活性。

阶段四:离线先行,在线随后 —— 鲁棒性的核心
  1. serial_cli_init();  // 串口 CLI 立刻开启,你随时可以插 USB 调试
  2. if (wifi_manager_wait_connected(30000) == ESP_OK) {
  3.     // 联网成功后,才启动这些需要网络的服务
  4.     telegram_bot_start();
  5.     agent_loop_start();
  6.     cron_service_start();
  7.     heartbeat_start();
  8.     ws_server_start();
  9.     // 创建出站派发任务,把回复正确地送回给你
  10.     xTaskCreatePinnedToCore(outbound_dispatch_task, ...);
  11. }
复制代码

这是 MimiClaw 鲁棒性设计的核心:即使联网失败(如之前遇到的 TLS 崩溃),串口 CLI 依然可用,Wi-Fi AP 热点也能正常工作,不会出现“彻底死机”的情况。这种“离线底座”设计,为系统设置了不可突破的底线,确保调试和基础操作始终可用。

阶段五:双核任务分配 —— 高效协同,避免卡顿
ESP32-S3 拥有两个 CPU 核,MimiClaw 对双核进行了合理分工,保障核心功能的流畅性:
- Core 0:运行 Wi-Fi 协议栈、LWIP、飞书 WebSocket 客户端的网络 I/O 以及串口 CLI,负责“对外通信”和“基础调试”。
- Core 1:运行 Agent 决策循环和消息派发任务,负责“核心思考”和“动作执行”。

这种分工确保了对话响应和电机控制不会被网络波动卡住,因为最核心的智能体决策的运行环境是独立的,不受网络组件的干扰。

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-4-27 09:04:24

【花雕】嵌入式AI Agent机器人:MimiClaw的架构与主程序...

本帖最后由 驴友花雕 于 2026-4-28 09:03 编辑

## 四、从调试经验回看架构

之前遇到的 TLS 错误,恰好印证了架构设计的合理性,也让我们更深刻地理解了各模块的关联:

  1. E (1291766) esp-tls-mbedtls: Failed to set client configurations
  2. Guru Meditation Error: Core  1 panic'ed (IllegalInstruction)
复制代码


该错误证实了架构图中 LLM Proxy 模块直接依赖 mbedTLS 组件,而错误的根源是 menuconfig 中未开启 TLS server verification。当我们理解了 llm_proxy_init() 与 SSL 库的关联后,修复这类问题就不再是盲目搜索,而是有明确方向的配置检查。

同样,飞书消息“Message from ou_... : 你好[握手]”能被成功处理,正是 outbound_dispatch_task 从消息总线取到回复后,根据 channel 字段正确路由回飞书的结果,这也体现了消息总线和出站派发任务的协同作用。


## 五、给你的动手路线图

在拥有可正常运行的设备、看懂系统架构后,可通过以下实践内化理解,二次开发亲手改造 MimiClaw:

1. 离线模式实验
故意留空 Wi-Fi 密码,刷入固件后观察:红灯是否正常亮起?屏幕是否有显示?串口 CLI 可输入哪些命令?通过该实验,能真切体会 MimiClaw“不联网也能正常工作”的架构优势。

2. “摇一摇”触发配置切换
拿起开发板快速晃动(需连接 IMU 和屏幕),观察配置页面是否会切换。config_screen_toggle 回调函数,正是架构图中“IMU → User Interface”这条交互链路的具体实现。

3. 写一个自定义技能
在 skills/ 目录下模仿已有 .c 文件,编写一个“情绪灯”技能,实现 skill_init(初始化)、skill_execute(执行)、skill_deinit(销毁)三个核心函数,再将其注册到 skill_loader 中。无需修改框架其他代码,即可为机器人新增一种行为。

4. 调校机器人的灵魂
通过串口 CLI 或直接编辑 SPIFFS 中的 SOUL.md 文件,定义机器人的人格。例如设置“用喵星人口吻回答,句尾必须加上‘咔嚓咔嚓’”,几分钟后,一个符合你预期人设的机器人就会诞生。

5. 纯本地闭环
假如编写一个 FreeRTOS 任务,每秒检查一次温度传感器数值。若温度超过 28°C 且 Agent 当前未处于移动状态,则直接驱动风扇。这是真正端侧智能的雏形,响应延迟可控制在毫秒级。


## 结语

MimiClaw 的真正价值,不在于它能让 ESP32 发出一条消息,而在于它提供了一个轻量、模块化、可离线的 AI Agent 开发底座。理解它的四层架构和启动流程,就相当于拿到了这个底座的“说明书”,从此可以尝试地添加传感器、执行器与大模型,而不会破坏系统原有的智能结构。

“迷你小龙虾”已经活了,它有了心跳、眼睛和手脚。接下来要做的,就是按照设想,逐步进行二次开发,一点一点教会它如何感知世界、如何自主行动。

【花雕】嵌入式AI Agent 机器人:硬件小车、部署和主架构图1

附录 MimiClaw 的架构与主程序概览相关参考资料
1、《【花雕动手做】全球首款 MCU 级 AI 智能体开盒:MimiClaw 架构全解析,把 “智能龙虾” 跑在 ESP32 上》
https://blog.csdn.net/weixin_41659040/article/details/159711424
2、《【花雕动手做】 AI 迷你小龙虾(MimiClaw)主程序:综合分析 + 深度解读 + 总体功能》
https://blog.csdn.net/weixin_41659040/article/details/159758142
3、《【花雕动手做】打破AI轻量化极限!MimiClaw:国产EP32S3 芯片上跑的纯C轻量AI Agent》
https://blog.csdn.net/weixin_41659040/article/details/152157480
4、《【花雕动手做】MimiClaw 嵌入式AI Agent系统架构剖析——基于FreeRTOS的多线程通信与外设协同机制》
https://blog.csdn.net/weixin_41659040/article/details/160352124

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail