# 加速度位移增量重算说明

## 目标

当前存档表格：

- `pingceng-c7-20260513-1-seg-bi-header-formula.xlsx`

该表已完成：

- 重算 5 列速度积分位移增量
- 将原气压/人工楼层段整理成 `floor_segment`，内容同时显示段号与楼层/过渡标签
- 主 `Sheet` 使用简短字段名表头，字段含义、来源、公式和算法说明移到 `字段说明` 工作表
- 按 X/Y/Z 三轴用不同底色分组，便于横向分析
- 追加 `Z` 速度全局线性斜率补偿列，作为第一版积分漂移补偿结果
- 将窗口分析关键结果回填进主 `Sheet`，用少量窗口特征做第一版 Z 运动状态候选判断
- 基于全局斜率补偿后 Z 速度重算 Z 单步位移增量，便于与原 Z 位移增量对比

## 文件归档

- 当前分析表保留在工作目录根部：
  `pingceng-c7-20260513-1-seg-bi-header-formula.xlsx`
- 当前说明文档：
  `加速度位移增量重算说明.md`
- 旧表、过程表和备份表统一放在 `tmp/` 下，不作为当前分析入口。

## 工作表结构

- `Sheet`
  主数据表。表头只保留短字段名，便于横向查看数据规律。该表同时保存点级采样数据、Z 速度全局斜率补偿结果、补偿速度重算的 Z 单步位移增量，以及按连续 20 点窗口块回填的 Z 运动窗口判断结果。

- `字段说明`
  当前主表保留字段的说明页。该页保存主表列号、字段名、含义、来源/公式/算法说明和原详细表头，便于查阅计算口径而不挤占主表查看空间。

## 当前裁剪范围

为减小分析文件体积，当前主表已按完整楼层分段边界裁剪，只保留：

```text
floor_segment = 001 ~ 061
```

裁剪终点是第 `061:-2` 段停层段末尾，不在过渡段中间截断。

当前保留轨迹为：

```text
-2, -1, 1, 8, 7, 6, 5, 4, 3, 2, 1, -1, -2,
-1, 1, 2, 3, 4, 5, 6, 7, 8,
7, 6, 5, 4, 3, 2, 1, -1, -2
```

当前范围：

```text
主表 Sheet: A1:AL76721
```

裁剪前全量表已放入 `tmp/` 留档，后续算法稳定后可回到全量轨迹验证。

重算这 5 列位移增量：

- `delta_disp_x_corrected_m`
- `delta_disp_y_corrected_m`
- `delta_disp_z_corrected_m`
- `delta_disp_x_raw_m`
- `delta_disp_y_raw_m`

本次重算的目标不是做“累计位移”，而是为**每一条数据**计算“相对上一条数据的位移增量”。

## 为什么要重算

现有版本的位移增量列按下面公式近似得到：

```text
Δs = 0.5 * a_avg * dt^2
```

这个公式只保留了“该时间步加速度新增出来的位移贡献”，没有显式使用上一时刻已经存在的速度：

```text
Δs = v_prev * dt + 0.5 * a_avg * dt^2
```

因此如果要更完整地表达每一步位移，应先求速度，再利用速度求该时间步位移。

## 基础输入

### 时间间隔

每两条数据之间的真实时间间隔由 `mcuts` 计算：

```text
dt_i = (mcuts_i - mcuts_{i-1}) / 1000
```

其中：

- `mcuts_i`：当前行的 `mcuts`
- `mcuts_{i-1}`：上一行的 `mcuts`
- `dt_i` 单位为秒

### 静止偏置与换算系数

静止文件：

- `raw_data/pingceng-c7-20260514--设备静止5分钟时数据.csv`

静止中心为：

```text
acc_x_bias = -6
acc_y_bias = -16
acc_z_bias = 1009
```

静止向量模长约为：

```text
counts_per_g = 1009.144687
```

因此计数值转物理加速度的换算系数为：

```text
scale = 9.80665 / 1009.144687
      ≈ 0.009717783904 m/s^2 per count
```

## 加速度转换

### corrected 三轴

这三列来自上游校正结果：

- `acc_x_corrected`
- `acc_y_corrected`
- `acc_z_corrected`

其中 `acc_z_corrected` 需要特别说明。它不是简单的 `acc_z - 1009`，而是先基于静止重力向量 `(-6, -16, 1009)` 做向重力方向的倾角投影修正，再去除 `1g` 重力。按当前表中数据关系可近似写成：

