Impeller-bryderi löses med programmeringsnörderi

Det är sällan man får chansen att hjälpa Mobacken-killarna med något de inte skulle klarat själva, så självklart tar man chansen att spänna musklerna när tillfälle ges.

Anders är nu i full färd med att konstruera/bygga en värre gasturbinmotor till sin motorcykel och i samband med detta så har någon snubbe (3D-scanning.se) 3D-skannat impeller och turbin åt honom. 3D-skanningen resulterar STL-filer, och vad Anders vill är att från dessa få fram en modell av hur motsvarande turbinhus ska se ut.

impeller1

”Skitenkelt” tänkte jag som det proffs jag ansåg mig vara, men togs rätt kvickt ner på jorden igen. Det hela resulterade i en del klurande, och en del lärdomar – vilket man såklart aldrig tackar nej till. Tänkte att jag kunde dela med mig lite.

Vad är en STL-fil?

STL står för ”Stereo Lithography”, och är ett sätt att representera tredimensionella objekt i dataform. Ett solitt objekt hanteras som ”ihåligt”, d.v.s. det har bara en yta och man tar inte hänsyn till vad som finns inuti detta. Ytan i sin tur är uppbyggd av trianglar, som var och en representeras av tre koordinater – en för varje hörn, samt en vektor (pilen i bilden nedan) som indikerar vilken sida av triangeln som utgör föremålets utsida.

StL-facet

http://www.fabbers.com/tech/STL_Format

När trianglarna fogas samman så bildas ett ”nät”. Därför kallas resultatet ofta för ”mesh”.

480px-STL-file

