Skip to content

Latest commit

 

History

99 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RMUC Custom Client UI

RoboMaster 2026 超级对抗赛桌面客户端,使用 React、TypeScript 和 Tauri。

CI

当前是可在本机完整联调的开发版本,尚未通过比赛设备验收。 操作台已接通真实本机 MQTT / V2 Protobuf,以及 UDP / HEVC 图传。正式比赛网络仍锁定。

操作台

能力与边界

功能 当前状态
比赛状态、机器人选择、视频/地图双视图、全屏 可用
本机 MQTT broker → Rust → V2 Protobuf → 操作台 已做桌面端到端验证
MQTT 连接确认、broker 重启后重新订阅 已验证
哨兵指令 → 模拟器 → SentryCtrlResult 回执 成功、拒绝、超时路径已验证
异常包计数、缺失/过期字段隐藏、诊断导出 可用
本机 UDP HEVC 播放 320×180 合成样本实测约 60 FPS
真实裁判系统、正式控制输入、1080p60 实机性能 待设备联调
雷达完整解析、地图实地标定、角色权限与全部比赛指令 尚未完成

本文描述当前入口。docs 中带历史版本号的文档保留为开发记录,不代表当前运行状态。

1. 环境准备

推荐 Windows 10/11 x64,安装:

工具 用途
Git 获取源码
Node.js 22.12+ 或受支持的新版本,附带 npm 前端、内置 MQTT 模拟器
Rust stable,MSVC 工具链 编译 Tauri 后端
Visual Studio Build Tools:Desktop development with C++、Windows SDK Windows 编译与链接
Microsoft Edge WebView2 Runtime 桌面界面与 WebCodecs
Python 3.10+(视频模拟时需要) 发送 HEVC 样本,无需额外 pip 包

安装依赖参见 Tauri 官方前置条件。 浏览器预览只需要 Git 和 Node.js;实际 MQTT TCP / UDP 必须使用桌面版。 HEVC 解码依赖当前 WebView2 和系统环境,客户端会报告不支持或配置失败。

PowerShell 检查:

node --version
npm --version
rustc --version
cargo --version
py --version

2. 获取和安装

git clone https://github.com/JFCY2718/rmuc-custom-client-ui.git
cd rmuc-custom-client-ui
npm ci

已有仓库先保存自己的修改,再更新分支。使用 npm ci 安装锁文件规定的版本。 内置模拟器已经包含 broker,不需要另装 Mosquitto、Docker 或 paho-mqtt。

可选:把 Rust 缓存放到空间充足的磁盘,仅对当前终端设置:

$env:CARGO_TARGET_DIR = "D:\rmuc-build-cache\target"

不设置时默认输出到 src-tauri/target。下面每个终端都要先进入项目根目录。

3. 启动操作台

npm run tauri:dev

该命令自动启动 Vite 和桌面程序,首次 Rust 编译较慢,默认进入演示模式。 不要同时运行多个桌面实例,避免 WebView2 数据目录和网络端口争用。

只看界面可运行 npm run dev,打开 http://localhost:5173;浏览器不能连接原生 MQTT 或图传。

  • 顶部切换“视频作战 / 战术态势”,快捷键 V。
  • F 切换全屏,Esc 关闭面板或退出全屏;输入框和对话框中不触发视图快捷键。
  • 点击机器人列表或地图编号切换观察对象。
  • 地图“红方/蓝方视角”只改变显示方向,不改变连接的己方颜色。
  • “本地标记”只在本机显示;点击地图,或聚焦地图后用方向键和 Enter 放置,不发送比赛指令。
  • “设置 → 进入工作台”打开原协议诊断与布局工具;进入前会清理图传和 MQTT 会话。

4. MQTT 联调:从零跑通

终端 A:启动模拟器

npm run simulator

出现 READY mqtt://127.0.0.1:1883 后,broker 和数据发送均已运行。 它按 V2 Protobuf 发送比赛、基地/前哨站、后勤、当前机器人静态/动态/位置、哨兵和空中支援状态。