```text
acc_z_corrected
    ≈ dot([acc_x, acc_y, acc_z], [-6, -16, 1009]) / 1009.144687
      - 1009.144687
```

corrected 计数值转物理加速度时直接乘 `scale`：

```text
a_x_corr_i = acc_x_corrected_i * scale
a_y_corr_i = acc_y_corrected_i * scale
a_z_corr_i = acc_z_corrected_i * scale
```

### raw x / y

原始 `x/y` 只做静止偏置去除：

```text
a_x_raw_i = (acc_x_i - acc_x_bias) * scale
a_y_raw_i = (acc_y_i - acc_y_bias) * scale
```

即：

```text
a_x_raw_i = (acc_x_i - (-6)) * scale
a_y_raw_i = (acc_y_i - (-16)) * scale
```

## 平均加速度

当前步 `i` 的平均加速度按相邻两点梯形近似：

```text
a_avg_i = (a_{i-1} + a_i) / 2
```

分别用于：

- `x corrected`
- `y corrected`
- `z corrected`
- `x raw`
- `y raw`

## 速度递推

对每个方向，速度按离散积分递推：

```text
v_i = v_{i-1} + a_avg_i * dt_i
```

其中：

- `v_{i-1}`：上一行速度
- `a_avg_i`：上一行和当前行的平均加速度
- `dt_i`：上一行到当前行的时间间隔

## 单步位移增量

当前步位移增量使用完整运动学公式：

```text
Δs_i = v_{i-1} * dt_i + 0.5 * a_avg_i * dt_i^2
```

其中：

- `Δs_i`：当前行相对上一行的位移增量
- `v_{i-1}`：上一行速度
- `a_avg_i`：当前步平均加速度
- `dt_i`：当前步时间间隔

第一条数据因为没有上一条数据，定义为：

```text
dt_1 = 0
v_1 = 0
Δs_1 = 0
```

## 初始速度如何取

当前存档表格使用 **全表连续递推速度**。

只有第一条数据没有上一条数据，因此定义：

```text
v_1 = 0
Δs_1 = 0
```

第二条数据开始直接继承上一行速度：

```text
v_i = v_{i-1} + a_avg_i * dt_i
```

进入新的 `floor_segment` 段时，不再把速度重置为 `0`。这样可以观察跨楼层段连续积分后的速度趋势，用于辅助核对气压分段边界。

注意：静止时真实速度应在 `0` 附近波动。若加速度存在很小残余偏置，连续积分后的速度会随时间漂移；因此速度曲线适合辅助看启动、减速和分段波动，不应单独当成楼层真值。

## 需要增加的过程列

### 公共列

- `dt_s`

### X 轴相关列

- `acc_x_raw_mps2`
- `acc_x_raw_avg_mps2`
- `vel_x_raw_mps`
- `delta_disp_x_raw_m`
- `acc_x_corrected_mps2`
- `acc_x_corrected_avg_mps2`
- `vel_x_corrected_mps`
- `delta_disp_x_corrected_m`

### Y 轴相关列

- `acc_y_raw_mps2`
- `acc_y_raw_avg_mps2`
- `vel_y_raw_mps`
- `delta_disp_y_raw_m`
- `acc_y_corrected_mps2`
- `acc_y_corrected_avg_mps2`
- `vel_y_corrected_mps`
- `delta_disp_y_corrected_m`

### Z 轴相关列

- `acc_z_corrected_mps2`
- `acc_z_corrected_avg_mps2`
- `vel_z_corrected_mps`
- `delta_disp_z_corrected_m`
- `delta_disp_z_corrected_global_slope_comp_m`

### Z 速度补偿与窗口判断列

- `vel_z_corrected_global_slope_comp_mps`
- `z_win_v_mean_comp_mps`
- `z_win_a_mean_mps2`
- `z_motion_state_candidate`
- `z_motion_floor_interval_candidate`

## 列顺序调整方案

按“先原始数据，再演变过程，再到位移”的原则，建议把相关列按轴集中放置。

建议最终顺序如下。

### 1. 基础信息

- `id`
- `device_id`
- `mcuts`
- `seq`
- `pressure`
- `temperature`
- `create_time`
- `floor_segment`
- `dt_s`

### 2. X 轴组

