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通信, 无人机模拟器, 无后门, 游戏外设, 硬件接口