2025年国赛高教社杯数学建模E题AI辅助智能体测解题全过程文档及程序

2025年国赛高教社杯数学建模

E题 AI辅助智能体测

原题再现

《国家学生体质健康标准》的颁布,有效地促进了大中小学生关注自身体质健康的发展,激励学生积极进行身体锻炼。通过在体育场地周边安装摄像头,可以对学生的体育动作进行实时捕捉,以便对学生的运动姿态进行分析。例如,在立定跳远教学中,通过记录并分析学生起跳瞬间的腿部发力动作、手臂摆动轨迹、身体腾空姿态以及落地姿势等一系列身体变化的细节数据,可以帮助教师全面了解每个学生动作的优点和不足,从而给出针对性的改进方案。
  通过摄像头拍摄的图像,利用AI人体姿态估计技术可以定位复杂场景中小尺度人体的关键点位置。基于AI的人体姿态识别算法,可以对运动者的姿态进行跟踪,获得人体关键节点在运动过程中不同帧的运动视频和位置坐标信息。请建立数学模型,解决以下问题:
  问题1 附件1是两位立定跳远运动者的跳远视频、位置信息和跳远成绩。其中,位置信息包含运动者在整个跳远过程中的33个关键节点(见附件2)在视频不同帧的位置坐标。请确定运动者在跳远过程中的起跳和落地时刻,并描述滞空阶段(从起跳到落地)的运动过程。
  问题2 经过短时间的专业训练,跳远成绩便可有较大幅度的提升。附件3是一些立定跳远运动者在纠正前、教练纠正姿势后的跳远视频、位置信息和跳远成绩。附件 4 是运动者的个人体质报告,包括年龄、身高、体重和体脂率等。请根据相关资料,分析影响运动者跳远成绩的主要因素。
  问题3 基于问题1和问题2的模型和结果,结合附件5中运动者11的跳远视频和位置信息以及个人体质信息(见附件4),预测该运动者的实际跳远成绩。
  问题4 在问题3的基础上,给出短时间内提升运动者11跳远成绩的姿势训练建议,以及经过短期训练后该运动者可能达到的理想跳远成绩。

整体求解过程概述(摘要)