- `acc_x`
- `acc_x_raw_mps2`
- `acc_x_raw_avg_mps2`
- `vel_x_raw_mps`
- `delta_disp_x_raw_m`
- `acc_x_corrected`
- `acc_x_corrected_mps2`
- `acc_x_corrected_avg_mps2`
- `vel_x_corrected_mps`
- `delta_disp_x_corrected_m`

### 3. Y 轴组

- `acc_y`
- `acc_y_raw_mps2`
- `acc_y_raw_avg_mps2`
- `vel_y_raw_mps`
- `delta_disp_y_raw_m`
- `acc_y_corrected`
- `acc_y_corrected_mps2`
- `acc_y_corrected_avg_mps2`
- `vel_y_corrected_mps`
- `delta_disp_y_corrected_m`

### 4. Z 轴组

- `acc_z`
- `acc_z_corrected`
- `acc_z_corrected_mps2`
- `acc_z_corrected_avg_mps2`
- `vel_z_corrected_mps`
- `delta_disp_z_corrected_m`

### 5. 其余 IMU 列

- `gyro_x`
- `gyro_y`
- `gyro_z`

### 6. Z 速度补偿与窗口判断列

- `vel_z_corrected_global_slope_comp_mps`
- `z_win_v_mean_comp_mps`
- `z_win_a_mean_mps2`
- `z_motion_state_candidate`
- `z_motion_floor_interval_candidate`
- `delta_disp_z_corrected_global_slope_comp_m`

## 楼层分段列

气压/人工楼层分段在当前表中合并为一列：

- `floor_segment`
  内容格式为 `三位段号:标签`，同时显示楼层/过渡段的时间顺序和楼层标签。

规则如下：

1. 以“连续相同标签”为一个段。
2. 从第一个段开始按出现顺序编号。
3. 停层标签如 `-2`、`1`、`8`。
4. 过渡标签如 `-2->-1`、`1->8`。

示例：

| `floor_segment` |
|---|
| `001:-2` |
| `002:-2->-1` |
| `003:-1` |

筛选某一具体段时筛完整内容，例如 `002:-2->-1`。筛选同类楼层/过渡时，用文本包含标签，例如包含 `-2->-1`。三位段号让文本列表按段顺序更容易阅读和排序。

## 最终字段说明

下面按最终输出顺序说明每一列的含义和来源。

### 基础信息列

- `id`
  原始数据行 ID，直接来自源文件。

- `device_id`
  设备编号，直接来自源文件。

- `mcuts`
  MCU 时间戳，单位 `ms`，直接来自源文件。

- `seq`
  采样序号，直接来自源文件。

- `pressure`
  原始气压计读数，直接来自源文件。

- `temperature`
  原始温度读数，直接来自源文件。

- `create_time`
  记录时间，直接来自源文件。

- `floor_segment`
  原气压/人工楼层分段编号和标签合并显示。
  格式为 `三位段号:标签`；停层段如 `001:-2`，过渡段如 `002:-2->-1`。

- `dt_s`
  当前行相对上一行的时间间隔，单位 `s`。
  公式：

```text
dt_i = (mcuts_i - mcuts_{i-1}) / 1000
```

第一行定义为 `0`。

### X 轴组

- `acc_x`
  原始 `X` 轴加速度计数值，直接来自源文件。

- `acc_x_raw_mps2`
  原始 `X` 轴经静止偏置去除后，再换算成 `m/s²` 的加速度。
  公式：

```text
acc_x_raw_mps2_i = (acc_x_i - acc_x_bias) * scale
```

- `acc_x_raw_avg_mps2`
  当前步 `X raw` 平均加速度。
  公式：

```text
acc_x_raw_avg_mps2_i = (acc_x_raw_mps2_{i-1} + acc_x_raw_mps2_i) / 2
```

- `vel_x_raw_mps`
  当前行 `X raw` 速度，单位 `m/s`。
  当前表按全表连续递推，仅第一条数据定义为 `0`。
  公式：

```text
vel_x_raw_i = vel_x_raw_{i-1} + acc_x_raw_avg_mps2_i * dt_i
```

- `delta_disp_x_raw_m`
  当前行相对上一行的 `X raw` 位移增量，单位 `m`。
  公式：

```text
delta_disp_x_raw_i
    = vel_x_raw_{i-1} * dt_i
    + 0.5 * acc_x_raw_avg_mps2_i * dt_i^2
```

- `acc_x_corrected`
  已做安装倾角修正、重力去除和静止偏置去除后的 `X` 轴加速度计数值。