By LaurensvanLieshout (Own work) [GFDL (http://www.gnu.org/copyleft/fdl.html) or CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons

Problemet?

Ja vad är problemet egentligen? Jo, det första problemet var min okunskap. Jag är van att använda 3D-CAD-program (Autodesk Inventor) och trodde att detta skulle vara som klippt och skuret för att lösa Anders lilla bryderi.

Det Anders vill är att få ut den profil som ”bildas” om man ser impellern från sidan, roterar den och projicerar den på en bakgrund. Den kontur som då bildas är precis den form man vill ha på huset som ska omsluta impellern.

impeller

Det visade sig dock inte riktigt vara så enkelt. Inventor är en mjukvara som man använder för att konstruera saker. De konstruktioner man gör består (väldigt förenklat) av olika ”primitiva former”, t.ex. cylindrar, kuber etc. som tillsammans utgör olika objekt. En godtycklig tredimensionell pryl som skannats in till en STL-modell har inte rätt uppbyggnad för att direkt kunna hanteras av Inventor.

Det finns ett tillägg till Inventor som heter Mesh Enabler, som kan analysera STL-filen och försöka bryta ner hela modellen till primitiva former som Inventor stödjer. Jag laddade ner Mesh Enabler och gjorde ett försök, utan särskilt bra resultat, d.v.s. det fungerade inte alls. Därför blev det till att ta till plan B…

Plan B

Varje gång man ska börja arbeta med ett nytt filformat så måste man ta reda på hur detta är uppbyggt. Alla filer som lagras i datorn består av en mängd datavärden av formatet byte. En byte kan anta ett värde från 0 till 255. Detta är inte så hemskt användbart i de flesta fall, då man kan behöva representera betydligt större och mindre värden än så. Därför kan man låta flera byte tillsammans representera större värden.

T.ex. så kan man låta 4 bytes representera ett flyttalsvärde (decimaltal) mellan -3,4028235E+38 och 3,4028235E+38, vilket i runda slängar blir +/- 3,4 med 38 nollor efter. Detta är det format (allmänt kallat datatyp) som används i STL-filer. Om man programmerar Visual Basic så benämns detta Single och i många andra programeringsspråk kallas datatypen Float.

den här hemsidan hittade jag det jag behövde. Det visade sig att uppbyggnaden på en STL-fil är väldigt enkel. Filen börjar med 80 bytes som innehåller en del generell information, som följs av 4 bytes som tillsammans talar om hur många trianglar filen innehåller. Efter de inledande 84 byten så kommer definitionerna av alla trianglar. Varje triangel definieras av totalt 50 bytes vardera.
Filen jag fick av Anders är enorm! 180 Mb låter kanske inte så mycket, men detta betyder faktiskt att man har 3 772 310 att gå igenom. Lite mer än vad jag skulle vilja göra manuellt över en kopp kaffe. Blir till att programmera istället.

Programmet

Sådana här uppgifter är faktiskt förbaskat kul. Vid det här laget vet jag:

1. Vad jag vill uppnå
2. Vad en STL-fil är för något
3. Hur STL-filen är uppbyggd.

Det jag inte räknat ut än är vilken metod jag ska använda. Jag bestämde mig efter en del funderande för följande metod, som senare skulle implementeras i kod:

Metod
1. Läs in hela STL-filen till datorns arbetsminne.
2. Läs ut hur många trianglar den innehåller.
3. Loopa igenom alla trianglar för att kontrollera modellens storlek. Detta gör jag för att veta var i ”rymden” objektet ligger.
4. Dela upp modellen i ett antal skikt, och kontrollera för varje skikt hur stor diameter detta har (se bilderna nedan).
5. Sammanfoga diametrarna från varje skikt till en kontur och exportera denna som en vanlig 2D-CAD-fil (dxf).

slices1

slices2

slices3

Bilderna har jag genererat med gratismjukvaran MeshLab. Nu när jag räknat ut en metod så var det bara till att skrida till verket. 160 rader fulkod senare så hade jag ett resultat.

kod

Alla program måste ha ett bra användargränssnitt. Utformande av sådana är inte riktigt min styrka, men i det här fallet blev jag nöjd:

program

Den lilla information som finns att få under processen rullar fram i textform:

debugOutput

Det är sådana här gånger man blir imponerad av datorer. Ofta upplever man dem som slöa, men när man gör program som är dedikerade till att lösa en specifik uppgift så går det undan! Det här programmet, som är fulkodat, taskigt optimerat och dessutom körs i debugläge i Visual Studio tar knappt 7 sekunder på sig att ladda in ~180 Mb från hårddisken, loopa igenom drygt 188 miljoner bytes två gånger, göra beräkningar på dessa samt generera en CAD-fil med resultatet. På en 6 år gammal dator!

andersProfil

Helt färdigt är det dock inte. Jag kan behöva ”kalibrera” modellen lite, så jag tror att jag låter Anders ta några enkla mått på den som jag kan använda för att kompensera i beräkningarna i programmet om det skulle vara nödvändigt!

Piece of cake!

(Edit: Här ser ni Mobacken-Anders arbeta vidare med profilen jag genererat).

Det här inlägget postades i Allmänt, Faktarutor/Guider. Bokmärk permalänken.

6 kommentarer till Impeller-bryderi löses med programmeringsnörderi

  1. Anders Johansson skriver:

    Hatten av, fan så imponerad jag blir av dig.

    • LinusN skriver:

      Tack tack.
      Och tack för att du lyckades skaka fram någon uppgift till bygget som du inte kunnat klara lika bra (eller bättre) själv 🙂

  2. Stefan Moss skriver:

    Bra gjort och kreativ lösning! Nu har du ju programmet klart till nästa gång men annars hade du kunnat testa göra det i Rhino 3D – Ett relativt enkelt ytmodelleringsprogram som hanterar inskannade punktmoln eller stl-filer för att t.ex. som i detta fall skapa kompletterande saker.

    • LinusN skriver:

      Tack för tipset. Jag var väl helt övertygad om att det skulle finnas något program som kunde lösa uppgiften, men hade ingen aning om vilket. I Autodesksuiten har vi Alias också. Det kanske skulle klara något liknande. Fördelen är i alla fall att jag har tillgång till Alias 🙂

  3. Olov skriver:

    Inte för att jag vill att du ska bli för stursk Linus 😉 men impad blir man.
    Fan en annan har ju fullt upp å få några jävla lysdioder att blinka med arduinon utan att behöva klippa och klistra kodrader.. Fast det säger kanske mer om vilket pucko man e själv kanske 😀

    Härligt att ni är på G med nya röret!

    • LinusN skriver:

      Jo min hybris är ständigt på gränsen till utbrott så det är till att hålla mig på marken :p
      Skämt åsido; vissa saker triggas man av och finner mer intressanta än andra och ska vi ägna oss åt ryggdunkeri så är det nog ingen i vare sig Mobacken- eller Svarthåletgänget som inte tjurar på tills avsett resultat uppnåtts 🙂

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *