四博 AI-S3 双目交互终端开发方案:ESP32-S3 + VB6824 + 双目动画 + 触控/姿态/震动闭环
1. 项目概述
四博 AI-S3 双目是一套面向 AI 桌面宠物、AI 陪伴机器人、AI 学习助手、AI 玩具和品牌 IP 互动终端的嵌入式 AI 硬件方案。它不是简单的"双屏显示眼睛",而是以 ESP32-S3 主控 + 双目 LCD + VB6824 语音芯片 + 四路触控 + 震动马达 + 姿态传感器 + 云端 AI 智能体 组成的一套完整交互系统。
从硬件资料看,四博 AI-S3 双目双屏方案采用 ESP32S3R8 + 16M Flash + VB6824 ,配备 1.28 寸 LCD 显示屏 ×2、主板、麦克风、喇叭和线材,可选小智、豆包、ChatGPT 等主流大模型,并支持全开源和二次开发。
四博 AI 开发宝典中也说明,AI-S3 双目硬件包含两块屏幕、主板、外壳等组件,主板内置小智智能体,支持 2.4G Wi-Fi,同时也可以扩展 4G 模组,屏幕支持 0.71 寸和 1.28 寸规格。
本文从工程实现角度,给出一套更接近量产项目的实现框架。
2. 整体硬件架构
┌──────────────────────────────────────┐
│ 四博 AI-S3 双目终端 │
├──────────────────────────────────────┤
│ 主控:ESP32-S3R8 / ESPS3-32 N16R8 │
│ 显示:0.71 / 1.28 寸双目 LCD │
│ 语音:VB6824 离线唤醒 / AEC / 命令词 │
│ 交互:四路触控感应 │
│ 反馈:震动马达 │
│ 姿态:三轴加速度计 / 六轴 IMU 可选 │
│ 音频:麦克风 + 喇叭 + 功放 │
│ 联网:Wi-Fi + BLE,小程序配网 │
│ AI:小智 / 豆包 / ChatGPT / 私有大模型 │
└──────────────────────────────────────┘
四博模组选型手册中,ESPS3-32 系列包含 N4、N8、N8R2、N16R2、N16R8 等多个子型号,芯片覆盖 ESP32-S3、ESP32-S3R2、ESP32-S3R8,并兼容 ESP32-S3-WROOM-1 系列模组,适合做音视频和 AI 类硬件。
3. 软件架构设计
建议采用 事件驱动 + 状态机 + 独立任务 的结构,而不是把所有逻辑写在一个 while(1) 里。
Application Layer
├── AI 对话
├── 表情状态机
├── 触摸交互
├── 姿态交互
├── 震动反馈
└── OTA / 小程序配置
Service Layer
├── Eye Engine
├── Touch Manager
├── IMU Manager
├── Haptic Manager
├── Voice Manager
├── AI WebSocket Client
└── Config Sync
Driver Layer
├── LCD Driver
├── GPIO Touch
├── LEDC Motor
├── I2C IMU
├── UART VB6824
└── Wi-Fi / BLE
工程目录建议:
sibo_ai_s3_eye/
├── main/
│ ├── app_main.c
│ ├── board_config.h
│ ├── app_event.c
│ ├── app_event.h
│ ├── eye_engine.c
│ ├── eye_engine.h
│ ├── dual_lcd.c
│ ├── dual_lcd.h
│ ├── touch_manager.c
│ ├── touch_manager.h
│ ├── imu_manager.c
│ ├── imu_manager.h
│ ├── haptic_motor.c
│ ├── haptic_motor.h
│ ├── vb6824_voice.c
│ ├── vb6824_voice.h
│ ├── ai_ws_client.c
│ ├── ai_ws_client.h
│ ├── ai_protocol.c
│ ├── ai_protocol.h
│ └── ota_manager.c
├── components/
│ ├── lcd_driver/
│ ├── audio_player/
│ ├── json_helper/
│ └── storage/
├── partitions.csv
└── sdkconfig.defaults
4. board_config.h
#pragma once
#include "driver/gpio.h"
#include "driver/uart.h"
#include "driver/i2c.h"
#include "driver/ledc.h"
#define PRODUCT_NAME "SIBO_AI_S3_EYE"
#define DEVICE_ID "SIBO_EYE_001122334455"
/* 屏幕规格 */
#define SCREEN_071 0
#define SCREEN_128 1
#define CONFIG_SCREEN_TYPE SCREEN_128
#if CONFIG_SCREEN_TYPE == SCREEN_128
#define EYE_LCD_WIDTH 240
#define EYE_LCD_HEIGHT 240
#else
#define EYE_LCD_WIDTH 160
#define EYE_LCD_HEIGHT 160
#endif
/* 左右眼 LCD */
#define LCD_LEFT_CS GPIO_NUM_10
#define LCD_LEFT_DC GPIO_NUM_11
#define LCD_LEFT_RST GPIO_NUM_12
#define LCD_LEFT_BL GPIO_NUM_13
#define LCD_RIGHT_CS GPIO_NUM_14
#define LCD_RIGHT_DC GPIO_NUM_15
#define LCD_RIGHT_RST GPIO_NUM_16
#define LCD_RIGHT_BL GPIO_NUM_17
#define LCD_SPI_MOSI GPIO_NUM_6
#define LCD_SPI_CLK GPIO_NUM_7
/* 四路触控 */
#define TOUCH_HEAD_GPIO GPIO_NUM_1
#define TOUCH_FACE_GPIO GPIO_NUM_2
#define TOUCH_CHAT_GPIO GPIO_NUM_3
#define TOUCH_BACK_GPIO GPIO_NUM_4
/* 震动马达 */
#define MOTOR_GPIO GPIO_NUM_5
#define MOTOR_PWM_TIMER LEDC_TIMER_0
#define MOTOR_PWM_CHANNEL LEDC_CHANNEL_0
#define MOTOR_PWM_FREQ 2000
/* IMU */
#define IMU_I2C_PORT I2C_NUM_0
#define IMU_I2C_SDA GPIO_NUM_8
#define IMU_I2C_SCL GPIO_NUM_9
/* VB6824 */
#define VB6824_UART UART_NUM_1
#define VB6824_TXD GPIO_NUM_18
#define VB6824_RXD GPIO_NUM_19
#define VB6824_BAUD 115200
/* AI Server */
#define AI_WS_URL "wss://ai.example.com/sibo/eye/ws"
5. 应用事件系统
AI 双目终端的输入源比较多,包括语音、触控、姿态、AI 返回、小程序配置等。统一事件总线可以让代码更清晰。
typedef enum {
APP_EVT_NONE = 0,
APP_EVT_WIFI_READY,
APP_EVT_AI_CONNECTED,
APP_EVT_AI_JSON,
APP_EVT_VOICE_WAKEUP,
APP_EVT_VOICE_CHAT,
APP_EVT_VOICE_SLEEP,
APP_EVT_TOUCH_HEAD,
APP_EVT_TOUCH_FACE,
APP_EVT_TOUCH_CHAT,
APP_EVT_TOUCH_BACK,
APP_EVT_GESTURE_SHAKE,
APP_EVT_GESTURE_LEFT,
APP_EVT_GESTURE_RIGHT,
APP_EVT_GESTURE_PICKUP,
APP_EVT_EYE_IDLE,
APP_EVT_EYE_HAPPY,
APP_EVT_EYE_THINKING,
APP_EVT_EYE_SPEAKING,
APP_EVT_EYE_SLEEPY,
APP_EVT_HAPTIC_SHORT,
APP_EVT_HAPTIC_LONG,
APP_EVT_OTA_NOTIFY,
} app_evt_id_t;
typedef struct {
app_evt_id_t id;
void *data;
size_t len;
} app_evt_t;
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
static QueueHandle_t s_app_evt_queue;
void app_event_init(void)
{
s_app_evt_queue = xQueueCreate(32, sizeof(app_evt_t));
}
bool app_event_send(app_evt_id_t id, void *data, size_t len)
{
if (!s_app_evt_queue) {
return false;
}
app_evt_t evt = {
.id = id,
.data = data,
.len = len,
};
return xQueueSend(s_app_evt_queue, &evt, pdMS_TO_TICKS(20)) == pdTRUE;
}
QueueHandle_t app_event_queue(void)
{
return s_app_evt_queue;
}
6. 双目表情引擎
6.1 表情状态定义
typedef enum {
EYE_IDLE = 0,
EYE_BLINK,
EYE_HAPPY,
EYE_THINKING,
EYE_SPEAKING,
EYE_SLEEPY,
EYE_ANGRY,
EYE_LISTENING,
} eye_state_t;
typedef struct {
eye_state_t state;
uint32_t frame;
bool mirror_right_eye;
TickType_t last_tick;
} eye_engine_t;
static eye_engine_t s_eye = {
.state = EYE_IDLE,
.frame = 0,
.mirror_right_eye = true,
};
6.2 表情切换接口
void eye_engine_set_state(eye_state_t state)
{
s_eye.state = state;
s_eye.frame = 0;
s_eye.last_tick = xTaskGetTickCount();
}
eye_state_t eye_engine_get_state(void)
{
return s_eye.state;
}
6.3 动画帧选择
static const uint16_t *eye_get_frame(eye_state_t state, uint32_t frame)
{
switch (state) {
case EYE_IDLE:
return eye_idle_frames[frame % EYE_IDLE_FRAME_COUNT];
case EYE_BLINK:
return eye_blink_frames[frame % EYE_BLINK_FRAME_COUNT];
case EYE_HAPPY:
return eye_happy_frames[frame % EYE_HAPPY_FRAME_COUNT];
case EYE_THINKING:
return eye_thinking_frames[frame % EYE_THINKING_FRAME_COUNT];
case EYE_SPEAKING:
return eye_speaking_frames[frame % EYE_SPEAKING_FRAME_COUNT];
case EYE_SLEEPY:
return eye_sleepy_frames[frame % EYE_SLEEPY_FRAME_COUNT];
default:
return eye_idle_frames[0];
}
}
6.4 30 FPS 双目刷新任务
void eye_engine_task(void *arg)
{
while (1) {
const uint16_t *frame = eye_get_frame(s_eye.state, s_eye.frame);
dual_lcd_draw_left(frame, EYE_LCD_WIDTH, EYE_LCD_HEIGHT);
if (s_eye.mirror_right_eye) {
dual_lcd_draw_right_mirror(frame, EYE_LCD_WIDTH, EYE_LCD_HEIGHT);
} else {
dual_lcd_draw_right(frame, EYE_LCD_WIDTH, EYE_LCD_HEIGHT);
}
s_eye.frame++;
if (s_eye.state == EYE_IDLE && s_eye.frame % 90 == 0) {
eye_engine_set_state(EYE_BLINK);
}
if (s_eye.state == EYE_BLINK &&
s_eye.frame >= EYE_BLINK_FRAME_COUNT) {
eye_engine_set_state(EYE_IDLE);
}
vTaskDelay(pdMS_TO_TICKS(33));
}
}
7. 双屏绘制封装
void dual_lcd_init(void)
{
lcd_spi_bus_init(LCD_SPI_MOSI, LCD_SPI_CLK);
lcd_panel_init(LCD_LEFT_CS, LCD_LEFT_DC, LCD_LEFT_RST, LCD_LEFT_BL);
lcd_panel_init(LCD_RIGHT_CS, LCD_RIGHT_DC, LCD_RIGHT_RST, LCD_RIGHT_BL);
lcd_backlight_set(LCD_LEFT_BL, 80);
lcd_backlight_set(LCD_RIGHT_BL, 80);
}
void dual_lcd_draw_left(const uint16_t *rgb565, int w, int h)
{
lcd_panel_draw_bitmap(LCD_LEFT_CS, 0, 0, w, h, rgb565);
}
void dual_lcd_draw_right(const uint16_t *rgb565, int w, int h)
{
lcd_panel_draw_bitmap(LCD_RIGHT_CS, 0, 0, w, h, rgb565);
}
void dual_lcd_draw_right_mirror(const uint16_t *rgb565, int w, int h)
{
static uint16_t *mirror_buf;
if (!mirror_buf) {
mirror_buf = heap_caps_malloc(
w * h * sizeof(uint16_t),
MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT
);
}
if (!mirror_buf) {
return;
}
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
mirror_buf[y * w + x] = rgb565[y * w + (w - 1 - x)];
}
}
lcd_panel_draw_bitmap(LCD_RIGHT_CS, 0, 0, w, h, mirror_buf);
}
8. 四路触控交互
四路触控可以设计成不同语义:
触控 1:摸头,开心反馈
触控 2:切换表情 / 彩蛋互动
触控 3:开始 AI 对话
触控 4:返回待机
typedef struct {
gpio_num_t gpio;
app_evt_id_t evt;
bool last_level;
TickType_t last_trigger;
} touch_item_t;
static touch_item_t s_touch_items[] = {
{TOUCH_HEAD_GPIO, APP_EVT_TOUCH_HEAD, true, 0},
{TOUCH_FACE_GPIO, APP_EVT_TOUCH_FACE, true, 0},
{TOUCH_CHAT_GPIO, APP_EVT_TOUCH_CHAT, true, 0},
{TOUCH_BACK_GPIO, APP_EVT_TOUCH_BACK, true, 0},
};
void touch_manager_init(void)
{
for (int i = 0; i < 4; i++) {
gpio_config_t cfg = {
.pin_bit_mask = 1ULL << s_touch_items[i].gpio,
.mode = GPIO_MODE_INPUT,
.pull_up_en = GPIO_PULLUP_ENABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE,
};
gpio_config(&cfg);
}
}
void touch_manager_task(void *arg)
{
while (1) {
TickType_t now = xTaskGetTickCount();
for (int i = 0; i < 4; i++) {
bool level = gpio_get_level(s_touch_items[i].gpio);
if (s_touch_items[i].last_level && !level) {
if (now - s_touch_items[i].last_trigger > pdMS_TO_TICKS(250)) {
app_event_send(s_touch_items[i].evt, NULL, 0);
s_touch_items[i].last_trigger = now;
}
}
s_touch_items[i].last_level = level;
}
vTaskDelay(pdMS_TO_TICKS(20));
}
}
9. 震动马达反馈
void haptic_motor_init(void)
{
ledc_timer_config_t timer = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.timer_num = MOTOR_PWM_TIMER,
.duty_resolution = LEDC_TIMER_10_BIT,
.freq_hz = MOTOR_PWM_FREQ,
.clk_cfg = LEDC_AUTO_CLK,
};
ledc_timer_config(&timer);
ledc_channel_config_t ch = {
.gpio_num = MOTOR_GPIO,
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = MOTOR_PWM_CHANNEL,
.timer_sel = MOTOR_PWM_TIMER,
.duty = 0,
.hpoint = 0,
};
ledc_channel_config(&ch);
}
static void haptic_set(uint32_t duty)
{
ledc_set_duty(LEDC_LOW_SPEED_MODE, MOTOR_PWM_CHANNEL, duty);
ledc_update_duty(LEDC_LOW_SPEED_MODE, MOTOR_PWM_CHANNEL);
}
void haptic_pulse(uint32_t duty, uint32_t ms)
{
haptic_set(duty);
vTaskDelay(pdMS_TO_TICKS(ms));
haptic_set(0);
}
void haptic_short(void)
{
haptic_pulse(700, 60);
}
void haptic_long(void)
{
haptic_pulse(850, 180);
}
10. 姿态传感器交互
内置三轴传感器后,可以做"拿起唤醒、摇一摇彩蛋、左右倾斜切表情"。
typedef struct {
float ax;
float ay;
float az;
} imu_accel_t;
static bool imu_is_shake(const imu_accel_t *a)
{
float energy = a->ax * a->ax + a->ay * a->ay + a->az * a->az;
return energy > 4.0f;
}
static bool imu_is_left(const imu_accel_t *a)
{
return a->ax < -0.55f;
}
static bool imu_is_right(const imu_accel_t *a)
{
return a->ax > 0.55f;
}
void imu_manager_task(void *arg)
{
imu_accel_t acc;
TickType_t last_evt = 0;
while (1) {
if (imu_read_accel(&acc) == ESP_OK) {
TickType_t now = xTaskGetTickCount();
if (now - last_evt > pdMS_TO_TICKS(600)) {
if (imu_is_shake(&acc)) {
app_event_send(APP_EVT_GESTURE_SHAKE, NULL, 0);
last_evt = now;
} else if (imu_is_left(&acc)) {
app_event_send(APP_EVT_GESTURE_LEFT, NULL, 0);
last_evt = now;
} else if (imu_is_right(&acc)) {
app_event_send(APP_EVT_GESTURE_RIGHT, NULL, 0);
last_evt = now;
}
}
}
vTaskDelay(pdMS_TO_TICKS(50));
}
}
11. VB6824 语音接入
四博 AI 方案中提到,ESP32-C2/C3/S3 + VB6824 语音方案已经应用于电子吧唧、S3 双目、S3 拍学机、地球仪、拍拍灯等场景;VB6824 负责音频编解码、AEC、语音唤醒和唤醒词修改,让主控专注通信和 UI。
typedef enum {
VB_CMD_WAKEUP = 0x01,
VB_CMD_CHAT = 0x02,
VB_CMD_SLEEP = 0x03,
VB_CMD_HAPPY = 0x04,
VB_CMD_STOP = 0x05,
} vb_cmd_t;
static void vb6824_dispatch(uint8_t cmd)
{
switch (cmd) {
case VB_CMD_WAKEUP:
app_event_send(APP_EVT_VOICE_WAKEUP, NULL, 0);
break;
case VB_CMD_CHAT:
app_event_send(APP_EVT_VOICE_CHAT, NULL, 0);
break;
case VB_CMD_SLEEP:
app_event_send(APP_EVT_VOICE_SLEEP, NULL, 0);
break;
case VB_CMD_HAPPY:
app_event_send(APP_EVT_EYE_HAPPY, NULL, 0);
break;
case VB_CMD_STOP:
app_event_send(APP_EVT_EYE_IDLE, NULL, 0);
break;
default:
break;
}
}
串口解析:
void vb6824_voice_task(void *arg)
{
uint8_t buf[64];
while (1) {
int len = uart_read_bytes(VB6824_UART, buf, sizeof(buf), pdMS_TO_TICKS(100));
if (len >= 5 && buf[0] == 0xAA && buf[1] == 0x55) {
uint8_t cmd = buf[3];
vb6824_dispatch(cmd);
}
}
}
12. AI 协议与四博小助手能力
四博小助手可实现 AI 对话、声音克隆、知识库接入、MCP 扩展能力,以及素材与固件在线更新等能力。
设备上线时可以把自身能力上报给云端:
{
"type": "hello",
"device_id": "SIBO_EYE_001122334455",
"product": "SIBO_AI_S3_EYE",
"screen": "1.28_dual",
"capability": {
"dual_eye": true,
"touch_keys": 4,
"haptic": true,
"imu": true,
"voice_clone": true,
"knowledge_base": true,
"mcp": true
}
}
AI 对话请求:
{
"type": "chat",
"session_id": "eye_session_0001",
"text": "给我讲一个关于太空的小故事",
"emotion": "happy",
"tts": true
}
AI 返回:
{
"type": "ai_result",
"text": "当然可以,我给你讲一个小星星去月球旅行的故事。",
"tts_url": "https://cdn.example.com/tts/eye_001.mp3",
"emotion": "happy",
"haptic": "short"
}
13. AI 返回解析:文字、表情、TTS、震动联动
void ai_protocol_parse(const char *json)
{
cJSON *root = cJSON_Parse(json);
if (!root) {
return;
}
cJSON *type = cJSON_GetObjectItem(root, "type");
if (cJSON_IsString(type) &&
strcmp(type->valuestring, "ai_result") == 0) {
cJSON *text = cJSON_GetObjectItem(root, "text");
cJSON *tts = cJSON_GetObjectItem(root, "tts_url");
cJSON *emotion = cJSON_GetObjectItem(root, "emotion");
cJSON *haptic = cJSON_GetObjectItem(root, "haptic");
if (cJSON_IsString(text)) {
ui_show_subtitle(text->valuestring);
}
if (cJSON_IsString(emotion)) {
if (strcmp(emotion->valuestring, "happy") == 0) {
eye_engine_set_state(EYE_HAPPY);
} else if (strcmp(emotion->valuestring, "thinking") == 0) {
eye_engine_set_state(EYE_THINKING);
} else if (strcmp(emotion->valuestring, "sleepy") == 0) {
eye_engine_set_state(EYE_SLEEPY);
} else {
eye_engine_set_state(EYE_IDLE);
}
}
if (cJSON_IsString(tts)) {
eye_engine_set_state(EYE_SPEAKING);
audio_player_play_url(tts->valuestring);
}
if (cJSON_IsString(haptic)) {
if (strcmp(haptic->valuestring, "short") == 0) {
app_event_send(APP_EVT_HAPTIC_SHORT, NULL, 0);
} else if (strcmp(haptic->valuestring, "long") == 0) {
app_event_send(APP_EVT_HAPTIC_LONG, NULL, 0);
}
}
}
cJSON_Delete(root);
}
14. 应用事件分发
static void app_handle_event(app_evt_t *evt)
{
switch (evt->id) {
case APP_EVT_VOICE_WAKEUP:
eye_engine_set_state(EYE_LISTENING);
haptic_short();
ui_show_subtitle("我在,请说");
break;
case APP_EVT_VOICE_CHAT:
eye_engine_set_state(EYE_THINKING);
ai_ws_send_chat("用户发起语音对话");
break;
case APP_EVT_TOUCH_HEAD:
eye_engine_set_state(EYE_HAPPY);
haptic_short();
break;
case APP_EVT_TOUCH_FACE:
eye_engine_set_state(EYE_THINKING);
ai_ws_send_chat("用户摸了一下设备,请生成一个有趣回应");
break;
case APP_EVT_TOUCH_CHAT:
eye_engine_set_state(EYE_LISTENING);
ai_ws_send_chat("用户开始对话");
break;
case APP_EVT_TOUCH_BACK:
eye_engine_set_state(EYE_IDLE);
ui_show_subtitle("已返回待机");
break;
case APP_EVT_GESTURE_SHAKE:
eye_engine_set_state(EYE_HAPPY);
haptic_long();
ai_ws_send_chat("用户摇了摇你,请给一个惊喜互动");
break;
case APP_EVT_GESTURE_LEFT:
eye_engine_set_state(EYE_SLEEPY);
break;
case APP_EVT_GESTURE_RIGHT:
eye_engine_set_state(EYE_HAPPY);
break;
case APP_EVT_AI_JSON:
ai_protocol_parse((const char *)evt->data);
free(evt->data);
break;
case APP_EVT_HAPTIC_SHORT:
haptic_short();
break;
case APP_EVT_HAPTIC_LONG:
haptic_long();
break;
default:
break;
}
}
void app_dispatch_task(void *arg)
{
app_evt_t evt;
QueueHandle_t q = app_event_queue();
while (1) {
if (xQueueReceive(q, &evt, portMAX_DELAY) == pdTRUE) {
app_handle_event(&evt);
}
}
}
15. app_main.c
void app_main(void)
{
nvs_flash_init();
app_event_init();
dual_lcd_init();
touch_manager_init();
haptic_motor_init();
imu_manager_init();
vb6824_voice_init();
ai_ws_client_init();
eye_engine_set_state(EYE_IDLE);
xTaskCreate(eye_engine_task, "eye_engine", 8192, NULL, 6, NULL);
xTaskCreate(touch_manager_task, "touch", 4096, NULL, 5, NULL);
xTaskCreate(imu_manager_task, "imu", 4096, NULL, 5, NULL);
xTaskCreate(vb6824_voice_task, "vb6824", 4096, NULL, 7, NULL);
xTaskCreate(app_dispatch_task, "app_dispatch", 8192, NULL, 8, NULL);
wifi_manager_start();
ai_ws_client_start();
ui_show_subtitle("四博 AI-S3 双目启动完成");
}
16. 总结
四博 AI-S3 双目方案的重点不是单纯"双屏显示",而是把 视觉表情、触摸输入、姿态识别、震动反馈、语音唤醒、AI 对话、小程序配置 组合成一个完整闭环。
双目屏幕:负责情绪表达
四路触控:负责主动交互
三轴传感器:负责姿态识别
震动马达:负责触觉反馈
VB6824:负责唤醒、AEC、离线语音
ESP32-S3:负责 UI、网络、AI 协议和任务调度
四博小助手:负责配网、声音克隆、知识库、MCP 和 OTA
这套方案适合 AI 桌面宠物、AI 陪伴机器人、AI 学习助手、AI 玩具和品牌 IP 互动终端。