立定跳远作为中小学生体质健康测试的核心项目,其动作姿态的规范性直接决定运动成绩与运动损伤风险。对学生立定跳远过程进行量化分析,能够精准定位动作短板,为教师制定个性化教学方案、优化训练策略提供科学依据。本文聚焦 AI 辅助立定跳远动作识别与优化问题,融合计算机视觉、运动生物力学与统计建模方法,构建了一套从姿态数据预处理、关键动作识别、影响因素分析到成绩预测与姿态优化的全流程分析框架。首先,基于一阶微分算法实现起跳与落地时刻的精准识别,刻画滞空阶段运动轨迹特征;其次,通过 Spearman 相关性分析挖掘影响跳远成绩的关键体质与姿态因素;最后,构建多元线性回归预测模型实现跳远成绩的精准预测,并针对典型案例提出可落地的姿态优化方案,为 AI 辅助体育教学与科学训练提供理论支撑与技术参考。
  针对数据预处理环节,为消除原始视频数据中的噪声与异常值干扰,本文构建了标准化的多步处理流程:首先采用线性插补法补齐数值为 0 的离散异常值,保证数据序列的连续性;其次基于视频分辨率与实际场地尺寸,建立像素坐标与实际物理坐标的映射关系,完成 Y 轴坐标向实际距离的转换;随后引入 Savitzky-Golay 滤波算法对轨迹数据进行平滑处理,有效滤除高频噪声;同时统一视频帧率为 30fps,同步调整时间戳以消除时间轴偏差;最后剔除附件 4 中无效的冗余指标,并基于运动生理学原理,将运动者 11 的脂肪重量、肌肉重量及去脂重量分别修正为 2.8kg、11.7kg 和 17.5kg,为后续分析提供高质量数据基础。
  针对问题一的关键动作识别与轨迹特征分析,本文首先基于人体骨骼关键点模型,将人体关键点划分为躯干、头部、腿部与手臂四大模块,对平滑后的轨迹数据进行初步探索;随后选取脚部关键点 29 至 32 的坐标均值作为研究对象,采用一阶微分算法计算垂直方向速度,设定 ±150px/s 的速度突变阈值,实现起跳与落地时刻的自动识别。模型结果显示:运动者 1 的起跳时刻为 4.127s(对应帧号 124),落地时刻为 4.563s(对应帧号 137),滞空时间为 0.436s;运动者 2 的起跳时刻为 5.463s(对应帧号 164),落地时刻为 5.897s(对应帧号 177),滞空时间为 0.434s。结合实际跳远成绩,计算得到视频图像的比例尺为 0.332cm/px,验证了识别方法的准确性与可靠性。在此基础上,提取滞空阶段的轨迹数据,采用三次多项式进行拟合,结果表明运动轨迹符合标准抛物线特征;进一步计算下肢关节角度(髋 - 膝 - 踝)、躯干倾斜角度(肩 - 髋)、上肢与下肢夹角(肩 - 髋 - 膝)以及大腿与地面夹角(髋 - 踝)等关键姿态指标并进行可视化,以运动者 1 为例,其下肢关节角度在跳跃过程中由初始的 147° 动态变化至落地阶段的 98°,直观呈现了动作过程中下肢姿态的变化规律。
  针对问题二的影响因素相关性分析,本文从体质特征与姿态特征两个维度展开系统研究。在体质特征方面,基于 Spearman 相关性分析对 13 个体质指标与跳远成绩的关联关系进行探究,发现指标间存在显著的多重共线性问题;结合运动生物力学原理,筛选出肌肉重量、体重、去脂体重、身高四个核心体质影响因素。在姿态特征方面,基于问题一的识别结果,计算起跳与落地时刻、滞空时间、比例尺及关键关节角度等姿态指标;以姿势调整前后的最高成绩为评价依据,分析不同运动者的成绩提升潜力,结果显示运动者 6 的成绩提升率最高,达 17.12%,运动者 8 的提升率最低,仅为 2.11%。进一步通过 Spearman 相关性分析探究关键角度特征值对成绩的影响,发现起跳时刻腿与地面的夹角、躯干角度,落地时刻的躯干角度、下肢角度、腿与地面的夹角、肩 - 髋 - 膝角度,以及手腕最大速度是影响跳远成绩的关键姿态因素。最后,通过剔除 8 岁儿童数据进行分组对比分析,结果表明成人与儿童群体的跳远姿态特征指标与成绩的相关程度存在显著差异,为不同年龄段的个性化教学提供了数据支撑。
  针对问题三的跳远成绩预测模型构建,本文基于筛选得到的 4 个体质因素与 7 个姿态因素,构建多元线性回归预测模型。首先对特征向量进行标准化处理,消除不同量纲的影响;随后采用最小二乘拟合估计方法求解模型参数,构建多元线性回归模型,并计算各参数对成绩的贡献度,量化不同因素的影响权重。最后,基于问题一得到的比例尺 0.332cm/px 对预测结果进行验证,模型预测的近似跳远成绩为 1.082 米;通过对多元线性回归模型与随机回归模型进行误差对比分析,结果表明多元线性回归模型的预测精度更高,误差仅为 0.011 米,最优预测结果为 1.078 米,验证了模型的有效性与可靠性。
  针对问题四的典型案例姿态优化分析,本文选取运动者 11 作为研究对象,结合其体质数据与姿态特征进行综合分析。结果显示,该运动者存在三大核心动作问题:起跳阶段下肢关节角度偏大、躯干前倾不足,腾空阶段收腹动作不充分,落地阶段下肢关节与肩 - 髋 - 膝角度偏大。为制定针对性优化方案,选取年龄相近且经过训练优化的运动者 9 作为参照对象,对比关键角度指标发现,运动者 11 在起跳屈曲幅度、腾空收腹动作与落地缓冲环节均存在明显改进空间。结合运动生物力学训练原理,制定了针对性的姿态优化训练方案,基于优化后的姿态指标进行成绩预测,结果表明运动者 11 的跳远成绩可提升至 1.205 米,提升幅度达 11.4%,充分验证了短期姿态调整对提升立定跳远成绩的显著增益效果。

模型假设:

