4. 构建飞控软件静态架构视图
任务说明
本案例目标是为eVTOL飞控软件建立一套可落地的静态架构视图,采用C4模型(Context→Container→Component→Code)逐层细化,最终形成一份与代码仓库结构对应的架构文档。交付物包括:C4分层描述、UML组件关系、关键类定义及架构验证规则。
1. 系统上下文(C1)
飞控软件运行于飞行控制计算机(FCC)中,外部交互方包括:电机/电调(ESC)、IMU/GPS传感器、遥控接收机、地面站(GCS)、电池管理系统(BMS)及任务计算机。上下文图明确边界:飞控软件不直接驱动舵机,而是通过CAN/串口输出控制指令。
2. 容器视图(C2)
飞控软件内部按实时性要求划分为四个容器:传感器驱动层(周期采集)、状态估计器(EKF融合)、控制律计算(姿态/位置环)、执行机构输出(混控与PWM生成)。容器间通过共享内存队列通信,避免动态内存分配。
3. 组件视图(C3)与关键类(C4)
以控制律容器为例,内部组件包括:AttitudeController(姿态环)、PositionController(位置环)、Mixer(混控分配)、ArmingManager(解锁管理)。组件间依赖通过接口注入,便于单元测试。
4. 架构文档生成与验证
将上述C4视图以Markdown + PlantUML形式固化到仓库docs/architecture/目录。验证路径:
- 运行
plantuml architecture.puml生成SVG,确认无渲染错误; - 使用
ctags或IDE检查代码中类名与C4组件一一对应; - 执行
grep -r "class AttitudeController" src/确认类存在; - 判定标准:每个C4容器至少对应一个源码目录,每个组件至少对应一个类,且依赖方向与代码中的include/调用方向一致。
5. 最小代码映射示例
// src/control/attitude_controller.h
#pragma once
#include "state_estimator.h"
class AttitudeController {
public:
void init(float kp_roll, float kp_pitch, float kp_yaw);
void update(const FlightState& state, const ControlRef& ref);
private:
float kp_[3];
float max_torque_ = 10.0f;
};
// src/control/mixer.h
#pragma once
#include <array>
class Mixer {
public:
void init(const std::array<float, 8>& motor_directions);
std::array<float, 8> mix(float torque_x, float torque_y, float torque_z, float thrust);
private:
std::array<float, 8> directions_;
};
该代码片段与组件图中的AttitudeController和Mixer一一对应,验证时检查头文件存在且接口签名匹配即可。