RIG-TARS(塔斯)二次开发指南
本章面向开发者,拆解 RIG-TARS 的底层技术细节——硬件架构、固件框架、MCP 工具扩展与编译烧录流程。读完之后,你可以让这台桌面机器人按自己的想法继续生长。
系统架构
RIG-TARS 采用高度集成的单芯片架构:感知、步态控制、界面渲染与语音交互全部由一颗 ESP32-S3 独立完成,无需协处理器。固件基于 RIG-Omni 开源项目构建,结构模型、固件代码与组装资料均已开放,适合用于学习机器人运动控制、大模型与多模态交互、物联网通信等技术。
硬件抽象层
主控核心:ESP32-S3(Xtensa 双核 32 位处理器,主频 240 MHz),2.4 GHz Wi-Fi + BLE 5.0,板载 PSRAM。
运动总线(UART · XGO 协议):3 台 SCS009 总线舵机通过 TX / RX 串行总线控制(GPIO46 / GPIO38),支持 ID 寻址与位置、速度、负载状态回读。
显示链路(SPI):2.4 英寸 ST7789V2 面板(320 × 240 横屏),40 MHz 像素时钟,16 行分段 DMA 刷新——按实际写入量申请缓冲,不占用整屏内存。
视觉与触摸:DVP 摄像头采集图像;触摸模块为数字输出传感器(GPIO3,低电平有效),用于短触互动与长按休眠。
音频系统(I2S 直连):数字麦克风拾音 + 3514 腔体喇叭放音,无硬件编解码芯片,音频链路直接在 I2S 上完成。
姿态感知(I2C):QMI8658C 六轴 IMU(SDA GPIO14 / SCL GPIO48),提供实时姿态解算与动态平衡数据。
软件框架
RIG-Omni 采用「一份共用核心、各形态独立扩展」的模块化架构:语音 AI、界面渲染、MCP 远程控制等能力由公共层提供;机器人形态相关的逻辑——步态、界面风格、唤醒词与音效——收拢在板型目录 main/boards/tars/ 中。MCP(Model Context Protocol)控制协议以结构化指令流对外开放,配合断线重连机制保障控制的实时性与可靠性。
分层架构
层级 | 组件 | 位置 |
|---|---|---|
应用层 | 语音 AI · 终端风界面 · MCP 服务 · 摄像头工具 | main/ |
板型抽象 | IMU · 按键 · BLE · 电池 · 摄像头等共享驱动 | main/boards/common/ |
机器人逻辑 | 板级初始化 · 步态生成 · 终端 UI · 蓝牙遥控 | main/boards/tars/ |
平台层 | Wi-Fi · 蓝牙 · SPI · I2C · I2S · UART · GPIO | ESP-IDF v5.5.2+ |
关键模块
tars_board.cc:TarsBoard 板级类——UART、SPI 屏幕、摄像头、按键的初始化,以及全部 TARS 专属 MCP 工具的注册。
tars_display.cc:终端风 UI 渲染——FLIGHT LOG 日志流、STATUS 状态面板与人格参数 footer 的绘制与刷新。
xgo.cc:SCS009 舵机驱动层——零位管理(Flash 持久化)、位置与负载状态回读、非阻塞串口发送与堵转检测。
xgo_action.cc:步态生成层——前进 / 后退 / 转向的余弦步态、限时运动与速度限幅。
ble_remote_control.cc:蓝牙遥控模式——BLE 连接与遥控指令解析。
mcp_server.cc / device_state_machine.cc:公共核心——MCP 工具服务(含 self.camera.* 通用工具)与设备状态机。
ota.cc / settings.cc:公共核心——云端 OTA 升级与 NVS 设置持久化。
核心代码解析
1. MCP 工具注册(tars_board.cc)
每个能力通过 AddTool 注册为一个云端大模型可调用的「工具」:工具名、自然语言描述、参数定义与执行回调。其中的描述会随请求提交给模型,由它判断何时调用——这是「说话就能控制」的关键一环。
mcp_server.AddTool("self.tars.forward",
"TARS 前进或后退。speed 为运动幅度(0-60,正值前进,负值后退,0 停下),"
"time 为持续时间(毫秒),time=0 时持续运动直到再次调用并设 speed=0。"
"步态频率 1.5Hz。适用于用户说'前进''往前走''后退''过来'等。",
PropertyList({
Property("speed", kPropertyTypeInteger, -60, 60),
Property("time", kPropertyTypeInteger, 0, 10000),
}),
[this](const PropertyList& properties) -> ReturnValue {
int speed = properties["speed"].value<int>();
int time = properties["time"].value<int>();
ESP_LOGI(TAG, "MCP forward speed=%d time=%d", speed, time);
tars_set_forward(speed, time);
return true;
});2. 余弦步态生成(xgo_action.cc)
步态在舵机控制循环中周期性更新:相位按 1.5 Hz 推进,cos 分量驱动一号关节前后摆动,sin 分量驱动另外两路关节交替起落。前进、后退、转向三种模式根据运动幅值自动切换,幅值越大步幅越大;带时长参数的运动到期后会自动停下。
void tars_gait_update() {
// 限时运动到期后自动停下
if (gait_until_us > 0 && esp_timer_get_time() >= gait_until_us) {
vx = 0.0f;
vyaw = 0.0f;
gait_until_us = 0;
}
float t = (now - gait_t0_us) / 1000000.0f;
float phase = TARS_GAIT_FREQ_HZ * t * 2.0f * (float)PI;
float c = cosf(phase); // 主柱摆动分量
float s = sinf(phase); // 侧柱交替分量
if (fabsf(amp_yaw) >= fabsf(amp_x)) {
// 转向模式:幅值为正左转,为负右转
float scale = fabsf(amp_yaw) / 30.0f;
pos[0] = c * 40.0f * scale;
pos[1] = s * amp_yaw;
pos[2] = -s * amp_yaw;
} else if (amp_x > 0.0f) {
// 前进模式
float scale = amp_x / 40.0f;
pos[0] = c * 55.0f * scale;
pos[1] = s * (-amp_x);
pos[2] = s * (-amp_x);
} else {
// 后退模式
float speed = -amp_x;
float scale = speed / 40.0f;
pos[0] = c * 50.0f * scale;
pos[1] = s * speed;
pos[2] = s * speed;
}
WritePos(pos);
}3. 堵转检测与保护(xgo.h / xgo.cc)
固件对每台舵机回读位置与负载。当位置误差与负载同时超过阈值并连续确认 3 次、且距上次触发已超过冷却窗口时,判定为堵转——保护回调立即接管,自动卸力冷却,避免舵机长时间憋劲。
#define STALL_POS_THRESHOLD 100 // 位置误差阈值
#define STALL_TOR_THRESHOLD 100 // 负载阈值
#define STALL_DEBOUNCE_COUNT 3 // 连续确认次数
#define STALL_COOLDOWN_MS 1000 // 触发后冷却窗口(毫秒)编译与烧录
环境要求
硬件:RIG-TARS 整机(RIG-Board0722 主控板)与 Type-C 数据线。
工具链:ESP-IDF v5.5.2 或更高版本(含 Xtensa-ESP32-S3-ELF 编译器)。
其他:Python 3.8+(构建脚本),USB 串口工具(连接 UART0 烧录与查看日志)。
编译与烧录步骤
# 1. 获取固件源码
git clone https://github.com/Xgorobot/RIG-Omni.git
cd RIG-Omni
# 2. 激活 ESP-IDF 环境(Linux / macOS 示例)
. $HOME/esp/esp-idf/export.sh
# Windows 用户请在 ESP-IDF 命令行环境中直接执行以下步骤
# 3. 选择目标芯片与板型
idf.py set-target esp32s3
idf.py menuconfig
# → RIG-Omni → Board Type → RIG-TARS
# → RIG-Omni → Firmware Region → Domestic (China) / Overseas
# 4. 编译
idf.py build
# 5. 烧录并查看串口日志(端口号按实际情况填写)
idf.py -p COM3 flash monitor固件区域(国内 / 海外)
RIG-Omni 支持从同一代码库构建国内与海外两个版本。在 menuconfig 中切换区域后,OTA 地址、默认语言、唤醒词与配网二维码会自动联动:
配置项 | 国内版(Domestic) | 海外版(Overseas) |
|---|---|---|
OTA 地址 | xl-api.xgorobot.com | xl-api.luwudynamics.ai |
默认语言 | zh_CN | en_US |
唤醒词 | 自定义唤醒词(小陆同学) | 自定义唤醒词 + 内置「Hey Kira」 |
配网动画 | 国内版二维码 | 海外版二维码 |
发布打包
编译完成后,可运行打包脚本生成发布包——含固件、bootloader、分区表、资源文件与 manifest.json,输出到 bin/ 目录:
python tools/gen_bin_package.py扩展开发
注册新的 MCP 工具
想让塔斯学会一个新技能,先为它注册一个工具:在 TarsBoard 的工具初始化代码中追加 AddTool 调用,填入工具名、描述、参数范围与执行逻辑,重新编译烧录即可。云端模型会自动把用户的话匹配到新工具上。
mcp_server.AddTool("self.tars.custom_action",
"用一句话描述这个工具的用途与大模型的调用时机",
PropertyList({
Property("duration", kPropertyTypeInteger, 0, 10000),
}),
[this](const PropertyList& properties) -> ReturnValue {
int duration = properties["duration"].value<int>();
// 在这里执行你的自定义动作
return true;
});自定义开机音效
把 .ogg 音效文件放进板型目录
main/boards/tars/,编译时会自动发现并嵌入固件,无需手动配置。开机音效文件名为
tars_startup.ogg;建议使用 Opus 编码、单声道、16 kHz 采样。请使用原创或已获授权的音效素材;可用 FFmpeg 完成转码:
ffmpeg -i source.wav -t 4.5 -ac 1 -ar 16000 -c:a libopus -b:a 24k main/boards/tars/tars_startup.ogg创建自定义板型
快速方式:运行
python tools/create_board.py,按向导提示创建新板型——自动生成全部必要文件并在构建系统中完成注册。手动方式:在
main/boards/下新建板型目录,编写板级与电机逻辑代码,并在 Kconfig 与 CMakeLists 中完成注册。板型专属资源:表情动画(emoji/)、界面布局(320_240/)、唤醒词模型(wakenet/)与音效文件(*.ogg)均随板型目录独立存放。
资源下载与开发环境
固件开源仓库(GitHub):Xgorobot/RIG-Omni——开源 ESP32-S3 多形态机器人固件。
结构模型与装配资料:RIG-TARS 全链路复刻指南(含 BOM、3D 打印工程与总装参考)。
开发环境清单:ESP-IDF v5.5.2+ · Python 3.8+ · Xtensa-ESP32-S3-ELF 工具链 · USB 转串口调试工具。