1.监控环境稳定性假设:假设监控画面不受极端光照、遮挡、晃动等干扰因素影响,视频画面清晰度、亮度与视角在采集过程中保持稳定,不会因环境突变导致关键点识别误差。
  2.设备一致性假设:假设所有运动者的视频数据均由同一台监控设备采集,视频分辨率、帧率、安装高度与拍摄角度完全一致,保证不同样本的像素 - 实际距离换算关系统一。
  3.动作标准化假设:假设所有运动者均按照标准立定跳远动作流程完成测试,无额外跳跃、垫步等违规动作,且起跳、腾空、落地阶段的动作定义与运动生物力学规律一致。
  4.数据有效性假设:假设附件提供的人体关键点坐标、跳远成绩、体质数据均为真实有效数据,无记录错误或篡改;且视频采集过程中无数据丢失、跳帧等问题。
  5.短期训练有效性假设:假设运动者 11 在短期内的姿态调整仅改变动作角度、滞空时间等姿态特征,不改变身高、体重等体质基础指标,且调整后的动作不会出现新的动作损伤风险。

问题分析:

数据预处理分析
  本研究的原始数据包含 10473 条人体关键点轨迹数据、1 张人体姿态示意图与 35 段 10 秒立定跳远视频数据,数据规模大、类型多,且受视频采集、传输与标注过程影响,不可避免地存在缺失值、重复值、异常值及高频噪声,直接用于分析会严重影响后续模型的精度与可靠性。为此,本文构建了一套标准化的多步预处理流程:
  数据初筛与可视化探索:首先对原始数据进行缺失值、重复值与异常值的统计性检验,通过绘制轨迹时序图、坐标分布热力图等方式,直观识别出位置信息恒为 0、坐标突变、帧号重复等典型异常模式,明确数据问题的分布特征;
  异常值处理与平滑降噪:针对大量位置信息为 0 的无效数据点,采用线性插值法进行补全;针对视频逐帧提取过程中产生的轨迹抖动与高频噪声,引入 Savitzky-Golay 滤波算法对关键点坐标序列进行平滑处理,在保留轨迹关键特征的同时,有效滤除噪声干扰;
