
xiaozhi-esp32 Otto-Robot ESP32-S3语音机器人从零到跳舞完整指南【免费下载链接】xiaozhi-esp32An MCP-based chatbot | 一个基于MCP的聊天机器人项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32你对桌上的小机器人说了句跳个舞它没有装死——两条腿先左右摇摆再来两步太空步最后站回原位用清亮的声音回你一句跳完了。这就是 Otto-Robot一个基于 xiaozhi-esp32 开源平台实现的 ESP32-S3 语音机器人内置六舵机动作系统、AFE 唤醒词引擎和 MCP 协议工具层。这篇指南带你从点亮它走到教会它跳舞全程不绕弯路。三分钟让 Otto 跑起来硬件连接与固件烧录读完这节你能把板子、舵机、麦克风、扬声器接好烧录固件并亲口听到 Otto 的第一声你好。硬件上你只需要四样东西一块ESP32-S3 控制板、舵机左腿、右腿、左脚、右脚四个必装左右手舵机可选、麦克风和扬声器。舵机是 Otto 的关节肌肉每个舵机吃 5V 电源供电不足是后面所有动作卡顿的元凶所以建议舵机供电和主控供电分开接。板级接线可以参考下面这张面包板示意图麦克风、喇叭和 ESP32-S3 开发板的走线关系一目了然软件侧装好 ESP-IDF 编译环境4.4 以上后三条命令走完克隆到烧录的全流程git clone https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 cd xiaozhi-esp32 idf.py set-target esp32s3 idf.py build flash monitor看到串口日志里打印出唤醒成功字样Otto 就跑起来了。唤醒词怎么工作Otto 的语音交互链路读完这节你能说清楚听到→理解→回应是怎么串起来的也知道想给 Otto 加一句新指令时该改哪里。Otto 的耳朵由AFE 唤醒词引擎负责相关实现见 esp_wake_word.cc音频采集、降噪、播放则由 audio_service.h 统筹。你喊出唤醒词后对话音频会被送到云端大模型模型理解你的意图再决定调用哪个设备工具。这里的关键是MCPModel Context Protocol协议你可以把它理解为 Otto 的能力菜单。设备端把每个能力注册成一个带名字、带参数说明的工具大模型看到的就是一份菜单它点单设备执行。注册长这样mcp_server.AddTool(self.otto.action, 执行机器人动作, PropertyList({ Property(action, kPropertyTypeString, sit), Property(steps, kPropertyTypeInteger, 3, 1, 100), Property(speed, kPropertyTypeInteger, 700, 100, 3000) }), this - ReturnValue { std::string action props[action].valuestd::string(); QueueAction(action); // 按动作名丢进后台动作队列 return true; });完整的工具注册模式可以参考 mcp_server.h 和 docs/mcp-usage.md。大模型与设备、云端两条链路的关系如下图注意动作是丢进后台队列执行的所以 Otto 跳舞的时候你还能接着跟它说话说停止就能立刻叫停。教 Otto 跳舞振荡器模型与六个舵机关节读完这节你能看懂每个动作的参数含义并且知道太空步和摇摆本质上是同一套信号的两种配方。Otto 的身体由六个舵机驱动LEFT_LEG、RIGHT_LEG、LEFT_FOOT、RIGHT_FOOT、LEFT_HAND、RIGHT_HAND定义在 otto_movements.h 里。这些动作怎么算出来的答案是振荡器模型——你可以理解为给每个舵机发一个按节奏摇一摇的信号。每个信号只有三个直觉参数振幅amplitude摇多大比如 ±30 度就是小幅度扭一扭周期period摇一圈花多久500 毫秒就是快节拍1500 毫秒就是慢悠悠相位差phase_diff各舵机错开多少启动。右腿比左腿晚半个周期走路就成了左右脚同相摇摆就成了。核心接口非常克制void Otto::OscillateServos(int amplitude[SERVO_COUNT], int offset[SERVO_COUNT], int period, double phase_diff[SERVO_COUNT], float cycle);在这个接口上Otto 已经配好了 20 多个预设动作walk行走、turn转身、jump跳跃、swing摇摆、moonwalk太空步、bend弯腰、whirlwind_leg旋风腿手部舵机装上后还有hand_wave挥手、windmill大风车、radio_calisthenics广播体操、magic_circle爱的魔力转圈圈……参数速查步数、速度、方向、幅度的取值范围都写在 otto-robot/README.md 里对着调就行。把 Otto 接入你的世界MCP 远程控制与自定义编排读完这节你能在局域网内直接用代码遥控 Otto并把几个基础动作串成自己的编舞甚至给它换表情。Otto 内置了一个 WebSocket 服务器见 websocket_control_server.cc连上 WiFi 后访问ws://设备IP:8080/ws用 JSON-RPC 就能跳过云端直接指挥它。任何 WebSocket 调试工具都能发这样的请求{jsonrpc:2.0,method:tools/call, params:{name:self.otto.action, arguments:{action:moonwalk,steps:3,speed:800}}, id:1}收到响应说明链路通了。想玩花点直接把基础动作像积木一样串起来// 一串生日快乐编排 void HappyBirthdayDance() { otto.HandWave(LEFT); // 挥手开场 otto.Moonwalker(2, 900, LEFT); // 两步太空步 otto.UpDown(3, 600, 15); // 上下蹦跶 otto.Jump(2, 1500); // 跳跃收尾 }动作之间的间隙会由Home()自动复位衔接。更高阶的还有self.otto.servo_sequences工具支持用 JSON 描述任意舵机序列振荡器模式与普通移动模式可混用。表情侧Otto 的脸是一块小屏用 scripts/Image_Converter/ 里的 LVGLImage 工具把 GIF 转成屏幕格式再交给 otto_emoji_display.cc 播放Otto 说话时就能做表情了。Otto 不听话了排查速查表读完这节你能按症状→原因→操作三步定位问题不用翻源码猜。症状可能原因跟着做动作卡顿、半途中断舵机供电不足舵机单独接 5V/2A 以上电源与主控分开供电唤醒不灵敏麦克风被挡住或离噪音源太近把麦克风朝前、离喇叭远一点重新喊一次唤醒词断连后找不到设备WiFi 信号弱用self.otto.get_ip工具查当前 IP设备离路由器近一些站姿歪斜、动作歪楼舵机装配有初始偏差调用self.otto.set_trim给对应舵机加 -50~50 度的微调值并保存连上 WiFi 但工具没反应没做协议初始化连接后先发一次initialize再tools/list确认工具列表调优两条动作太猛时调大speed数值数值越小越快或调用EnableServoLimit给舵机限速跳舞耗电快时把幅度amount从默认 30 往下压省电还能延长续航。回到桌面那一刻现在你可以重新对桌面上那个小家伙说跳个舞——这一次你知道它为什么会扭唤醒词引擎听了你的声音大模型点了菜振荡器按着节拍摇了六个舵机。Otto-Robot 的全部代码都在 xiaozhi-esp32 仓库里烧录固件后想改动作、想换表情、想加新工具改完重新idf.py build flash monitor就能见效。遇到 bug 或者有新的编排点子欢迎到项目的 issue 区留言或直接提交 PR一起把它调教得更像个人。项目仓库https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32【免费下载链接】xiaozhi-esp32An MCP-based chatbot | 一个基于MCP的聊天机器人项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考