终端 B:启动客户端

npm run tauri:dev

进入 设置 → 本机 MQTT 联调,保持默认端口 1883、红方、英雄,点击 连接本机 MQTT。 看到“MQTT 已连接”且收包数递增后关闭设置。

默认数据应为:

  • 顶部“本机 MQTT”,比赛阶段“比赛进行中”。
  • 红方基地 1450、蓝方基地 1234、队伍经济 250。
  • 英雄 HP 480、弹量 97,热量和位置随时间变化。
  • 未收到的属性显示 —;其他机器人没有下发的热量、最大血量不会沿用演示值。

动态消息不携带机器人 ID,由连接配置和 RobotStaticStatus 确定归属。 点击其他观察对象不会把收到的数据改归别人。

更换端口、队色或机器人

先“断开并返回演示”,停止模拟器(Ctrl+C),例如:

npm run simulator -- --port 1884 --team blue --robot 7

客户端设置端口 1884、蓝方、哨兵,再连接。模拟器编号为 1/2/3/4/5/6/7; 蓝方发送时自动使用 101…107。己方/对方基地会投影到正确的红蓝两侧。

设置保存在本机,下次自动填入,不会自动连接。地址固定为 127.0.0.1。 地图默认 28×15 米只是本地预览换算设置,不能代替实地标定。

5. 验证指令回环

连接 MQTT 后,点击 指令联调:

  1. 选择哨兵指令,例如“防御姿态”。
  2. 点击“发送联调指令”,再确认发送到本机模拟器。
  3. 模拟器输出 COMMAND {"command_id":8}。
  4. 客户端显示“模拟器确认成功”。

使用 V2 的 SentryCtrlCommand / SentryCtrlResult,一次只等待一条回执。 5 秒没有回执则显示“执行结果未知”,不会自动重发。 协议没有客户端事务 ID;结果未知的同编号指令需要重新连接后再联调,避免迟到回执误匹配。 其他比赛指令、键鼠连续控制尚未接入该发送入口。

6. UDP / HEVC 图传

图传独立于 MQTT。桌面操作台点击 连接本地图传,另开终端:

py -3 simulator/video_sender.py --loops 100

应出现仓库提供的彩条动态图像,尺寸 320×180,帧率接近 60 FPS。 发送结束后显示“视频中断”;“断开图传”释放 UDP 3334。 主视图切换不会重建解码会话。

发送自己的 Annex B HEVC 文件前查看参数:

py -3 simulator/video_sender.py --help

文件需每帧有 AUD,关键帧带 VPS/SPS/PPS;codec 可在设置中调整。 当前没有捆绑 FFmpeg/原生解码回退。详见 视频运行时。

7. 故障注入与诊断

停止已有模拟器,再使用下面参数。每次更换场景前断开客户端,再重新连接。

场景 命令 预期
拒绝指令 npm run simulator -- --ack reject 模拟器拒绝
丢弃回执 npm run simulator -- --ack drop 5 秒后结果未知
每 10 tick 插入异常包 npm run simulator -- --malformed-every 10 异常计数增加,正常遥测继续
3 秒后停止遥测但保留连接 npm run simulator -- --pause-after 3 过期数值隐藏
broker 重启 Ctrl+C 停止,再运行 npm run simulator 断线后重连、恢复订阅

设置面板显示收包、异常、重连和丢弃计数;导出诊断下载 JSON 报告。 重连有退避等待,最多 10 次失败后停止;此时显式断开再连接。 收包数证明传输活动,字段是否有效仍以各自更新时间为准。

8. 常见问题

