diff --git a/Makefile b/Makefile index 524a7ac..f16f7b6 100644 --- a/Makefile +++ b/Makefile @@ -84,7 +84,9 @@ convert_video_times: -init_hw_device vaapi=va:/dev/dri/renderD128 \ -filter_hw_device va \ -i $(input) \ - -vf 'format=nv12,hwupload,scale_vaapi=-2:720,trim=start=$(start):end=$(end)' \ + -ss $(start) \ + -to $(end) \ + -vf 'format=nv12,hwupload,scale_vaapi=-2:720' \ -c:v h264_vaapi \ -rc_mode CQP \ -qp 28 \ diff --git a/project-words.txt b/project-words.txt index 5bb8d68..35da1ce 100644 --- a/project-words.txt +++ b/project-words.txt @@ -3,7 +3,9 @@ Altium ASSEM astrojs Atmel +automations barebones +beaglebone Bitwarden Candian caperren @@ -24,6 +26,8 @@ ELMI fhhs flowbite flowrate +gcode +gerbers Gitea HDFS headshot @@ -38,15 +42,20 @@ leconte Loctite luxon MGMT +microcontroller +microcontroller's Micropumps Millis +modbus Mokai Multimeters nixos +nvme offroad Onshape OSSM OSURC +panelized Passthroughs pcbs Perren @@ -58,8 +67,10 @@ RFID Rito RSSI SARL +SCARA showerheads Shuttlebox +simplemotion sinnhuber sitemapindex Smartsheet @@ -71,9 +82,11 @@ Steller Tanguay Teamcenter timelapse +touchoff triaging trivago Truong +Ubiquiti Unstow uuidv vaapi diff --git a/src/assets/experience/osu-robotics-club/mars-rover-software-lead/iris-pcb-assembly-timelapse-converted.mp4 b/src/assets/experience/osu-robotics-club/mars-rover-software-lead/iris-pcb-assembly-timelapse.mp4 similarity index 100% rename from src/assets/experience/osu-robotics-club/mars-rover-software-lead/iris-pcb-assembly-timelapse-converted.mp4 rename to src/assets/experience/osu-robotics-club/mars-rover-software-lead/iris-pcb-assembly-timelapse.mp4 diff --git a/src/assets/experience/osu-robotics-club/mars-rover-software-lead/rover-gimbal-test-converted.mp4 b/src/assets/experience/osu-robotics-club/mars-rover-software-lead/rover-gimbal-test.mp4 similarity index 100% rename from src/assets/experience/osu-robotics-club/mars-rover-software-lead/rover-gimbal-test-converted.mp4 rename to src/assets/experience/osu-robotics-club/mars-rover-software-lead/rover-gimbal-test.mp4 diff --git a/src/assets/experience/osu-robotics-club/mars-rover-software-lead/senior-design-fair.jpg b/src/assets/experience/osu-robotics-club/mars-rover-software-lead/senior-design-fair.jpg new file mode 100644 index 0000000..b43d158 Binary files /dev/null and b/src/assets/experience/osu-robotics-club/mars-rover-software-lead/senior-design-fair.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/interface-tuning-and-detection.png b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/interface-tuning-and-detection.png new file mode 100644 index 0000000..fe76372 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/interface-tuning-and-detection.png differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-lid-overview.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-lid-overview.jpg new file mode 100644 index 0000000..c15dc65 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-lid-overview.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-syringe-overview.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-syringe-overview.jpg new file mode 100644 index 0000000..a8be74f Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-syringe-overview.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-top-overview-isometric.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-top-overview-isometric.jpg new file mode 100644 index 0000000..9cb926e Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-top-overview-isometric.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pre-travel.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-top-overview.jpg similarity index 53% rename from src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pre-travel.jpg rename to src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-top-overview.jpg index 13c35a4..f7e1fff 100644 Binary files a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pre-travel.jpg and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-top-overview.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-front-working-area-overview.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-front-working-area-overview.jpg new file mode 100644 index 0000000..78a3710 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-front-working-area-overview.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-front.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-front.jpg new file mode 100644 index 0000000..23a2767 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-front.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-left.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-left.jpg new file mode 100644 index 0000000..e08517c Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-left.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-lighting.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-lighting.jpg new file mode 100644 index 0000000..7c77833 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-lighting.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-rear.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-rear.jpg new file mode 100644 index 0000000..741561c Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-rear.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-right.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-right.jpg new file mode 100644 index 0000000..cb74784 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-right.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-touchoff.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-touchoff.jpg new file mode 100644 index 0000000..df5f14d Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-touchoff.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-dishes-lighting-reflection.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-dishes-lighting-reflection.jpg new file mode 100644 index 0000000..6c23c5b Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-dishes-lighting-reflection.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-front-dishes-beakers.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-front-dishes-beakers.jpg new file mode 100644 index 0000000..1227b64 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-front-dishes-beakers.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-front-overview.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-front-overview.jpg new file mode 100644 index 0000000..529a398 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-front-overview.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-front.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-front.jpg new file mode 100644 index 0000000..9d747e2 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-front.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-screen.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-screen.jpg new file mode 100644 index 0000000..d245bb7 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-screen.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-touchoff-block-isometric.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-touchoff-block-isometric.jpg new file mode 100644 index 0000000..abcaf45 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-touchoff-block-isometric.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/1-0-0/bottom.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/1-0-0/bottom.jpg new file mode 100644 index 0000000..bfcacad Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/1-0-0/bottom.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/1-0-0/top.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/1-0-0/top.jpg new file mode 100644 index 0000000..886707b Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/1-0-0/top.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/assembly-bottom.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/assembly-bottom.jpg new file mode 100644 index 0000000..68cf982 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/assembly-bottom.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/assembly-top-beaglebone.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/assembly-top-beaglebone.jpg new file mode 100644 index 0000000..8ab51fd Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/assembly-top-beaglebone.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/assembly-top.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/assembly-top.jpg new file mode 100644 index 0000000..56c7212 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/assembly-top.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/bottom.png b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/bottom.png new file mode 100644 index 0000000..9a580d9 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/bottom.png differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/top.png b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/top.png new file mode 100644 index 0000000..5129bcd Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/top.png differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/1-0-0/assembly-bottom.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/1-0-0/assembly-bottom.jpg new file mode 100644 index 0000000..6c03753 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/1-0-0/assembly-bottom.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/1-0-0/assembly-top.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/1-0-0/assembly-top.jpg new file mode 100644 index 0000000..2262e0b Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/1-0-0/assembly-top.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/2-0-0/assembly-bottom.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/2-0-0/assembly-bottom.jpg new file mode 100644 index 0000000..7f8248f Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/2-0-0/assembly-bottom.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/2-0-0/assembly-top.jpg b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/2-0-0/assembly-top.jpg new file mode 100644 index 0000000..404e558 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/2-0-0/assembly-top.jpg differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/2-0-0/top-panelized.png b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/2-0-0/top-panelized.png new file mode 100644 index 0000000..a55281d Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/2-0-0/top-panelized.png differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pick-and-placing.mp4 b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pick-and-placing.mp4 new file mode 100644 index 0000000..a3ca932 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pick-and-placing.mp4 differ diff --git a/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/precision-homing.mp4 b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/precision-homing.mp4 new file mode 100644 index 0000000..c7b3af0 Binary files /dev/null and b/src/assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/precision-homing.mp4 differ diff --git a/src/components/H4.astro b/src/components/H4.astro new file mode 100644 index 0000000..441b61e --- /dev/null +++ b/src/components/H4.astro @@ -0,0 +1,5 @@ +--- + +--- + +

