1. 课程导入与仿真环境搭建
航天器姿态控制软件仿真的核心目标,是在不把算法直接送上真实星载计算机、也不消耗真实燃料与在轨时间的前提下,验证姿态确定与控制算法在给定动力学、敏感器、执行机构与扰动条件下的行为是否正确、稳定、可收敛,并评估其精度、裕度与鲁棒性。它既不是单纯的数学推导,也不是简单的代码调试,而是把"控制律—动力学—测量—执行—环境扰动"这一闭环用软件复现出来,使工程师能在桌面环境中反复观察姿态误差、角速度、控制力矩与执行机构状态的变化。
从工程视角看,姿态控制软件仿真要回答三类问题:第一,算法逻辑是否正确,例如姿态误差四元数的符号约定、控制律增益方向、限幅与死区处理是否符合设计;第二,闭环性能是否达标,例如指向精度、稳定度、机动时间、超调量是否满足任务指标;第三,边界条件下是否安全,例如敏感器失效、执行机构饱和、大角速度初始条件、参数摄动时系统是否仍能保持稳定。因此,仿真工程从一开始就应围绕"可复现、可观测、可对比"来组织,而不是先写一大堆代码再想怎么验证。
典型工作流
一个最小可运行的姿态控制仿真工程,通常按以下顺序推进:定义坐标系与姿态描述方式 → 建立刚体转动动力学与运动学模型 → 接入环境力矩与扰动模型 → 配置敏感器测量模型 → 配置执行机构模型 → 实现姿态确定与控制算法 → 设置初始条件与仿真参数 → 运行并记录数据 → 绘制曲线并判读结果。这个顺序不是死板的,但每一步的输入输出必须清晰,否则后期排障会非常困难。
坐标系约定必须先说清楚,并在全文与图示中保持一致。本课程采用如下约定:本体坐标系 B 固连于航天器,参考坐标系 R 取为惯性系或轨道系(按任务指定),姿态用从 R 到 B 的旋转四元数 q_rb 描述,角速度 ω 在本体系下表达。姿态误差四元数定义为 q_e = q_rb^{-1} ⊗ q_cmd,其中 q_cmd 为期望姿态。若切换参考系,必须在配置文件中显式标注,避免符号与方向混乱。
常用工具链
姿态控制仿真常见的工具链组合有三类。第一类是 MATLAB/Simulink,适合快速搭建控制律、做参数扫描与频域分析,配合 Aerospace Blockset 可直接使用四元数、轨道与姿态模块。第二类是 Python 生态,用 NumPy/SciPy 做数值积分与矩阵运算,用 Matplotlib 绘图,用 scipy.integrate.solve_ivp 做变步长积分,适合版本管理与自动化测试。第三类是 C/C++ 配合 Eigen 与 CMake,适合把算法逐步迁移到星载软件,便于做定点化与实时性评估。本课程以 Python 为主线,同时给出与 Simulink 的对应关系,便于读者按自身条件选择。
数值积分器的选择直接影响仿真可信度。姿态动力学是刚性较强的非线性系统,若控制增益较大,显式欧拉法容易发散。建议默认使用 RK45(Dormand-Prince)变步长积分,相对容差设为 1e-8,绝对容差设为 1e-10;若需要固定步长以便与星载周期对齐,可用 RK4,步长取控制周期的 1/10 至 1/5,例如控制周期 0.1 s 时步长取 0.01 s。四元数在每步积分后必须归一化,否则范数漂移会引入虚假的姿态误差。
最小可运行仿真工程
下面给出一个最小工程的目录结构与关键配置,读者可直接照此创建并运行。工程名为 adcs_sim_min,包含模型、算法、配置与脚本四部分。
adcs_sim_min/
├── config/
│ └── default.yaml # 仿真参数、初始条件、增益
├── src/
│ ├── dynamics.py # 刚体转动动力学与运动学
│ ├── environment.py # 重力梯度、气动、磁力矩
│ ├── sensors.py # 陀螺、星敏感器测量模型
│ ├── actuators.py # 反作用飞轮、磁力矩器
│ └── controller.py # 姿态确定与控制律
├── run_sim.py # 主入口:装配、积分、记录
└── results/ # 输出 CSV 与曲线图
配置文件中至少应包含以下字段,示例数值属于合理假设,用于教学演示,不代表任何真实型号:
inertia: [12.0, 14.0, 10.0] # kg·m^2,主轴惯量
q0: [1.0, 0.0, 0.0, 0.0] # 初始姿态四元数
omega0: [0.0, 0.0, 0.0] # rad/s,初始角速度
q_cmd: [0.966, 0.259, 0.0, 0.0] # 期望姿态,约绕X轴30°
kp: 0.8 # 比例增益
kd: 2.5 # 微分增益
t_end: 60.0 # 仿真时长 s
dt: 0.01 # 积分步长 s
控制律采用经典的 quaternion feedback 形式:u = -kp * sign(qe0) * qev - kd * ω,其中 qe0 为误差四元数标量部分,qev 为矢量部分,sign(qe0) 用于保证最短路径旋转。执行机构输出需限幅,例如飞轮力矩上限设为 0.05 N·m,超出时按比例截断并记录饱和标志。运行 run_sim.py 后,结果 CSV 至少包含时间、四元数、角速度、控制力矩、饱和标志五列,便于后续判读。
运行后应重点观察三条曲线:姿态误差角随时间是否单调收敛到零附近、角速度是否在机动结束后迅速衰减、控制力矩是否在限幅范围内且无高频抖振。若误差角在零附近等幅振荡,通常是微分增益偏小或积分步长过大;若力矩长时间饱和,说明增益过大或期望姿态变化过快,需要降低 kp 或延长机动时间。建议把首次运行的 t_end 设为 60 s,确认收敛后再延长到 300 s 观察长期稳定性。
config/default.yaml 与 run_sim.py 纳入版本管理。每次修改增益或初始条件后,用不同的结果文件名保存 CSV,例如 results/kp08_kd25.csv,便于横向对比不同参数下的响应差异。