gregszero/dji-rc-joystick

GitHub: gregszero/dji-rc-joystick

通过逆向解析 DJI 私有 DUML USB 协议,将锁定的 DJI RM 系列遥控器桥接为 Linux 虚拟手柄,用于 PC 无人机模拟器飞行练习。

Stars: 0 | Forks: 0

# DJI RC → PC 摇杆桥接 将**锁定**的 DJI 智能控制器(RM 系列,Snapdragon APQ8053,USB id `2ca3:1023`)转变为标准的 Linux 手柄,让你可以用真实的摇杆 飞行 PC 无人机模拟器 (Liflift、Velocidrone、Uncrashed、DRL 等)。 该控制器**没有开发者选项**(无法授权 adb 或 sideload), 因此我们直接从 DJI 的**厂商 BULK / DUML** USB 接口读取摇杆数据——无需解锁——并通过 `/dev/uinput` 将其映射为虚拟摇杆。 ## 工作原理(逆向工程) - 即使在锁定状态下,RC 也会暴露一个厂商 BULK 接口(iface 1,EP OUT `0x02`,IN `0x83`),该接口使用 DJI 的 **DUML** 协议进行通信。 - 实时摇杆数值来自 **cmd_set `0x06`,cmd_id `0xf5`**(“RC Test Stick Value”),以约 64 Hz 的频率从模块 `src=0x06`(REMOTE_RADIO)轮询。 - 负载为 13 字节;四个轴是偏移量 **1, 3, 5, 7** 处的 **uint16 LE**(字节 0 是状态)。原始范围 ≈ 480–3611,中心点 ≈ 2048。 - DUML 帧结构/CRC 复用自 [dji-firmware-tools](https://github.com/o-gs/dji-firmware-tools)。 ## 环境要求 - Linux(使用 `/dev/uinput` 和 udev) - Python 3 - `libusb`(通常已预装;例如 `sudo pacman -S libusb` / `sudo apt install libusb-1.0-0`) - DJI RM 系列智能控制器(USB `2ca3:1023`),已开机并插入 ## 安装 ``` git clone git@github.com:gregszero/dji-rc-joystick.git cd dji-rc-joystick python3 -m venv .venv .venv/bin/pip install -r requirements.txt sudo bash install_udev.sh # (once) sudo-free USB access + lets games read the joystick ``` 运行 `install_udev.sh` 后,**请注销并重新登录**(以便 `input` 用户组 生效),并**重新插拔**一次控制器(以便应用新的 USB 规则)。 ## 用法 ``` ./run.sh # starts the bridge; Ctrl-C to stop ``` 当 udev 规则生效时,`run.sh` 无需 sudo 即可运行;否则会自动使用 sudo 提权。保持其运行,启动你的模拟器,并绑定这 4 个轴—— 该设备会显示为 Xbox 360 手柄,因此大多数模拟器会自动 识别双摇杆。 手动 / 高级用法: ``` .venv/bin/python dji_joystick.py --debug # run directly, see live values sudo .venv/bin/python calibrate.py # recalibrate if centers drift ``` 包含一个可用的默认 `calib.json`。当中心点 发生偏移时,随时可重新运行 `calibrate.py`。 ## 文件 | 文件 | 用途 | |------|---------| | `dji_joystick.py` | **桥接程序。** 轮询摇杆 → 虚拟摇杆。 | | `run.sh` | 启动器(当 udev 规则生效时无需 sudo,否则自动提权)。 | | `calib.json` | 各轴的最小值/中心点/最大值(来自校准)。 | | `calibrate.py` | 引导式校准 → 重新生成 `calib.json`。 | | `probe_duml.py` | DUML 握手探测(证明通道可用)。 | | `read_sticks.py` / `diag.py` | 快速实时数值读取。 | | `capture_sticks.py` / `analyze_f5.py` | 用于逆向解析负载的发现工具。 | | `ref_dat2pcap.py` | DUML CRC 例程(来自 dji-firmware-tools)。 | | `ref_mkdupc.py` | DUML 数据包构建器——仅供参考(未被桥接程序导入)。 | | `dji-dumlv1-proto.lua` | 用于 DUML 协议的 Wireshark 解析器。 | | `install_udev.sh` / `99-dji-rc-joystick.rules` | 无需 sudo 运行桥接程序。 | ## 许可证 [GPL-3.0](LICENSE) —— 选择此许可证是为了与整合的 dji-firmware-tools 代码保持兼容。 ## 免责声明 这是用于实现互操作性的独立逆向工程项目。不隶属于 DJI,也未获其认可。使用风险自负。
标签:Python, USB通信, 无人机模拟器, 无后门, 游戏外设, 硬件接口