- `acc_x_corrected_mps2`
  `acc_x_corrected` 换算成 `m/s²` 后的值。
  公式：

```text
acc_x_corrected_mps2_i = acc_x_corrected_i * scale
```

- `acc_x_corrected_avg_mps2`
  当前步 `X corrected` 平均加速度。
  公式：

```text
acc_x_corrected_avg_mps2_i
    = (acc_x_corrected_mps2_{i-1} + acc_x_corrected_mps2_i) / 2
```

- `vel_x_corrected_mps`
  当前行 `X corrected` 速度，单位 `m/s`。
  当前表按全表连续递推，仅第一条数据定义为 `0`。

- `delta_disp_x_corrected_m`
  当前行相对上一行的 `X corrected` 位移增量，单位 `m`。
  公式：

```text
delta_disp_x_corrected_i
    = vel_x_corrected_{i-1} * dt_i
    + 0.5 * acc_x_corrected_avg_mps2_i * dt_i^2
```

### Y 轴组

- `acc_y`
  原始 `Y` 轴加速度计数值，直接来自源文件。

- `acc_y_raw_mps2`
  原始 `Y` 轴去静止偏置后换算成 `m/s²` 的加速度。

- `acc_y_raw_avg_mps2`
  当前步 `Y raw` 平均加速度。

- `vel_y_raw_mps`
  当前行 `Y raw` 速度，单位 `m/s`。
  当前表按全表连续递推，仅第一条数据定义为 `0`。

- `delta_disp_y_raw_m`
  当前行相对上一行的 `Y raw` 位移增量，单位 `m`。

- `acc_y_corrected`
  已做安装倾角修正、重力去除和静止偏置去除后的 `Y` 轴加速度计数值。

- `acc_y_corrected_mps2`
  `acc_y_corrected` 换算成 `m/s²` 后的值。

- `acc_y_corrected_avg_mps2`
  当前步 `Y corrected` 平均加速度。

- `vel_y_corrected_mps`
  当前行 `Y corrected` 速度，单位 `m/s`。
  当前表按全表连续递推，仅第一条数据定义为 `0`。

- `delta_disp_y_corrected_m`
  当前行相对上一行的 `Y corrected` 位移增量，单位 `m`。

### Z 轴组

- `acc_z`
  原始 `Z` 轴加速度计数值，直接来自源文件。

- `acc_z_corrected`
  沿校正后 `Z` / 静止重力方向的加速度计数值。
  基于静止重力向量做倾角投影修正后，再去除 `1g` 重力。

- `acc_z_corrected_mps2`
  `acc_z_corrected` 换算成 `m/s²` 后的值。

- `acc_z_corrected_avg_mps2`
  当前步 `Z corrected` 平均加速度。

- `vel_z_corrected_mps`
  当前行 `Z corrected` 速度，单位 `m/s`。
  当前表按全表连续递推，仅第一条数据定义为 `0`。

- `delta_disp_z_corrected_m`
  当前行相对上一行、基于未做全局斜率补偿的 `vel_z_corrected_mps` 计算的 `Z corrected` 位移增量，单位 `m`。
  速度梯形积分公式：

```text
delta_disp_z_corrected_m_i
    = 0.5 * (v_{i-1} + v_i) * dt_i
```

  等价运动学形式：

```text
a_avg_i = (v_i - v_{i-1}) / dt_i

delta_disp_z_corrected_m_i
    = v_{i-1} * dt_i
      + 0.5 * a_avg_i * dt_i^2
```

  该列与补偿后 `delta_disp_z_corrected_global_slope_comp_m` 保持同一位移积分口径，便于只比较 Z 速度全局斜率补偿的效果。

- `delta_disp_z_corrected_global_slope_comp_m`
  当前行相对上一行、基于全局斜率补偿后 Z 速度重算的位移增量，单位 `m`。
  输入是相邻采样点的 `vel_z_corrected_global_slope_comp_mps` 与 `dt_s`。
  速度梯形积分公式：

```text
delta_disp_z_corrected_global_slope_comp_m_i
    = 0.5 * (v_comp_{i-1} + v_comp_i) * dt_i
```

  其中 `v_comp` 为 `vel_z_corrected_global_slope_comp_mps`，第一条数据定义为 `0`。

  该公式也可写成与原始 Z 位移增量一致的运动学形式：

