aero-agent-roles 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +18 -0
- package/README.md +49 -0
- package/bin/aero-agent-roles.js +127 -0
- package/lib/catalog.js +97 -0
- package/lib/install.js +48 -0
- package/lib/mcp.js +199 -0
- package/manifest.json +516 -0
- package/package.json +44 -0
- package/roles/aerodynamics-engineer/ROLE.md +153 -0
- package/roles/aerodynamics-engineer/SOURCES.md +12 -0
- package/roles/aerodynamics-engineer/cli.py +143 -0
- package/roles/aerodynamics-engineer/core/aerodynamics_core.py +1218 -0
- package/roles/aerodynamics-engineer/templates/aero-design-report-template.md +72 -0
- package/roles/aerodynamics-engineer/tests/test_aerodynamics_core.py +227 -0
- package/roles/aerodynamics-engineer/tests/test_role_aerodynamics.py +94 -0
- package/roles/aircraft-design-engineer/ROLE.md +138 -0
- package/roles/aircraft-design-engineer/SOURCES.md +12 -0
- package/roles/aircraft-design-engineer/cli.py +152 -0
- package/roles/aircraft-design-engineer/core/aircraft_design_core.py +1278 -0
- package/roles/aircraft-design-engineer/templates/concept-design-template.md +99 -0
- package/roles/aircraft-design-engineer/tests/test_aircraft_design_core.py +269 -0
- package/roles/aircraft-design-engineer/tests/test_role_aircraft_design_engineer.py +106 -0
- package/roles/airworthiness-compliance-engineer/ROLE.md +122 -0
- package/roles/airworthiness-compliance-engineer/SOURCES.md +16 -0
- package/roles/airworthiness-compliance-engineer/cli.py +146 -0
- package/roles/airworthiness-compliance-engineer/core/airworthiness_core.py +894 -0
- package/roles/airworthiness-compliance-engineer/templates/compliance-matrix-template.md +46 -0
- package/roles/airworthiness-compliance-engineer/tests/test_airworthiness_core.py +224 -0
- package/roles/airworthiness-compliance-engineer/tests/test_role_airworthiness.py +85 -0
- package/roles/as9100-quality-auditor/ROLE.md +128 -0
- package/roles/as9100-quality-auditor/SOURCES.md +16 -0
- package/roles/as9100-quality-auditor/cli.py +136 -0
- package/roles/as9100-quality-auditor/core/as9100_core.py +857 -0
- package/roles/as9100-quality-auditor/templates/findings-report-template.md +119 -0
- package/roles/as9100-quality-auditor/tests/test_as9100_cli_profile.py +105 -0
- package/roles/as9100-quality-auditor/tests/test_as9100_core.py +204 -0
- package/roles/as9100-quality-auditor/tests/test_role_as9100.py +90 -0
- package/roles/data-bus-avionics-engineer/ROLE.md +146 -0
- package/roles/data-bus-avionics-engineer/SOURCES.md +23 -0
- package/roles/data-bus-avionics-engineer/cli.py +311 -0
- package/roles/data-bus-avionics-engineer/core/data_bus_avionics_core.py +1121 -0
- package/roles/data-bus-avionics-engineer/templates/bus-assessment-template.md +134 -0
- package/roles/data-bus-avionics-engineer/tests/test_bundle_protocol.py +137 -0
- package/roles/data-bus-avionics-engineer/tests/test_data_bus_avionics_core.py +261 -0
- package/roles/data-bus-avionics-engineer/tests/test_role_data_bus_avionics_engineer.py +121 -0
- package/roles/do160-environmental-engineer/ROLE.md +136 -0
- package/roles/do160-environmental-engineer/SOURCES.md +30 -0
- package/roles/do160-environmental-engineer/cli.py +147 -0
- package/roles/do160-environmental-engineer/core/do160_environmental_core.py +1246 -0
- package/roles/do160-environmental-engineer/templates/environmental-qualification-plan-template.md +114 -0
- package/roles/do160-environmental-engineer/tests/test_do160_environmental_core.py +312 -0
- package/roles/do160-environmental-engineer/tests/test_role_do160_environmental_engineer.py +281 -0
- package/roles/do178c-cert-engineer/ROLE.md +120 -0
- package/roles/do178c-cert-engineer/SOURCES.md +16 -0
- package/roles/do178c-cert-engineer/cli.py +129 -0
- package/roles/do178c-cert-engineer/core/do178c_core.py +411 -0
- package/roles/do178c-cert-engineer/templates/psac-template.md +74 -0
- package/roles/do178c-cert-engineer/tests/test_do178c_cert_engineer_core.py +91 -0
- package/roles/do178c-cert-engineer/tests/test_role_do178c.py +109 -0
- package/roles/do254-hardware-engineer/ROLE.md +127 -0
- package/roles/do254-hardware-engineer/SOURCES.md +19 -0
- package/roles/do254-hardware-engineer/cli.py +308 -0
- package/roles/do254-hardware-engineer/core/do254_hardware_core.py +761 -0
- package/roles/do254-hardware-engineer/templates/phac-template.md +87 -0
- package/roles/do254-hardware-engineer/tests/test_do254_bundle_profile.py +152 -0
- package/roles/do254-hardware-engineer/tests/test_do254_hardware_core.py +200 -0
- package/roles/do254-hardware-engineer/tests/test_role_do254_hardware.py +108 -0
- package/roles/engineering-analysis-engineer/ROLE.md +154 -0
- package/roles/engineering-analysis-engineer/SOURCES.md +15 -0
- package/roles/engineering-analysis-engineer/cli.py +151 -0
- package/roles/engineering-analysis-engineer/core/engineering_analysis_engineer_core.py +866 -0
- package/roles/engineering-analysis-engineer/templates/analysis-memo-template.md +73 -0
- package/roles/engineering-analysis-engineer/tests/test_engineering_analysis_engineer_core.py +367 -0
- package/roles/engineering-analysis-engineer/tests/test_role_engineering_analysis_engineer.py +113 -0
- package/roles/flight-management-engineer/ROLE.md +160 -0
- package/roles/flight-management-engineer/SOURCES.md +30 -0
- package/roles/flight-management-engineer/cli.py +258 -0
- package/roles/flight-management-engineer/core/flight_management_core.py +1473 -0
- package/roles/flight-management-engineer/templates/route-assessment-template.md +94 -0
- package/roles/flight-management-engineer/tests/test_flight_management_core.py +437 -0
- package/roles/flight-management-engineer/tests/test_role_flight_management_engineer.py +123 -0
- package/roles/flight-mechanics-engineer/ROLE.md +162 -0
- package/roles/flight-mechanics-engineer/SOURCES.md +51 -0
- package/roles/flight-mechanics-engineer/cli.py +149 -0
- package/roles/flight-mechanics-engineer/core/flight_mechanics_core.py +1507 -0
- package/roles/flight-mechanics-engineer/templates/perf-sc-report-template.md +82 -0
- package/roles/flight-mechanics-engineer/tests/test_flight_mechanics_core.py +277 -0
- package/roles/flight-mechanics-engineer/tests/test_role_flight_mechanics_engineer.py +141 -0
- package/roles/flight-test-engineer/ROLE.md +137 -0
- package/roles/flight-test-engineer/SOURCES.md +24 -0
- package/roles/flight-test-engineer/cli.py +135 -0
- package/roles/flight-test-engineer/core/flight_test_core.py +931 -0
- package/roles/flight-test-engineer/templates/flight-test-template.md +143 -0
- package/roles/flight-test-engineer/tests/test_flight_test_engineer_core.py +227 -0
- package/roles/flight-test-engineer/tests/test_role_flight_test_engineer.py +150 -0
- package/roles/flight-test-performance-engineer/ROLE.md +165 -0
- package/roles/flight-test-performance-engineer/SOURCES.md +20 -0
- package/roles/flight-test-performance-engineer/cli.py +319 -0
- package/roles/flight-test-performance-engineer/core/flight_test_performance_core.py +1398 -0
- package/roles/flight-test-performance-engineer/templates/performance-report-template.md +105 -0
- package/roles/flight-test-performance-engineer/tests/test_flight_test_performance_engineer_core.py +308 -0
- package/roles/flight-test-performance-engineer/tests/test_role_flight_test_performance_engineer.py +165 -0
- package/roles/gnc-engineer/ROLE.md +141 -0
- package/roles/gnc-engineer/SOURCES.md +35 -0
- package/roles/gnc-engineer/cli.py +141 -0
- package/roles/gnc-engineer/core/gnc_core.py +1074 -0
- package/roles/gnc-engineer/templates/gnc-report-template.md +105 -0
- package/roles/gnc-engineer/tests/test_gnc_engineer_core.py +238 -0
- package/roles/gnc-engineer/tests/test_role_gnc_engineer.py +142 -0
- package/roles/guidance-engineer/ROLE.md +156 -0
- package/roles/guidance-engineer/SOURCES.md +43 -0
- package/roles/guidance-engineer/cli.py +280 -0
- package/roles/guidance-engineer/core/guidance_core.py +820 -0
- package/roles/guidance-engineer/templates/guidance-report-template.md +70 -0
- package/roles/guidance-engineer/tests/test_guidance_engineer_core.py +269 -0
- package/roles/guidance-engineer/tests/test_role_guidance_engineer.py +146 -0
- package/roles/high-speed-aerodynamics-engineer/ROLE.md +161 -0
- package/roles/high-speed-aerodynamics-engineer/SOURCES.md +18 -0
- package/roles/high-speed-aerodynamics-engineer/cli.py +282 -0
- package/roles/high-speed-aerodynamics-engineer/core/high_speed_aero_core.py +1566 -0
- package/roles/high-speed-aerodynamics-engineer/templates/high-speed-memo-template.md +75 -0
- package/roles/high-speed-aerodynamics-engineer/tests/test_bundle_protocol.py +103 -0
- package/roles/high-speed-aerodynamics-engineer/tests/test_high_speed_aero_core.py +280 -0
- package/roles/high-speed-aerodynamics-engineer/tests/test_role_high_speed_aerodynamics.py +125 -0
- package/roles/ndt-engineer/ROLE.md +157 -0
- package/roles/ndt-engineer/SOURCES.md +18 -0
- package/roles/ndt-engineer/cli.py +316 -0
- package/roles/ndt-engineer/core/ndt_core.py +1590 -0
- package/roles/ndt-engineer/templates/ndt-plan-template.md +109 -0
- package/roles/ndt-engineer/tests/test_ndt_cli_bundle.py +183 -0
- package/roles/ndt-engineer/tests/test_ndt_core.py +437 -0
- package/roles/ndt-engineer/tests/test_role_ndt_engineer.py +148 -0
- package/roles/numerical-analysis-engineer/ROLE.md +158 -0
- package/roles/numerical-analysis-engineer/SOURCES.md +19 -0
- package/roles/numerical-analysis-engineer/cli.py +414 -0
- package/roles/numerical-analysis-engineer/core/numerical_analysis_core.py +1220 -0
- package/roles/numerical-analysis-engineer/templates/verification-memo-template.md +120 -0
- package/roles/numerical-analysis-engineer/tests/test_bundle_protocol.py +157 -0
- package/roles/numerical-analysis-engineer/tests/test_numerical_analysis_core.py +337 -0
- package/roles/numerical-analysis-engineer/tests/test_role_numerical_analysis_engineer.py +117 -0
- package/roles/propulsion-engineer/ROLE.md +163 -0
- package/roles/propulsion-engineer/SOURCES.md +15 -0
- package/roles/propulsion-engineer/cli.py +168 -0
- package/roles/propulsion-engineer/core/propulsion_core.py +1291 -0
- package/roles/propulsion-engineer/templates/propulsion-report-template.md +92 -0
- package/roles/propulsion-engineer/tests/test_propulsion_engineer_core.py +294 -0
- package/roles/propulsion-engineer/tests/test_role_propulsion_engineer.py +106 -0
- package/roles/space-systems-engineer/ROLE.md +161 -0
- package/roles/space-systems-engineer/SOURCES.md +49 -0
- package/roles/space-systems-engineer/cli.py +173 -0
- package/roles/space-systems-engineer/core/space_systems_core.py +980 -0
- package/roles/space-systems-engineer/templates/space-systems-template.md +88 -0
- package/roles/space-systems-engineer/tests/test_role_space_systems_engineer.py +117 -0
- package/roles/space-systems-engineer/tests/test_space_systems_engineer_core.py +247 -0
- package/roles/state-estimation-engineer/ROLE.md +154 -0
- package/roles/state-estimation-engineer/SOURCES.md +27 -0
- package/roles/state-estimation-engineer/cli.py +326 -0
- package/roles/state-estimation-engineer/core/state_estimation_core.py +958 -0
- package/roles/state-estimation-engineer/templates/nav-state-estimator-design-template.md +76 -0
- package/roles/state-estimation-engineer/tests/test_bundle_protocol.py +110 -0
- package/roles/state-estimation-engineer/tests/test_role_state_estimation_engineer.py +127 -0
- package/roles/state-estimation-engineer/tests/test_state_estimation_engineer_core.py +231 -0
- package/roles/structures-loads-engineer/ROLE.md +171 -0
- package/roles/structures-loads-engineer/SOURCES.md +44 -0
- package/roles/structures-loads-engineer/cli.py +219 -0
- package/roles/structures-loads-engineer/core/structures_loads_core.py +1112 -0
- package/roles/structures-loads-engineer/templates/loads-strength-report-template.md +96 -0
- package/roles/structures-loads-engineer/tests/test_bundle_protocol.py +101 -0
- package/roles/structures-loads-engineer/tests/test_role_structures_loads_engineer.py +147 -0
- package/roles/structures-loads-engineer/tests/test_structures_loads_core.py +261 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: role
|
|
3
|
+
name: gnc-engineer
|
|
4
|
+
title: "Guidance, Navigation and Control (GNC) Engineer"
|
|
5
|
+
status: draft
|
|
6
|
+
domain: gnc-autonomy
|
|
7
|
+
deliverable_type: "control design + guidance/navigation analysis report"
|
|
8
|
+
standards_bound:
|
|
9
|
+
- id: mil-std-1797a
|
|
10
|
+
tier: TIER-1
|
|
11
|
+
reference-only: false
|
|
12
|
+
skills_bound:
|
|
13
|
+
- gnc-autonomy/control/pid-control-design
|
|
14
|
+
- gnc-autonomy/control/lead-lag-compensation
|
|
15
|
+
- gnc-autonomy/control/frequency-response-design
|
|
16
|
+
- gnc-autonomy/control/digital-control-design
|
|
17
|
+
- gnc-autonomy/control/observer-design
|
|
18
|
+
- gnc-autonomy/control/control-allocation
|
|
19
|
+
- gnc-autonomy/control/gain-scheduling
|
|
20
|
+
- gnc-autonomy/control/adaptive-control
|
|
21
|
+
- gnc-autonomy/navigation/navigation-frames
|
|
22
|
+
- gnc-autonomy/navigation/inertial-navigation
|
|
23
|
+
- gnc-autonomy/navigation/kalman-filter-design
|
|
24
|
+
- gnc-autonomy/navigation/gnss-pseudorange-positioning
|
|
25
|
+
- gnc-autonomy/navigation/gnss-raim-fde
|
|
26
|
+
- gnc-autonomy/navigation/dilution-of-precision
|
|
27
|
+
- gnc-autonomy/guidance/pursuit-guidance
|
|
28
|
+
- gnc-autonomy/optimal-control/lqr-design
|
|
29
|
+
- gnc-autonomy/optimal-control/model-predictive-control
|
|
30
|
+
- gnc-autonomy/optimal-control/bang-bang-control
|
|
31
|
+
- gnc-autonomy/optimal-control/dymos-trajectory
|
|
32
|
+
- gnc-autonomy/space/attitude-dynamics
|
|
33
|
+
- gnc-autonomy/space/orbit-dynamics
|
|
34
|
+
- gnc-autonomy/space/orbit-determination
|
|
35
|
+
- gnc-autonomy/space/rendezvous-phasing
|
|
36
|
+
tools_allowed: [stdlib, offline-file-processing]
|
|
37
|
+
forbidden:
|
|
38
|
+
- "claim certification approval"
|
|
39
|
+
- "release flight software"
|
|
40
|
+
- "reproduce proprietary standard text"
|
|
41
|
+
sign_off_required: true
|
|
42
|
+
license: Apache-2.0
|
|
43
|
+
compatibility: "agentskills.io ROLE.md; any SKILL.md host"
|
|
44
|
+
metadata:
|
|
45
|
+
version: 0.1.0
|
|
46
|
+
author: Aero Agent Roles
|
|
47
|
+
skills_release: "v1.3.0+"
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
# Guidance, Navigation and Control (GNC) Engineer
|
|
51
|
+
|
|
52
|
+
## Role identity
|
|
53
|
+
|
|
54
|
+
Owns the GNC chain for a vehicle: navigation state estimation (INS,
|
|
55
|
+
GNSS, filtering), guidance law selection, and control law design
|
|
56
|
+
(inner/outer loops) with stability margins and handling-qualities
|
|
57
|
+
context; plus attitude/orbit dynamics for space applications. Use when
|
|
58
|
+
a vehicle needs a designed, analyzed control system or a navigation/
|
|
59
|
+
guidance architecture with quantified performance. Do NOT use for
|
|
60
|
+
aerodynamic/structural analysis or avionics software certification
|
|
61
|
+
(DO-178C role).
|
|
62
|
+
|
|
63
|
+
## Deliverable contract
|
|
64
|
+
|
|
65
|
+
1. **GNC design report** (per templates/gnc-report-template.md, a FILLED
|
|
66
|
+
worked example generated by the core for the reference autopilot
|
|
67
|
+
item) - control architecture, plant model, loop gains, stability
|
|
68
|
+
margins, disturbance response, navigation error budget, guidance
|
|
69
|
+
performance, and (for space) attitude/orbit control.
|
|
70
|
+
2. **Analysis evidence set** - the design calculations, frequency
|
|
71
|
+
responses, covariance runs, and Monte Carlo results, delivered as
|
|
72
|
+
the report's "Calculation traceability" appendix plus the computed
|
|
73
|
+
tables (gains, margins, budgets) in each section.
|
|
74
|
+
|
|
75
|
+
The core engine computes every number from the domain rules of the
|
|
76
|
+
bound leaves; nothing is asserted without a calculation.
|
|
77
|
+
|
|
78
|
+
## Workflow (stages -> bound skills)
|
|
79
|
+
|
|
80
|
+
| Stage | Loads skill | Produces |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| 1. Frames + plant | navigation-frames + space/attitude-dynamics + space/orbit-dynamics | reference frames, plant dynamics |
|
|
83
|
+
| 2. Navigation filter | kalman-filter-design + inertial-navigation + gnss-pseudorange-positioning + gnss-raim-fde + dilution-of-precision | nav architecture + error budget |
|
|
84
|
+
| 3. Inner loop | pid-control-design + lead-lag-compensation + frequency-response-design | inner loop gains + margins |
|
|
85
|
+
| 4. Digital implementation | digital-control-design | discrete design |
|
|
86
|
+
| 5. State estimation | observer-design | observer gains |
|
|
87
|
+
| 6. Allocation/scheduling | control-allocation + gain-scheduling + adaptive-control | allocator + schedule |
|
|
88
|
+
| 7. Guidance | pursuit-guidance | guidance law |
|
|
89
|
+
| 8. Optimal control | lqr-design + model-predictive-control + bang-bang-control + dymos-trajectory | optimal/trajectory solution |
|
|
90
|
+
| 9. Space GNC | space/orbit-determination + space/rendezvous-phasing | orbit determination, rendezvous |
|
|
91
|
+
| 10. Report | (all above) | the GNC design report |
|
|
92
|
+
|
|
93
|
+
## Evidence gates
|
|
94
|
+
|
|
95
|
+
- Stage 1 done = plant + frames documented; states/inputs defined.
|
|
96
|
+
- Stage 2 done = navigation error budget with sensor noise assumptions.
|
|
97
|
+
- Stage 3 done = gain/phase margins meet the stated requirement.
|
|
98
|
+
- Stage 5 done = observer poles placed with a rationale.
|
|
99
|
+
- FINAL = every gain and margin traces to a calculation; Monte Carlo/
|
|
100
|
+
covariance results stated where relevant.
|
|
101
|
+
|
|
102
|
+
## Boundary / forbidden
|
|
103
|
+
|
|
104
|
+
- NEVER claim certification approval or release flight software (that is
|
|
105
|
+
the software/hardware cert + program authority).
|
|
106
|
+
- Margins are design predictions; flight test and formal verification
|
|
107
|
+
are separate.
|
|
108
|
+
- Navigation/guidance results assume the stated sensor models.
|
|
109
|
+
|
|
110
|
+
## Verification
|
|
111
|
+
|
|
112
|
+
The role runs STANDALONE: `core/gnc_core.py` is an executable engine
|
|
113
|
+
that computes PID/LQR/observer gains, phase and gain margins from the
|
|
114
|
+
loop gains, Kalman steady-state covariance and gain, PN guidance
|
|
115
|
+
commands, sample-rate and discrete-design checks, and a seeded Monte
|
|
116
|
+
Carlo robustness pass, then BUILDS the GNC design report and
|
|
117
|
+
gate-checks deliverables. No AeroSkills checkout required.
|
|
118
|
+
|
|
119
|
+
Run the role:
|
|
120
|
+
```bash
|
|
121
|
+
python3 cli.py build --out gnc-report.md # example item
|
|
122
|
+
python3 cli.py build --vehicle "My UAV" --bandwidth 4 # override facts
|
|
123
|
+
python3 cli.py check --file gnc-report.md # gate-check a report
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Tests:
|
|
127
|
+
- tests/test_gnc_engineer_core.py (20 tests): domain rules (pole
|
|
128
|
+
placement anchors, bandwidth factor, margins, Riccati, Kalman,
|
|
129
|
+
observer, PN), builder correctness, gate pass/fail, standalone mode
|
|
130
|
+
(no skills repo).
|
|
131
|
+
- tests/test_role_gnc_engineer.py: bound-skill resolution (skips if
|
|
132
|
+
the skills repo is absent) + workflow + filled template + boundaries.
|
|
133
|
+
|
|
134
|
+
Bound skills in Aero Agent Skills deepen individual stages when the
|
|
135
|
+
library is present (navigation leaves, guidance leaves, space GNC);
|
|
136
|
+
the core engine does not depend on them.
|
|
137
|
+
|
|
138
|
+
## Compliance
|
|
139
|
+
|
|
140
|
+
- mil-std-1797a context where HQ applies. References summary-not-copy.
|
|
141
|
+
- SOURCES.md records standards referenced.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# SOURCES.md - GNC Engineer
|
|
2
|
+
|
|
3
|
+
| Source | Role use | Gated |
|
|
4
|
+
|---|---|---|
|
|
5
|
+
| MIL-STD-1797A | handling qualities context (Level-1 margins/bandwidth context where HQ applies) | false |
|
|
6
|
+
| Stevens & Lewis, Aircraft Control and Simulation | control methods (book) | true |
|
|
7
|
+
| Tewari, Modern Control Design | control reference (book) | true |
|
|
8
|
+
| Groves, Principles of GNSS, Inertial, and Multisensor Navigation | navigation reference (book) | true |
|
|
9
|
+
| Vallado, Fundamentals of Astrodynamics | orbit methods (book) | true |
|
|
10
|
+
|
|
11
|
+
Summary-not-copy per STANDARDS.md.
|
|
12
|
+
|
|
13
|
+
## Encoded domain rules (computed by core/gnc_core.py)
|
|
14
|
+
|
|
15
|
+
The engine's numbers come from the textbook methods carried by the
|
|
16
|
+
bound Aero Agent Skills leaves (which encode the books above as
|
|
17
|
+
practice); no standard text is reproduced:
|
|
18
|
+
|
|
19
|
+
| Rule | Formula | Bound leaf |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| Second-order bandwidth | w_bw = f(z) wn, f(z) = sqrt(1-2z^2+sqrt(2-4z^2+4z^4)) | control/frequency-response-design |
|
|
22
|
+
| PID pole placement | match (s^2+2zwn s+wn^2)(s+p3) to plant b/(s^2+a1 s+a0) | control/pid-control-design |
|
|
23
|
+
| Type-1 loop margins | L = K/(s(s+a)): PM = 90-atan(wc/a), GM = inf | control/pid-control-design |
|
|
24
|
+
| Loop margins (general) | |L(jw)| and root-sum unwrapped phase on jw | control/frequency-response-design |
|
|
25
|
+
| LQR | K = R^-1 B' P from the ARE closed form | optimal-control/lqr-design |
|
|
26
|
+
| Kalman steady state | P = Riccati root, K = hP/(h^2P+r) | navigation/kalman-filter-design |
|
|
27
|
+
| Observer | L = phi(A) O^-1 e_n (Ackermann, 2-state) | control/observer-design |
|
|
28
|
+
| Guidance | a_c = N Vc lam_dot | guidance/pursuit-guidance |
|
|
29
|
+
| Digital | 10-20 samples per closed-loop cycle; velocity-form PID | control/digital-control-design |
|
|
30
|
+
|
|
31
|
+
Margins requirements (PM >= 45 deg, GM >= 6 dB) are the conventional
|
|
32
|
+
flight-control design targets recorded as project requirements in the
|
|
33
|
+
example; MIL-STD-1797A adds handling-qualities context where the
|
|
34
|
+
program requires it. All example plant/sensor numbers are stated
|
|
35
|
+
project facts (verify against the vehicle data).
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""cli.py - run the GNC Engineer role.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
python3 cli.py build [--out <file.md>] [--bandwidth <rad/s>] \
|
|
6
|
+
[--phase-margin <deg>] [--gain-margin <dB>] [--bundle]
|
|
7
|
+
# build the GNC design report
|
|
8
|
+
# --bundle also emit evidence/{model,gates,provenance}.json (PROTOCOL.md)
|
|
9
|
+
python3 cli.py check --file <file.md> # gate-check a report
|
|
10
|
+
|
|
11
|
+
The role ENGINE (core/gnc_core.py) does the work standalone; bound
|
|
12
|
+
skills in Aero Agent Skills deepen individual stages when present.
|
|
13
|
+
"""
|
|
14
|
+
import argparse
|
|
15
|
+
import os
|
|
16
|
+
import sys
|
|
17
|
+
|
|
18
|
+
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
|
19
|
+
"core"))
|
|
20
|
+
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
|
21
|
+
"..", "..", "scripts"))
|
|
22
|
+
import gnc_core as core # noqa: E402
|
|
23
|
+
import evidence # noqa: E402
|
|
24
|
+
|
|
25
|
+
ROLE_SLUG = "gnc-engineer"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def cmd_build(args):
|
|
29
|
+
proj = core.example_project()
|
|
30
|
+
# allow overriding requirements / vehicle from the CLI
|
|
31
|
+
if args.vehicle:
|
|
32
|
+
proj.vehicle = args.vehicle
|
|
33
|
+
if args.bandwidth:
|
|
34
|
+
proj.req_bandwidth_rad_s = float(args.bandwidth)
|
|
35
|
+
if args.phase_margin:
|
|
36
|
+
proj.req_phase_margin_deg = float(args.phase_margin)
|
|
37
|
+
if args.gain_margin:
|
|
38
|
+
proj.req_gain_margin_db = float(args.gain_margin)
|
|
39
|
+
model = core.build_gnc_report(proj)
|
|
40
|
+
md = core.render_gnc_report_markdown(model)
|
|
41
|
+
|
|
42
|
+
# program profile (customer tailoring): load + apply context header
|
|
43
|
+
profile = None
|
|
44
|
+
try:
|
|
45
|
+
profile = evidence.load_profile(args.profile)
|
|
46
|
+
except ValueError as e:
|
|
47
|
+
print("error: bad profile: %s" % e)
|
|
48
|
+
return 1
|
|
49
|
+
if profile:
|
|
50
|
+
model["profile"] = {
|
|
51
|
+
"customer": profile.get("customer"),
|
|
52
|
+
"program": profile.get("program"),
|
|
53
|
+
"basis": profile.get("basis"),
|
|
54
|
+
"authority": profile.get("authority"),
|
|
55
|
+
"der": profile.get("der"),
|
|
56
|
+
"document_prefix": profile.get("document_prefix"),
|
|
57
|
+
"revision": profile.get("revision"),
|
|
58
|
+
}
|
|
59
|
+
md = evidence.profile_header_block(profile) + md
|
|
60
|
+
|
|
61
|
+
gates = core.check_gnc_report(model)
|
|
62
|
+
if args.out:
|
|
63
|
+
with open(args.out, "w") as f:
|
|
64
|
+
f.write(md)
|
|
65
|
+
print("built GNC design report (%s) -> %s"
|
|
66
|
+
% (model["vehicle"], args.out))
|
|
67
|
+
if profile:
|
|
68
|
+
print("profile: %s / %s" % (profile.get("customer"),
|
|
69
|
+
profile.get("program")))
|
|
70
|
+
print("gates: all_pass=%s %s" % (gates["all_pass"], gates))
|
|
71
|
+
if args.bundle:
|
|
72
|
+
prov = {
|
|
73
|
+
"role": ROLE_SLUG,
|
|
74
|
+
"core": {
|
|
75
|
+
"file": "core/gnc_core.py",
|
|
76
|
+
"functions": ["pid_gains_second_order", "loop_margins",
|
|
77
|
+
"type1_margins", "riccati_solution",
|
|
78
|
+
"kalman_steady_state", "observer_gain_2state",
|
|
79
|
+
"pn_acceleration", "sample_rate_rule",
|
|
80
|
+
"monte_carlo_outer_margins",
|
|
81
|
+
"build_gnc_report"],
|
|
82
|
+
"version": "0.1.0",
|
|
83
|
+
},
|
|
84
|
+
"skills": [],
|
|
85
|
+
"cross_checked": False,
|
|
86
|
+
"disclaimer": "DRAFT for human review. Not an approval document.",
|
|
87
|
+
}
|
|
88
|
+
paths = evidence.write_bundle(
|
|
89
|
+
args.out, ROLE_SLUG, "GNC design report", model, gates, prov)
|
|
90
|
+
print("bundle: model=%s" % paths["model"])
|
|
91
|
+
print(" gates=%s" % paths["gates"])
|
|
92
|
+
print(" provenance=%s" % paths["provenance"])
|
|
93
|
+
else:
|
|
94
|
+
print(md)
|
|
95
|
+
return 0 if gates["all_pass"] else 1
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def cmd_check(args):
|
|
99
|
+
if not os.path.exists(args.file):
|
|
100
|
+
print("file not found: %s" % args.file)
|
|
101
|
+
return 1
|
|
102
|
+
md = open(args.file).read()
|
|
103
|
+
gates = core.check_gnc_report_markdown(md)
|
|
104
|
+
for name, ok in gates.items():
|
|
105
|
+
if name != "all_pass":
|
|
106
|
+
print("%s %s" % ("PASS" if ok else "FAIL", name))
|
|
107
|
+
print("RESULT: %s" % ("PASS" if gates["all_pass"] else "FAIL"))
|
|
108
|
+
return 0 if gates["all_pass"] else 1
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def main():
|
|
112
|
+
p = argparse.ArgumentParser(description="GNC Engineer role")
|
|
113
|
+
sub = p.add_subparsers(dest="cmd", required=True)
|
|
114
|
+
|
|
115
|
+
b = sub.add_parser("build")
|
|
116
|
+
b.add_argument("--out", default="", help="output file (default: stdout)")
|
|
117
|
+
b.add_argument("--vehicle", default="", help="vehicle / project name")
|
|
118
|
+
b.add_argument("--bandwidth", default="",
|
|
119
|
+
help="attitude bandwidth requirement (rad/s)")
|
|
120
|
+
b.add_argument("--phase-margin", default="",
|
|
121
|
+
help="phase margin requirement (deg)")
|
|
122
|
+
b.add_argument("--gain-margin", default="",
|
|
123
|
+
help="gain margin requirement (dB)")
|
|
124
|
+
b.add_argument("--bundle", action="store_true",
|
|
125
|
+
help="emit evidence/{model,gates,provenance}.json")
|
|
126
|
+
b.add_argument("--profile", default="",
|
|
127
|
+
help="program profile JSON (customer tailoring, "
|
|
128
|
+
"docs/PROFILE-SCHEMA.md)")
|
|
129
|
+
b.set_defaults(fn=cmd_build)
|
|
130
|
+
|
|
131
|
+
c = sub.add_parser("check")
|
|
132
|
+
c.add_argument("--file", required=True,
|
|
133
|
+
help="GNC design report markdown to gate-check")
|
|
134
|
+
c.set_defaults(fn=cmd_check)
|
|
135
|
+
|
|
136
|
+
args = p.parse_args()
|
|
137
|
+
sys.exit(args.fn(args))
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
if __name__ == "__main__":
|
|
141
|
+
main()
|