坐标系校正与物理量转换:基于视频分辨率 1280×720,对 Y 轴坐标进行翻转处理,将图像坐标系转换为与实际场地高度方向一致的物理坐标系;结合实际跳远成绩,建立像素坐标与实际距离的比例尺换算关系,为后续轨迹与角度的量化分析提供物理量支撑;
时间轴统一校准:针对附件仅提供帧号、无直接时间戳的问题,查阅相关文献并结合视频采集设备参数,统一设定视频帧率为 30fps,将帧号转换为时间戳,构建连续的时间序列,为起跳、落地时刻的精准识别提供时间基准。
  问题一分析
  问题一的核心目标是基于 AI 姿态识别技术,实现立定跳远起跳、落地时刻的精准识别,并刻画滞空阶段的运动轨迹与姿态特征,为后续影响因素分析与成绩预测提供基础数据支撑。首先,基于附件 2 的人体关键点数据与人体解剖学结构知识,明确 33 个人体关键点的定义与对应部位,将其划分为躯干、腿部、头部与手臂四大模块,绘制人体关键点示意图并进行可视化,为后续姿态分析提供解剖学基础;其次,为客观识别起跳与落地时刻,选取脚部关键点的坐标均值作为研究对象,采用数值微分方法计算脚部垂直方向速度,引入速度突变阈值,实现起跳、落地时刻的自动识别,并基于时间轴计算滞空时间;同时结合运动者的实际跳远成绩,计算不同运动者的轨迹比例尺,验证识别方法的可靠性;在此基础上,提取滞空阶段的轨迹数据,采用三次多项式对运动轨迹进行拟合,验证其抛物线运动特征;进一步计算下肢关节角度(髋 - 膝 - 踝)、躯干倾斜角度、上肢与下肢夹角、大腿与地面夹角等关键姿态指标,分析其在跳跃过程中的动态变化规律,为后续姿态优化提供依据。
  问题二分析
  问题二旨在从体质与姿态两个维度,挖掘影响立定跳远成绩的关键因素,为后续成绩预测模型的构建与姿态优化提供支撑。首先,结合附件 3 的姿态调整前后数据与附件 4 的个人体质报告,构建 "体质 - 姿态" 双维度影响因素分析框架;在体质因素方面,选取身高、体重、肌肉重量、去脂体重等核心指标,与跳远成绩进行 Spearman 相关性分析,绘制热力图可视化结果,筛选出相关性显著的关键体质因素;在姿态因素方面,采用与问题一相同的方法,计算姿态调整前后每名运动者每次测试的起跳、落地时刻、滞空时间及关键关节角度变化,并通过比例尺验证其可靠性;提取调整前后的最高成绩,计算成绩提升率,分析不同运动者的训练提升潜力,并对提升度最高的运动者的角度变化进行可视化分析;最后,考虑到附件中包含儿童与成人两类群体数据,分别对儿童组、成人组及混合组数据进行相关性分析,对比不同群体中姿态特征指标与成绩的相关程度差异,探究年龄因素对姿态 - 成绩相关性的影响,为分年龄段的个性化训练提供数据支撑。
  问题三分析
  问题三的核心目标是构建高精度的立定跳远成绩预测模型,基于问题二筛选得到的关键影响因素,对运动者 11 的跳远成绩进行预测。首先,以问题二确定的关键体质因素与姿态因素为自变量,以实际跳远成绩为因变量,构建预测模型的特征向量;为提升预测精度,对比分析多元线性回归模型与随机森林回归模型的适用性:多元线性回归模型可清晰解释多变量之间的线性相关关系,便于量化各因素对成绩的影响权重;随机森林回归模型则在处理非线性、复杂交互关系数据方面具有更强的判别能力;其次,对自变量进行标准化处理,消除不同量纲的影响,采用最小二乘拟合估计方法求解多元线性回归模型参数,采用网格搜索与交叉验证优化随机森林模型参数;最后,通过比例尺换算将预测结果与实际成绩进行对比,验证模型的预测精度,并对两种模型的误差进行分析,选择最优模型作为最终预测模型,实现对运动者 11 跳远成绩的精准预测。
  问题四分析
  问题四要求基于问题三的预测结果,为运动者 11 制定短时间内可实施的姿势训练建议,并预测训练后的理想成绩。首先,明确短期训练的核心前提:短期内难以显著改变身高、体重等体质因素,因此训练优化的重点聚焦于姿态角度的修正与动作规范性的提升;基于此,结合运动者 11 当前的姿态特征与问题一、二中的分析结果,定位其在起跳屈曲幅度、腾空收腹动作、落地缓冲环节等方面的短板;其次,选取年龄相近、姿态优化效果显著的同年龄段运动者作为参照,提取其关键角度指标的优化范围,为运动者 11 制定针对性的姿态调整目标;基于调整后的姿态指标,代入问题三构建的预测模型,预测训练后的理想跳远成绩;最后,结合运动生物力学训练原理,为运动者 11 设计短期可执行的训练方案,明确各阶段的训练重点与角度调整目标,验证短期姿态优化对提升立定跳远成绩的增益效果,为个性化体育教学与训练提供科学依据。

模型的建立与求解整体论文缩略图

全部论文及程序请见下方" 只会建模 QQ名片" 点击QQ名片即可

部分程序代码(完整论文以及代码请联系博主):