```text
a_comp_avg_i = (v_comp_i - v_comp_{i-1}) / dt_i

delta_disp_z_corrected_global_slope_comp_m_i
    = v_comp_{i-1} * dt_i
      + 0.5 * a_comp_avg_i * dt_i^2
```

  因此新列和原 `delta_disp_z_corrected_m` 的积分本质一致。主要变化不是积分方法，而是速度输入由未补偿 `vel_z_corrected_mps` 改为全局斜率补偿后的 `vel_z_corrected_global_slope_comp_mps`。

### 角速度列

- `gyro_x`
  原始 `X` 轴陀螺仪读数，直接来自源文件。

- `gyro_y`
  原始 `Y` 轴陀螺仪读数，直接来自源文件。

- `gyro_z`
  原始 `Z` 轴陀螺仪读数，直接来自源文件。

### Z 速度补偿与窗口判断列

- `vel_z_corrected_global_slope_comp_mps`
  对原始 `vel_z_corrected_mps` 去除全表线性上漂后的第一版补偿速度，单位 `m/s`。

- `z_win_v_mean_comp_mps`
  连续 20 点分块窗口内补偿后 Z 速度均值。
  每个 20 点块只计算一组结果，并在该块 20 行回填同一结果。

- `z_win_a_mean_mps2`
  连续 20 点分块窗口内 Z corrected 物理加速度均值。
  每个 20 点块只计算一组结果，并在该块 20 行回填同一结果。

- `z_motion_state_candidate`
  基于窗口速度均值和窗口加速度均值的 Z 向运动相位候选状态。

- `z_motion_floor_interval_candidate`
  基于 Z 运动窗口状态重划分的候选楼层/过渡区间。
  内容格式为 `三位区间顺序号:候选标签`，例如 `002:-2->-1`。

## Z 速度全局斜率补偿

当前表先使用全表统一斜率消除 `vel_z_corrected_mps` 的一阶线性积分漂移。

拟合规则：

1. 取全表 `vel_z_corrected_mps` 全部数据点。
2. 以第一条数据时间为 `t=0`，按 `mcuts` 计算累计时间：

```text
t_i = (mcuts_i - mcuts_1) / 1000
```

3. 对整条速度曲线做一次线性回归：

```text
vel_z_corrected_mps = k * t + b
```

4. 只用回归斜率 `k` 做速度漂移补偿：

```text
vel_z_corrected_global_slope_comp_mps
    = vel_z_corrected_mps - k * t
```

当前表拟合结果：

```text
k  = 0.00327445908455756 m/s²
b  = -0.0215858047837836 m/s
R² = 0.799898983513224
```

补偿列只减 `k * t`，不减截距 `b`，因此保留第一条速度定义为 `0`。当前表已经保留该补偿速度，并用相邻补偿速度对 `Z` 单步位移增量做了新的梯形积分列，用于和原 `delta_disp_z_corrected_m` 对比。

## Z 运动窗口结果回填

当前窗口分析使用连续分块，不使用重叠滑动：

```text
窗口点数: 20 点
分块步长: 20 点
主表采样间隔: 约 10ms/点
窗口长度: 约 0.2s
输出间隔: 约 0.2s
```

也就是：

```text
第1个窗口: 点1~20
第2个窗口: 点21~40
第3个窗口: 点41~60
```

因此窗口块之间在原始采样点上是连续覆盖的：

- 不重叠；
- 不跳点；
- 不存在点 `1~20` 算完后再隔一段数据才算下一次。

窗口分析结果已经合并进主 `Sheet`。每个 20 点块只输出一组窗口结果，但为了在主表中连续查看、筛选和画图，该组结果会回填到该块的 20 个点级采样行。当前主表已删去尾部不足 20 点的单个采样点，保留 `76720` 个采样点，正好形成 `3836` 个完整 20 点块并回填全部数据行。

回填列：

- `z_win_v_mean_comp_mps`
  当前连续 20 点分块中 `vel_z_corrected_global_slope_comp_mps` 的均值。
  该输入速度已经由原始 `vel_z_corrected_mps` 减去全局线性漂移 `k*t` 得到。
- `z_win_a_mean_mps2`
  当前连续 20 点分块中 `acc_z_corrected_mps2` 的均值。
  该输入加速度来自主表 `acc_z_corrected` 计数值乘 `scale` 后的 Z corrected 物理加速度。
- `z_motion_state_candidate`
  速度均值和加速度均值联合得到的第一版 Z 向运动相位候选状态。
