Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
5296961
Add Doumont presentation template and video notes scaffolding for IDE…
github-actions[bot] Jul 15, 2026
d1591df
Transcribe Doumont notes and outline Draft 2 with review feedback app…
github-actions[bot] Jul 18, 2026
f019cc0
Add Edison mock-audience analysis job script and submitted task ID
github-actions[bot] Jul 18, 2026
2059bc6
Resubmit Edison mock-audience job with inlined documents after two up…
github-actions[bot] Jul 18, 2026
f882ec5
Fetch successful Edison mock-audience report and fix upload flow per …
github-actions[bot] Jul 18, 2026
b5dcc3d
Add bare EMC 2026 PowerPoint template with all slides and media stripped
github-actions[bot] Jul 18, 2026
aca2555
Apply PR review comments and Edison mock-audience feedback as Draft 3
github-actions[bot] Jul 18, 2026
20043df
Add programmatic-edit demo of the bare EMC template (master title, pl…
github-actions[bot] Jul 21, 2026
2b23c20
Add correlation notes for Box video snips vs. source YouTube metadata
github-actions[bot] Jul 21, 2026
f38d482
Create .gitignore
me-madsen Jul 22, 2026
e1ed232
Add files via upload
me-madsen Jul 22, 2026
b08d9bf
Add rendered previews of all 14 slides of IDETC Tensegrity Slides Dra…
github-actions[bot] Jul 26, 2026
51a803e
Submit slide deck Draft 1 to Edison for mock PM + audience persona re…
github-actions[bot] Jul 26, 2026
2ce8fe9
Add Edison mock PM + audience persona review of slide deck Draft 1 (t…
github-actions[bot] Jul 26, 2026
a348a53
Add comprehensive data catalogue: all issues, PRs, and branches swept…
github-actions[bot] Jul 26, 2026
016c939
Add IDETC supplement deck: EMC BO block (animations kept) + gap/prior…
github-actions[bot] Jul 26, 2026
3c711ac
Rebuild supplement deck: message titles, big type, four embedded videos
github-actions[bot] Jul 31, 2026
e08f890
Add background section: 2D tensegrity teaching clip, labelled anatomy…
github-actions[bot] Jul 31, 2026
df4e957
Fix nonsense fps claim: 960 fps cannot resolve a 1.6 ms pulse
github-actions[bot] Jul 31, 2026
06847f1
Build supplement deck from the pristine EMC block, not from its own o…
github-actions[bot] Jul 31, 2026
61f999e
Set Marcus Madsen as presenter; add NASA toy-to-lander clip
github-actions[bot] Jul 31, 2026
6937c2e
Refresh Draft 1 title-slide previews after presenter change
github-actions[bot] Jul 31, 2026
d3bd8c6
Add issue #94 analysis-transparency slides and four more clips of our…
github-actions[bot] Jul 31, 2026
2432f84
Inlay the background block: 2D teaching clip and anatomy into the sup…
github-actions[bot] Jul 31, 2026
a12cce6
Talk to the audience, not to the reviewer, on the video slides
github-actions[bot] Aug 6, 2026
421cf8c
Add screenshot of the graveyard hello-Marcus test slide in idetc-2026…
github-actions[bot] Aug 18, 2026
af2e1a0
Transcribe the 2026-08-18 feedback video into an annotated spec sheet
github-actions[bot] Aug 18, 2026
cc4190f
Add the thousandths-of-a-second axis-label fix from the follow-up PR …
github-actions[bot] Aug 18, 2026
034bcd3
Implement the Claude-owned feedback-video items on the data slides
github-actions[bot] Aug 18, 2026
1bd7cb1
Add the T3-prism search-space figure with geometry-parameter callouts
github-actions[bot] Aug 19, 2026
4e525d5
Add the tensologic fold-and-release clip and record its insertion int…
github-actions[bot] Aug 19, 2026
ae4d01c
Add screenshot of the search-space slide placed into idetc-2026.pptx
github-actions[bot] Aug 19, 2026
83c0152
Add per-parameter search-space sweep GIFs and their builder script
github-actions[bot] Aug 20, 2026
bd1f63b
Transcribe the 8-20 slide walkthrough into script, to-do list, and te…
github-actions[bot] Aug 20, 2026
00d625f
Add the one-continuous-motion search-space GIF, dials turned up one b…
github-actions[bot] Aug 20, 2026
e9d6db6
Revise the sequence GIF and add the seed-designs tour GIF and still
github-actions[bot] Aug 20, 2026
2f1abec
Fix cable-through-strut occlusion and add the two search-space MP4 vi…
github-actions[bot] Aug 20, 2026
dd6cf4f
Add editor proof screenshots for the video/still swaps on deck slides…
github-actions[bot] Aug 20, 2026
105b8e4
Rework the attenuation figure: schematic, peak markers, and the T ratio
github-actions[bot] Aug 20, 2026
1aa5cb5
Add the slide reference list, its QR code, and the QR builder script
github-actions[bot] Aug 24, 2026
5685f27
Add the TPU + PLA lattice concept figure in the T3 rendering style
github-actions[bot] Aug 24, 2026
6a0bde1
Simplify the lattice concept figure: one T3 level, squatter prisms, 2…
github-actions[bot] Aug 24, 2026
784f5e2
Reference list: drop the meta intro, presenter is Marcus, authors in …
github-actions[bot] Aug 24, 2026
5f02bc0
Reference list: move presenter notes to an internal file, public page…
github-actions[bot] Aug 24, 2026
e6b536f
Reference list: audit against the active slides, add contribution cre…
claude[bot] Aug 25, 2026
c952f29
Place the round-2 per-gram results sequence into idetc-2026.pptx
github-actions[bot] Aug 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions presentation/Slide Decks/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 23 additions & 0 deletions presentation/Slide Decks/marcus-workflow-deck-previews/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Workflow Discussion Slides — @me-madsen

Source: https://byu.box.com/s/5k9os5cijnm2dbn0mrtngzglph6ce1do
(posted by @me-madsen in
[#41, 2026-07-28](https://github.com/vertical-cloud-lab/tensegrity-optimization/issues/41),
"I've been using this slideshow with recent meetings to show our work and process")

7 slides, 103 MB (embedded videos), default PowerPoint theme — a working
meeting deck, not the IDETC deck. The .pptx is not committed (well over
GitHub's 100 MB limit); these are LibreOffice-rendered previews only.

Assets in here that the IDETC deck currently lacks:

- slide 3 — drop-tower photo and instrumented specimen on the base plate
- slide 7 — the end-to-end workflow figure (design → CAD → slice → print →
post-process → test → back to BO)
- slide 2 — TPU print-parameter timelapse
- slide 4 — portrait phone video, `prc1kn` 2026-07-22 drop 2

Note: slide 5 lists four objectives (transmissibility, compaction efficiency,
SEA, peak transmitted force). `bo/tensegrity_campaign.py` and the IDETC
abstract use two objectives (SEA, compaction efficiency) plus a peak-force
constraint. Worth settling before slides freeze.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
183 changes: 183 additions & 0 deletions presentation/build_designs_tour_gif.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
"""Build the seed-designs tour GIF for the IDETC slide deck.

Same look as gif-param-sequence.gif, continued: the animation starts on
that GIF's end configuration (every geometry parameter at its upper
bound) and then morphs through the nine actual seed designs of the
printed campaign (S0, then Sobol specimens 1 to 8) in specimen order,
all five dials moving together for each transition. Requested in PR #84
(me-madsen, 2026-08-20). No caption text on the slide; the dials carry
their bound values at their ends.

Geometry, bounds, colors, and the depth-sorted renderer come from
build_search_space_figure.py so the assets stay consistent. Seed values
are the nine rows of bo/t3-prism-bo-batch.csv (commit 18c41a6, the batch
that was actually printed and drop-tested). One camera and one mm scale
cover every frame.

Output: presentation/media/gif-designs-tour.gif (16:9, 1920x1080).
"""

from __future__ import annotations

import math
from pathlib import Path

import matplotlib

matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

from build_search_space_figure import (
BOUNDS,
GUIDE,
INK,
INK2,
draw_structure,
nodes,
project,
setup_axes,
)
from build_search_space_gifs import ACCENT

HERE = Path(__file__).resolve().parent
OUT = HERE / "media" / "gif-designs-tour.gif"

FIG_W_IN, FIG_H_IN, DPI = 8.0, 4.5, 240 # 1920 x 1080 px
STEPS = 18 # frames for one design-to-design transition
STEP_MS = 70 # per-frame duration mid-transition
DESIGN_HOLD_MS = 950 # pause on each seed design
END_HOLD_MS = 1600 # pause at the all-max start and the last design

DIALS = [
("R_mm", "triangle radius R", "{:.0f} mm"),
("H_mm", "height H", "{:.0f} mm"),
("twist_deg", "twist angle", "{:.0f}\N{DEGREE SIGN}"),
("strut_d_mm", "strut diameter", "{:.1f} mm"),
("cable_d_mm", "cable diameter", "{:.1f} mm"),
]

# All nine campaign seed designs, in specimen order: S0 (specimen 0),
# then the eight Sobol designs (specimens 1-8). bo/t3-prism-bo-batch.csv.
SEEDS = [
dict(R_mm=32.1266, H_mm=89.6262, twist_deg=59.7792,
strut_d_mm=7.8831, cable_d_mm=5.3902),
dict(R_mm=33.7842, H_mm=80.0836, twist_deg=77.4080,
strut_d_mm=10.8717, cable_d_mm=3.0003),
dict(R_mm=38.9665, H_mm=99.9950, twist_deg=47.6915,
strut_d_mm=7.0737, cable_d_mm=3.9241),
dict(R_mm=25.1224, H_mm=72.0587, twist_deg=65.1213,
strut_d_mm=10.1789, cable_d_mm=4.6640),
dict(R_mm=27.6114, H_mm=104.1304, twist_deg=70.4432,
strut_d_mm=9.2816, cable_d_mm=4.4922),
dict(R_mm=36.3001, H_mm=63.2297, twist_deg=52.9940,
strut_d_mm=6.4571, cable_d_mm=4.0550),
dict(R_mm=35.9821, H_mm=96.4464, twist_deg=62.1055,
strut_d_mm=11.6620, cable_d_mm=3.4949),
dict(R_mm=30.1066, H_mm=74.8199, twist_deg=44.4573,
strut_d_mm=8.5803, cable_d_mm=4.9377),
dict(R_mm=29.0207, H_mm=100.8663, twist_deg=63.7624,
strut_d_mm=6.1990, cable_d_mm=3.1969),
]

ALL_MAX = {k: hi for k, (lo, hi) in BOUNDS.items()}


def eased(a, b):
"""Cosine-eased dict-of-params a -> b sequence, STEPS frames."""
out = []
for t in range(STEPS):
f = (1 - math.cos(math.pi * t / (STEPS - 1))) / 2
out.append({k: a[k] + (b[k] - a[k]) * f for k in a})
return out


def frame_sequence():
"""(params, hold_ms) for every frame: all-max, then each seed."""
frames = []
waypoints = [ALL_MAX] + SEEDS
for i in range(len(waypoints) - 1):
for t, params in enumerate(eased(waypoints[i], waypoints[i + 1])):
hold = STEP_MS
if i == 0 and t == 0:
hold = END_HOLD_MS
elif t == STEPS - 1:
hold = (END_HOLD_MS if i == len(waypoints) - 2
else DESIGN_HOLD_MS)
frames.append((params, hold))
return frames


def union_bbox(frames):
"""(u, v) bounding box over every frame, one camera for the whole run."""
us, vs = [], []
for params, _ in frames:
bot, top = nodes(params)
for pt in bot + top:
u, v, _ = project(pt)
us.append(u)
vs.append(v)
return min(us), max(us), min(vs), max(vs)


def draw_dial_panel(fig, params):
"""Five stacked dials, all live: every transition moves all of them."""
sx0, sx1 = 0.685, 0.945
for j, (key, label, fmt) in enumerate(DIALS):
lo, hi = BOUNDS[key]
val = params[key]
frac = (val - lo) / (hi - lo)
y = 0.78 - j * 0.14
fig.text(sx0, y + 0.045, label, ha="left", va="bottom",
fontsize=10, color=INK)
fig.text(sx1, y + 0.045, fmt.format(val), ha="right", va="bottom",
fontsize=10, color=ACCENT, fontweight="bold")
fig.add_artist(plt.Line2D([sx0, sx1], [y, y], color=GUIDE,
lw=2.6, solid_capstyle="round",
transform=fig.transFigure))
fig.add_artist(plt.Line2D([sx0 + frac * (sx1 - sx0)], [y],
marker="o", markersize=9, color=ACCENT,
transform=fig.transFigure))
# Bound values at the dial ends (lo left, hi right).
fig.text(sx0, y - 0.032, fmt.format(lo), ha="center", va="top",
fontsize=8, color=INK2)
fig.text(sx1, y - 0.032, fmt.format(hi), ha="center", va="top",
fontsize=8, color=INK2)


def render_frame(params, bbox):
u0, u1, v0, v1 = bbox
fig = plt.figure(figsize=(FIG_W_IN, FIG_H_IN), dpi=DPI)
fig.patch.set_facecolor("white")

ax = fig.add_axes([0.02, 0.05, 0.62, 0.91])
center = ((u0 + u1) / 2, (v0 + v1) / 2)
ppmm = setup_axes(ax, fig, center, (u1 - u0) + 40, (v1 - v0) + 30)
draw_structure(ax, params, ppmm)

draw_dial_panel(fig, params)

fig.canvas.draw()
img = Image.fromarray(np.asarray(fig.canvas.buffer_rgba())[..., :3])
plt.close(fig)
return img


def main():
frames = frame_sequence()
bbox = union_bbox(frames)
imgs = [render_frame(params, bbox) for params, _ in frames]
palette = imgs[0].quantize(colors=256)
imgs_q = [f.quantize(colors=256, palette=palette, dither=0)
for f in imgs]
durations = [hold for _, hold in frames]
OUT.parent.mkdir(parents=True, exist_ok=True)
imgs_q[0].save(OUT, save_all=True, append_images=imgs_q[1:],
duration=durations, loop=0, optimize=True)
print(f"wrote {OUT} ({OUT.stat().st_size / 1e6:.2f} MB, "
f"{len(imgs_q)} frames)")


if __name__ == "__main__":
main()
Loading