1. 这篇文章真正要解决的问题
如果你是一名嵌入式开发者,或者对智能硬件、语音交互感兴趣,那么最近在技术社区里频繁出现的“龙虾”和“ESP-Claw”这两个词,很可能已经引起了你的注意。但面对铺天盖地的“启动龙虾”、“养龙虾”、“龙虾部署”等热词,你是否感到困惑:这到底是一个新的AI模型,一个开发框架,还是一个具体的硬件项目?它和传统的语音控制方案相比,究竟解决了什么新问题?
这篇文章要解决的,正是这个核心困惑。我们将深入剖析“ESP-Claw龙虾小智”这个项目,它本质上是一个集成了多模态AI能力的嵌入式智能终端原型。其核心价值并非创造了一个全新的AI模型,而是通过“代码融合”这一关键工程实践,将开源的语音识别、自然语言处理、大语言模型(LLM)能力与低成本的ESP32硬件平台深度结合,打造出一个可运行、可二次开发的“AI智能体”实体。
对于开发者而言,真正的痛点在于:AI能力(尤其是语音和LLM)如何低成本、低门槛地“落地”到真实的物理设备中?传统方案要么依赖云端API,存在延迟、隐私和网络依赖问题;要么需要强大的本地算力,成本高昂。ESP-Claw项目提供了一个极具启发性的答案:通过精心设计的软件架构,在资源受限的MCU上,实现端侧语音唤醒、识别,并与本地或轻量化的LLM进行交互,完成复杂的任务理解与执行。
因此,本文不仅是一篇ESP-Claw的安装部署教程,更是一次对“嵌入式AI应用开发新范式”的拆解。你将了解到:
- ESP-Claw的核心架构与“代码融合”的真实含义:它如何将不同来源的代码库整合成一个可编译、可运行的固件。
- 从零开始的完整部署与实践指南:涵盖环境搭建、固件编译、烧录、配置及与“龙虾小智”AI服务的对接。
- 语音控制链路的深度解析:从麦克风拾音到最终设备动作,数据是如何流动和处理的。
- 开发扩展与避坑指南:如何基于此项目进行二次开发,以及实践中最常见的问题与解决方案。
读完本文,你将能独立完成一个ESP-Claw智能终端的部署,并深刻理解其背后的设计哲学,为开发自己的嵌入式AI应用打下坚实基础。
2. 基础概念与核心原理
在深入实操之前,我们必须厘清几个关键概念,这能帮助你理解这个项目为何值得关注,而不是将其视为又一个普通的“开发板Demo”。
ESP-Claw:硬件载体与项目名称ESP-Claw首先指的是一款开源的硬件设计,通常基于乐鑫(Espressif)的ESP32-S3系列芯片。这款芯片双核、主频高达240MHz,集成Wi-Fi和蓝牙,拥有足够的算力和内存来运行相对复杂的AI推理任务。项目提供了硬件的原理图与PCB设计,社区也有现成的模块或开发板可供购买。它构成了整个系统的“身体”。
龙虾(OpenClaw/Lobster):AI智能体软件栈“龙虾”是这个项目的软件灵魂,也是一个容易产生混淆的点。根据社区资料,“龙虾”并非指某个单一的AI模型,而是一个面向嵌入式设备的AI智能体(Agent)框架或服务集合。它可能包含了以下组件:
- 语音唤醒与识别引擎:用于离线或在线识别“龙虾”等唤醒词及后续的语音指令。
- 自然语言理解(NLU)模块:将识别出的文本指令解析为结构化的意图和参数。
- 大语言模型(LLM)接口:负责与本地部署的轻量化LLM(如Qwen2.5-1.5B-Instruct)或云端API进行交互,完成复杂的对话、推理和任务规划。
- 技能(Skill)执行框架:根据NLU或LLM的输出,调用具体的函数来控制硬件(如点亮LED、播放音频)或处理信息。
代码融合:项目的核心工程实践这是本项目最精髓的部分,也是标题中“代码融合”的真正含义。它指的是将来自不同仓库、不同技术栈的代码,通过一定的架构设计,整合编译成一个能在ESP32上运行的单一固件(Firmware)。这些代码可能包括:
- 乐鑫官方的ESP-IDF开发框架:提供基础的系统驱动、网络协议栈。
- 开源的语音处理库:如
esp-sr(乐鑫语音识别)或VAD(语音活动检测)算法。 - “龙虾”AI服务端代码的客户端适配层:实现与本地或远端“龙虾”服务的通信协议(如WebSocket、HTTP)。
- 用户自定义的技能逻辑:控制具体外设的代码。
“融合”的挑战在于解决库依赖、内存管理、实时性以及不同模块间的数据流协同。成功的融合意味着开发者无需关心底层拼接,只需关注业务逻辑。
语音控制链路全景理解数据流是进行调试和二次开发的基础。一个完整的语音控制周期通常如下:
[麦克风拾音] -> [音频预处理(降噪、AEC)] -> [语音唤醒检测] -> [语音识别(ASR)] -> [文本指令] -> [本地NLU/LLM推理] -> [生成结构化命令] -> [技能执行器] -> [硬件动作(GPIO、I2C等)]ESP-Claw项目可能将唤醒+ASR放在设备端,将NLU/LLM放在同一局域网内的更强算力的服务器(如树莓派、小型PC)上,两者通过Wi-Fi通信。这是一种典型的“端-云协同”架构,平衡了性能、成本和隐私。
3. 环境准备与前置条件
开始动手前,请确保你的开发环境满足以下要求。我们将以在Windows 11系统上,通过WSL2的Ubuntu环境进行开发作为标准路径,这也是社区最推荐的方式,因为它能完美兼容ESP-IDF所需的Linux工具链。
3.1 硬件准备
- ESP-Claw开发板/模块:一块基于ESP32-S3的ESP-Claw硬件。确保其USB接口可用于供电和烧录。
- USB数据线:Type-C接口,支持数据传输。
- 扬声器与麦克风:部分板载有麦克风,如需更好效果或播放音频,可能需要外接。
- 可选:本地AI服务器:如果你计划在局域网内部署“龙虾”的LLM服务,需要另一台设备(如树莓派4B、旧笔记本或小型服务器),建议配置至少4核CPU、8GB内存。
3.2 软件环境准备(Windows + WSL2)
- 启用WSL2:以管理员身份打开PowerShell,运行:
(也可选择Ubuntu-24.04,但需注意ESP-IDF对新发行版的官方支持时效。)wsl --install -d Ubuntu-22.04 - 安装ESP-IDF开发框架:这是编译ESP32固件的基石。在WSL的Ubuntu终端中,遵循乐鑫官方指南进行安装。这里采用最稳定的方式:
# 1. 创建开发目录并进入 mkdir -p ~/esp cd ~/esp # 2. 克隆ESP-IDF(推荐使用稳定版本,如v5.1) git clone -b v5.1 --recursive https://github.com/espressif/esp-idf.git # 3. 运行安装脚本 cd esp-idf ./install.sh esp32s3 # 4. 设置环境变量(每次打开新终端都需要执行,或将其加入bashrc) . ./export.sh - 获取ESP-Claw项目源码:
cd ~/esp # 克隆主仓库,这里假设项目仓库地址(请根据实际社区仓库替换) git clone https://github.com/opensource-project/esp-claw-lobster.git cd esp-claw-lobster # 同步子模块(关键!很多“代码融合”的依赖在这里) git submodule update --init --recursive
3.3 网络与权限检查
- 确保你的Windows防火墙和WSL网络配置允许USB设备访问。
- 在Ubuntu中,将你的用户添加到
dialout组,以获得串口读写权限:
执行此命令后,需要完全退出WSL终端再重新进入,或重启WSL,才能使权限生效。sudo usermod -a -G dialout $USER
4. 核心流程拆解:从源码到会说话的设备
拥有了环境和代码后,我们将其转化为设备上运行的固件。这个过程清晰地分为几个阶段。
4.1 项目配置与菜单设置ESP-IDF使用menuconfig进行图形化配置,这是决定固件功能的关键一步。
cd ~/esp/esp-claw-lobster idf.py set-target esp32s3 # 设置目标芯片为ESP32-S3 idf.py menuconfig在menuconfig界面中,你需要重点关注以下配置(使用方向键和回车键导航):
- Serial flasher config -> Default serial port:确认或设置你的开发板在Ubuntu中的串口设备,通常是
/dev/ttyACM0或/dev/ttyUSB0。 - Lobster Configuration(如果项目有该菜单):
Wi-Fi SSID&Wi-Fi Password:配置设备连接的无线网络。Lobster Server Host:设置“龙虾”AI服务端的IP地址和端口,例如192.168.1.100:8080。Wake Word Engine:选择唤醒词引擎,如“Hi,龙虾”或自定义。Audio Output/I2S Settings:根据你的硬件连接,配置音频输出引脚和参数。
- Component config -> ESP Speech Recognition:启用并配置所需的语音识别模型。
4.2 编译与构建配置完成后,保存退出。执行编译命令,IDF将启动交叉编译工具链,将你所有的C/C++源码、引用的组件库(即“融合”的代码)链接成二进制文件。
idf.py build这个过程会持续几分钟。如果出现错误,最常见的原因是:
- 子模块未更新:回头检查
git submodule update --init --recursive是否执行成功。 - 依赖缺失:某些组件可能需要额外的Python包,根据错误提示使用
pip install安装。 - 内存溢出:ESP32-S3内存有限,如果启用了过多功能,可能需要在
menuconfig中调整分区表(Partition Table)或关闭一些组件。
4.3 烧录固件到设备编译成功后,将开发板通过USB连接电脑,并确保在WSL中能识别到串口(ls /dev/tty*查看)。执行烧录命令:
idf.py -p /dev/ttyACM0 flash-p参数后跟你的实际串口。烧录过程会有进度条显示。完成后,设备会自动重启。
4.4 监控设备日志查看设备启动和运行日志是调试的必备技能。保持设备连接,运行:
idf.py -p /dev/ttyACM0 monitor你将看到ESP32的启动信息、Wi-Fi连接状态、以及“龙虾”服务的连接情况。按Ctrl+]可以退出监控模式。
5. 部署“龙虾”AI服务端(本地服务器端)
ESP-Claw设备本身通常不运行大型LLM,它需要与一个“龙虾”服务端通信。以下是部署一个基础服务端的示例。
5.1 服务器环境准备假设你在同一局域网的另一台Ubuntu服务器(或WSL)上操作。
# 1. 安装Python和pip sudo apt update && sudo apt install python3 python3-pip git # 2. 克隆龙虾服务端仓库(此处为示例,仓库地址需替换为真实项目地址) git clone https://github.com/lobster-ai/lobster-server.git cd lobster-server # 3. 安装Python依赖 pip3 install -r requirements.txt5.2 配置与启动服务服务端通常需要一个配置文件,例如config.yaml:
# config.yaml server: host: "0.0.0.0" # 监听所有网络接口 port: 8080 llm: model_type: "qwen2.5-1.5b-instruct" # 指定使用的模型 model_path: "./models/qwen2.5-1.5b-instruct-gguf.bin" # 模型文件路径 # 或者使用API模式 # api_base: "https://api.openai.com/v1" # api_key: "your-api-key" skills: - name: "control_light" description: "控制LED灯" function: "light_switch" - name: "get_time" description: "获取当前时间" function: "tell_time"然后启动服务:
python3 app.py --config config.yaml服务启动后,会监听8080端口。你可以在浏览器访问http://<服务器IP>:8080/health来检查服务是否健康。
5.3 ESP-Claw设备端配置回环回到ESP-Claw项目的menuconfig中,将Lobster Server Host设置为上述服务器的IP和端口,例如192.168.1.100:8080。重新编译烧录后,设备启动日志应显示成功连接到服务器。
6. 完整示例:实现一个语音控制LED的技能
现在,我们来创建一个完整的技能闭环:通过语音“打开灯”来控制ESP-Claw板载的LED。
6.1 服务端技能开发在龙虾服务端代码中,找到技能注册的地方(例如skills/目录),新建一个Python文件light_skill.py:
# lobster-server/skills/light_skill.py import logging from skills.base_skill import BaseSkill class LightControlSkill(BaseSkill): def __init__(self): super().__init__("control_light") # 这里可以初始化硬件连接,对于服务端,通常是发送MQTT或HTTP指令到设备 # 本例中,我们假设服务端直接通过WebSocket向设备发送控制消息 self.logger = logging.getLogger(__name__) def execute(self, intent: dict, device_id: str): """执行技能""" action = intent.get('parameters', {}).get('action', 'toggle') self.logger.info(f"Request to {action} light for device {device_id}") # 构建发送给ESP-Claw设备的控制消息 control_message = { "type": "skill_execute", "skill": "light", "action": action, "device_id": device_id } # 这里需要调用你的WebSocket或MQTT客户端,将消息发送给指定的设备 # 例如:websocket_manager.send_to_device(device_id, control_message) # 返回执行结果给对话引擎 return { "text": f"好的,已{action}灯光。", "success": True } def get_description(self): return "控制智能设备的灯光开关"然后在技能管理器里注册它。
6.2 设备端技能执行器在ESP-Claw的固件代码中,需要接收服务端下发的指令并执行。找到设备端处理网络消息的代码(例如main/lobster_client.c):
// main/lobster_client.c #include "driver/gpio.h" #define LED_GPIO_NUM 2 // 假设LED连接在GPIO2上 static void skill_light_execute(cJSON *action_params) { const char *action = cJSON_GetObjectItem(action_params, "action")->valuestring; ESP_LOGI(TAG, "Light skill execute: %s", action); if (strcmp(action, "on") == 0) { gpio_set_level(LED_GPIO_NUM, 1); // 点亮LED } else if (strcmp(action, "off") == 0) { gpio_set_level(LED_GPIO_NUM, 0); // 熄灭LED } else if (strcmp(action, "toggle") == 0) { int level = gpio_get_level(LED_GPIO_NUM); gpio_set_level(LED_GPIO_NUM, !level); // 翻转状态 } } // 在消息解析函数中调用 void handle_server_message(char *message) { cJSON *root = cJSON_Parse(message); cJSON *type = cJSON_GetObjectItem(root, "type"); if (cJSON_IsString(type) && (strcmp(type->valuestring, "skill_execute") == 0)) { cJSON *skill = cJSON_GetObjectItem(root, "skill"); if (cJSON_IsString(skill) && (strcmp(skill->valuestring, "light") == 0)) { cJSON *action = cJSON_GetObjectItem(root, "action"); skill_light_execute(action); } } cJSON_Delete(root); }6.3 语音交互测试
- 对ESP-Claw设备说:“嗨,龙虾”(唤醒词)。
- 设备提示音后,说:“打开灯”。
- 设备端进行语音识别,将文本“打开灯”通过Wi-Fi发送给龙虾服务端。
- 服务端的NLU/LLM将“打开灯”解析为意图
control_light,参数action=on,并调用LightControlSkill。 - 服务端通过WebSocket将控制消息
{"type":"skill_execute", "skill":"light", "action":"on"}发回给ESP-Claw设备。 - 设备端的
handle_server_message函数解析消息,调用skill_light_execute("on"),最终控制GPIO2输出高电平,LED点亮。
7. 运行结果与效果验证
成功完成上述步骤后,你可以通过以下方式验证系统是否正常工作:
7.1 设备启动日志验证通过idf.py monitor观察启动日志,成功的标志通常包括:
I (0) cpu_start: Starting scheduler on APP CPU. I (512) wifi:wifi driver task: 3ffd7e34, prio:23, stack:6656, core=0 I (622) wifi:wifi firmware version: ... I (632) wifi:mode : sta (xx:xx:xx:xx:xx:xx) I (1852) wifi:new:<6,0>, old:<1,0>, ap:<255,255>, sta:<6,0>, prof:1 I (2912) wifi:state: init -> auth (b0) I (2922) wifi:state: auth -> assoc (0) I (2932) wifi:state: assoc -> run (10) I (2962) wifi:connected with [你的Wi-Fi SSID], aid = 1, channel 6, BW20, bssid = xx:xx:xx:xx:xx:xx I (2962) wifi:security type: 3, phy: bgn, rssi: -45 I (2972) wifi:pm start, type: 1 I (2982) lobster_client: Wi-Fi Connected. Connecting to Lobster server at ws://192.168.1.100:8080/ws I (3012) lobster_client: WebSocket Connected to server.看到WebSocket连接成功的日志,表明设备网络和服务连接正常。
7.2 语音唤醒与识别测试说出预设的唤醒词(如“嗨,龙虾”),设备应给出一个视觉(LED闪烁)或听觉(提示音)反馈,表明已进入聆听指令状态。随后说出指令,观察监控日志:
I (120153) esp_sr_wakenet: Wakenet triggered. I (120163) lobster_audio: Wake word detected, start recording command. I (120453) lobster_audio: Command recording finished. I (120463) lobster_client: ASR result: "打开灯" I (120463) lobster_client: Sending text to server: "打开灯"这表示唤醒、录音、识别和发送流程正常。
7.3 技能执行验证发送指令后,继续观察日志和设备本身:
I (120863) lobster_client: Received from server: {"type": "skill_execute", "skill": "light", "action": "on"} I (120863) main: Light skill execute: on I (120863) gpio: GPIO[2]| OutputEn: 1| OutputVal: 1同时,ESP-Claw开发板上的LED(连接GPIO2)应该被点亮。至此,一个完整的端到端语音控制闭环就验证成功了。
8. 常见问题与排查思路
在部署和开发过程中,你几乎一定会遇到一些问题。下表列出了最常见的问题及其解决方法。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
idf.py build编译失败 | 1. 子模块未同步。 2. Python依赖缺失。 3. IDF版本与项目不兼容。 4. 编译器路径错误。 | 1. 检查git submodule status。2. 查看错误信息中缺失的Python包。 3. 确认项目README要求的IDF版本。 4. 检查 IDF_PATH环境变量。 | 1. 执行git submodule update --init --recursive。2. 根据提示 pip install安装。3. 切换至正确的IDF版本分支。 4. 重新执行 export.sh。 |
idf.py flash烧录失败 | 1. 串口选择错误。 2. 设备未进入下载模式。 3. 驱动未安装(Windows)。 4. 用户无串口权限(Linux/WSL)。 | 1. 检查/dev/tty*列表,拔插设备看变化。2. 尝试按住设备上的 BOOT键再点击EN键复位进入下载模式。3. 查看设备管理器是否有未知设备。 4. 运行 groups $USER查看是否在dialout组。 | 1. 使用正确的端口,如/dev/ttyACM0。2. 手动使设备进入下载模式。 3. 安装乐鑫CP210x或CH340 USB转串口驱动。 4. 执行 sudo usermod -a -G dialout $USER并重启WSL。 |
| Wi-Fi 连接失败 | 1. SSID/密码错误。 2. 网络加密方式不匹配。 3. 信号太弱。 4. 路由器设置了MAC过滤。 | 1. 在menuconfig中仔细检查。2. 查看路由器设置(WPA2-PSK最通用)。 3. 查看日志中的 rssi值(大于-70较好)。4. 查看路由器后台。 | 1. 重新配置并保存。 2. 将路由器加密方式改为WPA2-PSK。 3. 让设备靠近路由器。 4. 将设备MAC地址加入路由器白名单。 |
| 无法连接龙虾服务器 | 1. 服务器IP/端口错误。 2. 服务器未启动。 3. 防火墙阻止端口。 4. WebSocket路径错误。 | 1. 在设备和服务端分别ping对方IP。2. 在服务器运行 netstat -tlnp查看端口监听。3. 检查服务器防火墙规则( sudo ufw status)。4. 查看设备日志中的完整连接URL。 | 1. 修正menuconfig中的服务器地址。2. 确保服务端应用已运行。 3. 开放服务器对应端口(如8080)。 4. 检查服务端WebSocket路由设置。 |
| 唤醒词无反应 | 1. 麦克风硬件故障或未启用。 2. 唤醒词模型未加载或配置错误。 3. 环境噪音过大。 4. 音频采集参数(采样率、增益)不当。 | 1. 尝试用arecord等工具测试麦克风。2. 检查 menuconfig中ESP Speech Recognition的唤醒词选择。3. 在安静环境下测试。 4. 查看音频初始化日志。 | 1. 检查麦克风焊接和电路。 2. 确保选择了正确的唤醒词模型并编译进固件。 3. 优化使用环境或启用降噪算法。 4. 调整 menuconfig中的音频参数。 |
| 语音识别(ASR)不准 | 1. 普通话不标准或方言。 2. 使用的语音模型不支持中文或词汇量小。 3. 音频前处理(VAD、降噪)效果差。 | 1. 尝试说标准、清晰的普通话短句。 2. 确认项目使用的ASR模型支持中文。 3. 查看音频处理环节的日志和数据。 | 1. 进行语音训练或使用更通用的指令。 2. 考虑替换或训练更合适的语音模型。 3. 优化音频前处理算法或参数。 |
| LLM响应慢或无响应 | 1. 服务器性能不足。 2. 模型文件过大,加载慢。 3. 网络延迟高。 4. 提示词(Prompt)设计不佳导致推理慢。 | 1. 监控服务器CPU/内存使用率。 2. 查看服务端日志模型加载时间。 3. 测试设备到服务器的网络延迟。 4. 分析发送给LLM的请求内容。 | 1. 升级服务器硬件或使用更小模型。 2. 使用量化版本模型(如GGUF格式)。 3. 确保设备和服务端在同一局域网。 4. 优化Prompt,使其简洁明确。 |
9. 最佳实践与工程建议
将ESP-Claw项目用于实际开发或产品原型时,遵循以下建议可以避免很多麻烦。
9.1 项目管理与版本控制
- 固定依赖版本:在项目根目录创建
requirements.txt(Python)和idf_component.yml(ESP-IDF组件),明确记录所有库的版本号,确保环境可复现。 - 善用Git子模块和标签:对于引用的第三方仓库(如乐鑫的语音组件),使用子模块的特定提交(commit)或标签(tag),而不是
master分支,以防止上游更新导致构建失败。
9.2 配置管理与网络
- 分离敏感配置:不要将Wi-Fi密码、API密钥等硬编码在代码或
menuconfig中。ESP-IDF支持非易失性存储(NVS)和idf.py menuconfig的“自定义默认配置”功能。首次配网可以使用SmartConfig或蓝牙配网。 - 实现重连机制:网络连接可能中断。在设备端代码中,必须实现Wi-Fi和WebSocket的断线重连逻辑,并加入指数退避策略,避免频繁重试耗尽资源。
9.3 性能与稳定性优化
- 监控内存与堆栈:ESP32资源紧张。定期使用
heap_caps_print_heap_info()和uxTaskGetStackHighWaterMark()监控内存和任务栈使用情况,防止内存泄漏和栈溢出。 - 任务优先级与看门狗:语音处理、网络通信等任务需要合理设置优先级。启用硬件看门狗(WDT)和软件看门狗任务,防止某个任务阻塞导致系统死机。
- 电源管理:如果是电池供电设备,需要充分利用ESP32的深度睡眠(Deep Sleep)功能,仅在唤醒词检测到活动时才唤醒主CPU,大幅降低功耗。
9.4 技能与LLM交互设计
- 设计明确的技能边界:不是所有指令都需要LLM处理。简单的、确定的指令(如“开灯”、“关灯”)应由设备端的NLU直接处理,只有复杂的、需要推理的指令(如“我感觉有点冷”)才交给LLM。这能降低延迟和服务器负载。
- 为LLM设计结构化输出:要求LLM以固定的JSON格式返回结果,而不是自由文本。例如:
{"intent": "control_light", "parameters": {"action": "on", "location": "bedroom"}}。这极大简化了设备端的解析逻辑。 - 实现对话状态管理:对于多轮对话,服务端需要维护简单的对话上下文,否则LLM可能无法理解“把它关掉”中的“它”指代什么。
9.5 测试与调试
- 分级测试:
- 单元测试:测试单个技能函数、硬件驱动。
- 集成测试:测试语音识别到技能执行的完整链路,可以模拟音频输入和网络消息。
- 系统测试:在实际环境中进行端到端测试。
- 丰富的日志输出:在不同模块中使用不同日志级别(ERROR, WARN, INFO, DEBUG)。生产环境可以关闭DEBUG日志以节省资源和带宽。
通过本文的拆解,你应该已经对ESP-Claw龙虾小智项目有了从概念到实践的全方位理解。它不仅仅是一个酷炫的Demo,更是一个展示了如何将前沿AI能力与嵌入式系统深度融合的优秀范本。从“代码融合”的工程智慧,到“端-云协同”的架构设计,每一步都为解决“让AI在小型设备上真正有用”这一核心问题提供了思路。
你可以以此为起点,探索更多可能性:替换更强的本地LLM、增加视觉传感器实现多模态交互、设计更复杂的技能、甚至将多个这样的设备组成一个分布式智能家居网络。记住,开源项目的最大价值在于它为你提供了一个可修改、可学习的起点。