
小智 AI 接入 electronBotMCP 工具、WebSocket 局域网调试与舵机动作编程完全指南【免费下载链接】xiaozhi-esp32An MCP-based chatbot | 一个基于MCP的聊天机器人项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32导读本文围绕稚晖君开源的桌面级机器人 electronBot 在小智 AIxiaozhi-esp32中的完整接入方案展开系统讲解其 6 自由度舵机结构、安全角度裁剪机制、11 个 MCP 控制工具的参数含义以及如何通过 WebSocket 在同一局域网内直接调试机器人动作。阅读完本文后你将掌握self.electron.*系列工具的调用格式、AI 自编程舵机序列servo_sequences的 JSON 语法并理解底层源码中动作队列、NVS 微调持久化与电池检测的实现原理可直接上手为 electronBot 编排自然流畅的交互动作。electronBot 与小智 AI 的接入概览electronBot 是稚晖君开源的桌面级机器人外观灵感来自《机器人总动员》中的 EVE。在小智 AI 的xiaozhi-esp32项目中该版本以main/boards/electron-bot/目录下的独立板级实现接入官方文档位于 main/boards/electron-bot/README.md。接入后的 electronBot 具备四大核心能力语音交互通过小智 AI 的语音链路进行对话本板使用 no_audio_codec.h 对应的无外部音频编解码器方案麦克风/扬声器走 I2S表情显示基于 240x240 的 GC9A01 圆形屏幕渲染 GIF 表情显示类见 electron_emoji_display.h继承自SpiLcdDisplay并叠加EmojiCollection表情支持动作控制6 个舵机驱动的肢体动作支持预设动作与 AI 自编程序列WebSocket 局域网调试设备连上 WiFi 后自动在 8080 端口启动 MCP 控制服务同一局域网内可直接调用工具。硬件方面机器人拥有6 个自由度左右臂各含 pitch俯仰与 roll横滚两个舵机外加身体旋转与头部上下。板级引脚定义在 config.h 中ELECTRON_BOT_VERSION当前为2.0.4舵机引脚说明Right_Pitch_PinGPIO_NUM_5右臂 pitch旋转Right_Roll_PinGPIO_NUM_4右臂 roll推杆Left_Pitch_PinGPIO_NUM_7左臂 pitchLeft_Roll_PinGPIO_NUM_15左臂 rollBody_PinGPIO_NUM_6身体旋转Head_PinGPIO_NUM_16头部上下舵机驱动由 movements.h 中基于振荡器oscillator.h的Otto动作类实现舵机索引依次为RIGHT_PITCH/RIGHT_ROLL/LEFT_PITCH/LEFT_ROLL/BODY/HEAD默认初始姿态为{180, 180, 0, 0, 90, 90}。舵机安全范围与角度裁剪机制为避免损坏机械结构electronBot 的每个舵机都定义了固件安全范围任何越界的目标角度都会被自动裁剪。该逻辑由 electron_bot_controller.cc 中的ServoMinAngle/ServoMaxAngle实现短键舵机说明固件安全范围rpright_pitch右臂 pitch0-180rrright_roll右臂 roll100-180lpleft_pitch左臂 pitch0-180lrleft_roll左臂 roll0-80bbody身体旋转30-150hhead头部上下75-105安全说明固件会自动裁剪超出范围的目标角度。AI 自编程的振荡动作也会限制振幅确保中心角 ± 振幅不超过安全范围避免损坏机械结构。具体实现见ClampOscillationRange先对中心角做安全范围裁剪再取中心角到上下限的较小距离作为振幅上限electron_bot_controller.cc。此外Otto类还内置了舵机速度限制器默认SERVO_LIMIT_DEFAULT 240度/秒见 movements.h防止舵机瞬间跳变。oscillator.h中以 500–2500 µs 的脉宽区间对应舵机角度输出配合 1MHz 定时器分辨率实现平滑插值。AI 指令示例与建议动作参数在实际对话中AI 可以根据用户的自然语言生成对应的 MCP 工具调用。官方文档给出的典型指令包括手部动作举起双手、挥挥手、拍拍手、放下手臂身体动作向左转 30 度、向右转 45 度、回到中间头部动作抬头看看、低头思考、点点头、连续点头组合动作挥手告别、表示同意、环顾四周为了让动作在对话中显得自然文档建议遵循以下参数取值与源码中 MCP 工具的 Property 定义一致参数建议值说明steps1-3保持动作简短自然speed800-1200毫秒数值越小动作越快amount拍打20-40身体30-60头部5-12动作幅度固件会按安全范围裁剪注意源码中各工具声明的合法参数范围比建议值更宽steps为1-10speed为500-1500servo_move/servo_sequences为100-3000body_turn的angle为0-90head_move的angle为1-15。建议值之外的取值虽然合法但容易让动作显得生硬或过快。WebSocket 局域网调试ElectronBot 连上 WiFi 后会自动启动本地 WebSocket 控制服务可在同一局域网内直接调用 MCP 工具无需经过云端。ws://设备IP:8080/ws从源码看该服务由 websocket_control_server.cc 实现基于 ESP-IDF 的httpdWebSocket 能力注册/ws路径握手成功后维护客户端连接表单条消息长度上限 4096 字节启动入口位于 electron_bot.cc 的InitializeWebSocketControlServer。对应的编译配置见 config.json构建目标为esp32s3必须开启CONFIG_HTTPD_WS_SUPPORTy。消息格式服务端支持两种消息格式。第一种是带type包装的 MCP 消息type固定为mcp真正的 MCP 请求放在payload字段{type:mcp,payload:{jsonrpc:2.0,method:tools/list,id:1}}第二种是直接发送裸的 MCP JSON-RPC 消息{jsonrpc:2.0,method:tools/call,params:{name:self.electron.get_status,arguments:{}},id:2}服务端收到消息后会把 JSON 交给McpServer::GetInstance().ParseMessage()统一处理websocket_control_server.cc。同时板子还会注册 MCP 广播回调把云端下发的 MCP 消息通过 WebSocket 推送给所有已连接的调试客户端实现双向交互。MCP 工具一览electronBot 控制器在初始化时通过McpServer::AddTool注册了 11 个 MCP 工具源码见 electron_bot_controller.cc工具作用self.electron.hand_action手部动作举手、放手、挥手、拍打self.electron.body_turn身体左转、右转、回中self.electron.head_move抬头、低头、点头、回中self.electron.servo_move单独移动一个舵机到指定角度self.electron.servo_sequencesAI 自编程舵机序列self.electron.set_trim保存单个舵机微调值self.electron.get_trims读取当前舵机微调值self.electron.home复位到初始姿态self.electron.stop立即停止当前动作并复位self.electron.get_status返回moving或idleself.electron.get_ip返回 WiFi IP 和连接状态self.battery.get_level返回电量和充电状态所有动作请求都会进入一个容量为 10 的 FreeRTOS 消息队列xQueueCreate(10, ...)由独立的高优先级ActionTask逐条串行执行electron_bot_controller.cc因此动作不会互相抢占而是按提交顺序排队。下面逐个工具给出参数说明与可复制的调用示例。手部动作hand_actionaction1举手2放手3挥手4拍打hand1左手2右手3双手。举手、放手、身体转向、抬头、低头属于保持姿态动作执行完成后不会自动复位。需要回到初始姿态时请调用对应的放手/回中动作或显式调用self.electron.home。{jsonrpc:2.0,method:tools/call,params:{name:self.electron.hand_action,arguments:{action:1,hand:3,speed:1000}},id:3}源码中手部动作被展开为 12 个底层枚举值举左/右/双手、放左/右/双手、挥左/右/双手、拍左/右/双手由Otto::HandAction执行movements.h。身体动作body_turndirection1左转2右转3回中angle为转向角度0-90度。{jsonrpc:2.0,method:tools/call,params:{name:self.electron.body_turn,arguments:{direction:1,speed:1000,angle:45}},id:4}头部动作head_moveaction1抬头2低头3点头一次4回中5连续点头。{jsonrpc:2.0,method:tools/call,params:{name:self.electron.head_move,arguments:{action:3,steps:1,speed:1000,angle:5}},id:5}单舵机调节servo_move可以使用完整舵机名right_pitch/right_roll/left_pitch/left_roll/body/head也可以使用短键rp/rr/lp/lr/b/h。角度会按固件安全范围自动裁剪见前文安全范围表position声明范围为0-180speed为移动时间100-3000毫秒。{jsonrpc:2.0,method:tools/call,params:{name:self.electron.servo_move,arguments:{servo_type:head,position:100,speed:800}},id:6}{jsonrpc:2.0,method:tools/call,params:{name:self.electron.servo_move,arguments:{servo_type:rp,position:120,speed:800}},id:7}舵机名到索引的映射由ServoIndexFromName完成electron_bot_controller.cc无效名称会返回错误提示。AI 自编程动作servo_sequencesself.electron.servo_sequences的sequence参数是一个JSON 字符串。顶层字段字段说明a动作数组必填d当前序列结束后的延迟毫秒可选a数组中的每个元素可以是普通移动动作或振荡动作两者按顺序依次执行支持分段多次调用并自动排队。普通移动动作字段说明s舵机目标角度对象键名使用rp/rr/lp/lr/b/hv移动时间100-3000毫秒d当前动作后的延迟毫秒{a:[{s:{rp:120,lp:60,h:100},v:800,d:200}]}振荡动作字段说明osc.a振幅对象osc.o中心角对象osc.ph相位差对象单位为度osc.p周期100-3000毫秒osc.c周期数0.1-20.0{a:[{osc:{a:{rr:25,lr:25},o:{rr:160,lr:20},ph:{lr:180},p:400,c:5}}]}振荡动作的实现细节electron_bot_controller.cc振幅限定在0-90中心角限定在0-180且按安全范围裁剪相位差以度为单位传入内部转换为弧度× π/180随后调用OscillateServos让舵机按正弦波运动并利用ClampOscillationRange保证中心角 ± 振幅永不越界。通过 WebSocket 调用完整示例将普通移动与振荡动作组合在一个序列中{jsonrpc:2.0,method:tools/call,params:{name:self.electron.servo_sequences,arguments:{sequence:{\a\:[{\s\:{\rp\:120,\lp\:60,\h\:100},\v\:800,\d\:200},{\osc\:{\a\:{\rr\:25,\lr\:25},\o\:{\rr\:160,\lr\:20},\ph\:{\lr\:180},\p\:400,\c\:5}}]}}},id:8}动作完成后建议显式复位{jsonrpc:2.0,method:tools/call,params:{name:self.electron.home,arguments:{}},id:9}校准set_trim/get_trims设置单个舵机微调值范围为-30到30度会永久保存到 NVS命名空间electron_trims见LoadTrimsFromNVS与set_trim处理器electron_bot_controller.cc。微调值在每次上电初始化时通过Otto::SetTrims应用用于校正舵机安装误差。{jsonrpc:2.0,method:tools/call,params:{name:self.electron.set_trim,arguments:{servo_type:head,trim_value:0}},id:10}读取当前微调值{jsonrpc:2.0,method:tools/call,params:{name:self.electron.get_trims,arguments:{}},id:11}状态查询获取机器人是否正在动作返回moving或idle由is_action_in_progress_标志决定{jsonrpc:2.0,method:tools/call,params:{name:self.electron.get_status,arguments:{}},id:12}获取 WiFi IP 与连接状态{jsonrpc:2.0,method:tools/call,params:{name:self.electron.get_ip,arguments:{}},id:13}获取电池电量与充电状态底层由 power_manager.h 实现每秒通过 ADC 采样并取 10 次滑动平均计算电量充电状态由 GPIO 电平判断{jsonrpc:2.0,method:tools/call,params:{name:self.battery.get_level,arguments:{}},id:14}底层工作流从 MCP 请求到舵机运动为了更精确地理解整个控制链路可以从源码梳理一条完整的调用链入口云端下发或 WebSocket 客户端提交 MCP 请求统一进入McpServer分发ElectronBotController::RegisterMcpTools中注册的工具回调解析参数如action/hand/speed将其映射为内部动作枚举手部 1-12、身体 13-15、头部 16-20、复位 21、单舵机 22、序列 23并调用QueueAction/QueueServoSequence排队参数结构体ElectronBotActionParams通过容量 10 的消息队列发送若动作任务尚未创建则由StartActionTaskIfNeeded立即创建高优先级任务执行ActionTask循环从队列取出参数根据类型调用Otto::HandAction/BodyAction/HeadAction/Home/MoveServos/OscillateServos期间通过 LEDC 定时器输出 PWM 驱动舵机oscillator.h 的AngleToCompare负责角度到脉宽比较值的换算复位stop工具会删除动作任务、清空队列并回到初始姿态控制器初始化时也会先执行一次Home归位。动作执行期间的舵机状态会实时反映到get_status方便调试客户端判断是否可提交下一个动作。角色设定建议为了让 AI 在与 electronBot 交互时选择更合适的动作官方文档给出了可直接复制到小智 AI 角色设定System Prompt中的参考文案我是一个可爱的桌面级机器人拥有 6 个自由度左手 pitch/roll、右手 pitch/roll、身体旋转、头部上下。我可以通过动作表达情绪同意时点头打招呼时挥手高兴时举手思考时低头好奇时抬头告别时挥手。对话时请优先选择简短自然的动作。需要复杂表现时可以使用self.electron.servo_sequences分段编排动作最后调用self.electron.home复位。结合前文的参数建议可以进一步补充动作频率上保持steps在 1-3 之间、speed在 800-1200ms拍打/挥手等幅度类动作按amount的建议区间取值这样既能保证动作辨识度又不会让机器人显得机械或失控。调试与二次开发提示编译构建该板型在 config.json 中声明目标芯片为 ESP32-S3构建时需追加CONFIG_HTTPD_WS_SUPPORTy以启用 WebSocket 服务。按键交互板载 BOOT 按键GPIO_NUM_0在设备处于启动配网状态时点击可进入 WiFi 配置模式正常运行时可切换对话状态见 electron_bot.cc。表情扩展面部表情走ElectronEmojiDisplay它复用EmojiCollection的 GIF 表情机制开发者可在表情集合中扩充新的表情资源。动作编排实践复杂的情绪表达建议拆分为“抬手 → 振荡挥手 → 复位”三段式序列利用d字段控制节奏最后统一home归位避免机器人停留在夸张姿态。以上工具参数与调用示例均以当前仓库的源码实现为准可直接复制到 WebSocket 调试工具如 wscat、在线 WebSocket 客户端中验证效果。【免费下载链接】xiaozhi-esp32An MCP-based chatbot | 一个基于MCP的聊天机器人项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考