现象 处理
连接按钮不可用 使用桌面版;连接期间和已连接时设置锁定
8 秒内未收到 broker 确认 检查模拟器是否 READY、端口是否一致;不要填比赛设备地址
EADDRINUSE 停止旧模拟器或更换端口,客户端同步修改
属性显示 — 检查机器人身份和对应消息;未下发属性本来就未知
HEVC 不支持 / 配置失败 检查 WebView2、系统 HEVC 能力和 codec;先用仓库样本排除码流问题
视频中断 检查发送进程、UDP 3334、本地地址;MQTT 正常不代表图传正常
link.exe / SDK 缺失 安装 C++ 桌面开发及 Windows SDK,重开终端
cargo / py 找不到 安装对应工具并重开终端,或使用 Python 完整路径
第二个窗口不出现 / exe 无法覆盖 关闭旧客户端后再启动或构建

9. 构建 Windows 程序

npm run tauri:build

当前生成 exe,不生成安装包:

  • 默认:src-tauri/target/release/rmuc-custom-client-ui.exe
  • 设置过 CARGO_TARGET_DIR:该目录下的 release/rmuc-custom-client-ui.exe

运行 exe 不需要 Vite;接收机器仍需 WebView2 和可用的 HEVC 环境。 复制前先退出旧版本。

10. 开发与验证

原工作台的 official_locked 模式保持禁用网络;本机联调从操作台设置进入。 历史流程见 团队交接指南,当前能力以本文为准。

npx vitest run src/state/live/liveTelemetry.test.ts src/lib/tauri/runtime.test.ts src/protocol/official/__tests__/officialV2MessageNormalizer.test.ts
cargo test --manifest-path src-tauri/Cargo.toml mqtt_runtime

GitHub CI 执行前端格式/lint/类型/单测/构建、Rust fmt/clippy/check/test、Python 图传测试及仓库协议验证。

可复现的桌面 MQTT 冒烟:

$env:WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS = "--remote-debugging-port=9223"
npm run tauri:dev
# 在另一个项目终端,确保 Node 能找到 Playwright:
node scripts/ui/smoke-mqtt.cjs

脚本自带测试 broker(仅本机 18884),测试后停止。需要独立安装的 Playwright, 可通过 NODE_PATH 指向已有安装。测试后关闭客户端和终端;普通启动不主动开启调试端口。 界面/视频脚本分别为 scripts/ui/smoke-operator.cjs 和 scripts/video/smoke-hevc.cjs。

11. 距离比赛可用还缺什么

当前无真实裁判系统硬件证据,不能宣称比赛可用。设备到位后需要:

  1. 校验真实 V2 抓包、阵营/机器人身份及全部所需 topic。
  2. 明确雷达线格式,完成地图标定与角色权限。
  3. 实现并验收所需比赛控制输入、指令与回执。
  4. 验收实际 UDP 码流、1920×1080@60 解码、延迟及长时间稳定性。
  5. 在明确设备配置下开放实验室网络入口,完成比赛环境验收。

官方协议参数:设备 broker 192.168.12.1:3333、客户端 IP 192.168.12.2、图传 UDP 3334。 这不表示当前版本已经开放该连接。 证据与剩余工作见 本机联调说明。

12. RM26_Client 复用与许可

参考 ClearWei/RM26_Client (社区项目,复旦大学星云 EGA,并非官方客户端)。 快照:e291f2f65f5a5924509e4e2fe1b148ff9d4b24af。

  • 原样复用赛场底图及 hero/engineer/infantry/sentry/drone 图标。
  • 借鉴视频/战术双视图和地图镜像处理。
  • 协议对照其 MQTT 定义与模拟器发布顺序,再以所提供的 V2.0.0 PDF 为准。
  • 保留本项目 React/Tauri、MQTT runtime、视频会话和验证工具,没有迁入整套 Qt 工程。

素材来源见 NOTICE 和 参考许可证。 本项目代码采用 MIT。

About

RoboMaster 2026 超级对抗赛自定义客户端 UI —— React + TypeScript + Vite + Tauri。当前为 UI 原型 + 协议骨架,官方真实连接未开放。

Topics

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages