refactor(protocol): 移除上行帧 seq 字段,精简协议开销

BLE 链路层已有重传保序机制,应用层 seq 冗余且从未被接收端消费,
移除后 CoP 帧 18→17 字节、Encoder 帧 14→13 字节。
This commit is contained in:
2026-05-12 15:58:46 +08:00
parent cb758045f8
commit b72ea5334f
3 changed files with 20 additions and 27 deletions
+16 -19
View File
@@ -31,8 +31,8 @@
| 类型名 | 值 | 方向 | 长度 | 频率 | 说明 |
|--------|----|------|------|------|------|
| `PROTO_TYPE_COP` | `0x01` | 平衡板 -> 基站 | `18` | 50 Hz | 压力中心帧 |
| `PROTO_TYPE_ENCODER` | `0x02` | 平衡板 -> 基站 | `14` | TBD | 电机编码器帧(预留) |
| `PROTO_TYPE_COP` | `0x01` | 平衡板 -> 基站 | `17` | 50 Hz | 压力中心帧 |
| `PROTO_TYPE_ENCODER` | `0x02` | 平衡板 -> 基站 | `13` | TBD | 电机编码器帧(预留) |
| `PROTO_TYPE_RESISTANCE` | `0x10` | 基站 -> 平衡板 | `16` | 按需 | 阻力参数帧 |
| `PROTO_TYPE_SPOTTER` | `0x11` | 基站 -> 平衡板 | `9` | 按需 | 保护模式帧 |
| `PROTO_TYPE_HEARTBEAT` | `0x20` | 基站 -> 平衡板 | `5` | ~1 Hz | 心跳帧 |
@@ -41,19 +41,18 @@
### 3.1 压力中心帧 (CoP)
CoP 帧固定 18 字节,结构如下:
CoP 帧固定 17 字节,结构如下:
| 字节偏移 | 字段 | 类型 | 值/范围 | 说明 |
|----------|------|------|---------|------|
| `0` | `sync0` | `uint8` | `0xAA` | 帧头第 1 字节 |
| `1` | `sync1` | `uint8` | `0x55` | 帧头第 2 字节 |
| `2` | `type` | `uint8` | `0x01` | CoP 包类型 |
| `3` | `seq` | `uint8` | `0-255` | 包序号,循环递增 |
| `4` | `flags` | `uint8` | 见下表 | 状态标志位 |
| `5-8` | `cop_x` | `float32 LE` | - | 压力中心 X 坐标 (mm) |
| `9-12` | `cop_y` | `float32 LE` | - | 压力中心 Y 坐标 (mm) |
| `13-16` | `force` | `float32 LE` | - | 总压力 (N) |
| `17` | `crc` | `uint8` | - | CRC-8/MAXIM 校验 |
| `3` | `flags` | `uint8` | 见下表 | 状态标志位 |
| `4-7` | `cop_x` | `float32 LE` | - | 压力中心 X 坐标 (mm) |
| `8-11` | `cop_y` | `float32 LE` | - | 压力中心 Y 坐标 (mm) |
| `12-15` | `force` | `float32 LE` | - | 压力 (N) |
| `16` | `crc` | `uint8` | - | CRC-8/MAXIM 校验 |
#### flags 位定义
@@ -97,34 +96,32 @@ CoP_Y = (F0 * y0 + F1 * y1 + F2 * y2 + F3 * y3) / F_total
下面是一个 CoP 帧示例(CoP 有效):
```text
AA 55 01 2A 01 00 00 F0 41 00 00 48 42 00 80 BB 44 XX
AA 55 01 01 00 00 F0 41 00 00 48 42 00 80 BB 44 XX
```
含义如下:
- `AA 55`:双帧头
- `01`CoP 包
- `2A`:序号 `0x2A`
- `01`flags = `force_valid`
- `00 00 F0 41``cop_x = 30.0` mmLE float32
- `00 00 48 42``cop_y = 50.0` mmLE float32
- `00 80 BB 44``force = 1500.0` NLE float32
- `XX`CRC-8/MAXIM(对字节 `[2..16]` 计算)
- `XX`CRC-8/MAXIM(对字节 `[2..15]` 计算)
### 3.2 电机编码器帧(预留)
编码器帧固定 14 字节,结构如下。该帧目前仅在协议中预留定义,固件暂不实现。
编码器帧固定 13 字节,结构如下。该帧目前仅在协议中预留定义,固件暂不实现。
| 字节偏移 | 字段 | 类型 | 值/范围 | 说明 |
|----------|------|------|---------|------|
| `0` | `sync0` | `uint8` | `0xAA` | 帧头第 1 字节 |
| `1` | `sync1` | `uint8` | `0x55` | 帧头第 2 字节 |
| `2` | `type` | `uint8` | `0x02` | 编码器包类型 |
| `3` | `seq` | `uint8` | `0-255` | 包序号 |
| `4` | `flags` | `uint8` | `0` | 预留 |
| `5-8` | `cable_length` | `float32 LE` | - | 拉索度 (mm) |
| `9-12` | `velocity` | `float32 LE` | - | 拉索速度 (mm/s) |
| `13` | `crc` | `uint8` | - | CRC-8/MAXIM 校验 |
| `3` | `flags` | `uint8` | `0` | 预留 |
| `4-7` | `cable_length` | `float32 LE` | - | 拉索长度 (mm) |
| `8-11` | `velocity` | `float32 LE` | - | 拉索度 (mm/s) |
| `12` | `crc` | `uint8` | - | CRC-8/MAXIM 校验 |
## 4. 下行数据包
@@ -199,7 +196,7 @@ AA 55 20 05 XX
## 5. 当前实现约束
- CoP 帧固定 18 字节,可在最小 ATT MTU 23(NUS 有效负载 20 字节)下传输。
- CoP 帧固定 17 字节,可在最小 ATT MTU 23(NUS 有效负载 20 字节)下传输。
- 50 Hz CoP 上行流隐式充当平衡板到基站的活性检测,因此心跳仅为下行。
- 传感器通道到物理位置的映射:MUX `{0x01, 0x23, 0x45, 0x67}` → FL/FR/BR/BL。
- `BOARD_HALF_WIDTH_MM = 200``BOARD_HALF_LENGTH_MM = 200`(后续可能调整)。
+4 -6
View File
@@ -42,15 +42,14 @@
/* 总重低于此值时 CoP 无意义(除零保护),单位 kg */
#define COP_MIN_FORCE_THRESHOLD 0.5f
/* ─── 上行: CoP 帧 (18 bytes, 50 Hz) ───
/* ─── 上行: CoP 帧 (17 bytes, 50 Hz) ───
*
* [AA 55 01 seq flags cop_x(4) cop_y(4) force(4) crc]
* [AA 55 01 flags cop_x(4) cop_y(4) force(4) crc]
*/
struct cop_frame_t {
uint8_t sync0; /* = PROTO_SYNC0 */
uint8_t sync1; /* = PROTO_SYNC1 */
uint8_t type; /* = PROTO_TYPE_COP */
uint8_t seq; /* 包序号 0-255 滚动,用于丢包检测 */
uint8_t flags; /* bit0: force_valid */
float cop_x; /* 压力中心 X (mm),板面坐标系 */
float cop_y; /* 压力中心 Y (mm),板面坐标系 */
@@ -63,15 +62,14 @@ union cop_pkt_t {
uint8_t bytes[sizeof(struct cop_frame_t)];
};
/* ─── 上行: 电机编码器帧 (14 bytes, 预留) ───
/* ─── 上行: 电机编码器帧 (13 bytes, 预留) ───
*
* [AA 55 02 seq flags cable_length(4) velocity(4) crc]
* [AA 55 02 flags cable_length(4) velocity(4) crc]
*/
struct encoder_frame_t {
uint8_t sync0; /* = PROTO_SYNC0 */
uint8_t sync1; /* = PROTO_SYNC1 */
uint8_t type; /* = PROTO_TYPE_ENCODER */
uint8_t seq; /* 包序号 */
uint8_t flags; /* 预留,填 0 */
float cable_length; /* 拉索长度 (mm) */
float velocity; /* 拉索速度 (mm/s) */
-2
View File
@@ -174,7 +174,6 @@ static void sensor_thread_fn(void *p1, void *p2, void *p3) {
(void)p2;
(void)p3;
uint8_t cop_seq = 0;
uint8_t debug_log_divider = 0;
int64_t frame_ts = k_uptime_get();
@@ -201,7 +200,6 @@ static void sensor_thread_fn(void *p1, void *p2, void *p3) {
pkt.frame.sync0 = PROTO_SYNC0;
pkt.frame.sync1 = PROTO_SYNC1;
pkt.frame.type = PROTO_TYPE_COP;
pkt.frame.seq = cop_seq++;
pkt.frame.flags = valid ? COP_FLAG_FORCE_VALID : 0;
pkt.frame.cop_x = cop_x;
pkt.frame.cop_y = cop_y;