- `z_motion_floor_interval_candidate`
  基于 Z 窗口候选状态重新划分的候选楼层/过渡区间，用于让速度/加速度状态修正气压分段边界。
  当前内容把区间顺序号和候选标签写在同一列，便于直接看出重复楼层过渡属于哪一次运动段。

第一版候选状态规则：

```text
|v| < 0.2 且 |a| < 0.05
    -> STILL

|v| >= 0.2 且 |a| < 0.05
    -> CRUISE

|a| >= 0.05 且 v*a >= 0
    -> ACCEL

|a| >= 0.05 且 v*a < 0
    -> DECEL
```

其中：

```text
v = z_win_v_mean_comp_mps
a = z_win_a_mean_mps2
```

阈值来源：

1. 在当前表的连续 `20` 点分块窗口统计中，按 `floor_segment` 标签部分不含 `->` 的停层候选块观察静止背景。
2. 当前裁剪表静止候选窗口 `|z_win_v_mean_comp_mps|` 的 `99%` 分位约为：

```text
0.188 m/s
```

因此第一版静止/非静止速度阈值取：

```text
V = 0.2 m/s
```

3. 当前裁剪表静止候选窗口 `|z_win_a_mean_mps2|` 的 `95%` 分位约为：

```text
0.02865 m/s²
```

因此第一版加速度显著阈值取：

```text
A = 0.05 m/s²
```

状态算法核心：

```text
输入速度:
    v = 当前窗口全局斜率补偿后Z速度均值

输入加速度:
    a = 当前窗口Z corrected物理加速度均值

静止:
    |v| < V 且 |a| < A

匀速:
    |v| >= V 且 |a| < A

加速:
    |a| >= A 且 v*a >= 0

减速:
    |a| >= A 且 v*a < 0
```

其中 `v*a` 用于判断速度方向与加速度方向是否一致：

- `v*a >= 0` 表示速度幅值倾向增大，判为 `ACCEL`。
- `v*a < 0` 表示加速度与速度方向相反，速度幅值倾向减小，判为 `DECEL`。

该算法适合做窗口级第一版候选相位判断，但还不是事件边界最终结论：

1. `STILL` 与 `CRUISE` 由速度阈值和加速度阈值共同区分。
2. 加速度显著时再用 `v*a` 判断速度幅值趋增还是趋减。
3. 启动和到站附近速度接近零，单个窗口的 `ACCEL` / `DECEL` 容易受零速附近符号波动影响。
4. 最终开始点、匀速段边界、减速开始点和结束点，仍需结合前后连续窗口块、滞回/状态机和补偿后速度曲线回溯确认。

### MCU 实时判断说明

当前回填到主表的窗口结果不是为了只做离线画图，而是在模拟 MCU 上的实时判断流程。

实时侧可以采用：

```text
采样节奏:
    主采样约 10ms / 点

窗口:
    连续取满 20 点形成一块
    约 0.2s 数据

更新:
    当前块算完后, 紧接着取下一块 20 点
    约每 0.2s 输出一次窗口判断
```

因此 MCU 可以实时得到：

```text
窗口速度均值 v
窗口加速度均值 a
当前窗口候选状态
```

速度阈值与加速度阈值可以直接做实时状态判断的核心条件。之所以仍区分“候选状态”和“最终实时状态”，不是因为该算法只能离线使用，而是因为真实运行中阈值附近会存在：

- 传感器噪声；
- 电梯机械振动；
- 启动/到站边界的缓变；
- 加速度在阈值附近短时穿越；
- 速度在零附近的小符号波动；
- 速度积分补偿后的残余误差。

若 MCU 每个 20 点块只按单块候选状态立即切换输出，边界附近仍可能出现：

```text
STILL -> ACCEL -> STILL -> ACCEL
```

这种短时抖动会影响楼层区间重划分与后续位移估计。

建议 MCU 在线流程分两层：

```text
连续20点分块窗口特征
    -> 速度/加速度阈值候选状态
    -> 状态机连续确认
    -> 输出实时稳定状态
```

第一层候选状态就是当前主表中 `z_motion_state_candidate` 的算法。

第二层状态机建议第一版加入连续窗口确认：

```text
启动确认:
    连续若干窗口为运动候选后, STILL -> ACCEL

匀速确认:
    速度明显非零且加速度回到阈值内后, ACCEL -> CRUISE

减速确认:
    DECEL候选连续出现后, ACCEL/CRUISE -> DECEL

停稳确认:
    速度和加速度连续回到静止阈值内后, DECEL -> STILL
```

