feat: 摇杆手型 HandStyle 支持(标准/单摇杆左/单摇杆右/坦克式),设置界面持久化
- AppSettings.kt: 添加 handStyle 字段,默认 STANDARD - SettingsRepository.kt: 添加 KEY_HAND_STYLE 持久化键,setHandStyle() 方法,setAll() 包含手型 - JoystickController.kt: 添加 HandStyle 枚举,dualStickToAxisCommand() 按手型映射轴 - MainViewModel.kt: 轴指令循环传入当前 handStyle - SettingsScreen.kt: 添加 HandStyleDropdown 下拉选择组件 - AGENTS.md: 同步更新手型文档 Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
@@ -35,7 +35,7 @@ com.example.m20_gamepad/
|
||||
│ └── StatusReports.kt # 下行状态结构(基础状态、运控状态、设备状态等)
|
||||
├── service/
|
||||
│ ├── RobotConnection.kt # 连接状态机管理(连接/订阅/心跳/断线判定)
|
||||
│ └── JoystickController.kt # 摇杆输入 → 协议指令映射
|
||||
│ └── JoystickController.kt # 摇杆输入 → 协议指令映射,含 HandStyle 多手型支持
|
||||
├── video/
|
||||
│ └── RtspVideoPlayer.kt # RTSP 视频流播放(ExoPlayer + Composable 包装)
|
||||
├── data/
|
||||
@@ -91,12 +91,23 @@ Joystick(
|
||||
- 角度 270° = 正下 → X 负方向(后退)
|
||||
- 强度百分比 → [-1, 1] 比例值
|
||||
|
||||
**映射公式(从左摇杆角度/强度到 X/Y)**:
|
||||
**标准手型(STANDARD)**:
|
||||
```
|
||||
val x = power / 100.0 * cos(angle) // 垂直分量
|
||||
val y = power / 100.0 * sin(angle) // 水平分量
|
||||
左摇杆: X = sin(angle) * power/100, Y = cos(angle) * power/100
|
||||
右摇杆: Yaw = cos(angle) * power/100
|
||||
```
|
||||
|
||||
**单摇杆左(SINGLE_LEFT)**:左摇杆控制 X(前后) + Yaw(转向,类车操控),右摇杆仅控制 Y(横移)
|
||||
|
||||
**单摇杆右(SINGLE_RIGHT)**:左摇杆仅控制 Y(横移),右摇杆控制 X(前后) + Yaw(转向,类车操控)
|
||||
|
||||
**坦克式(TANK)**:两摇杆 up/down 差速计算 X/Yaw,无横移 Y
|
||||
```
|
||||
左履带 = sin(leftAngle) * leftScale
|
||||
右履带 = sin(rightAngle) * rightScale
|
||||
X = (左履带 + 右履带) / 2
|
||||
Yaw = (左履带 - 右履带) / 2
|
||||
```
|
||||
右摇杆控制 Yaw(偏航角速度)。
|
||||
|
||||
---
|
||||
|
||||
@@ -117,6 +128,7 @@ val y = power / 100.0 * sin(angle) // 水平分量
|
||||
| `rtsp_url` | String | `rtsp://10.21.31.103:554/stream` | RTSP 视频流地址 |
|
||||
| `video_codec` | Enum | `AUTO` | `AUTO` / `FORCE_HW` / `FORCE_SW_H264` / `FORCE_SW_H265` |
|
||||
| `video_resize_mode` | Enum | `ZOOM` | `FIT` / `ZOOM` / `FILL` |
|
||||
| `hand_style` | Enum | `STANDARD` | `STANDARD` / `SINGLE_LEFT` / `SINGLE_RIGHT` / `TANK` |
|
||||
|
||||
### 持久化
|
||||
|
||||
@@ -219,6 +231,7 @@ gradlew installDebug
|
||||
- [x] 休眠按钮状态约束:仅非站立状态(空闲/趴下/阻尼等)可切换休眠,站立/RL 控制时禁用
|
||||
- [x] RTSP 自动重连:`RtspVideoPlayer` 播放失败后自动重试,指数退避(初始 1s,最大 30s,倍率 2),URL/解码器变化时重置退避状态;覆盖层显示重试次数和倒计时
|
||||
- [x] 订阅请求清理:删除 `ProtocolClient.sendSubscriptionRequests()` 方法及 `connect()` 中的注释调用;同步删除 `ControlCommands.subscribeStatus()` 和 `SUB_*` 常量,彻底清除死代码
|
||||
- [x] 摇杆手型支持:`HandStyle` 枚举(标准/单摇杆左/单摇杆右/坦克式),映射到 `JoystickController.dualStickToAxisCommand()`,设置界面持久化存储,实时生效
|
||||
|
||||
### 待办
|
||||
|
||||
|
||||
Reference in New Issue
Block a user