DIABLO刑天机器人集群语音控制系统
一、项目简介
这个项目主要实现了通过ESP32S3小智语音助手独立或者集群控制本末科技的刑天轮式机器人。具体的控制逻辑是:小智语音指令→MCP Tool Call→ROS2 MotionCmd→diablo_ctrl_node→ 下位机控制板的控制架构。开发stdio MCP Server,将前进、后退、转向、俯仰、站立/趴下等动作封装为可被小智调用的工具。
我这次一共使用了3台刑天机器人进行集群控制,理论上可以集群控制很多个(可能∞个?😂😂😂)这样的同类型机器人。
Tips:在集群控制时这里的同类型机器人不只局限于刑天机器人,它可以是任何搭载了ROS2操作系统的机器人或者其他物件,这与集群控制的逻辑有关后文会介绍。单独控制时这个范围就更广了,被控制的可以是大部分可以联网的MCU或者边缘计算板卡。文章最后附有Github仓库地址。

二、具体实现
如果你的手边刚好有这样一台刑天机器人,你可以直接开始部署项目源代码了,这很快只需要把代码拉取到对应的文件夹(Maybe 1~2min如果你的网络够好的话)。
1.进入ros工程文件夹:
cd ~/diablo_ws/src
2.拉取我的Github仓库代码:
拉取主分支给Robot1:
cd ~/diablo_ws/src
git clone -b main https://github.com/yan-gd/xiaozhi-diablo_ros2.git
robot2 拉:
cd ~/diablo_ws/src
git clone -b robot2 https://github.com/yan-gd/xiaozhi-diablo_ros2.git
robot3 拉:
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/MotionCmd
3.每台机器都编译:
第一次部署时,建议在每台机器人上分别完整编译一次 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.bash
Tips:拉取到代码之后你需要修改配置文件中的变量值,改成你自己的小智接入点~
另外源代码中还有开机自启的系统服务文件,目的是让小智桥接程序开机自启,不必每次都进入图形界面或者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 Robot
https://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 package
https://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 控制命令,从而实现自然语言控制机器人。
更多推荐




所有评论(0)