python 复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
立定跳远姿态识别:起跳/落地时刻识别、轨迹平滑、比例尺计算、关键角度计算
"""

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.signal import savgol_filter

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# -------------------------- 1. 数据读取与预处理 --------------------------
# 读取 Excel 文件(根据实际路径修改)
# df = pd.read_excel("../data/附件/附件1/运动者1的跳远位置信息.xlsx")
# df = pd.read_excel("../data/附件/附件1/运动者2的跳远位置信息.xlsx")
# df = pd.read_excel("../data/附件/附件3/姿势调整前/运动者6第2次的跳远位置信息.xlsx")
df = pd.read_excel("../data/附件/附件3/姿势调整后/运动者6调整后第2次的跳远位置信息.xlsx")

fps = 30  # 视频帧率
# 构建时间戳
df["time"] = df.index / fps

# 对所有关键点的 X、Y 做补齐和平滑处理
for col in df.columns:
    if col.endswith("_X") or col.endswith("_Y"):
        # 先把 0 替换为 NaN
        df[col] = df[col].replace(0, np.nan)
        # 用插值填充缺失值(前后都补)
        df[col] = df[col].interpolate(method='linear', limit_direction='both')
        # Savitzky-Golay 平滑滤波
        df[col] = savgol_filter(df[col], window_length=7, polyorder=2)

# -------------------------- 2. 起跳与落地时刻识别 --------------------------
# 双脚 4 个脚掌点取平均(29,30,31,32)
df["foot_Y_smooth"] = (df["31_Y"] + df["32_Y"] + df["30_Y"] + df["29_Y"]) / 4

# 计算脚掌垂直速度(数值微分)
df["foot_v_smooth"] = np.gradient(df["foot_Y_smooth"], df["time"])

# 起跳时刻:脚掌第一次快速上升,速度负向突变(<-150 px/s)
takeoff_candidates = df.index[df["foot_v_smooth"] < -150]
if len(takeoff_candidates) > 0:
    jump_start = takeoff_candidates[0]
else:
    jump_start = df.index[0]
t_takeoff = df.loc[jump_start, "time"]

# 落地时刻:脚掌最后一次快速下降,速度正向突变(>150 px/s),控制在起跳后1秒内
landing_candidates = df.index[
    (df["foot_v_smooth"] > 150) &
    (df["time"] >= t_takeoff) &
    (df["time"] <= t_takeoff + 1)
]
if len(landing_candidates) > 0:
    jump_end = landing_candidates[-1]
else:
    jump_end = df.index[-1]
t_landing = df.loc[jump_end, "time"]

t_flight = t_landing - t_takeoff

# 保存起跳/落地关键信息
features = {
    "起跳帧号": jump_start,
    "落地帧号": jump_end,
    "起跳时间(s)": t_takeoff,
    "落地时间(s)": t_landing,
    "滞空时间(s)": t_flight
}
result = pd.DataFrame([features])
print("起跳/落地识别结果:")
print(result)

# -------------------------- 3. 比例尺计算 --------------------------
df["foot_X_smooth"] = (df["31_X"] + df["32_X"] + df["30_X"] + df["29_X"]) / 4

# 运动者真实成绩(根据实际情况修改)
# 运动者1: real_distance = 1.58
# 运动者2: real_distance = 1.15
real_distance = 1.58

# 起跳/落地水平像素差
pixel_distance = df.loc[jump_end, "foot_X_smooth"] - df.loc[jump_start, "foot_X_smooth"]
scale = real_distance / pixel_distance  # 1像素对应多少米

print(f"起跳时刻水平像素值: {df.loc[jump_start, 'foot_X_smooth']:.2f} px")
print(f"落地时刻水平像素值: {df.loc[jump_end, 'foot_X_smooth']:.2f} px")
print(f"比例尺: {scale:.5f} m/px")

# -------------------------- 4. 数值微分可视化对比图 --------------------------
t_start = max(0, t_takeoff - 0.5)
t_end = t_landing + 0.5
df_clip = df[(df["time"] >= t_start) & (df["time"] <= t_end)].copy()

fig, axes = plt.subplots(2, 1, figsize=(6, 3), dpi=300, sharex=True)

# 子图1:脚掌轨迹
ax1 = axes[0]
ax1.plot(df_clip["time"], 720 - df_clip["foot_Y_smooth"],
         label="脚掌轨迹(滤波后)", color="#407bd0", linewidth=1.2)
ax1.scatter(t_takeoff, 720 - df.loc[jump_start, "foot_Y_smooth"],
            color="green", s=20, label="起跳时间")
ax1.scatter(t_landing, 720 - df.loc[jump_end, "foot_Y_smooth"],
            color="red", s=20, label="落地时间")
ax1.set_ylabel("高度(px)", fontsize=12)
ax1.grid(True, linestyle='--', alpha=0.5)
for spine in ax1.spines.values():
    spine.set_color('black')
    spine.set_linewidth(0.6)
ax1.tick_params(left=True, axis='both', direction='out', length=4, width=0.8, color='k', labelsize=9)

# 子图2:脚掌速度
ax2 = axes[1]
ax2.plot(df_clip["time"], df_clip["foot_v_smooth"],
         label="脚掌速度(微分)", color="purple", linewidth=1.2)
ax2.scatter(t_takeoff, df_clip.loc[jump_start, "foot_v_smooth"], color="green", s=20)
ax2.scatter(t_landing, df_clip.loc[jump_end, "foot_v_smooth"], color="red", s=20)
ax2.set_xlabel("时间(s)", fontsize=12)
ax2.set_ylabel("速度(px/s)", fontsize=12)
ax2.grid(True, linestyle='--', alpha=0.5)
for spine in ax2.spines.values():
    spine.set_color('black')
    spine.set_linewidth(0.6)
ax2.tick_params(bottom=True, left=True, right=False, top=False, axis='both',
                direction='out', length=4, width=0.8, color='k', labelsize=9)

# 合并图例
handles1, labels1 = ax1.get_legend_handles_labels()
handles2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(handles1 + handles2, labels1 + labels2,
           loc="upper center", bbox_to_anchor=(0.488, 1.5),
           ncol=4, fontsize=10, frameon=False, handletextpad=0.1, columnspacing=0.8)

ax1.margins(x=0, y=0.2)
ax2.margins(x=0, y=0.5)
plt.tight_layout()
# plt.savefig("../image/起跳与落地时刻微分示意图.svg", bbox_inches='tight', dpi=800, transparent=True)
plt.show()

# -------------------------- 5. 关键角度计算 --------------------------
def angle(p1, p2, p3):
    """计算由三点p1-p2-p3构成的夹角(单位:度)"""
    v1 = np.array([p1[0] - p2[0], p1[1] - p2[1]])
    v2 = np.array([p3[0] - p2[0], p3[1] - p2[1]])
    cos_theta = np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2) + 1e-6)
    return np.degrees(np.arccos(np.clip(cos_theta, -1.0, 1.0)))

# 5.1 手臂角度计算
right_angles = []
left_angles = []
for i in range(len(df)):
    # 右臂:肩11-肘13-腕15
    p1 = (df.loc[i, "11_X"], df.loc[i, "11_Y"])
    p2 = (df.loc[i, "13_X"], df.loc[i, "13_Y"])
    p3 = (df.loc[i, "15_X"], df.loc[i, "15_Y"])
    right_angles.append(angle(p1, p2, p3))

    # 左臂:肩12-肘14-腕16
    p1 = (df.loc[i, "12_X"], df.loc[i, "12_Y"])
    p2 = (df.loc[i, "14_X"], df.loc[i, "14_Y"])
    p3 = (df.loc[i, "16_X"], df.loc[i, "16_Y"])
    left_angles.append(angle(p1, p2, p3))

df["右臂角度"] = right_angles
df["左臂角度"] = left_angles
df["手臂角度"] = (df["左臂角度"] + df["右臂角度"]) / 2
arm_angle_range = df["手臂角度"].max() - df["手臂角度"].min()

# 5.2 手腕最大速度计算
fps = 30
# 右手腕
df["右手腕_vx"] = df["15_X"].diff() * fps
df["右手腕_vy"] = df["15_Y"].diff() * fps
df["右手腕速度"] = np.sqrt(df["右手腕_vx"]**2 + df["右手腕_vy"]**2)
# 左手腕
df["左手腕_vx"] = df["16_X"].diff() * fps
df["左手腕_vy"] = df["16_Y"].diff() * fps
df["左手腕速度"] = np.sqrt(df["左手腕_vx"]**2 + df["左手腕_vy"]**2)
# 合并求平均
df["手腕速度"] = (df["左手腕速度"] + df["右手腕速度"]) / 2
max_wrist_speed = df["手腕速度"].max()

print("关键姿态特征:")
print(f"手臂摆动角度幅度(°): {arm_angle_range:.2f}")
print(f"手腕最大速度(px/s): {max_wrist_speed:.2f}")

# 5.3 躯干、腿部角度计算工具函数
def get_point(frame, idx):
    return (frame[f"{idx}_X"], frame[f"{idx}_Y"])

def trunk_angle(frame):
    """躯干与地面竖直夹角(肩-髋)"""
    hip_x = (frame["23_X"] + frame["24_X"]) / 2
    hip_y = (frame["23_Y"] + frame["24_Y"]) / 2
    shoulder_x = (frame["11_X"] + frame["12_X"]) / 2
    shoulder_y = (frame["11_Y"] + frame["12_Y"]) / 2
    v = np.array([shoulder_x - hip_x, shoulder_y - hip_y])
    vertical = np.array([0, -1])
    cos_theta = np.dot(v, vertical) / (np.linalg.norm(v) * np.linalg.norm(vertical) + 1e-6)
    return np.degrees(np.arccos(np.clip(cos_theta, -1.0, 1.0)))

def avg_leg_angle_with_ground(frame):
    """腿部与地面的夹角(髋-踝)"""
    hip = np.array([(frame["23_X"] + frame["24_X"]) / 2,
                    (frame["23_Y"] + frame["24_Y"]) / 2])
    ankle = np.array([(frame["27_X"] + frame["28_X"]) / 2,
                      (frame["27_Y"] + frame["28_Y"]) / 2])
    leg_vec = ankle - hip
    ground_vec = np.array([1, 0])
    cos_theta = np.dot(leg_vec, ground_vec) / (np.linalg.norm(leg_vec) * np.linalg.norm(ground_vec) + 1e-6)
    return np.degrees(np.arccos(np.clip(cos_theta, -1.0, 1.0)))

# 构建逐时刻角度表(起跳至落地阶段)
rows = []
for idx, row in df.loc[jump_start:jump_end].iterrows():
    time_s = idx / fps
    # 合并左右髋、膝、踝取平均
    hip = ((row["23_X"] + row["24_X"]) / 2, (row["23_Y"] + row["24_Y"]) / 2)
    knee = ((row["25_X"] + row["26_X"]) / 2, (row["25_Y"] + row["26_Y"]) / 2)
    ankle = ((row["27_X"] + row["28_X"]) / 2, (row["27_Y"] + row["28_Y"]) / 2)

    # 下肢角度(髋-膝-踝)
    leg_angle = angle(hip, knee, ankle)
    # 躯干角度
    t_angle = trunk_angle(row)
    # 腿部与地面夹角
    leg_ground_angle = avg_leg_angle_with_ground(row)

    rows.append({
        "time(s)": time_s,
        "下肢角度(°)": leg_angle,
        "躯干角度(°)": t_angle,
        "腿部与地面夹角(°)": leg_ground_angle
    })

angle_df = pd.DataFrame(rows)
print("\n起跳-落地阶段角度数据(前5条):")
print(angle_df.head())
全部论文及程序请见下方" 只会建模 QQ名片" 点击QQ名片即可
相关推荐
python_DONG7 小时前
响应面法(Response Surface Methodology, RSM)单目标优化算法
算法·数学建模
数模竞赛Paid answer10 小时前
2025年国赛高教社杯数学建模C题NIPT的时点选择与胎儿的异常判定解题全过程文档及程序
数学建模·全国大学生数学建模竞赛·高教社杯
数模竞赛Paid answer13 小时前
2025年国赛高教社杯数学建模D题矿井突水水流漫延模型与逃生方案解题全过程文档及程序
数学建模·全国大学生数学建模竞赛·高教社杯
数模竞赛Paid answer14 小时前
2025年国赛高教社杯数学建模A题烟幕干扰弹的投放策略解题全过程文档及程序
数学建模·全国大学生数学建模竞赛·高教社杯·烟雾干扰弹的投放策略
一只小小的土拨鼠1 天前
2026年华中杯大学生数学建模挑战赛ABC(华中杯数学建模)参赛思路与解题策略全解析(详细解题思路和论文+完整项目代码+全套资源)
数学建模
一只小小的土拨鼠1 天前
2026年深圳杯&东三省数学建模联赛历年命题规律与硬核备赛指南
数学建模·深圳杯
超级码力6661 天前
【Latex第三方文档类standalone】standalone类介绍及应用
算法·数学建模·信息可视化
做cv的小昊1 天前
【TJU】研究生应用统计学课程笔记(4)——第二章 参数估计(2.1 矩估计和极大似然估计、2.2估计量的优良性原则)
人工智能·笔记·考研·数学建模·数据分析·excel·概率论
武帝为此2 天前
【相关性分析综述】
人工智能·数学建模