2. 磁力矩器卸载的基本原理与建模

任务定义

本案例针对卫星动量轮因长期受扰动力矩(如气动、重力梯度、太阳光压)积累而饱和的问题,建立磁力矩器卸载的数学模型。核心目标为:给定当前动量轮角动量 Hw、地磁场矢量 B(本体坐标系)及磁力矩器最大磁偶极矩 mmax,计算所需卸载力矩 Tc,并求解最优磁偶极矩指令 mcmd,使产生的控制力矩在垂直于地磁场的平面内最大程度抵消动量轮多余角动量。

物理原理与建模

磁力矩器通过通电线圈产生磁偶极矩 m,与地磁场 B 相互作用产生力矩:

T = m × B

由于力矩方向始终垂直于 B,无法直接产生沿磁场方向的力矩分量。卸载策略采用交叉积控制律:

mcmd = k · (Hw × B) / |B|²

其中 k 为卸载增益(单位 s⁻¹),该式保证产生的力矩方向为 (Hw × B) × B,即在与 B 垂直的平面内指向 -Hw 的方向分量,从而衰减动量轮角动量。当计算所得 |mcmd| 超过 mmax 时,需进行饱和限幅。

自洽实现

以下Python代码实现上述建模与计算,包含:地磁场矢量输入、卸载力矩计算、磁偶极矩指令求解、饱和限幅处理及卸载效果评估。


import numpy as np

def magnetic_unloading(H_w, B, k=0.01, m_max=0.5):
    """
    磁力矩器卸载计算
    
    参数:
        H_w : ndarray (3,)  动量轮角动量 (N·m·s),本体坐标系
        B   : ndarray (3,)  地磁场矢量 (T),本体坐标系
        k   : float         卸载增益 (s⁻¹)
        m_max: float        磁力矩器最大磁偶极矩 (A·m²)
    
    返回:
        dict: 包含卸载力矩、磁偶极矩指令、实际输出力矩及状态
    """
    # 1. 期望卸载力矩方向:与动量轮角动量相反
    #    但磁力矩只能产生垂直于B的分量,故取H_w在垂直于B平面上的投影
    B_norm_sq = np.dot(B, B)
    if B_norm_sq < 1e-12:
        raise ValueError("地磁场矢量接近零,无法进行磁卸载")
    
    # 2. 交叉积控制律计算磁偶极矩指令
    m_cmd = k * np.cross(H_w, B) / B_norm_sq
    
    # 3. 饱和限幅
    m_mag = np.linalg.norm(m_cmd)
    if m_mag > m_max:
        m_cmd = m_cmd * (m_max / m_mag)
        saturated = True
    else:
        saturated = False
    
    # 4. 实际产生的卸载力矩
    T_unload = np.cross(m_cmd, B)
    
    # 5. 沿H_w方向的卸载效率(用于评估)
    H_norm = np.linalg.norm(H_w)
    if H_norm > 1e-12:
        # 卸载力矩在H_w反方向上的分量占比
        proj = -np.dot(T_unload, H_w) / H_norm
    else:
        proj = 0.0
    
    return {
        'm_cmd': m_cmd,
        'm_mag': np.linalg.norm(m_cmd),
        'T_unload': T_unload,
        'saturated': saturated,
        'unload_rate': proj  # 正数表示有效卸载
    }

# ============ 样例输入与计算 ============
if __name__ == "__main__":
    # 场景:动量轮角动量主要沿本体X轴(如飞轮转速偏高)
    H_w = np.array([0.5, 0.1, -0.05])   # N·m·s
    
    # 地磁场在本体坐标系的测量值(示例,单位特斯拉)
    B = np.array([2.0e-5, -1.5e-5, 3.0e-5])  # T
    
    # 执行卸载计算
    result = magnetic_unloading(H_w, B, k=0.02, m_max=0.3)
    
    # 输出关键结果
    print("=== 磁力矩器卸载计算结果 ===")
    print(f"磁偶极矩指令 m_cmd = {result['m_cmd']} A·m²")
    print(f"指令幅值 |m_cmd| = {result['m_mag']:.4f} A·m²")
    print(f"饱和限幅状态: {'是' if result['saturated'] else '否'}")
    print(f"实际卸载力矩 T = {result['T_unload']} N·m")
    print(f"有效卸载速率 = {result['unload_rate']:.4f} N·m·s⁻¹")

落地与验证

运行方式:将代码保存为 mag_unload_model.py,在装有NumPy的Python环境中执行 python mag_unload_model.py。

验证方法:观察输出中 m_cmd 与 B 的点积是否接近零(磁偶极矩垂直于磁场),并检查 T_unload 与 H_w 的点积是否为负(力矩方向与角动量方向相反,实现卸载)。

判定标准:若 unload_rate > 0 且 |m_cmd| ≤ m_max(或饱和时等于m_max),且 dot(m_cmd, B) ≈ 0,则模型正确。预期输出中 m_cmd 幅值约为0.3(受饱和限制),卸载力矩在H_w方向产生负分量。

磁力矩器卸载控制律与矢量关系 X Y Z O H_w B m_cmd T = m×B ⊥ 交叉积控制律 m_cmd = k · (H_w × B) / |B|² 约束:m_cmd ⊥ B 饱和:|m_cmd| ≤ m_max 卸载力矩:T = m_cmd × B 卸载效果评估 有效卸载速率 = -T·H_w / |H_w| 当速率 > 0 时,动量轮角动量衰减 计算流程 输入H_w, B → 计算m_cmd → 饱和限幅 → 输出T

关键要点

本模型的核心约束在于磁力矩方向始终垂直于地磁场矢量,因此无法直接卸载沿磁场方向的角动量分量。实际工程中,当动量轮角动量与地磁场方向接近平行时,卸载效率趋近于零,需等待轨道位置变化使磁场方向改变后再进行卸载。上述代码通过 unload_rate 参数量化了当前时刻的卸载效率,可用于判断是否适合执行卸载操作。