diff --git a/src/components/PopoverWordDefinition.astro b/src/components/PopoverWordDefinition.astro index 271fa90..a2e392f 100644 --- a/src/components/PopoverWordDefinition.astro +++ b/src/components/PopoverWordDefinition.astro @@ -11,6 +11,7 @@ const keys: { [key: string]: string } = { GUI: "Graphical user interface", NUC: "A small and low-power computer made by Intel", PCBs: "Printed circuit boards", + SCARA: "Selective Compliance Assembly Robot Arm", TDD: "Test driven development", UPS: "Uninterruptible power supply", VISA: "Virtual instrument software architecture", diff --git a/src/components/PrintedCircuitBoard.astro b/src/components/PrintedCircuitBoard.astro index 0adeae8..a36991f 100644 --- a/src/components/PrintedCircuitBoard.astro +++ b/src/components/PrintedCircuitBoard.astro @@ -2,6 +2,9 @@ import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro"; import Ul from "@components/Ul.astro"; +import H3 from "@components/H3.astro"; +import H4 from "@components/H4.astro"; +import PageGroup from "@components/PageGroup.astro"; import type { printedCircuitBoard, printedCircuitBoardRevision, @@ -19,33 +22,37 @@ const semanticPcbRevisionSort = ( -((a.major - b.major) * 100 + (a.minor - b.minor) * 10 + (a.patch - b.patch)); --- -
- { - pcb.revisions?.sort(semanticPcbRevisionSort).map((revision) => ( -
-
-
- Revision: - - {revision.major}.{revision.minor}.{revision.patch} - + +

{pcb.name}

{pcb.description}

+
+ { + pcb.revisions?.sort(semanticPcbRevisionSort).map((revision) => ( +
+
+
+ Revision: + + {revision.major}.{revision.minor}.{revision.patch} + +
+
{revision.date.toISODate()}
-
{revision.date.toISODate()}
+
+ +
+ {revision.notes && revision.notes.length > 0 && ( +
+
    +
+ )}
-
- -
- {revision.notes && revision.notes.length > 0 && ( -
    - )} -
- )) - } -
+ )) + } +
+ diff --git a/src/content.config.ts b/src/content.config.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/data/site-layout.ts b/src/data/site-layout.ts index e755e87..b3062ef 100644 --- a/src/data/site-layout.ts +++ b/src/data/site-layout.ts @@ -50,7 +50,6 @@ export const siteLayout: navLink[] = [ placeholderEntry: true, }, { - enabled: false, navText: "Zebrafish Embryo Pick and Plate", isSubItem: true, path: "zebrafish-embryo-pick-and-plate", @@ -81,12 +80,10 @@ export const siteLayout: navLink[] = [ ], }, { - enabled: false, navText: "OSU Robotics Club", path: "osu-robotics-club", children: [ { - enabled: false, navText: "Mars Rover Software Team Lead", path: "mars-rover-software-team-lead", }, diff --git a/src/pages/experience/osu-robotics-club/mars-rover-software-team-lead.astro b/src/pages/experience/osu-robotics-club/mars-rover-software-team-lead.astro index 57aa706..0652c02 100644 --- a/src/pages/experience/osu-robotics-club/mars-rover-software-team-lead.astro +++ b/src/pages/experience/osu-robotics-club/mars-rover-software-team-lead.astro @@ -11,20 +11,34 @@ import type { videoConfig } from "@interfaces/video.ts"; import { roverSubTitles } from "./osu-robotics-club.ts"; +import H3 from "@components/H3.astro"; +import Li from "@components/Li.astro"; + +import Video from "@components/Media/Video.astro"; +import Paragraph from "@components/Paragraph.astro"; +import Paragraphs from "@components/Paragraphs.astro"; +import SkillMatrix from "@components/SkillMatrix/SkillMatrix.astro"; +import Timeline from "@components/Timeline/Timeline.astro"; +import Ul from "@components/Ul.astro"; +import type { categorySkills } from "@interfaces/skill-matrix.ts"; +import type { timelineEntry } from "@interfaces/timeline.ts"; +import { DateTime } from "luxon"; + import circ_champions from "@assets/experience/osu-robotics-club/mars-rover-software-lead/circ-champions.jpg"; import corwin_at_competition from "@assets/experience/osu-robotics-club/mars-rover-software-lead/corwin-at-competition.jpg"; import drumheller_team_photo from "@assets/experience/osu-robotics-club/mars-rover-software-lead/drumheller-team-photo.jpg"; import final_ground_station_gui from "@assets/experience/osu-robotics-club/mars-rover-software-lead/final-ground-station-gui.png"; import ground_station_at_competition from "@assets/experience/osu-robotics-club/mars-rover-software-lead/ground-station-at-competition.jpg"; -import iris_pcb_assembly_timelapse_converted from "@assets/experience/osu-robotics-club/mars-rover-software-lead/iris-pcb-assembly-timelapse-converted.mp4"; +import iris_pcb_assembly_timelapse_converted from "@assets/experience/osu-robotics-club/mars-rover-software-lead/iris-pcb-assembly-timelapse.mp4"; import iris_pcb_working from "@assets/experience/osu-robotics-club/mars-rover-software-lead/iris-pcb-working.jpg"; import rover_at_competition_from_above from "@assets/experience/osu-robotics-club/mars-rover-software-lead/rover-at-competition-from-above.jpg"; import rover_at_competition_pickup_test from "@assets/experience/osu-robotics-club/mars-rover-software-lead/rover-at-competition-pickup-test.jpg"; -import rover_gimbal_test_converted from "@assets/experience/osu-robotics-club/mars-rover-software-lead/rover-gimbal-test-converted.mp4"; +import rover_gimbal_test_converted from "@assets/experience/osu-robotics-club/mars-rover-software-lead/rover-gimbal-test.mp4"; import rover_pose_with_dinosaur from "@assets/experience/osu-robotics-club/mars-rover-software-lead/rover-pose-with-dinosaur.jpg"; import rover_with_arm_pose_in_desert from "@assets/experience/osu-robotics-club/mars-rover-software-lead/rover-with-arm-pose-in-desert.jpg"; +import senior_design_fair from "@assets/experience/osu-robotics-club/mars-rover-software-lead/senior-design-fair.jpg"; import silly_poke from "@assets/experience/osu-robotics-club/mars-rover-software-lead/silly-poke.gif"; -import Video from "@components/Media/Video.astro"; +import LinkButton from "@components/LinkButton.astro"; const headerCarouselGroup: carouselGroup = { animation: "slide", @@ -36,6 +50,7 @@ const headerCarouselGroup: carouselGroup = { corwin_at_competition, rover_at_competition_from_above, rover_at_competition_pickup_test, + senior_design_fair, final_ground_station_gui, ground_station_at_competition, iris_pcb_working, @@ -43,17 +58,254 @@ const headerCarouselGroup: carouselGroup = { ], }; +const timeline: timelineEntry[] = [ + { + event: "Project Started", + eventDetail: "Design Work Begins", + date: DateTime.fromISO("2017-09-01"), + }, + { + event: "Senior Design Presentation", + eventDetail: "Senior Design Fair", + date: DateTime.fromISO("2018-05-18"), + }, + { + event: "Won 1st Place!", + eventDetail: "CIRC", + date: DateTime.fromISO("2018-08-13"), + }, + { + event: "Project Finished", + eventDetail: "Final Documentation Complete", + date: DateTime.fromISO("2018-08-31"), + }, +]; + +const categorizedSkills: categorySkills[] = [ + { + category: "Software & Environments", + skills: [ + { + item: "Version Control", + subItems: [{ item: "Git" }], + }, + { + item: "Programming", + subItems: [ + { + item: "Languages", + subItems: [ + { item: "Python 2" }, + { item: "C++" }, + { item: "Bash Shell Scripting" }, + { item: "High-Level Embedded C/C++ (Arduino/Teensy)" }, + ], + }, + { + item: "Frameworks", + subItems: [{ item: "OpenCV" }, { item: "Qt" }], + }, + ], + }, + { + item: "Operating Systems", + subItems: [ + { + item: "Linux", + subItems: [{ item: "Ubuntu" }], + }, + ], + }, + ], + }, + { + category: "Electrical", + skills: [ + { + item: "Schematic & PCB Design", + subItems: [ + { + item: "Software", + subItems: [{ item: "Altium Designer" }], + }, + { + item: "PCB Assembly & Rework", + subItems: [ + { item: "Handheld Soldering" }, + { item: "Handheld Hot-Air Reflow" }, + { item: "Oven Reflow" }, + ], + }, + ], + }, + { + item: "Electrical Diagnostics", + subItems: [ + { item: "Multimeters" }, + { item: "Electronic Loads" }, + { item: "Oscilloscopes" }, + { item: "Logic Analyzers" }, + ], + }, + { + item: "Harnessing Fabrication", + subItems: [{ item: "DC Power & Signal" }], + }, + ], + }, +]; + const videos: videoConfig[] = [ { videoPath: iris_pcb_assembly_timelapse_converted }, { videoPath: rover_gimbal_test_converted }, { videoPath: "https://www.youtube-nocookie.com/embed/ZjGW-HWapVA" }, - { videoPath: "https://www.youtube-nocookie.com/embed/sceA2ZbEV8Y0" }, + { videoPath: "https://www.youtube-nocookie.com/embed/sceA2ZbEV8Y" }, ]; --- - +
+ +
+ +

Summary

+ +

Timeline

+ +
+ +

Key Takeaways

+
    +
  • Won 1st place in an international competition
  • +
  • Wrote software in Python and C++ for the Rover's onboard computer
  • +
  • Wrote firmware in embedded C/C++ for the Rover's distributed + microcontroller sub-systems
  • +
  • Hand-assembled most of the custom PCBs for the Rover's distributed + microcontroller sub-systems
  • +
  • Hand-fabricated much of the custom harnessing on the Rover
  • +
  • Piloted the Rover during some competition events
  • +
+
+ +
+ +

Details

+ +

My Experience

+ + + I had not originally planned to be software lead for this Rover year, + as I was already working two part time jobs and going to school + full-time, but after my best friend Nick decided to become team and + electrical lead, and my other best friend Dylan would create the + rover's arm for his senior design project, I just couldn't say no. + This also came hot off the heels of me being the emergency software + lead for Rover the previous year, writing enough code in the nine days + before competition to at least give them a fighting chance, which they + had, so I was even more prepped and ready. I only had one hard + requirement, joining as the software lead, and it was that we would + have to create a serious ground station setup. When I first joined the + robotics club in 2011, I did so because I was enraptured by the rover, + but especially its ground station, which was a full-screen display + full of stats, indicators, and buttons that got the nerd in me + excited. If I was going to go all-in, I was going to do the same, and + ended up making the ground station software my university senior + design project. + + + The upcoming year of work turned out to be some of the most intense I + ever had at OSU, mostly self-inflicted due to not wanting to let this + opportunity get wasted. It's worth noting, that not only was I writing + the ground station software, but also the software running on the + rover's onboard Jetson TX2 computer, all the firmware for each of the + many distributed systems, on top of also hand-assembling/debugging + most of the rover's PCBs, and creating many of its electrical wiring + harnesses. In total, I put in over 2000 hours of work on this project, + while working two part-time jobs and taking classes. It was a lot, + but, it also turned out to be my proudest achievement while at OSU, so + I'd argue it was worth it! + + + After these countless hours, what resulted was some incredibly robust + hardware and software, which didn't crash, and which allowed us to + absolutely crush the competition at the Canadian International Rover + Challenge in Drumheller, Alberta, Canada. We won first place, with a + final score of 287 points. The second best team got 159, so it wasn't + even close! On top of doing that well, the software was also feature + complete by halfway through the competition, which was no small feat + considering the amount of scope creep a project like this tends to + encounter. I was particularly proud of the ground station by this + point as well. Not only was it a treasure trove of information about + the Rover's state, but included live GPS mapping, multiple switchable + camera views with pan/tilt capabilities and quality-switching, + artificial speed limiting, and automations to automatically complete + some of the tasks from the competition with just a few button presses. + Considering the robotics team hadn't placed over 3rd since before I'd + started in 2011, finally getting a first place win was a breath of + fresh air, and made it much more cathartic when graduating the + following year. + + +
+ +

Technical Overview

+ + + The ground station itself contained an Intel NUC with a Core i5, 16GB + ram, nvme ssd, and was connected to two 23″ 1080p monitors. I chose + two so we would be able to see all primary Rover systems without + having to swap between tabs or pages, which I’d had to do on some + other software I’d written and knew wouldn’t be efficient when we were + in the middle of a timed event. The desktop ran Ubuntu 16.04 with the + ROS2 stack. For the UI, PyQt was used, allowing for easy tweaking + using QtCreator, and which provided access to QtSignals, a feature + that made simple cross-thread communication much easier in Python. The + Python code itself was Python 2, which was a limitation of the ROS2 + stack. Control of the rover was done via USB xbox controllers, plus a + keyboard and mouse. + + + The Rover itself ran on an NVidia Jetson TX2 single-board computer + powered from a 500Wh li-on battery. The electronics box also contained + a fuse box, power cutoff, network switch, battery backup, composite to + network video converter, usb hub, FrSky controller receiver, and + custom usb->RS485 adapter board. The TX2 ran Ubuntu 16.04 with the + ROS2 stack, just like the ground station. All remote control boards on + the Rover were communicated to using the modbus protocol over RS485. + Interfacing with the arm was achieved via RS485 as well, but using the + custom simplemotion control library provided by the motor controller + company. Using linux UDEV rules, usb->serial and cameras were + symlinked to custom, repeatable names at /dev/rover/name so that + devices could be accessed identically after reboots. Custom ROS nodes + were written for each system to be controlled, and the whole Rover ROS + package set to start automatically at boot. The Rover could be + controlled with an FrSky X9D controller whether the ground station was + running or not. The controller could also override all other control + inputs on-the-fly by flipping a switch on the controller. This was a + safety feature to ensure runaway ground station or autonomy code + wouldn’t allow the Rover to take off on its own. Conversely, the Rover + would also work without the controller powered on, but would + immediately allow for this override if turned on at any time. + Communication with the ground station was done using two Ubiquiti + Rocket M2 long-range wifi radios, along with their 10dB + omnidirectional antennas. This simple setup allowed for a transparent + ethernet link to be made between the two systems, allowing for useful + features such as remote debugging and code upload. The radios were + tested to work at roughly a kilometer away, when mostly line-of-sight. + + +
+

Videos

diff --git a/src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator.ts b/src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator-pcbs.ts similarity index 98% rename from src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator.ts rename to src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator-pcbs.ts index 2bcbc97..1e6a117 100644 --- a/src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator.ts +++ b/src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator-pcbs.ts @@ -19,7 +19,7 @@ import half_assembled_main_top_surround_bottom from "@assets/experience/osu-sinn export const dechorionatorPcb: printedCircuitBoard = { name: "Dechorionator", description: - "Control board which provides motion and water flow control, along with user control and monitoring.", + "Control board which provides motion and water flow control, along with user control and monitoring", revisions: [ { diff --git a/src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator.astro b/src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator.astro index fc0dc0f..6cec863 100644 --- a/src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator.astro +++ b/src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator.astro @@ -3,11 +3,13 @@ import ExperienceLayout from "@layouts/ExperienceLayout.astro"; import H2 from "@components/H2.astro"; import H3 from "@components/H3.astro"; +import InlineLink from "@components/InlineLink.astro"; import Li from "@components/Li.astro"; import CustomCarousel from "@components/Media/CustomCarousel/CustomCarousel.astro"; import PageGroup from "@components/PageGroup.astro"; import Paragraph from "@components/Paragraph.astro"; import Paragraphs from "@components/Paragraphs.astro"; +import PopoverWordDefinition from "@components/PopoverWordDefinition.astro"; import PrintedCircuitBoard from "@components/PrintedCircuitBoard.astro"; import SkillMatrix from "@components/SkillMatrix/SkillMatrix.astro"; import Timeline from "@components/Timeline/Timeline.astro"; @@ -18,7 +20,7 @@ import { timelineFromPrintedCircuitBoard } from "@interfaces/printed-circuit-boa import type { categorySkills } from "@interfaces/skill-matrix.ts"; import type { timelineEntry } from "@interfaces/timeline.ts"; -import { dechorionatorPcb } from "./dechorionator.ts"; +import { dechorionatorPcb } from "./dechorionator-pcbs.ts"; import { subTitles, workingTimeline, @@ -42,8 +44,7 @@ import top_holder_closeup from "@assets/experience/osu-sinnhuber-aquatic-researc import top_lid_open from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/top-lid-open.jpg"; import top_showerhead from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/top-showerhead.jpg"; import travel_setup from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/travel-setup.jpg"; -import InlineLink from "@components/InlineLink.astro"; -import PopoverWordDefinition from "@components/PopoverWordDefinition.astro"; +import { DateTime } from "luxon"; const headerCarouselGroup: carouselGroup = { animation: "slide", @@ -73,6 +74,16 @@ const headerCarouselGroup: carouselGroup = { const timeline: timelineEntry[] = [ ...workingTimeline, ...timelineFromPrintedCircuitBoard(dechorionatorPcb), + { + event: "Project Started", + eventDetail: "Initial Requirements Given", + date: DateTime.fromISO("2014-05-01"), + }, + { + event: "Project Finished", + eventDetail: "Delivered Units to Lab", + date: DateTime.fromISO("2016-09-01"), + }, ]; const categorizedSkills: categorySkills[] = [ diff --git a/src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate-pcbs.ts b/src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate-pcbs.ts new file mode 100644 index 0000000..8c7b785 --- /dev/null +++ b/src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate-pcbs.ts @@ -0,0 +1,91 @@ +import { DateTime } from "luxon"; + +import type { printedCircuitBoard } from "@interfaces/printed-circuit-board.ts"; + +import control_bottom_1_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/1-0-0/bottom.jpg"; +import control_top_1_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/1-0-0/top.jpg"; +import control_assembly_bottom_2_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/assembly-bottom.jpg"; +import control_assembly_top_beaglebone_2_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/assembly-top-beaglebone.jpg"; +import control_assembly_top_2_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/assembly-top.jpg"; +import control_bottom_2_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/bottom.png"; +import control_top_2_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/top.png"; +import lights_assembly_bottom_1_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/1-0-0/assembly-bottom.jpg"; +import lights_assembly_top_1_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/1-0-0/assembly-top.jpg"; +import lights_assembly_bottom_2_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/2-0-0/assembly-bottom.jpg"; +import lights_assembly_top_2_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/2-0-0/assembly-top.jpg"; +import lights_top_panelized_2_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/2-0-0/top-panelized.png"; + +export const pnpLights: printedCircuitBoard = { + name: "Lighting Board", + description: + "Compact, bright, 24V lighting to provide high-contrast video for the pick and plate", + + revisions: [ + { + major: 2, + minor: 0, + patch: 0, + date: DateTime.fromISO("2014-09-23"), + images: [ + lights_top_panelized_2_0_0, + lights_assembly_top_2_0_0, + lights_assembly_bottom_2_0_0, + ], + notes: [ + { + item: "First panelized PCB design, with built-in test features", + }, + ], + }, + { + major: 1, + minor: 0, + patch: 0, + date: DateTime.fromISO("2014-04-07"), + images: [lights_assembly_top_1_0_0, lights_assembly_bottom_1_0_0], + notes: [ + { + item: "Worked, but couldn't remove heat efficiently long-term", + }, + ], + }, + ], +}; +export const pnpControl: printedCircuitBoard = { + name: "Driver Board", + description: + "Motion controller, and single-board-computer interface, for the embryo pick and plate machine", + + revisions: [ + { + major: 2, + minor: 0, + patch: 0, + date: DateTime.fromISO("2014-07-11"), + images: [ + control_top_2_0_0, + control_bottom_2_0_0, + control_assembly_top_2_0_0, + control_assembly_bottom_2_0_0, + control_assembly_top_beaglebone_2_0_0, + ], + notes: [ + { + item: "Functional, but ultimately scrapped due to motion control complexity", + }, + ], + }, + { + major: 1, + minor: 0, + patch: 0, + date: DateTime.fromISO("2013-12-02"), + images: [control_top_1_0_0, control_bottom_1_0_0], + notes: [ + { + item: "First printed circuit board I ever designed, which was REALLY bad", + }, + ], + }, + ], +}; diff --git a/src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate.astro b/src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate.astro index 92e3098..9d87756 100644 --- a/src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate.astro +++ b/src/pages/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate.astro @@ -1,5 +1,316 @@ --- import ExperienceLayout from "@layouts/ExperienceLayout.astro"; + +import H2 from "@components/H2.astro"; +import H3 from "@components/H3.astro"; +import Li from "@components/Li.astro"; +import CustomCarousel from "@components/Media/CustomCarousel/CustomCarousel.astro"; +import Video from "@components/Media/Video.astro"; +import PageGroup from "@components/PageGroup.astro"; +import Paragraph from "@components/Paragraph.astro"; +import Paragraphs from "@components/Paragraphs.astro"; +import PopoverWordDefinition from "@components/PopoverWordDefinition.astro"; +import PrintedCircuitBoard from "@components/PrintedCircuitBoard.astro"; +import SkillMatrix from "@components/SkillMatrix/SkillMatrix.astro"; +import Timeline from "@components/Timeline/Timeline.astro"; +import Ul from "@components/Ul.astro"; + +import type { carouselGroup } from "@interfaces/image-carousel.ts"; +import { timelineFromPrintedCircuitBoard } from "@interfaces/printed-circuit-board.ts"; +import type { categorySkills } from "@interfaces/skill-matrix.ts"; +import type { timelineEntry } from "@interfaces/timeline.ts"; + +import { + subTitles, + workingTimeline, +} from "./osu-sinnhuber-aquatic-research-laboratory.ts"; + +import { + pnpControl, + pnpLights, +} from "./zebrafish-embryo-pick-and-plate-pcbs.ts"; + +import installation_and_tuning from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/installation-and-tuning.jpg"; +import interface_tuning_and_detection from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/interface-tuning-and-detection.png"; +import off_controls_lid_overview from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-lid-overview.jpg"; +import off_controls_syringe_overview from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-syringe-overview.jpg"; +import off_controls_top_overview from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-top-overview.jpg"; +import off_front_working_area_overview from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-front-working-area-overview.jpg"; +import off_front from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-front.jpg"; +import off_left from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-left.jpg"; +import off_lighting from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-lighting.jpg"; +import off_rear from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-rear.jpg"; +import off_right from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-right.jpg"; +import off_touchoff from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-touchoff.jpg"; +import on_dishes_lighting_reflection from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-dishes-lighting-reflection.jpg"; +import on_front_dishes_beakers from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-front-dishes-beakers.jpg"; +import on_front_overview from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-front-overview.jpg"; +import on_front from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-front.jpg"; +import on_screen from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-screen.jpg"; +import on_touchoff_block_isometric from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-touchoff-block-isometric.jpg"; + +import pick_and_placing from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pick-and-placing.mp4"; +import precision_homing from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/precision-homing.mp4"; +import InlineLink from "@components/InlineLink.astro"; +import { DateTime } from "luxon"; + +const headerCarouselGroup: carouselGroup = { + animation: "slide", + images: [ + installation_and_tuning, + on_front_overview, + interface_tuning_and_detection, + on_front, + on_front_dishes_beakers, + on_screen, + off_touchoff, + on_touchoff_block_isometric, + off_controls_top_overview, + off_controls_syringe_overview, + off_controls_lid_overview, + off_front, + off_front_working_area_overview, + off_left, + off_rear, + off_right, + off_lighting, + on_dishes_lighting_reflection, + ], +}; + +const timeline: timelineEntry[] = [ + ...workingTimeline, + ...timelineFromPrintedCircuitBoard(pnpLights), + ...timelineFromPrintedCircuitBoard(pnpControl), + { + event: "Project Started", + eventDetail: "Initial Requirements Given", + date: DateTime.fromISO("2013-12-01"), + }, + { + event: "Project Finished", + eventDetail: "Delivered Units to Lab", + date: DateTime.fromISO("2016-09-01"), + }, +]; + +const categorizedSkills: categorySkills[] = [ + { + category: "Software & Environments", + skills: [ + { + item: "Version Control", + subItems: [{ item: "Git" }], + }, + { + item: "Programming", + subItems: [ + { + item: "Languages", + subItems: [ + { item: "Python 2" }, + { item: "Bash Shell Scripting" }, + { item: "Low-Level Embedded C/C++ (Atmel Studio)" }, + ], + }, + { + item: "Frameworks", + subItems: [{ item: "OpenCV" }, { item: "Qt" }], + }, + ], + }, + { + item: "Operating Systems", + subItems: [ + { + item: "Linux", + subItems: [{ item: "Debian" }], + }, + { item: "Microsoft Windows" }, + ], + }, + ], + }, + { + category: "Electrical", + skills: [ + { + item: "Schematic & PCB Design", + subItems: [ + { + item: "Software", + subItems: [ + { item: "Altium Designer" }, + { item: "Mentor Graphics PADS" }, + ], + }, + { + item: "Manufacturing", + subItems: [ + { item: "Gerber Export" }, + { item: "BOM Management" }, + { item: "In-House Assembly" }, + ], + }, + ], + }, + { + item: "Electrical Diagnostics", + subItems: [ + { item: "Multimeters" }, + { item: "Electronic Loads" }, + { item: "Oscilloscopes" }, + ], + }, + { + item: "Harnessing Fabrication", + subItems: [{ item: "DC Low-Power & Signal" }], + }, + ], + }, + { + category: "Mechanical", + skills: [ + { + item: "Fabrication", + subItems: [{ item: "CNC" }, { item: "Hand Tools" }], + }, + ], + }, +]; + +const videos: string[] = [pick_and_placing, precision_homing]; --- - + + + +

Summary

+ +

Timeline

+ +
+ +

Key Takeaways

+
    +
  • Delivered a design, and multiple built units, of a custom embryo + pick-and-plate machine
  • +
  • Reduced cost from ~$150,000 for previous generation to ~$10,000
  • +
  • Reduced the size from 4.5'x4.5'x8' for previous generation to + 1'x1'x1.5'
  • +
+
+ +
+ +

Details

+ + + For some quick context on why such a machine was even needed, the + Sinnhuber Aquatic Research Lab performs toxicology research using + Zebrafish. This means tha the lab is also a breeding facility, + generating a few thousand eggs a day, which need to be processed and + isolated prior to being introduced to experimental conditions. At one + point in time, these processes were done by hand, with all researchers + spending a significant portion of their day simply prepping the embryos. + Later on, they hired a contractor to design an automated solution to the + isolation problem, and while they delivered, the units were industrial + overkill, using massive arms and enclosures + to pick up embryos which were roughly half a millimeter in diameter. They + were also very expensive, costing around $150k per machine, and the lab had + four installed. Thus, the engineering team was tasked with cost and size reducing + them so that more could fit in the same space and throughput could be higher. + + + My coworker, Dylan Thrush, and I got to work. He focussed on the mechanical side, while I worked + on electrical and software. I had recently been learning PCB design + after becoming more familiar with it through the OSU robotics club, and + decided that a good place to start would be to create a motion + controller. Dylan and I had already landed on a simple stepper-motor + based system to more than meet the needs of a task like this, and both + of us already had experience with stepper-based CNC machines, making it + a great jumpoff point. My first PCB was unfortunately a massive failure, + because while I did include a quad stepper motor driver, + microcontroller, general purpose I/O, and usb to serial interface, I + failed to export the gerbers correctly. This resulted in a PCB with no + drills, making it completely useless (outside of a good learning + experience)! It was also just a poor layout overall, which isn't + surprising considering it was my first ever PCB design. If you want to + see this embarrassing result, check out the PCB section at the end of + this page! + + + For the second revision, we'd made some progress in other places, but + most importantly had decided that we would use a Beaglebone Black single-board-computer to run the whole system. In an effort to simplify + the assembly, I decided that the next revision would include headers to directly + mount the Beaglebone to the unit, providing power and a serial interface over + those pins. This version actually worked as expected, with only a few very + minor bodges to the microcontroller's crystal, and some bulk capacitance on + the power input. Since things were working, I began writing embedded C to + control motion through some higher-level interfaces. Not long into this process, + I realized I might have bitten off more than I could chew. Not only was I + having to learn the deep ins and outs of microcontroller programming, kinematics, + and serial interfaces, but I would still have to greatly improve my Python + skills, learn to create graphical user interfaces, and figure out how to detect + embryos using a camera and computer vision. While I was sad to scrap this, + we decided to fall back on a motion controller called TinyG, which would simply require gcode to be sent over serial to function. + + + Dylan built up a mechanical testbed, which we could mount a camera to, + and I began to focus on embryo detection. I was relatively new to + Python, but quickly found the Qt framework for building decent-looking + interfaces, and OpenCV for providing generic detection capabilities via + webcams. Over the next few years (remember, we were students doing this + part time, and working on other projects simultaneously), I eventually + created a fairly comprehensive user interface that would allow + researchers to tune detection and motion parameters on-the-fly. This was + shown on a touchscreen that the beaglebone plugged into, making it quite + intuitive. Dylan had also created a mechanical foundation providing + repeatable alignment for a petri dish with embryos, the 96-well plate + for placement, and a waste container to get rid of extra water in our + metal pipette tip that would be used to pick up the embryos. I'd also + created some very bright lighting boards to mount to the unit's + extrusion, illuminating the embryos from the side, something that was + absolutely required for consistent detection with the camera. After a + long journey, we finally delivered multiple units to the lab! Seeing + such small devices performing the same task next to the behemoths which + were the prior versions was quite amusing. You could easily fit a two by + two grid of these in the working area of each of those machines. + Overall, this was a highly ambitious project, but it developed some of + my most successful skills I gained while at OSU while accelerating the + research at the lab! + + +
+ +

Videos

+
+ { + videos.map((video) => ( +
+
+ +

Printed Circuit Boards

+ + +
+
diff --git a/src/pages/index.astro b/src/pages/index.astro index 03f4502..42cf981 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -53,9 +53,9 @@ const headerCarouselGroup: carouselGroup = { href="/experience/osu-ceoas-ocean-mixing-group/robotic-oceanographic-surface-sampler" >robotic oceanographic surface sampler - and an embryo pick-and-plate machinezebrafish embryo pick-and-plate machine. One my my proudest moments was when our club's mars rover took first place at the Candian International Rover Challenge in 2018, for which I was the