You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于手机加速度传感器数据计算行走距离与路径重构问询

加速度传感器数据处理:行走距离计算与路径重构实操方案

核心问题拆解

  • 从加速度数据中提取有效行走段:区分行走动作、转角2秒静止期、转向过程
  • 解决加速度到距离的转换:处理传感器噪声、分离重力干扰分量
  • 结合矩形路径逻辑重构轨迹:利用转角停留的时间窗口判断方向切换节点

第一步:预处理加速度数据(分离重力与运动分量)

手机传感器输出的是合加速度(重力+运动加速度),必须先拆分出真正的运动线性加速度,不然静止时的重力会完全干扰运动数据计算。用低通滤波器滤除高频噪声,再分离重力分量:

import numpy as np
from scipy.signal import butter, filtfilt, find_peaks

# 低通滤波器:保留重力这类低频分量,滤除运动产生的高频噪声
def butter_lowpass(cutoff, fs, order=5):
    nyq = 0.5 * fs
    normal_cutoff = cutoff / nyq
    b, a = butter(order, normal_cutoff, btype='low', analog=False)
    return b, a

def lowpass_filter(data, cutoff=2.0, fs=50.0, order=5):
    b, a = butter_lowpass(cutoff, fs, order=order)
    y = filtfilt(b, a, data)
    return y

# 拆分重力分量与运动用的线性加速度
def separate_gravity_linear(acc_data, fs=50):
    # 三轴分别做低通滤波,提取重力分量
    gravity_x = lowpass_filter(acc_data[:,0], cutoff=0.5, fs=fs)
    gravity_y = lowpass_filter(acc_data[:,1], cutoff=0.5, fs=fs)
    gravity_z = lowpass_filter(acc_data[:,2], cutoff=0.5, fs=fs)
    # 线性加速度 = 原始数据 - 重力分量(仅保留行走产生的加速度)
    linear_x = acc_data[:,0] - gravity_x
    linear_y = acc_data[:,1] - gravity_y
    linear_z = acc_data[:,2] - gravity_z
    return np.column_stack((linear_x, linear_y, linear_z)), np.column_stack((gravity_x, gravity_y, gravity_z))

第二步:识别行走、静止、转角停留段

通过线性加速度的模长判断状态:行走时模长呈周期性波动,静止时模长接近0,转角的2秒是连续静止的长片段:

def detect_motion_segments(linear_acc, fs=50, stationary_threshold=0.1, pause_duration=2.0):
    # 计算线性加速度的模长(三轴平方和开根号)
    acc_magnitude = np.linalg.norm(linear_acc, axis=1)
    # 标记静止帧:模长小于阈值的帧判定为静止
    stationary_frames = acc_magnitude < stationary_threshold
    # 给每帧打标签:0=行走,1=临时静止,2=转角停留(≥2秒)
    segment_labels = np.zeros(len(acc_magnitude))
    current_stationary_count = 0
    
    for i in range(len(stationary_frames)):
        if stationary_frames[i]:
            current_stationary_count +=1
            # 连续静止达到2秒,标记为转角停留
            if current_stationary_count >= pause_duration * fs:
                segment_labels[i] = 2
            # 短时间静止(如抬脚瞬间停顿)不计入转角
            elif current_stationary_count > fs * 0.2:
                segment_labels[i] = 1
        else:
            current_stationary_count =0
            segment_labels[i] = 0
    
    return segment_labels, acc_magnitude

第三步:计算单段行走距离

提供两种实用方案,可根据数据质量选择:

方案1:积分法(适合高精度稳定采样)

通过积分线性加速度得到速度,再积分得到位移,最终计算总距离:

def calculate_walk_distance_by_integration(linear_acc, segment_labels, fs=50):
    # 提取所有行走段的线性加速度数据
    walk_indices = segment_labels ==0
    walk_acc = linear_acc[walk_indices]
    
    # 积分得到速度(初始速度设为0)
    velocity = np.cumsum(walk_acc, axis=0) / fs
    # 积分得到位移
    displacement = np.cumsum(velocity, axis=0) / fs
    
    # 这段行走的总距离为位移首尾点的模长
    total_distance = np.linalg.norm(displacement[-1] - displacement[0])
    return total_distance, displacement

方案2:步长计数法(抗噪声能力更强)

通过检测加速度峰值计数步数,再乘以步长得到总距离(步长可通过已知距离校准):

def calculate_walk_distance_by_step_count(acc_magnitude, segment_labels, fs=50, step_length=0.7):
    # 提取行走段的加速度模长数据
    walk_magnitude = acc_magnitude[segment_labels ==0]
    # 峰值检测:加速度峰值对应抬脚动作,计数步数
    peaks, _ = find_peaks(walk_magnitude, height=0.3, distance=fs*0.3)
    step_count = len(peaks)
    # 总距离=步数×步长(经验公式:步长≈0.413×身高,建议用10米行走数据校准)
    total_distance = step_count * step_length
    return total_distance, step_count

第四步:重构矩形路径

利用转角停留段分割行走段,按矩形路径的四个方向依次分配位移:

def reconstruct_rectangle_path(walk_segments, expected_sizes=[15,7,15,7]):
    path = np.array([[0,0]])  # 起点设为(0,0)
    current_pos = np.array([0,0])
    # 四个方向:右、上、左、下
    directions = np.array([[1,0], [0,1], [-1,0], [0,-1]])
    
    for i, seg_distance in enumerate(walk_segments):
        # 按顺序循环切换方向
        dir_idx = i %4
        # 计算当前段的位移增量
        delta = directions[dir_idx] * seg_distance
        current_pos += delta
        path = np.vstack((path, current_pos))
    
    return path

关键优化与避坑点

  1. 传感器校准:启动APP前务必校准手机姿态传感器,初始倾斜会导致重力分量计算错误,直接废掉所有数据
  2. 采样率固定:Android端采集加速度时要固定采样率(建议50Hz),采样率波动会大幅放大积分误差
  3. 多传感器融合:如果单纯加速度数据误差大,可以结合陀螺仪数据判断90度转向,比仅靠停留时间更准确
  4. 步长校准:用步长计数法时,先让用户走一段已知距离(如10米),自动校准步长,比经验公式精度高很多

内容的提问来源于stack exchange,提问作者Jumbo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:08:23