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