1. 建立火箭运动学模型

建立火箭运动学模型 学习卡片

任务说明

本案例实现火箭在二维平面内的质点运动学模型。给定初始位置、初始速度和加速度随时间变化的函数,通过数值积分(欧拉法)更新火箭的位置与速度,为后续制导算法提供运动学基础。模型忽略质量变化、空气动力和重力以外的力,仅描述运动学关系。

运动学方程

二维平面内质点运动学由以下微分方程描述:

dvx/dt = ax(t)
dvy/dt = ay(t)
dx/dt  = vx
dy/dt  = vy

其中 (x, y) 为位置,(vx, vy) 为速度,(ax, ay) 为加速度。本案例采用固定时间步长 dt 的欧拉积分进行离散更新。

代码实现

import numpy as np

class RocketKinematics:
    """二维质点运动学模型(欧拉积分)"""
    def __init__(self, x0, y0, vx0, vy0, dt):
        self.x = x0
        self.y = y0
        self.vx = vx0
        self.vy = vy0
        self.dt = dt
        self.t = 0.0

    def step(self, ax, ay):
        """推进一个时间步,ax/ay 为当前时刻加速度分量"""
        # 更新速度
        self.vx += ax * self.dt
        self.vy += ay * self.dt
        # 更新位置
        self.x += self.vx * self.dt
        self.y += self.vy * self.dt
        # 更新时间
        self.t += self.dt
        return self.x, self.y, self.vx, self.vy, self.t

def simulate_constant_accel(duration, dt):
    """示例:恒定加速度 (2.0, 1.5) m/s²,初始位置原点,初始速度 (10, 0) m/s"""
    rocket = RocketKinematics(x0=0.0, y0=0.0, vx0=10.0, vy0=0.0, dt=dt)
    n_steps = int(duration / dt)
    trajectory = []
    for _ in range(n_steps):
        state = rocket.step(ax=2.0, ay=1.5)
        trajectory.append(state)
    return trajectory

if __name__ == "__main__":
    # 仿真 5 秒,步长 0.01 秒
    traj = simulate_constant_accel(duration=5.0, dt=0.01)
    # 打印最后一步状态
    x, y, vx, vy, t = traj[-1]
    print(f"t={t:.2f}s  x={x:.2f}m  y={y:.2f}m  vx={vx:.2f}m/s  vy={vy:.2f}m/s")

代码说明

RocketKinematics 类封装了运动学状态与欧拉更新逻辑。step 方法接收当前时刻的加速度分量,依次更新速度与位置。示例函数 simulate_constant_accel 演示了恒定加速度下的轨迹计算,便于验证数值正确性。

验证方法

对于恒定加速度情形,解析解为:

x(t) = x0 + vx0·t + 0.5·ax·t²
y(t) = y0 + vy0·t + 0.5·ay·t²
vx(t) = vx0 + ax·t
vy(t) = vy0 + ay·t

运行上述代码,观察输出。以示例参数(初始位置原点,初始速度 (10,0) m/s,加速度 (2.0,1.5) m/s²,仿真 5 秒)为例,预期输出为:

t=5.00s  x=75.00m  y=18.75m  vx=20.00m/s  vy=7.50m/s

将代码输出与解析解对比,误差应小于 0.01(由步长 0.01s 引入的欧拉截断误差)。若误差在允许范围内,则模型实现正确。

火箭运动学模型 — 数据流与更新时序 初始状态 x₀, y₀ vx₀, vy₀ 加速度函数 ax(t), ay(t) 每步采样 欧拉积分器 v += a·dt x += v·dt t += dt 状态输出 x, y, vx, vy, t 每步返回,供制导算法使用 循环至下一时刻 初始状态 加速度输入 积分更新 状态输出

落地与扩展

将上述代码保存为 rocket_kinematics.py,直接运行即可得到仿真结果。后续制导算法可在每个时间步调用 step(ax, ay),其中加速度由制导律计算得出,从而形成完整的闭环仿真链路。该模型是后续所有制导算法仿真的运动学基础。