
Echo: AI桌面机器人 / RV1106开发板
简介
这是一个十分硬核,功能超多的AI桌面机器人。有LVGL菜单,可以陪你聊天,翻译,看天气,能跑AI相机,是基于RV1106的小巧的linux开发板~
简介:这是一个十分硬核,功能超多的AI桌面机器人。有LVGL菜单,可以陪你聊天,翻译,看天气,能跑AI相机,是基于RV1106的小巧的linux开发板~开源协议
:CC BY-NC-SA 4.0
(未经作者授权,禁止转载)描述
AI桌面机器人
Echo-Mate
📒 简介
这可能是你见过最硬核,功能最全的AI桌面机器人~
功能超多,复刻轻松,超级适合入门学习的Linux开发板~
如果深入学习,可以掌握的知识如下:
🤖 功能展示
部分界面展示如下(功能太多就不全部展示了):
📁 系统组成
系统框图如下图所示,主控芯片RV1106,SDK使用的更改的luckfox-pico的SDK,图形库使用的LVGL。WIFI使用的SDIO接口,使用的RTL8723BS;屏幕使用的2.4寸触摸屏,存储介质可以自行选择使用SD卡或者板上的NAND Flash。具体的内容详见原理图。
📑 功能说明
各个历史版本实现的功能如下表所示:
- LCD使用的2.4寸屏幕,SPI ST7789V,触摸为IIC FT6336U,触摸屏幕型号为
P024C128-CTP; - LVGL菜单可以自行按照仓库代码的范式自行添加内容;
- 小电视功能暂时就只是一个ffmpeg的一个演示;
- 游戏参考延续了OV-Watch智能手表的一些游戏的逻辑;
- AI聊天采用websocket与服务器(你的电脑),进行通信,由于RV1106是单核A7算力不够,所以AI聊天的相关模型推理等放到了
Server端,详细见Server端的Python代码,当然,为了照顾不想搭建环境的同学,打包好了一个Server的exe可执行文件,可以自行下载到window电脑运行,作为服务器; - 意图理解,这个是用谷歌的
FastText模型进行文字的分类任务,还是深度学习那一套; - 供电暂时只有TypeC供电,后续可加入电池提高空间自由度
🔨 硬件介绍
Echo-Mate的核心板,硬件框图如下所示:
具体的细节这里不做赘述,详见工程的原理图和PCB。原理图很多地方就是参考RV1106的官方设计手册等资料进行的外围电路设计,如果不想做驱动板不想打外壳,直接打这个RV1106核心板,在核心板上做开发也是可以的。
注意,硬件例如CSI摄像头等地方,需要差分走线,详见PCB的网络差分对。
Echo-Mate AI桌面机器人的“腿”,也就是电机驱动板,使用TC118S驱动减速电机,逻辑比较简单,这里也不再过多赘述。
💻 软件介绍
-
工程的软件框架介绍
Echo-Mate的软件框架如下图所示,
Middleware用到较多的包,在仓库的buildroot默认设置已经设置好了,如果需要加库请自行操作。这里只对大概框架进行说明,具体的代码细节需要在仓库中自行学习。仓库中都写有
README,有详细的如何编译,如何烧录,请仔细看!
- UI层使用
LVGL,PageManager仍然使用栈,进行多页面的管理,相比之前的OV-Watch手表项目,这个项目中的PageManager更加完善,可以直接使用char字符来注册和查询页面,相比直接用变量更加方便管理,开源界面空间有限不过多赘述。详细可以到手册或者代码去看。 - UI层中,创建APP的逻辑就是,进入页面后,开启一个线程运行APP,主线程还是UI线程,详细内容见仓库代码,例如:
// 创建并初始化Application对象 void* create_aichat_app(const char* address, int port, const char* token, const char* deviceId, const char* aliyun_api_key, int protocolVersion, int sample_rate, int channels, int frame_duration) { auto* app = new Application(std::string(address), port, std::string(token), std::string(deviceId), std::string(aliyun_api_key), protocolVersion, sample_rate, channels, frame_duration); return static_cast(app); } int start_ai_chat(const char* address, int port, const char* token, const char* deviceId, const char* aliyun_api_key, int protocolVersion, int sample_rate, int channels, int frame_duration) { .....省略此处..... pthread_mutex_lock(&running_mutex); // 创建应用 app_instance = create_aichat_app(address, port, token, deviceId, aliyun_api_key, protocolVersion, sample_rate, channels, frame_duration); pthread_mutex_unlock(&running_mutex); .....省略此处..... return 0; } - 业务层,就是这些APP的实际实现的具体功能了,例如UI中AI Chat聊天APP的功能,或者AI相机,yolov5的推理,这些运行的结果可以在UI层进行显示,即UI层与具体业务层进行交互。
- DeskBot_demo的目录结构说明
DeskBot_demo/ ├── bin/ # 可执行文件 ├── build/ # build缓存 ├── common/ # 通用层 │ ├── sys_manager/ # 开发板硬件对应的管理 │ └── xxx_manager/ # xxx对应的管理 ├── conf/ # 系统设置 ├── gui_app/ # UI层的软件 │ ├── common/ # UI层扩展lib │ ├── font/ # UI字体 │ ├── images/ # UI图片 │ ├── pages/ # UI层主要pages │ └── ui.c/h # ├── lvgl/ # lvgl核心组件 ├── utils # 其他 ├── lv_conf.h # lvgl设置 └── main.c
- UI层使用
-
AI Chat聊天原理介绍
AI Chat的原理图如下图所示。
snowboy在开发板部署,作热词唤醒;FSMN-VAD模型实现语音活动端点识别;SenceVoice作语音转文字ASR;CosyVoice作文字转语音TTS;FastText作意图识别,即做文本的多分类任务,后续意图识别改为了MCP,进行function call,即大模型直接输出意图相关的内容(json),再进行解释执行即可。为什么不参考小爱同学使用
bert进行分类任务, 是因为bert要针对特定任务做微调,我电脑有点带不动>.< 。注意:这些模型都是在你的电脑运行的,相当于你的电脑作为服务器。
由于RV1106开发板是单核A7的,算力不是很够,没有办法在本地运行
sherpa-onnx或sherpa-ncnn,会导致无法实时的进行语音识别,之前为了实现本地ASR,试过运行模型zipformer,RTF(Real-Time Factor)非常高,都超过1了,完全无法实现实时的语音识别,所以本地部署方案直接否决。
因此采用如下图所示的方法,电脑端(或者你有其他好的做服务器也行)作为服务器
Server,开发板作为Client。具体的websocket的数据传输协议详见手册或者github中的AIchat_demo说明。
除了
CosyVoice和DeepSeek,其他模型都是部署到电脑本地,为了照顾没有GPU的同学,Server中的的生成式模型,CosyVoice和DeepSeek,调用的API,因为没有卡想要效果好就很慢。当然有GPU的同学有卡的同学,可以完全实现部署到电脑本地~AI Chatclient端的具体的状态机转换如下图所示:
意图识别目前已经从FastText更换至MCP和function call,在开发板端,只需要向服务器注册function就可以了,例如在开发板上注册机器人移动的意图:
void IntentsRegistry::RegisterAllFunctions(IntentHandler& intent_handler) { // 注册机器人移动相关的函数 intent_handler.RegisterFunction("robot_move", RobotMove::Move); // 如果有其他功能模块,可以在这里继续注册 // intent_handler.RegisterFunction("audio_play", AudioControl::Play); } Json::Value IntentsRegistry::GenerateRegisterMessage() { Json::Value message; message["type"] = "functions_register"; // 添加 robot_move 的元信息 Json::Value robot_move; robot_move["name"] = "robot_move"; robot_move["description"] = "让机器人运动"; // 添加多个 arguments Json::Value arguments; arguments["direction"] = "字符数据,分别有forward,backward,left和right"; arguments["speed"] = "整数数据,表示运动速度"; arguments["duration"] = "浮点数,表示运动持续时间(秒)"; robot_move["arguments"] = arguments; // 将 robot_move 添加到 functions 数组中 message["functions"].append(robot_move); return message; }然后按照上述例子再自行完善
RobotMove::Move这个函数即可了,十分方便~ -
智能相机YOLO Camera原理介绍
这里的YOLO相机为了方便直接使用的
nihui大佬的OpenCV-Mobile, 使用 opencv-mobile 捕获摄像头图像的方式较为方便,但是失去了 VI 组件和 VPSS 组件的硬件加速,在性能上有明显损失,如果想要帧率更高,可以基于VI, VPSS进行图像捕获。
我已经编译好了适配Echo开发板的opencv-mobile包(与luckfox-pico相同,只是白名单需要改一下然后重新编译),可以直接拿去使用,这里不再赘述,东西太多了。
YOLO相机具体实现的流程如下图(参考
Luckfox-pico例程):
-
其他原理介绍
更多软件细节,请到代码仓库中自行学习。例如:基本的数据结构堆栈链等,通信协议,C++状态机,C++设计模式,多线程管理,如何部署RKNN调用NPU,如何进行数据处理与模型训练等等。
注意:天气和自动获取时间需要连接WIFI,地理地区对应的adcode城市代码已经放在附件的excel表中。
🔨 3D打印外壳介绍
可以直接拿到打包好的文件进行光固化打印即可,直接在立创3D打印下单,外壳的配件和组装好的图片如下所示:
📥 复刻指南
-
需要的物料如下:
- Echo核心板(BOM参见原理图,注意WIFI模块是
RTL8723BS模块) - 3D打印外壳(去立创3D打印即可,注意主动轮和从动轮,都要打两份)
- 焊接工具,焊接软线等
- 螺丝螺母若干, 马达,双面胶等,详见附件
配件表pdf
- Echo核心板(BOM参见原理图,注意WIFI模块是
-
复刻需要的开发环境如下:
- windows电脑一台
- USB连接线
- SD卡, 读卡器
- usb转ttl串口模块
- RK瑞芯微驱动助手
- RK瑞芯微烧录工具
- MobaXterm
-
深入学习需要的开发环境如下:
- Ubuntu22.04
- python环境(python=3.10)
- 以及带脑子,会查资料~
这里会简单说明一些固件烧录和程序执行,详细内容见手册。
-
固件烧录:
附件中上传了SD卡上的buildroot固件,由于只能上传50M的包,所以将多个part01-03全选然后解压缩即可。以下是简易的烧录示意:
首先格式化SD卡(可以使用SD Card formatter),然后使用RK瑞芯微烧录工具进行烧录,烧好插上开发板即可。注意,使用SD卡作为存储介质启动,需要保证NAND Flash为空内容!
NAND FLASH的烧录和擦除方法可以详见手册。
-
开发板使用:
- 登录,可以使用串口登录和SSH登录(USB虚拟网卡)
- WIFI连接,时区设置, 文件传输等,详见手册
- 默认登录用户和密码为:
登录账号: root 登录密码: root -
程序执行:
首先解压附件中的bin.rar,然后把bin文件夹传到开发板中,然后vi更改system_para.conf, 需要更改AI_Chat_Server地址为同网络下运行server的电脑地址,可通过ipconfig命令查看,开发板和电脑互ping一下就知道了;
还需要更改高德的api_key,用于访问天气;以及需要更改阿里云百炼的api_key。这两个key都需要注册一下,应该都是个人用户免费的。
想要正常访问天气等,需要连接WIFI哦,连接WIFI的指令可以看手册,或者网上搜~
然后再进入
bin文件夹内,执行main即可,注意必须进入bin文件夹中执行,因为有各种文件依赖:cd ./bin chmod +x ./main ./main
如果想要正常运行聊天功能,还需要在电脑上运行
Server服务,如果有python环境的可以参考仓库按照Server环境搭建与运行搭建环境然后运行即可。ctrl+C可中断程序.python ./main.py --access_token="123456"
如果不想搭建环境不想用python,这里也打包好了
.exe可执行文件(有点大2个G),直接运行即可,运行方式如下:
解压完AiChatServer-Win-exe-V1.0.rar, 进入main文件夹,然后在这个文件中进入cmd,运行即可.ctrl+双击C可中断程序..\main.exe --access_token="123456"
Server打包好的exe百度网盘:
AiChatServer-Win-exe-V1.1.rar网盘链接: https://pan.baidu.com/s/1_s_79DHZS9EZjnfybqlNJw?pwd=r7f7 提取码: r7f7 -
3D外壳装配:
详见附件的复刻视频或者B站视频~
📑 课后作业
有能力的同学可以完成以下作业,我会大致给出解决的方向:
- 整体:熟悉整个工程包括软件和硬件 (基本项)
- 硬件:自行更改核心板,加入
EMMC作为存储介质 (困难) - 软件:在LVGL菜单添加一个简单的
APP,例如定时器, 可以参考之前手表项目的逻辑实现 (简单) - 软件:不使用
Opencv-mobile, 使用VI,VPSS组件进行捕获图形, 试下提高帧率 (中等) - 软件:在
意图识别中加入一个意图分类,例如增减屏幕亮度(中等)
(目前有的意图只有: 前后左右运动,以及对话结束说拜拜) - 驱动:是否可以实现
DRM驱动ST7789V屏幕,目前使用的fb,可以参考网上的tinydrm的移植 (困难) - 驱动:修改设备树,使能和禁止蓝色的LED (简单)
- 驱动:加入OV2685 (困难)
- 其他...
🔗 参考资料
[1] luckfox rkmpi学习指南
[2] 新一代kaldi(k2-fsa)sherpa-onnx
[3] FunASR
[4] SenceVoice
[5] SenceVoice论文
[6] CosyVoice
[7] FastText
[8] OpenCV-Mobile
[8] 小智ESP32
⚠️ 注意事项
- WIFI模块别搞错了,是RTL8723BS模块!
- 如果想要学习开发,请在ubuntu虚拟机上下拉仓库学习!
- 层叠结构,免费的7628,免费的20%阻抗
- WIFI的天线购买立创的 AIWF022 即可,WIFI7 内置FPC天线 2.4G&5.8G双频PCB柔性天线
- 屏幕型号是淘宝浦洋的:P024C128-CTP触摸屏
- 软件请以仓库和手册为准,硬件以立创开源平台的PCB为准!
- 最新SD卡固件和NAND固件,请到手册中下载,立创不一定上传的最新的!
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。