按当前约 `0.2s` 输出一个连续分块窗口结果，第一版可先测试：

```text
相位切换确认: 连续 2 个窗口块, 约 0.4s
停稳确认:     连续 3 个窗口块, 约 0.6s
```

后续若边界仍抖动，可加入滞回阈值，例如：

```text
进入运动速度阈值 V_enter = 0.20 m/s
退出运动速度阈值 V_exit  = 0.15 m/s

进入动态加速度阈值 A_enter = 0.05 m/s²
退出动态加速度阈值 A_exit  = 0.03 m/s²
```

实时系统中通常区分：

1. **确认时刻**：状态机已确认电梯进入新状态的当前时刻。
2. **回溯边界**：若 MCU 保留短窗口缓存，可回溯到首次连续满足条件的窗口起点，作为更接近真实的开始/结束边界。

### Z 运动区间候选重划分

`z_motion_floor_interval_candidate` 在主表每个完整 20 点窗口块对应的 20 行中给出按 Z 运动状态重划分后的候选楼层区间。

该列内容格式为：

```text
三位区间顺序号:候选标签
```

例如：

```text
001:-2
002:-2->-1
003:-1
004:-1->1
```

顺序号按候选区间沿时间轴连续变化的顺序生成；同一连续候选区间在回填行中共享同一编号。这样多次出现同类过渡时不会混在一起，例如 `002:-2->-1` 和后面的 `026:-2->-1` 表示两次不同运动段。

算法：

1. 把 `z_motion_state_candidate` 中非 `STILL` 的窗口块先视为动态窗口块。
2. 若两个动态区之间只被不超过 `2` 个窗口块的 `STILL` 短间隙打断，则合并该短间隙。
   当前窗口块输出间隔约 `0.2s`，`2` 个窗口块约为 `0.4s`。
3. 长度不超过 `2` 个窗口块的孤立动态碎片视为抖动，回收为静止区。
4. 静止区取该区最近的 `floor_segment` 停层标签部分作为楼层标签。
5. 动态区取其前后静止区停层标签，形成：

```text
起点楼层->终点楼层
```

例如：

```text
001:-2
002:-2->-1
003:-1
004:-1->1
005:1
006:1->8
```

筛选方式：

1. 查某一次候选区间时，直接筛完整内容，例如 `002:-2->-1`。
2. 查所有同类楼层过渡时，用文本包含候选标签，例如包含 `-2->-1`。
3. 三位编号用于让文本列表按段顺序更容易阅读和排序。

该列的边界来自速度/加速度窗口状态，不再直接沿用原气压分段边界。它仍是候选区间；后续 MCU 实时输出应优先基于状态机确认后的稳定状态，再结合短缓存回溯开始点和结束点。

## 单行示意

当前行 `i` 的计算链路，拿 `x corrected` 举例：

```text
dt_i = (mcuts_i - mcuts_{i-1}) / 1000

a_x_corrected_i = acc_x_corrected_i * scale

a_x_corrected_avg_i = (a_x_corrected_{i-1} + a_x_corrected_i) / 2

vel_x_corrected_i = vel_x_corrected_{i-1} + a_x_corrected_avg_i * dt_i

delta_disp_x_corrected_i
    = vel_x_corrected_{i-1} * dt_i
    + 0.5 * a_x_corrected_avg_i * dt_i^2
```

其余四个方向完全同理。

## 当前表格使用提示

1. `floor_segment` 同时显示原分段编号和楼层标签，例如 `002:-2->-1`；查某一段筛完整内容，查同类过渡用文本包含标签。
2. `floor_segment` 使用三位编号前缀，按文本升序排序时也便于按采集分段顺序查看。
3. 分析楼层启停与上下行趋势时，优先结合 `pressure`、`acc_z_corrected_mps2` 与 `vel_z_corrected_mps`。
4. 连续积分速度会放大残余加速度偏置；停层段中速度持续漂移时，应先考虑偏置、零速度约束或分段校准问题。
5. `vel_z_corrected_global_slope_comp_mps` 是补偿速度对照列；`delta_disp_z_corrected_global_slope_comp_m` 是其重算位移增量列；原始 `vel_z_corrected_mps` 与 `delta_disp_z_corrected_m` 仍保留供对比。
