一、项目简介这个项目主要实现了通过ESP32S3小智语音助手独立或者集群控制本末科技的刑天轮式机器人。具体的控制逻辑是小智语音指令→MCP Tool Call→ROS2MotionCmd→diablo_ctrl_node→下位机控制板的控制架构。开发stdioMCP Server将前进、后退、转向、俯仰、站立/趴下等动作封装为可被小智调用的工具。我这次一共使用了3台刑天机器人进行集群控制理论上可以集群控制很多个可能∞个这样的同类型机器人。Tips:在集群控制时这里的同类型机器人不只局限于刑天机器人它可以是任何搭载了ROS2操作系统的机器人或者其他物件这与集群控制的逻辑有关后文会介绍。单独控制时这个范围就更广了被控制的可以是大部分可以联网的MCU或者边缘计算板卡。文章最后附有Github仓库地址。二、具体实现如果你的手边刚好有这样一台刑天机器人你可以直接开始部署项目源代码了这很快只需要把代码拉取到对应的文件夹Maybe 1~2min如果你的网络够好的话。1.进入ros工程文件夹cd ~/diablo_ws/src2.拉取我的Github仓库代码拉取主分支给Robot1cd ~/diablo_ws/src git clone -b main https://github.com/yan-gd/xiaozhi-diablo_ros2.gitrobot2 拉cd ~/diablo_ws/src git clone -b robot2 https://github.com/yan-gd/xiaozhi-diablo_ros2.gitrobot3 拉:cd ~/diablo_ws/src git clone -b robot3 https://github.com/yan-gd/xiaozhi-diablo_ros2.git仓库中一共有3个分支的代码主分支main对应Robot1的代码它与其他两版的代码不同的地方是多了一个集群控制命令分发的功能Robot1将接收到的集群控制命令分发给另外两台机器人。这里的命令分发通过 UDP 通知robot2/robot3 收到后再在各自本机发 ROS2 控制消息。在此之前我还使用了ROS2 DDS但背后的坑是ROS2 DDS 在多机局域网里经常会出现这种尴尬状态ros2 node list / ros2 topic list 看得到但真正的 topic 数据不稳定、不送达、延迟大或者只发现不通信如果三台机器人都在同一个ROS_DOMAIN_ID例如都等于 51那么调度端发布一次diablo/MotionCmd三台都可能收到没法区分谁该动。如果三台用不同 ROS_DOMAIN_ID那 robot1 的 ROS2 节点默认又不能直接向 robot2/robot3 的 domain 发布数据。可以起多 domain bridge 或多进程但这样又回到跨机器DDS 数据面的不稳定问题。所以这个项目采用了一个很实用的工程折中跨机器只走简单 UDP 控制请求真正的 ROS2 MotionCmd 永远在机器人本机发布。Robot2和Robot3分支的代码多了一个接收Robot1命令的功能。调度端在本机直接发布 robot1 命令对 robot2/robot3 通过 UDP relay 请求它们在本机发布/diablo/MotionCmd3.每台机器都编译第一次部署时建议在每台机器人上分别完整编译一次 ROS 2 工作空间cd ~/diablo_ws source /opt/ros/foxy/setup.bash colcon build --symlink-install source install/setup.bash如果你只想编译小智控制包可以用cd ~/diablo_ws source /opt/ros/foxy/setup.bash colcon build --symlink-install --packages-select xiaozhi_robot_control source install/setup.bashTips拉取到代码之后你需要修改配置文件中的变量值改成你自己的小智接入点~另外源代码中还有开机自启的系统服务文件目的是让小智桥接程序开机自启不必每次都进入图形界面或者ssh远程连接。建议你运行命令如果需要开机自启的话cd ~/diablo_ws/src/xiaozhi_robot_control bash ./scripts/install_simple_startup.sh如果需要未登录桌面也能开机启动用户服务执行一次sudo loginctl enable-linger diablo查看状态和日志systemctl --user status xiaozhi-diablo-startup.service journalctl --user -u xiaozhi-diablo-startup.service -f初次部署会遇到系统文件权限问题执行命令给 scripts 目录下脚本加执行权限cd ~/diablo_ws/src/xiaozhi-diablo_ros2/xiaozhi_robot_control chmod x scripts/*.sh最后再查看系统服务状态时RUNNING就行了。三、项目仓库本项目仓库yan-gd/xiaozhi-diablo_ros2: xiaozhi ESP32S3 control diablo_ros2 Robothttps://github.com/yan-gd/xiaozhi-diablo_ros2如果你不知道小智xiaozhi esp32是什么78/xiaozhi-esp32: An MCP-based chatbot | 一个基于MCP的聊天机器人https://github.com/78/xiaozhi-esp32如果你不知道刑天机器人是什么DDTRobot/diablo_ros2: diablo ros2 packagehttps://github.com/DDTRobot/diablo_ros2四、演示视频刑天机器人此项目不止局限于刑天机器人如果你身边有其他ros2操作系统的机器人比如树莓派小车松灵小车地瓜机器人等等想要进行语音控制的话可以重点关注源代码中xiaozhi_robot_control的代码实现。这个目录可以理解为“小智语音控制和 ROS 2 机器人之间的桥接层”。它的核心作用不是直接驱动电机而是把小智识别到的语音指令转换成 ROS 2 中的控制消息再交给机器人原有的底层控制节点执行。它主要有以下几个特点1.不依赖特定机器人本体虽然当前项目默认适配的是刑天机器人控制话题是 /diablo/MotionCmd但整体思路可以迁移到其他 ROS 2 机器人上。例如普通移动小车可以改成发布 /cmd_vel机械臂可以改成调用对应的 action、service 或控制 topic。2.保留原有 ROS 2 控制架构xiaozhi_robot_control不直接绕过原来的机器人驱动而是继续使用 ROS 2 的 topic 通信方式这样做的好处是不用重写底层驱动只需要把语音指令转换成机器人已经支持的 ROS 2 控制接口。3.通过 MCP 工具暴露机器人能力:小智并不是直接发送 ROS 2 消息而是调用 MCP 工具例如前进、后退、左转、右转、停止、查询状态等。每一个工具背后对应一个具体的 ROS 2 控制逻辑因此开发者可以根据自己的机器人能力自定义工具名称和动作行为。总结来说xiaozhi_robot_control 的价值不只是控制刑天机器人而是提供了一个“小智语音 ROS 2 机器人”的通用接入模板。只要你的机器人已经具备 ROS 2 控制接口就可以参考这个目录将语音指令转换成对应的 ROS 2 控制命令从而实现自然语言控制机器人。
DIABLO刑天机器人集群语音控制系统
发布时间:2026/6/27 17:53:07
一、项目简介这个项目主要实现了通过ESP32S3小智语音助手独立或者集群控制本末科技的刑天轮式机器人。具体的控制逻辑是小智语音指令→MCP Tool Call→ROS2MotionCmd→diablo_ctrl_node→下位机控制板的控制架构。开发stdioMCP Server将前进、后退、转向、俯仰、站立/趴下等动作封装为可被小智调用的工具。我这次一共使用了3台刑天机器人进行集群控制理论上可以集群控制很多个可能∞个这样的同类型机器人。Tips:在集群控制时这里的同类型机器人不只局限于刑天机器人它可以是任何搭载了ROS2操作系统的机器人或者其他物件这与集群控制的逻辑有关后文会介绍。单独控制时这个范围就更广了被控制的可以是大部分可以联网的MCU或者边缘计算板卡。文章最后附有Github仓库地址。二、具体实现如果你的手边刚好有这样一台刑天机器人你可以直接开始部署项目源代码了这很快只需要把代码拉取到对应的文件夹Maybe 1~2min如果你的网络够好的话。1.进入ros工程文件夹cd ~/diablo_ws/src2.拉取我的Github仓库代码拉取主分支给Robot1cd ~/diablo_ws/src git clone -b main https://github.com/yan-gd/xiaozhi-diablo_ros2.gitrobot2 拉cd ~/diablo_ws/src git clone -b robot2 https://github.com/yan-gd/xiaozhi-diablo_ros2.gitrobot3 拉:cd ~/diablo_ws/src git clone -b robot3 https://github.com/yan-gd/xiaozhi-diablo_ros2.git仓库中一共有3个分支的代码主分支main对应Robot1的代码它与其他两版的代码不同的地方是多了一个集群控制命令分发的功能Robot1将接收到的集群控制命令分发给另外两台机器人。这里的命令分发通过 UDP 通知robot2/robot3 收到后再在各自本机发 ROS2 控制消息。在此之前我还使用了ROS2 DDS但背后的坑是ROS2 DDS 在多机局域网里经常会出现这种尴尬状态ros2 node list / ros2 topic list 看得到但真正的 topic 数据不稳定、不送达、延迟大或者只发现不通信如果三台机器人都在同一个ROS_DOMAIN_ID例如都等于 51那么调度端发布一次diablo/MotionCmd三台都可能收到没法区分谁该动。如果三台用不同 ROS_DOMAIN_ID那 robot1 的 ROS2 节点默认又不能直接向 robot2/robot3 的 domain 发布数据。可以起多 domain bridge 或多进程但这样又回到跨机器DDS 数据面的不稳定问题。所以这个项目采用了一个很实用的工程折中跨机器只走简单 UDP 控制请求真正的 ROS2 MotionCmd 永远在机器人本机发布。Robot2和Robot3分支的代码多了一个接收Robot1命令的功能。调度端在本机直接发布 robot1 命令对 robot2/robot3 通过 UDP relay 请求它们在本机发布/diablo/MotionCmd3.每台机器都编译第一次部署时建议在每台机器人上分别完整编译一次 ROS 2 工作空间cd ~/diablo_ws source /opt/ros/foxy/setup.bash colcon build --symlink-install source install/setup.bash如果你只想编译小智控制包可以用cd ~/diablo_ws source /opt/ros/foxy/setup.bash colcon build --symlink-install --packages-select xiaozhi_robot_control source install/setup.bashTips拉取到代码之后你需要修改配置文件中的变量值改成你自己的小智接入点~另外源代码中还有开机自启的系统服务文件目的是让小智桥接程序开机自启不必每次都进入图形界面或者ssh远程连接。建议你运行命令如果需要开机自启的话cd ~/diablo_ws/src/xiaozhi_robot_control bash ./scripts/install_simple_startup.sh如果需要未登录桌面也能开机启动用户服务执行一次sudo loginctl enable-linger diablo查看状态和日志systemctl --user status xiaozhi-diablo-startup.service journalctl --user -u xiaozhi-diablo-startup.service -f初次部署会遇到系统文件权限问题执行命令给 scripts 目录下脚本加执行权限cd ~/diablo_ws/src/xiaozhi-diablo_ros2/xiaozhi_robot_control chmod x scripts/*.sh最后再查看系统服务状态时RUNNING就行了。三、项目仓库本项目仓库yan-gd/xiaozhi-diablo_ros2: xiaozhi ESP32S3 control diablo_ros2 Robothttps://github.com/yan-gd/xiaozhi-diablo_ros2如果你不知道小智xiaozhi esp32是什么78/xiaozhi-esp32: An MCP-based chatbot | 一个基于MCP的聊天机器人https://github.com/78/xiaozhi-esp32如果你不知道刑天机器人是什么DDTRobot/diablo_ros2: diablo ros2 packagehttps://github.com/DDTRobot/diablo_ros2四、演示视频刑天机器人此项目不止局限于刑天机器人如果你身边有其他ros2操作系统的机器人比如树莓派小车松灵小车地瓜机器人等等想要进行语音控制的话可以重点关注源代码中xiaozhi_robot_control的代码实现。这个目录可以理解为“小智语音控制和 ROS 2 机器人之间的桥接层”。它的核心作用不是直接驱动电机而是把小智识别到的语音指令转换成 ROS 2 中的控制消息再交给机器人原有的底层控制节点执行。它主要有以下几个特点1.不依赖特定机器人本体虽然当前项目默认适配的是刑天机器人控制话题是 /diablo/MotionCmd但整体思路可以迁移到其他 ROS 2 机器人上。例如普通移动小车可以改成发布 /cmd_vel机械臂可以改成调用对应的 action、service 或控制 topic。2.保留原有 ROS 2 控制架构xiaozhi_robot_control不直接绕过原来的机器人驱动而是继续使用 ROS 2 的 topic 通信方式这样做的好处是不用重写底层驱动只需要把语音指令转换成机器人已经支持的 ROS 2 控制接口。3.通过 MCP 工具暴露机器人能力:小智并不是直接发送 ROS 2 消息而是调用 MCP 工具例如前进、后退、左转、右转、停止、查询状态等。每一个工具背后对应一个具体的 ROS 2 控制逻辑因此开发者可以根据自己的机器人能力自定义工具名称和动作行为。总结来说xiaozhi_robot_control 的价值不只是控制刑天机器人而是提供了一个“小智语音 ROS 2 机器人”的通用接入模板。只要你的机器人已经具备 ROS 2 控制接口就可以参考这个目录将语音指令转换成对应的 ROS 2 控制命令从而实现自然语言控制机器人。