Documents

Physics

Geometry & panel models

Every force model (aero, SRP, Earth radiation) sums over one flat-plate table: outward normal, area and centroid per plate. This page covers where that table comes from and what it can and cannot carry.

The .geom plate format

# comment lines start with '#'
# nx ny nz  area_m2  cx cy cz        (body frame, metres; normal is normalised on load)
3.86397878e-08 -9.25292046e-09 1  0.6851072  2.85854239e-06 -1.23764175e-08 -0.00148214848
2.56280635e-05  1.47689322e-05 -1 0.686308478 -4.750931e-06 1.54475543e-05 -0.00185992405
...
  • Exactly 7 columns per line. geometry.load_geom rejects anything else, so there is no material column today.
  • A thin membrane is two plates with opposite normals (front and back). Each face is summed separately by the aero and SRP laws.
  • Loaded into C++ as PanelSoA {nx, ny, nz, area, cx, cy, cz} via Simulator.set_panels(n, A, c).

Shipped models

FilePlatesUsed by
data/earthcup_hex_v3.geomhex sail plate modeldefault env (v3–v11)
data/SolarCat_v3_1pct_plates.geom176 (raw STL triangles merged by normal, 12° tolerance). Error vs the full mesh over 200 attitudes: force 0.094 %, projected area 0.892 %, torque 2.681 %.SC_v1/v2/v3_6mq, vehicle_v3*.yaml

Mesh → plates (geometry.py)

  1. load_mesh: STL/OBJ (unit default mm) or STEP/STP (via trimesh + cascadio/OpenCASCADE, using the file's own unit). Welds vertices and drops degenerate faces.
  2. Region-grow faces whose normals are within θ_merge (8° for quality 1pct).
  3. Area-weighted least-squares plane per side, outward flip.
  4. Seal: shared edges are snapped to the intersection line of the two side planes, so there are no cracks.
  5. Ear-clip each sealed polygon. Each triangle becomes a plate (n̂, A, r_c).
  6. Quality budget 1pct / 5pct / 10pct on wetted and ram area at six attitudes. The original triangle area is kept where an outline would exceed the budget.
python main.py sim geometry --in part.step --quality 1pct        # -> outputs/results/geometry/part_1pct.geom
python main.py sim validate_attitudes --quality 1pct              # projected-area check vs the STL
python main.py sim plot_simplify                                  # 3D comparison figure
Part identity is lost The simplifier merges by normal direction only. Two different parts (for example a solar-cell face and a Kapton face) that are coplanar and adjacent get merged into one side, and the CAD part or body name is not kept. Material assignment therefore needs either a per-part pass (simplify each STEP body separately, then concatenate) or a post-hoc spatial tagging step. Both are covered in the plan. CHANGELOG_v2.7 also notes that simplify_sides emits far-away sliver centroids on SolarCat_v3; the 176-plate model was produced by a separate clustering script for that reason.

Vehicle cards

  • config/plant/vehicle.yaml (six-beam hex, 0.750 kg), vehicle_v3.yaml, vehicle_v3b.yaml, vehicle_v3c.yaml (SolarCat_v3 with a 7 cm static margin, PCB position, trim mass). vehicle.py builds mass properties, rod axes and dipoles from them.
  • cp_offset_m: centroids are shifted to offset the centre of pressure from the CoM (a stated balance assumption).
  • damage.py (v11): membrane holes and tears scale plate areas mid-episode (set_panels is called again).

Not in the panel model

  • Materials, per-face optical or GSI properties, wall temperature per plate.
  • Shadowing and shielding: no plate blocks another plate's sunlight or flow.
  • Deformation (membrane billowing) and articulation (moving panels). Only the v11 damage area scaling exists.