Otto-Robot上手指南30分钟让语音交互机器人听懂话还会跳舞【免费下载链接】xiaozhi-esp32An MCP-based chatbot | 一个基于MCP的聊天机器人项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32你喊一声跳个舞桌子上的小人不动声色说向前走它又装作没听见。Otto-Robot 想解决的就是这个痛点一块基于 ESP32-S3 的控制板加上六个舵机装进 xiaozhi-esp32 这个开源固件里它就成了一个能唤醒、能聊天、还能按你的口令走步跳舞的语音交互机器人背后的对话大脑由 xiaozhi 云端服务提供你不用自己搭语音链路。30 秒看成品它到底能干什么上电之后机器人自动检测硬件版本摄像头版 / 无摄像头版启动 240×240 的 ST7789 表情屏然后进入待机。你喊一声唤醒词它就接上 xiaozhi 后台开始对话你说向前走太空步坐下它就真的迈步、跳舞、坐下屏幕上同时刷出对应表情。整个闭环是唤醒 → 录音上传 → 后台听懂并给出指令 → 调用设备上的动作工具 → 舵机运动。中间那一步走的是 MCPModel Context Protocol可以理解为设备给 AI 提供的一组可调用工具AI 决定让它做什么固件决定怎么动。值不值得动手它预置了 20 多个动作行走、转身、跳跃、摇摆、太空步、旋风腿、坐下加了手部舵机还能挥手、做大风车、做广播体操。本文带你从零烧录到能对话能跳舞跑通之后再拆原理、教你加自己的动作。开工前清单依赖一次备齐名称/版本用途ESP32-S3 控制板摄像头版 / 无摄像头版主控固件上电时自动检测版本并切换引脚配置6 个舵机左腿、右腿、左脚、右脚、左手、右手关节执行器手部两个可省没有时相关动作自动跳过麦克风I2S16kHz 采样拾取唤醒词和对话语音扬声器I2S24kHz 采样播放唤醒提示音和 AI 回复240×240 ST7789 SPI 屏显示表情动画和状态WiFi连接 xiaozhi 后台走 Websocket/MQTT 协议电池 充电检测线电量上报self.battery.get_level工具可查ESP-IDF 开发环境编译烧录用 idf.py 操作xiaozhi 后台角色在后台建角色并配置动作能力提示词AI 才知道它会让机器人做什么所有引脚舵机、音频、屏幕、I2C都已经写在 main/boards/otto-robot/config.h 的HardwareConfig结构里两个硬件版本各一套你接线时照抄即可。分步跑通四个里程碑逐个验收里程碑 1固件编译烧录先拉代码然后设置目标芯片、编译、烧录git clone https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 cd xiaozhi-esp32 idf.py set-target esp32s3 idf.py build flash monitor预期现象编译末尾没有 error烧录完成后串口开始滚动日志能看到自动检测硬件版本: 摄像头版或无摄像头版以及OttoRobot标签下的初始化信息。 验证方法日志里出现检测到摄像头或正常的无摄像头分支日志且屏幕点亮。里程碑 2配网并连上后台板子上的 BOOT 按钮就是配网开关。预期现象开机启动过程中按住 BOOT 不放会进入 WiFi 配网模式SoftAP连上手机热点、填好 WiFi 和密码后固件保存配置并重启日志里出现已连接到字样MCP 工具开始注册能看到开始注册MCP工具...。 验证方法日志里确认拿到 IP 且 websocket 连接成功也可以对机器人说我的 IP 是多少它会调self.otto.get_ip回答你。别忘了在 xiaozhi 后台建好角色板子目录的 README 里直接给了一段可抄的我的身份 我的动作能力 我的个性特点配置贴进后台AI 才会主动配合做动作。里程碑 3语音指令闭环对机器人喊唤醒词等它提示在听然后说跳个舞。预期现象它先做一个小动作性格设定里写了说话前随机做个动作再开口回应脚下开始迈步说停止立刻刹住回位。 验证方法连续说向前走→太空步→坐下三个动作都按队列执行完且每个动作结束后自动回初始位sit 和 showcase 除外说明动作队列和复位逻辑都通了。里程碑 4局域网直连调试不走云端固件在局域网开了一个 WebSocket 服务器JSON-RPC 2.0 格式浏览器控制台或任意 WS 工具都能连。连接地址是ws://设备IP:8080/ws先发初始化再拉工具列表就能在本地把 20 多个动作全部点一遍{jsonrpc:2.0,method:tools/list,params:{},id:2}预期现象返回的列表里能看到self.otto.action、self.otto.stop、self.battery.get_level等工具。 验证方法照板子 README 里的示例发一条tools/call执行walk机器人不动说明连接或参数有问题动了对比串口日志里的执行动作行确认工具命中。拆开看原理它为什么能工作跑通之后值得花十分钟看三条核心链路。第一条动作工具注册。向前走这三个字本身不是固件认识的话是 AI 翻译成了一次工具调用。固件侧把所有动作收进一个 MCP 工具参数带默认值回调里只做一件事——把动作丢进队列// main/boards/otto-robot/otto_controller.cc mcp_server.AddTool(self.otto.action, 执行机器人动作。action: 动作名称...sit(坐下)、showcase(展示动作)、home(复位)..., PropertyList({ Property(action, kPropertyTypeString, sit), Property(steps, kPropertyTypeInteger, 3, 1, 100), Property(speed, kPropertyTypeInteger, 700, 100, 3000), Property(direction, kPropertyTypeInteger, 1, -1, 1), Property(amount, kPropertyTypeInteger, 30, 0, 170), Property(arm_swing, kPropertyTypeInteger, 50, 0, 170) }), this - ReturnValue { std::string action properties[action].valuestd::string(); if (action walk) { QueueAction(ACTION_WALK, steps, speed, direction, arm_swing); } return true; });大白话AI 说走 5 步固件像接到外卖订单一样把它记进队列专门的后台任务逐个取单执行所以动作执行中你还能插新指令。第二条振荡器驱动的舵机。真正让动作平滑的不是逐帧摆角度而是每个舵机挂了一个振荡器给它振幅、中心角、周期、相位差它就按正弦曲线来回摆。otto_movements.h 里所有舞蹈动作最后都归结为这一个函数void OscillateServos(int amplitude[SERVO_COUNT], int offset[SERVO_COUNT], int period, double phase_diff[SERVO_COUNT], float cycle);大白话想让两个脚交替迈步就是把左右脚的相位差设成 180 度让两个钟摆反着走想让手臂画大风车就加大振幅、调短周期。oscillator.h 里能看到底层用的是 LEDC 定时器输出 20ms 周期、500~2500us 脉宽的 PWM舵机认这个。另外EnableServoLimit(240)默认限制每个舵机 240 度/秒 的转角速度防止突然抽风。第三条唤醒与对话。音频引擎常驻监听麦克风检测到唤醒词后切换设备状态开始上行录音AI 的回复走下行播放动作指令走 MCP 工具——听到-理解-回应三条线各走各的通道互不阻塞。玩出花样三个进阶方向方向一自定义动作编排。固件提供了self.otto.servo_sequences工具支持两种模式逐段移动a和振荡器osc还能在末尾加延迟d。改动点是在 WS 调试里发一段自定义 JSON或在后台角色提示词里教 AI 用这个工具。示例双臂反向摆 5 个周期周期 500ms{jsonrpc:2.0,method:tools/call,params:{name:self.otto.servo_sequences,arguments:{sequence:{\a\:[{\osc\:{\a\:{\lh\:30,\rh\:30},\o\:{\lh\:90,\rh\:90},\ph\:{\rh\:180},\p\:500,\c\:5.0}}]}}},id:24}预期效果两只手绕水平线反相挥舞把ll/rl左右腿的振幅改大、相位差给 180 度就是一段自定义舞步。键名对照表在板子 README 的序列舵机键名说明里。方向二换自己的唤醒词。默认用内置唤醒词仓库里有CustomWakeWordmain/audio/wake_words/custom_wake_word.h和专门的分区表partitions/v1/16m_custom_wakeword.csv预留了模型空间。改动点是把训练好的模型文件放进工程、按文档配置自定义唤醒词使能项。预期效果喊自己的名字也能叫醒机器人。方向三表情动画加码。Otto 的表情系统基于内置图标字体otto_icon_font.c和OttoEmojiDisplay240×240 上已经够用想要更花哨的可以用仓库里的 LVGL 图像转换工具 把图片转成屏上格式。改动点在 main/display/lvgl_display/预期效果对话中播放自定义 GIF 表情机器人戏精程度直接拉满。避坑对照表现象可能原因处理办法动作卡顿、中途卡死舵机嗡嗡响六个舵机同时动电流很大供电不足把 5V 拉垮舵机改用独立 5V 电源≥2A与开发板共地唤醒不灵敏麦克风离嘴远、正对噪音源或环境太吵把麦克风朝人挪近一些远离风扇/音箱音量调大重试连接 xiaozhi 后台不稳定、偶发掉线WiFi 信号弱机器人靠近路由器配网时选信号最好的 SSID上电后关节位置歪扭舵机零点漂移或装配误差用self.otto.set_trim给对应舵机微调-50~50 度self.otto.get_trims查当前值串口音频调试时听不清拾音采样链路问题用仓库自带的 scripts/audio_debug_server.py 抓一路实时音频对照收束从一个跳舞的 Otto 开始Otto-Robot 在 xiaozhi-esp32 里是个很好的切入口MCP 工具、振荡器舵机控制、唤醒词检测、表情显示这些能力你全都能在这个小项目里摸到代码量又不至于劝退。跑通它之后再往回看整个 xiaozhi-esp32 框架对你就不神秘了——其他几十块板子不过是换了一套引脚和外壳。现在轮到你了如果让你给这台语音交互机器人编排一段生日舞你会先调哪几个关节的相位差动手改一条servo_sequences序列试试答案就在舵机里。代码仓库git clone https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32【免费下载链接】xiaozhi-esp32An MCP-based chatbot | 一个基于MCP的聊天机器人项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考