České vysoké učení technické v Praze Fakulta informačních technologií Katedra teoretické informatiky
Diplomová práce
Přístupy k automatizaci 3D tisku Bc. Marek Žehra
Vedoucí práce: Ing. Pavel Kordík, Ph.D.
7. května 2014
Poděkování Rád bych poděkoval svému vedoucímu práce za trpělivé vedení a přínosné rady v průběhu řešení práce. Dále pak vedení fakulty za poskytnutí prostředků v podobě laboratoře 3D tisku, kde byla většina mé práce testována. Nesmím zapomenout také na Dolfa Veenvlieta, tvůrce instruktážního DVD k aplikaci Blender, který mě inspiroval v mnoha směrech při zkoumání tisknutelnosti objektů. A v neposlední řadě bych chtěl obzvláště poděkovat své přítelkyni za podporu a trpělivost v průběhu psaní této práce.
Prohlášení Prohlašuji, že jsem předloženou práci vypracoval(a) samostatně a že jsem uvedl(a) veškeré použité informační zdroje v souladu s Metodickým pokynem o etické přípravě vysokoškolských závěrečných prací. Beru na vědomí, že se na moji práci vztahují práva a povinnosti vyplývající ze zákona č. 121/2000 Sb., autorského zákona, ve znění pozdějších předpisů. V souladu s ust. § 46 odst. 6 tohoto zákona tímto uděluji nevýhradní oprávnění (licenci) k užití této mojí práce, a to včetně všech počítačových programů, jež jsou její součástí či přílohou a veškeré jejich dokumentace (dále souhrnně jen „Dílo“), a to všem osobám, které si přejí Dílo užít. Tyto osoby jsou oprávněny Dílo užít jakýmkoli způsobem, který nesnižuje hodnotu Díla a za jakýmkoli účelem (včetně užití k výdělečným účelům). Toto oprávnění je časově, teritoriálně i množstevně neomezené. Každá osoba, která využije výše uvedenou licenci, se však zavazuje udělit ke každému dílu, které vznikne (byť jen zčásti) na základě Díla, úpravou Díla, spojením Díla s jiným dílem, zařazením Díla do díla souborného či spracováním Díla (včetně překladu), licenci alespoň ve výše uvedeném rozsahu a zároveň zpřístupnit zdrojový kód takového díla alespoň srovnatelným způsobem a ve srovnatelném rozsahu, jako je zpřístupněn zdrojový kód Díla.
V Praze dne 7. května 2014
.....................
České vysoké učení technické v Praze Fakulta informačních technologií c 2014 Marek Žehra. Všechna práva vyhrazena.
Tato práce vznikla jako školní dílo na Českém vysokém učení technickém v Praze, Fakultě informačních technologií. Práce je chráněna právními předpisy a mezinárodními úmluvami o právu autorském a právech souvisejících s právem autorským. K jejímu užití, s výjimkou bezúplatných zákonných licencí, je nezbytný souhlas autora.
Odkaz na tuto práci Žehra, Marek. Přístupy k automatizaci 3D tisku. Diplomová práce. Praha: České vysoké učení technické v Praze, Fakulta informačních technologií, 2014.
Abstract This work deals with the automation of the process of 3D printing. In the first part we introduce the 3D printing itself and its technology, we’ll explain what the process of printing consists of and explore existing automation capabilities. The practical part is comprised of designing a custom solution for automation, which we describe and test on simple objects. Keywords 3D,print,additive manufacturing,C++,genetics,rotation,mesh,stl
Abstrakt Tato práce se zabývá automatizací procesu 3D tisku. V první části se seznámíme s 3D tiskem jako takovým a jeho technologiemi, vysvětlíme si z čeho sestává proces tisku a dále zmapujeme stávající možnosti automatizace. V praktické části navrhneme vlastní řešení pro automatizaci, které si popíšeme a otestujeme na jednoduchých objektech. Klíčová slova 3D,tisk,aditivní výroba,C++,genetika,rotace,mesh,stl
ix
Obsah Úvod Cíl práce
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1 Rešerše 1.1 3D tisk . . . . . . . . . . . . . . . . . . 1.1.1 Princip . . . . . . . . . . . . . 1.1.2 Technologie . . . . . . . . . . . 1.2 RepRap . . . . . . . . . . . . . . . . . 1.2.1 O Projektu . . . . . . . . . . . 1.2.2 Modely tiskáren . . . . . . . . 1.3 Co předchází tisku . . . . . . . . . . . 1.3.1 Získání modelu . . . . . . . . . 1.3.2 3D mesh . . . . . . . . . . . . . 1.3.3 Příprava tiskárny . . . . . . . . 1.4 Proces 3D tisku . . . . . . . . . . . . . 1.4.1 Kontrola 3D mesh . . . . . . . 1.4.2 Kontrola tisknutelnosti modelu 1.4.3 Slicing . . . . . . . . . . . . . . 1.4.4 Tisk . . . . . . . . . . . . . . . 1.5 Současná řešení . . . . . . . . . . . . . 2 Návrh 2.1 Vymezení cíle . . . . . . . 2.2 Popis problému . . . . . . 2.3 Popis řešení . . . . . . . . 2.3.1 Použité technologie 2.3.2 Načtení modelu . . 2.3.3 Oprava meshe . . . 2.3.4 Detekce rotace . .
. . . . . . .
. . . . . . . xi
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . .
1 1
. . . . . . . . . . . . . . . .
3 3 4 5 8 8 9 12 12 13 16 19 20 25 27 32 33
. . . . . . .
35 35 36 36 37 38 38 38
2.3.5
Výstup algoritmu . . . . . . . . . . . . . . . . . . . . . .
3 Implementace 3.1 Struktura tříd . . . . . . 3.1.1 NormaledModel . 3.1.2 NormaledVolume 3.1.3 NormaledFace . . 3.1.4 Rotation . . . . . 3.1.5 RotationFitness . 3.1.6 Rotater . . . . . 3.1.7 SolverBruteForce 3.1.8 SolverGenetics . 3.2 Oprava meshe . . . . . . 3.3 Genetický algoritmus . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
44 45 45 45 47 47 47 48 48 49 49 49 50
4 Testování
53
Závěr
59
Literatura
61
A Obrázky
65
B Výčet atributů a metod tříd B.1 NormaledModel . . . . . . . B.2 NormaledVolume . . . . . . B.3 NormaledFace . . . . . . . . B.4 Rotation . . . . . . . . . . . B.5 RotationFitness . . . . . . . B.6 Rotater . . . . . . . . . . . B.7 SolverBruteForce . . . . . . B.8 SolverGenetics . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
75 75 76 76 76 77 78 78 79
C Seznam použitých zkratek
81
D Obsah přiloženého CD
83
xii
Seznam obrázků 0.1
Ideální stav 3D tisku . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13
Řez ukázkovým modelem . . . . . . . . Ukázka výtisku z cukru . . . . . . . . . Průřez vrstvou FFF/FDM . . . . . . . . Modely tiskáren RepRap . . . . . . . . Příklad modelu v programu OpenSCAD Rozložení 3D meshe . . . . . . . . . . . Kalibrace tiskárny . . . . . . . . . . . . Workflow 3D tiskaře . . . . . . . . . . . Neuzavřená 3D mesh . . . . . . . . . . . Chyba kdy má hrana více než 2 stěny . Detekce problémů v Blenderu . . . . . . Srovnání výšky vrstvy . . . . . . . . . . Přehled vzorů a intenzity výplní . . . .
2.1 2.2 2.3 2.4 2.5 2.6
Diagram řešení problému rotace . . . . . . . . . . . . Genrování kombinací osy rotace . . . . . . . . . . . . Testovací objekt natočený o 15 stupňů podle vektoru Stavový prostor kombinace osy otáčení a úhlu . . . . Pseodokód genetického algoritmu (generační model) Algoritmus turnajové selekce . . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
4 7 9 10 13 14 19 20 22 23 27 29 31
. . . . . . . . . . (1, 0, 0) . . . . . . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
36 40 40 42 44 44
3.1
Diagram tříd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
4.1 4.2 4.3 4.4 4.5 4.6
Graf Graf Graf Graf Graf Graf
55 55 56 56 57 57
závislosti závislosti závislosti závislosti závislosti závislosti
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
2
počtu iterací na úspěšnosti algoritmu . . . . . . . velikosti populace na úspěšnosti algoritmu . . . . velikosti turnajové selekce na úspěšnosti algoritmu elitismu na úspěšnosti algoritmu . . . . . . . . . . pravděpodobnosti křížení na úspěšnosti algoritmu pravděpodobnosti mutace na úspěšnosti algoritmu xiii
. . . . . .
4.7
Graf závislosti síly mutace na úspěšnosti algoritmu . . . . . . . . .
A.1 Ukázka 3D modelu . . . . . . . . . A.2 Ukázka výtisku . . . . . . . . . . . A.3 Princip technologie Sterolitografie A.4 Princip práškového tisku . . . . . . A.5 Princip tiskové hlavy u FFF/FDM A.6 Princip technologie FFF/FDM 2 . A.7 Model tiskárny RepRap Rostock . A.8 Ukázka vygenerovaného STL . . . A.9 Příklad normálového vektoru . . . A.10 Rozhraní aplikace Slic3r . . . . . . A.11 Rozhraní aplikace KISSlicer . . . . A.12 Rozhraní aplikace Cura . . . . . . A.13 Rozhraní aplikace Pronterface . . . A.14 Rozhraní aplikace OctoPrint . . .
xiv
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
58 65 66 67 67 68 69 70 71 71 72 72 73 73 74
Úvod 3D tisk je v dnešní době velice populární téma. Někdo si pod tím představuje zbytečnost a mediální „bublinu“, jiní zázračnou technologii, pomocí které lze tisknout v domácích podmínkách orgány, kloubní náhrady a v neposlední řadě zbraně. Tato technologie dnes zažívá jakousi renesanci, protože samotný princip 3D tisku je znám již dlouhou řádku let. Samotné téma 3D tisku, či aditivní výroby, by jistě svým rozsahem dalo na nejednu publikaci. Dodnes se veškerá pozornost věnovala konstrukcím tiskáren, jejich designem a schopností tisknout s vysokou přesností. Tato doba ale již pomalu opadá, protože vstupují na trh tiskárny bez nutnosti si je postavit doma v dílně, nebo v rámci projektu na škole, jako tomu bylo i v případě testovacích tiskáren použitých pro tuto práci. Pokud máme vyřešenou konstrukci a není problém si tiskárnu pořídit, tak velice rychle začneme hledat software k ovládání takové tiskárny. Situace v této oblasti je dnes více než roztříštěná. Tento program umí to, tamten zase ono, jiný zase něco jiného, ale už neumí to co ten první, a tak bychom mohli pokračovat dále. Ucelená a jednoduchá řešení pro uživatele jsou vzácnost.
Cíl práce Na aplikaci, která by uměla vyřešit všechny problémy spojené s 3D tiskem si pravděpodobně ještě nějaký čas počkáme. Ale první vlaštovky jsou již na obzoru. Částečně kompletní systémy již existují, ač v komerční placené verzi, ale dostupné jsou. My se ovšem v této práci zaměříme na ta řešení, která jsou dostupná každému, ideálně OpenSource. Pokusím se vám přiblížit, co je 3D tisk jako takový, co vše předcházelo vzniku tiskáren, jaké máme technologie. Dále zmapujeme současná řešení a pokusíme se navrhnout proces 3D tisku, abychom se co nejvíce přiblížili stavu zobrazeném na obrázku 0.1.
1
Úvod
Mocné orákulum řešící všechny problémy
3D model
3D tiskárna Fyzický objekt
Obrázek 0.1: Ideální stav 3D tisku
2
Kapitola
Rešerše V této kapitole se budeme zabývat současným stavem 3D tisku. Tedy vysvětlením pojmu 3D tisk, popisem technologií, popisem projektu RepRap, do kterého patří tiskárna používána na testování výsledků. Dále pak jaké jsou možnosti přípravy modelů, co je to 3D mesh, jaké může obsahovat chyby, co musí současný 3D tiskař1 udělat pro to, aby měl hotový výrobek.
1.1
3D tisk
Proces 3D tisku je nejčastěji vysvětlován jako převod počítačového modelu na fyzický objekt (jak je znázorněno na obrázcích A.1 a A.2). Zprávy o prvním vytištěném objektu pochází z roku 1982, který vyrobil Hideo Kodama ze společnosti Nagoya Municipal Industrial Research Institute. První funkční 3D tiskárna pak byla vytvořena Charlesem W. Hullem ze společnosti 3D Systems, roku 1984. Hull také přišel s řadou patentů týkajících se 3D tisku. Mnoho z nich je dnes používáno v aditivní výrobě, kterou zmíníme později v této kapitole. Na svém počátku byl 3D tisk velice nákladný a nebylo tak možné aby se objevil na běžném trhu. Počátkem 21. století ale cena těchto technologií začala rapidně klesat a dnes již máme k dispozici tiskárny, které jsou i pro běžného člověka dostupné. V dnešní době se 3D tisk hojně využívá k prototypingu2 a tisku objektů, kde není žádoucí sériová výroba. Lze využít i na výrobu předlohy formy pro vstřikování nebo lití, případně výroby samotné formy.
1
Člověk obsluhující 3D tiskárnu, nebo zabývající se 3D tiskem Rapid Prototyping - rychlá výroba prototypů, neboli vzorových/pokusných výrobků před zahájením sériové výroby 2
3
1
1. Rešerše
1.1.1
Princip
Základním principem všech 3D tiskáren je výroba fyzického objektu po vrstvách. Každý počítačový model lze rozřezat, neboli naslicovat, na N vrstev, které lze potom reprezentovat jako 2D polygony. Každou takovou vrstvu již lze pomocí tiskárny nanést na vrstvu předchozí. Objekty poté doslova rostou z tiskové základny. Směr růstu objektu je poté závislý na technologii a orientaci objektu (převážně podle osy Z). Jedná se o opak metody obrábění, kde je materiál postupně odebírán, v případě 3D tisku materiál přidáváme. Tomuto procesu se říká aditivní. Největší výhodou oproti obrábění je, že nevzniká téměř žádný odpad. Je to tedy velice úsporná metoda z hlediska spotřeby materiálu. Technologie 3D tisku umožňuje vytvářet nejen objekty jako takové, ale i jakkoliv složité jejich vnitřní struktury. Můžeme tedy například vyrobit běžně „nevyrobitelné“ díly, které jsou již z výroby do sebe zapojeny a bez destrukce je nelze rozpojit. Vnitřek objektu navíc nemusí být zcela plný ani dutý. Můžeme si ve většině případů určit jakou strukturu bude tato výplň mít, včetně její hustoty. Na ukázku provedeme řez modelem [12] (jako je znázorněno na obrázku 1.1), dostaneme tvar tvořící jednu vrstvu vzorového objektu. Tuto vrstvu můžeme vidět na obrázku 1.1b.
(a) pozice řezu v modelu
(b) výsledná vrstva
Obrázek 1.1: Řez ukázkovým modelem z portálu Thingiverse.com [13] V našem příkladu je vrstva tvořena dvěma polygony reprezentujícími tělo cho4
1.1. 3D tisk botnice a zdvižené chapadlo. Pokud to zobecníme, tak každý fyzický vytištěný objekt se skládá z N vrstev, kde v každé z nich je L různě složitých polygonů. Celkový objem takového objektu můžeme spočítat jako: M=
Li N X X
S(pi,n ) · hi ,
i=0 n=0
kde S je funkce počítající obsah polygonu, hi je výška vrstvy i, N je celkový počet vrstev a Li je počet polygonů p ve vrstvě i.
1.1.2
Technologie
Základní princip, kladení vrstev na sebe, popsaný v předchozí kapitole je pro všechny technologie společný. Každý přístup se ale liší tím, jak jsou jednotlivé vrstvy vyráběny. Níže popíšeme tři nejpoužívanější technologie 3D tisku. Hloubavý čtenář nalezne schémata níže popisovaných technologií v příloze A, obrázky A.3, A.4, A.5 a A.6. 1.1.2.1
Sterolitografie
Metoda patentována 11. března 1986 Charlesem Hullem [10], anglicky Stereolitography (dále jen SLA) jinak také označována jako optical fabrication, photo-solidification, solid free-form fabrication nebo solid imaging. Pracuje na principu vytvrzování fotopolymeru3 pomocí ozařování určitou vlnovou délkou. Jedná se o první a nejstarší technologii 3D tisku. 3D tiskárna postavena na technologii SLA se skládá ze dvou základních částí. Lázně s tekutým polymerem a laseru, nebo jiného ozařovacího zařízení. Zářením na konkrétní místo je pak z tekuté formy polymeru vytvrzena část vrstvy. Pokud postupně ozáříme celou plochu vrstvy, dostaneme plně vytvrzenou část objektu. Poté můžeme přistoupit na další vrstvu ponořením tiskové základny hlouběji do lázně. Tímto vyroste v lázni celý objekt, který je pak možno vyjmout a případně ještě opracovávat. Mimo ponořování objektu do lázně, kde jsme omezeni velikostí lázně existuje ještě druhý přístup k tvorbě objektů, a to doslova vytahováním objektu z lázně s polymerem. U druhého přístupu je aktuálně tisknutá vrstva promítána na dno nádržky s tenkou vrstvou polymeru. Nemáme tak omezen tiskový prostor velikostí nádrže s polymerem. Tato technologie pracuje řádově v jednotkách µm. Teoreticky můžeme říci, že přesnost tohoto typu tiskárny je rovna velikosti molekuly polymeru. Výhodou je také výsledná tvrdost objektů, která je ovšem dána především použitým 3
Fotopolymerem myslíme pryskyřici citlivou na ozáření určitou vlnovou délkou
5
1. Rešerše materiálem. Celková přesnost zařízení je poté dána kombinací faktorů: hustota polymeru, šíře laserového paprsku, délka a intenzita ozařování. Vlnová délka záření je dána použitým polymerem. Nejčastěji se setkáme se stroji používajícími UV4 záření. 1.1.2.2
Práškový tisk
Metoda vyrábějící objekty, jejichž základem je jemný práškový materiál. Konkrétní zpracování se poté dělí na více přístupů, v každém z nich je ale nanesena na podložku tenká vrstva prášku, která je nějakým postupem zpevněna. Poté je na tuto vrstvu nanesena další a opět se zpevní. Další vrstvy už postupují stejně. Objekt je nutno z prášku vyjmout, případně prášek odsát z tiskové komory. Tato technologie se převážně používá v komerčních tiskárnách na výrobu přesných i vícebarevných prototypů. Jak již bylo zmíněno, lze použít různé druhy prášku a různé přístupy. Jedním z těchto přístupů, označován jako Selective laser sintering (SLS), je nanesení vrstvy prášku a poté ozařování CO2 laserem. Působením laseru je prášek nataven a spékáním tvoří jednolitou vrstvu. Tisková základna se posune o výšku vrstvy níže a je nanesena další vrstva prášku. Jelikož jsou ozářena pouze místa ve vrstvě která mají být zpevněna, tak okolní materiál zůstává ve formě prášku a slouží nadále jako podpora pro části, které neleží přímo na tiskové základně. Jako stavební materiál v tomto případě lze použít prášky ve formě plastu, kovu, pryže, keramiky nebo speciálního písku. Zrno tiskového prášku se pohybuje v rozmezí velikosti 20 až 100 µm. Pokud použijeme jako stavební materiál prášek na bázi kovu, máme zaručeno, že výrobek bude velice odolný. Lze tímto způsobem tedy vyrábět i velice namáhané části zařízení, jako jsou například ozubená kola. Dalším přístupem v práškovém tisku je využití dvou složek materiálu. V tomto případě je prášek použit jako základní stavební materiál a k němu je přidávána druhá pojivá složka vytvářející pevnou část vrstvy. Na tiskovou základnu je stejně jako v předchozím případě nanesena tenká vrstva prášku. Dále pak nad plochou přejíždí tisková hlava, která vytryskává, podobně jako u inkoustových tiskáren, z mikrotrysek pojidlo. Často je jako pojidlo použit fotopolymer, který je vzápětí ozářen, aby byla vrstva dostatečně vytvrzena. Tento přístup má výhodu v tom, že lze jako pojidlo použít polymer barevný. Je tedy možné dodržet barevnost modelu. Jedná se o nejjednodušší způsob jak přenést model do reálného světa včetně barev. 4
6
Ultrafialové záření – v rozsahu vlnových délek 200–400 nm
1.1. 3D tisk Jedním ze zajímavějších práškových tiskových materiálů je například cukr, k jehož zpevnění stačí aby v tryskách byla místo pojidla voda, nebo potravinářské barvivo, pokud chceme dosáhnout barevnosti výtisku. Tímto způsobem lze například tisknout unikátní kostky cukru do kávy, jak je znázorněno na obrázku 1.2.
1.1.2.3
Vytlačování termoplastu
Metoda označována jako fused filament fabrication(dále jenom FFF), thermoplastic extrusion, nebo také fused deposition modeling/method (FDM) je další technologií z rodiny 3D tisku. Jedná se o nejméně náročnou technologii z hlediska konstrukce tiskové hlavy. Princip tiskáren založených na metodě FFF je přirovnáván k principu tavné pistole. Stavebním materiálem tiskárny je plast ve formě drátu, který je hnacím mechanismem vtlačován do tiskové hlavy, kde je roztaven a následně tryskou postupně kladen na tiskovou základnu v podobě tenké linky. Pohyb tiskové hlavy je ve všech 3 prostorových osách řízen krokovými motory. Podobně jako u předchozích technologií není nutné v tomto přístupu dělat objekty vždy plné. Je možné použít pouze „nutnou“ výplň, nebo tisknout objekty plně duté. Průřez jednou vrstvou s 20% výplní je zobrazen na obrázku 1.3, kde jsou barevně znázorněna místa, kde je vytlačován plast, a tmavě šedou barvou přejezdy, kdy se tryska pouze přemisťuje a nenanáší tiskový materiál. Vzory výplně si detailně popíšeme v kapitole 1.4.3.
Obrázek 1.2: Ukázka výtisku z cukru [1] 7
1. Rešerše Materiály pro tisk touto technologií jsou, jak již název napovídá, termoplasty. Tedy materiál na bázi plastu, který po zahřátí změkne a lze ho protlačit tryskou. Uvedeme několik příkladů termoplastů. PLA5 je bioplast, který je vyráběn částečně z kukuřičného škrobu a jedná se tím o plast, který je ekologický. Naproti tomu ABS6 je plast běžně používán na výrobu téměř všeho plastového v našem okolí (například i kostičky LEGO). Spolu s PLA jsou to v dnešní době dva nejčastěji používané plasty pro 3D tisk pomocí FFF. Další materiály jsou například Nylon, PCL7 , Polykarbonát nebo PVA8 , který je díky rozpustnosti ve vodě vhodný na stavbu podpor. Ve srovnání s ostatními technologiemi 3D tisku je tento přístup nejméně nákladný na materiál. Uvedené plasty ve formě drátu lze dnes již poměrně snadno pořídit za rozumnou cenu9 . Provozní náklady tiskárny jsou téměř zanedbatelné. Ale abychom nevyzdvihovali pouze klady, musíme zmínit, že objekty vytištěné touto metodou jsou náchylnější na destrukci. Ne ovšem ve všech osách prostoru. Hlavní nevýhodou totiž je samotný princip tisku, a to vrstvení materiálu. Pokud pokládáme vrstvu roztaveného materiálu na již zchladlý materiál, nemusí dobře přilnout a objekty mají poté tendenci praskat právě ve spojení dvou vrstev. Ať už vlivem smršťování plastu (čemuž se dá částečně předejít použitím plastu, který má nízkou smrštivost), nebo mechanickým poškozením. V kapitole 1.3.3 zmíníme jak těmto problémům částečně předejít, nelze se jim bohužel úplně vyhnout.
1.2
RepRap
Řada výše uvedených technologií byla po mnoho let patentována a bylo tak znemožněno použití kýmkoliv jiným, než společností 3D Systems, která tyto patenty podala. V roce 2005 však vypršel patent na samotnou technologii vytlačování termoplastu popsanou v kapitole 1.1.2.3. Vzhledem k „jednoduchosti“ technologie není až takový problém vyrobit takto fungující tiskárnu v domácích podmínkách.
1.2.1
O Projektu
S myšlenkou vyrábění tiskáren v domácích podmínkách z plastových součástek které jsou také vytištěny přišel v roce 2005 Dr. Adrian Bowyer na University of 5
Polylactic acid (PLA) - kyselina polymléčná Akrylonitrilbutadienstyren (ABS) - amorfní termoplastický průmyslový kopolymer 7 Polycaprolactone (PCL) 8 Polyvinylalkohol (PVA) - ve vodě rozpustný syntetický polymer 9 V době psaní této práce lze pořídit 1 kg tiskového termoplastu přibližně za 500 Kč. 6
8
1.2. RepRap
Obrázek 1.3: Průřez vrstvou FFF/FDM Bath [25]. Inicioval založení projektu nazvaného RepRap, zkratka pro Replicating rapid prototyper, což můžeme česky volně přeložit jako sebereplikující se rychlý výrobce prototypů. Znamená to, že tiskárny zahrnuty v projektu jsou schopny rychlé výroby prototypů a zároveň dokáží replikovat samy sebe, nebo spíše přesněji, tisknout součástky na své kopie nebo další tiskárny z projektu. Veškerá dokumentace, návrhy součástek, řídící elektroniky a software je šířen pod OpenSource licencí GNU General Public License.
1.2.2
Modely tiskáren
V projektu je zařazena celá řada tiskáren nejrůznějších typů a variant. My budeme popisovat pouze základní modely ze kterých vychází dnes téměř všechny modely tiskáren, které jsou v projektu, nebo jsou komerčně vyráběny. 1.2.2.1
Darwin
Vůbec první RepRap tiskárnou (Obr. 1.4a) byla tiskárna nazvaná Darwin, původně Cartesian bot. Obě jména mají svůj význam. Jméno Cartesian bot vychází z toho, že tisk probíhá ve 3 osách kartézské soustavy souřadnic. Jméno Darwin pak bylo vybráno podle britského přírodovědce Charlese Darwina, který byl zakladatelem evoluční teorie. Pokud se totiž zamyslíme nad 3D tiskárnami jako nad sebereplikujícími se stroji které se volně šíří mezi staviteli, tak se jedná vlastně o řízenou evoluci těchto strojů. Téměř žádný stavitel tiskárny totiž nenechá svou tiskárnu bez sebemenší úpravy a alespoň jednu součástku na ní vylepší nebo vymění. Tiskárny se tak neustále vyvíjí.
9
1. Rešerše Práce na modelu započaly v roce 2005 při založení projektu RepRap. Rok nato v r. 2006 byla pomocí této tiskárny vytištěna první součástka. První tiskárna typu Darwin ale nebyla tak úplně RepRap, protože sama tiskárna byla vyrobena z dílů vyřezaných laserem ze dřeva. Až její první „potomek“ byl skutečný RepRap. Konstrukce modelu Darwin je obdélníková a pohyb os X a Y je zajištěn samotnou tiskovou hlavou. Tisková základna, která stoupá a klesá, tvoří pak osu Z. 1.2.2.2
Mendel
Model který přišel jako druhý po modelu Darwin nese označení Mendel. Jméno bylo tentokrát vybráno podle zakladatele genetiky, George Mendela. Konstrukce je na rozdíl od předchozího modelu trojúhelníková, jak je vidět na obrázku 1.4b. Tiskárna je výrazně menší (při zachování stejných rozměrů tisku) a jak říká sám autor [25], již se vejde i na běžný pracovní stůl. Změna v konstrukci spočívala v tom, že tisková hlava se pohybuje v osách X a Z. Pohyblivá tisková základna pak tvoří osu Y.
(a) Darwin
(b) Mendel
Obrázek 1.4: Modely tiskáren RepRap
1.2.2.3
Huxley
Dalším stupněm evoluce byla tiskárna nazvaná Huxley. Jedná se o konstrukčně stejný stroj jako model Mendel, ale výrazně menší. Tisková plocha Mendel tiskárny je 20x20x14 cm a tisková plocha tiskárny Huxley je poloviční, tedy 10x10x7 cm. Impulsem pro její vytvoření bylo zvýšení mobility tiskárny. S modelem Huxley již není problém tiskárnu přenášet mezi místnostmi, budovami 10
1.2. RepRap a ani není větší problém ji převážet. Nedávno se v komunitní databázi objektů a návrhů CubeHero [5] objevila varianta skládací tiskárny Huxley. Je to názornou ukázkou toho, že jakmile je design zveřejněn, nikomu již nic nebrání tomu, aby si konstrukci upravil dle vlastních požadavků. 1.2.2.4
Rostock
Spíše pro zajímavost zmíníme tiskárnou trochu vybočující z řady „běžných“ konstrukcí RepRap tiskáren. Jedná se o model nazvaný, podle rodného města jejího autora Rostock. Jde o přizpůsobeného delta robota k 3D tisku. Delta robot je konstrukce, kde je pohyb v prostoru kartézské soustavy souřadnic přepočítáván na pohyb 3 ramen. Více patrné je to z obrázku A.7
11
1. Rešerše
1.3
Co předchází tisku
V této kapitole se podíváme na to, jaké vstupy požaduje 3D tiskárna a jak tyto vstupy získat pomocí konkrétních programů. Některé vstupy jsou obecné, jiné se mohou lišit podle použité technologie a přístupu k tisku. Veškeré přístupy přípravy objektů, které zde budou popsány jsou platné především pro tiskárny z projektu RepRap a technologii FFF (viz 1.1.2.3), neboť tyto tiskárny jsou šířeny pod OpenSource licencí a jsou cenově nejdostupnější. Není cílem této práce se zabývat komerčními řešeními, protože k těmto tiskárnám zákazník zpravidla dostane i patřičnou podporu a software.
1.3.1
Získání modelu
Model, neboli předlohu pro tisk lze získat několika způsoby. První se nabízí vlastní návrh. Ten je možné realizovat téměř v jakémkoliv 3D CAD10 systému nebo v programu určeném pro 3D počítačové modelování. Z komerčních nástrojů můžeme zmínit například hojně používaný AutoCAD od společnosti Autodesk, Inc., případně přímo aplikaci určenou pro modelování strojních součástek, Inventor. Pokud chceme vytvářet model v modelovacím systému, ale máme raději OpenSource varianty, tak pravděpodobně vybereme software Blender. Jedná se o OpenSource modelovací prostředí, které mimo jiné od verze 2.65 umožňuje kontrolu modelu před 3D tiskem (podrobněji viz kapitola 1.4.1). V případě, že jsme zastánci webových řešení, i tato možnost je k dispozici. Zabývá se jím webový projekt Tinkercad [2]. Jedná se o jednoduchý webový editor používající technologii WebGL pro vytváření 3D modelů. Další, v RepRap projektu hojně využívanou, možností je použití softwaru OpenSCAD. Modelování v tomto softwaru připomíná spíše programování. Prostředí využívá CSG11 modelování. Při tomto přístupu modely definujeme kombinací základních geometrických primitiv jako je koule, kvádr, válec, jehlan, atd. S primitivy můžeme provádět transformace jako je posun, rotace, škálování, stejně tak i booleovské operace jako rozdíl, průnik, sloučení. Pokud chceme vytvořit model na obrázku 1.5, použijeme kód 1.1, kde definujeme vykreslení primitiva cube, což je modul který vytvoří kostku o velikosti jedné strany zadané parametrem, v našem případě 150 jednotek velkou. Proč neuvádíme konkrétní jednotky, jako například mm, si objasníme v kapitole 1.3.2. Pro hloubavého čtenáře je dostupný velice podrobný manuál [17], ve kterém je popsán celý jazyk s jakým OpenSCAD pracuje.
10 11
12
Computer aided design = počítačem podporované projektování Constructive solid geometry = vektorové modelování geometrických objektů
1.3. Co předchází tisku
velikost_kostky = 150; velikost_koule = 100; cube(velikost_kostky,center=true); sphere(velikost_koule);
Kód 1.1: Ukázka kódu v programu OpenSCAD
Obrázek 1.5: Příklad modelu v programu OpenSCAD V neposlední řadě je zde i možnost model získat stažením z internetu. Konkrétně na to slouží například dva webové portály, Thingiverse [13] a Cubehero [5]. Některé modely z portálu Thingiverse byly použity pro testování výsledků této práce.
1.3.2
3D mesh
Objekty které chceme vytisknout, musíme mít ve formátu 3D mesh, konkrétně mesh trojúhleníkovou. Mesh je reprezentace 3D modelu pomocí sítě tvarů, která může být reprezentována pomocí několika druhů tvarů. Nejčastěji používané jsou trojúhelníky, čtyřúhelníky, nebo polygony. Vlastní mesh se pak skládá z několika typů objektů. Rozložíme-li ji na tyto typy, dostaneme seznam bodů (vertex), hran (edge), stěn (faces), polygonů, povrchů a nakonec objektů (znázorněno na obrázku 1.6). Pokud budeme objekt skládat ve 3D prostoru, potřebujeme nejprve definici bodů, ze kterých je objekt složen, seznam hran kterými jsou tyto body 13
1. Rešerše spojeny, označení, kde je stěna určitého tvaru (v našem případě budeme používat trojúhelníkové stěny) a jaký je její normálový vektor. Z těchto trojúhelníků již lze složit polygony a povrch celého objektu.
Obrázek 1.6: Rozložení 3D meshe Takto vytvořená mesh definuje vnější plášť celého objektu. Jinými slovy, co je ohraničeno meshí, je v reálném světě hmotný objekt. Můžeme si to představit jako definici obalu objektu. Díky možnosti směrovat normálu jednotlivých stěn nejsme omezeni pouze na zcela uzavřené objekty. Můžeme takto definovat i objekt, který má vnější obal, ale uvnitř je objekt zcela jiný. Například bychom mohli vyrobit kouli v dutém kvádru (a naopak). 3D tiskárna nám takovýto objekt celkem bez problému vytiskne jako jeden kus. Koule by pak byla permanentně uvězněna v kvádru a bez jeho „rozlomení“ bychom nebyli schopni ji „osvobodit“. V kapitole 1.3.1 jsme zmínili, že veškeré rozměry se uvádějí ve virtuálních jednotkách. V souborech, kde je uložena definice objektu, není uvedeno, o jaké jednotky reálného světa se jedná. Tento údaj v souborech nechybí, ale neuvádí se. Záleží na softwaru, který s daty pracuje, jak si jednotky interpretuje. Často záleží na geografické oblasti, ve které se objekty zpracovávají, zda je použito metrického nebo imperiálního systému. 1.3.2.1
STL
3D mesh může být uložena v mnoha formátech, které zde ale nebudeme všechny zmiňovat. Pro nás důležitý je formát STL, což je zkratka pro Stereolitography, nebo také Standard Tessellation Language. Tento formát využívá trojúhelníkové reprezentace meshe. Soubory se dělí na dva způsoby uložení, ASCII12 a binární. Pro člověka čitelnější a snáze pochopitelný je formát ASCII, tedy textová reprezentace dat. 12
14
ASCII = anglická zkratka pro American Standard Code for Information Interchange
1.3. Co předchází tisku V souboru máme potom jednotlivé objekty ohraničeny klíčovým slovem solid, následuje definice jednotlivých facet, neboli stěn objektu, a v nich definovány body vertexy. Každá hodnota je uložena jako číslo s pohyblivou čárkou s možností definice exponentu ve formátu čislo’e’[znaménko]exponent, tj. například "-2.648000e-002". Příklad takového kódu vygenerovaného z programu OpenSCAD nalezneme v ukázce 1.2. Výsledek celého kódu je k dispozici i ve formě obrázku A.8. Jedná se o kostku s velikostí stěny 1 jednotka. solid OpenSCAD_Model facet normal -1 0 0 outer loop vertex 0 0 1 vertex 0 1 1 vertex 0 0 0 endloop endfacet ... facet normal 1 0 0 outer loop vertex 1 0 1 vertex 1 0 0 vertex 1 1 1 endloop endfacet endsolid OpenSCAD_Model
Kód 1.2: Příklad STL ASCII souboru Protože textová reprezentace velkých modelů (myšleno modelů s velkým počtem bodů) může být v textové formě velice objemná, a to i v řádech stovek MB13 , máme možnost STL soubory ukládat také ve formě binárního souboru. Ten již není pro člověka tak snadno čitelný bez použití specializovaného software, ale na druhou stranu je velice úsporný k požadovanému místu na disku. Pro srovnání rozdílů velikosti si vezmeme již použitý ukázkový model CuteOcto [12] a uložíme ho nejprve v obou dostupných formách STL. Soubor uložen jako ASCII STL má velikost 13,9 MB a soubor ve formě binary STL pak 3,4 MB. Binární STL má tedy na tomto příkladu zhruba čtvrtinovou velikost, což je při velkých objemech dat již znatelný rozdíl. Binární forma STL souborů má následující strukturu: Hlavička o délce 80 znaků (neměla by začínat klíčovým slovem solid, protože podle toho většina programů rozpoznává, že se jedná o ASCII reprezentaci), následuje 4 bajtový unsigned integer určující počet trojúhelníků (stěn), data pro každý trojúhelník. Trojúhelník je pak popsán 12 čísly s pohyblivou řádovou čárkou o velikosti 13
MB = megabajt
15
1. Rešerše 32 bitů (32-bit-floating point numbers) v následujícím pořadí: 3 pro normálový vektor, 3 pro každý ze 3 bodů trojúhelníku. Následuje ještě 16 bitový integer pro určení počtu dalších atributů14 , který je ale většinou softwarů zanedbáván (výchozí hodnota je 0). V předchozích částech jsme hovořili o normálovém vektoru trojúhelníkové stěny. Jedná se o kolmici na povrch trojúhelníku určující vnější stranu objektu (příklad najdeme v příloze s obrázky na ukázce A.9). Všechny normálové vektory všech trojúhelníků by tedy měly směřovat ven z objektu. Software vytvářející 3D mesh má ale v tomto případě na výběr. Pokud je totiž normálový vektor nastaven na (0, 0, 0) je tím určeno, že normálový vektor není definován a má být automaticky dopočítán při načítání. Stejně jako všechny ostatní formáty 3D meshí používá STL virtuální jednotky. Je tedy opět na nás jak tyto jednotky reprezentujeme v reálném světě. My pro jednoduchost předpokládáme, že jednotky jsou v mm. Tedy pokud je v ukázkovém souboru uvedeno, že kostka je velikosti (1, 1, 1), je tím myšlen rozměr 1x1x1 mm.
1.3.3
Příprava tiskárny
Nedílnou součástí „předletové přípravy“ před tiskem je i kalibrace tiskárny. Ta probíhá ve dvou etapách. Kalibrace samotného zařízení a poté kalibrace profilu pro slicing. Na první pohled se může zdát, že se jedná o jednu věc, ale jak později zjistíme, kalibrace zařízení většinou děláme pouze jednou, vzápětí po sestavení tiskárny, a není poté nutné nastavení měnit, pokud neprovádíme výrazné změny hardwaru. Kalibraci profilu je většinou potřeba provést pro každý použitý materiál. Nicméně pokud neměníme například typ materiálu, můžeme také nastavit jednou a neměnit. Jelikož se pohybujeme se světě OpenSource, nemůže tomu být jinak ani u srdce samotné tiskárny, tedy u řídící elektroniky. Jak tomu již bývá, typů elektroniky a možných firmwarů je celá řada. Rozebírat detaily elektroniky není cílem této práce, proto se zaměříme na softwarovou část, tedy na firmware. Zřejmě nejpoužívanější firmware u tiskáren RepRap je Marlin [28]. Pro koncového uživatele stačí pouze zmiňovaný firmware stáhnout, zkompilovat a nahrát dle uvedeného návodu na webu. Co tedy obnáší kalibrace, když už je to vše připravené? 14 Dalšími atributy myslíme například určení barvy trojúhelníku, které je ale v našem případě zbytečně
16
1.3. Co předchází tisku 1.3.3.1
Firmware
Kalibrací myslíme hlavně určení správného počtu kroků na jednotku, výběr správného senzoru teploty a nastavení vhodných parametrů pro rychlosti. Všechny tyto změny se provádí v konfiguračním hlavičkovém souboru před kompilací. Následně jsou výchozí hodnoty nahrány ve firmware a lze je změnit pouze přehráním elektroniky novou verzí. Jedním z těchto parametrů je například vhodný počet kroků na jednotku. Jinými slovy, potřebujeme určit o kolik kroků se musí otočit krokový motor v tiskárně, aby tisková hlava dosáhla jednotky v určeném směru. My budeme předpokládat, že pracujeme opět v mm. Naším cílem je tedy vypočítat kolik kroků musí udělat motory na osách X, Y a Z. Naštěstí nemusíme nic měřit, ale stačí nám pouze dosadit do vzorce pro výpočet kroků po osách X a Y: stepsx,y =
360 sa
· ms bp · pt
kde sa je úhel o který se motor otočí při jednom kroku, ms je počet mikrokroků, na které má ovladač rozdělit celé kroky motoru, bp je pak rozteč zubů na ozubeném řemenu použitého pro pohyb a pt je počet zubů na řemenici. Například tedy, kdybychom měli motory s otáčkou na krok 1, 8◦ , 16 mikrokroků, řemen s rozestupy 2 mm a počet zubů na řemenici 20, vyjde nám, že motor musí udělat 80 kroků, aby tisková hlava urazila 1 mm. Naproti tomu osa Z, kde se používají převážně závitové tyče k ovládání stoupání, je počítá podle vzorce: 360 · ms stepsz = sa tp kde máme opět počet mikrokroků ms a úhel motoru sa, ale místo údajů o řemenu a řemenici zde uvádíme stoupání závitové tyče tp, neboli pokud provedeme jednu otáčku tyčí, o kolik se posune tisková hlava. Opět uvedeme příklad. Předpokládejme, že máme stejný motor i ovladač jako v předchozím případě, ale závitová tyč má stoupání 0, 8 mm (stoupání M5 závitové tyče), pak motor na ose Z musí udělat 4000 kroků, aby tisková hlava stoupla o 1 mm. Podobným způsobem je potřeba zkalibrovat i kroky na motoru tiskové hlavy, neboli extruderu. Zde je velice důležité, aby bylo dávkování přesné. Na kalibraci extruderu nám závisí i kvalita vytištěných objektů. Správné dávkování je důležité pro správné určení množství plastu, které se má vytlačit, aby byla dosažena linka o správné výšce a tloušťce. V tomto případě můžeme použít vzorce pro výpočet kroků: stepse =
( 360 sa · ms) · hd · π
tb ts
17
1. Rešerše kde máme, mimo parametry určující vlastnosti motoru, ještě parametry tb , určující počet zubů velkého kola, a ts , určující počet zubů malého kola, pro nastavení poměru těchto kol a hodnotu hd, což je průměr hnacího šroubu (mechanismus pohánějící materiál do trysky, nejčastěji šroub s soustruženou hnací hrohlubní). Mnohem jednodušší způsob je ale počet kroků na extruderu změřit, často také proto, že neznáme skutečný efektivní průměr hnacího šroubu. Měříme tak, že nastavíme ve firmwaru nějakou výchozí hodnotu, řekněme 700 (kroků na mm). Zavedeme do tiskové hlavy materiál, uděláme si na materiálu značku, necháme tiskárnu vytlačit například 100 mm materiálu, změříme kolik bylo skutečně do tiskové hlavy vtlačeno a výchozí hodnotu vynásobíme poměrem skutečnosti oproti požadované délce. Pokud nám například vyjde, že tiskárna vtlačila do trysky namísto 100 mm pouze 90 mm, vypočítáme nový počet kroků jako 700· 100 90 . Tím získáme novou hodnotu, kterou přepíšeme do firmware. Nově nastavený parametr otestujeme stejným způsobem a případně upravíme. Měření opakujeme do té doby, než je dávkování přesné. Postup je také znázorněn na obrázku 1.7a. Původně umístěná značka je nakreslena oranžovou barvou a její posun je znázorněn zelenou barvou. Nás zajímá rozdíl těchto dvou vzdáleností od tiskové hlavy.
1.3.3.2
Rychlosti a teploty
V této kapitole trochu předběhneme, protože budeme popisovat ve skutečnosti parametry, které se nastavují ve slicovacím software (viz kapitola 1.4.3). Nicméně se opět jedná o parametry, které lze nastavit jednou a již neměnit. Rychlost tisku je možné si přednastavit v několika variantách, varianty nejsou cílem této kapitoly. Cílem je přiblížit co může způsobit chybné nastavení základní rychlosti tisku. Příliš vysoká rychlost tisku může způsobit, že termoplast nebude dostatečně chladnout a objekty se poté budou deformovat. Na obrázku 1.7b je vidět, že postupným ubíráním základní tiskové rychlosti lze výrazně zlepšit výsledek tisku. Toto je bohužel parametr, který nelze předem jednoznačně určit a je potřeba přizpůsobit možnostem tiskárny a použitému materiálu (nepočítaje prostředí ve kterém je tiskárna umístěna). Teplota při tisku je parametr, který se určuje na míru především použitému materiálu. Nebudeme zde zmiňovat konkrétní teploty, protože ty jsou skutečně různé pro použité termoplasty, a dokonce i pro různé tiskové hlavy. Ale i pokud máme nastavenu správnou rychlost tisku, může se nám při vysoké teplotě stát, že objekty budou přehřáté a výsledky budou velice podobné prvnímu objektu zleva na obrázku 1.7b. Při nízké teplotě se nám naopak může stát, že tisková hlava přestane podávat materiál, protože tryska nebude mít 18
1.3. Co předchází tisku dostatečnou teplotu na natavení plastu. To způsobí zaprvé možné vynechání tisku, tedy díry v objektu, a zadruhé že se nám vrstvy dostatečně nezapečou do sebe. Jak jsme zmínili v kapitole 1.1.2.3, dostatečné zapečení je důležité pro výslednou pevnost objektu. Tím, že dodržíme správnou tiskovou teplotu materiálu lze dosáhnout vyšší pevnosti objektů i v rizikových místech, jako jsou tiskové vrstvy.
(a) Měření kroku extruderu
(b) Postupná kalibrace rychlosti tisku
Obrázek 1.7: Kalibrace tiskárny Oba tyto parametry lze velice těžko určit a je nutné je kalibrovat na základe zkušeností. Vzhledem k tomu, že tisk je časově náročný, vzniká na naší fakultě v rámci rozvojového projektu mladých týmů interaktivní databáze již takto vytištěných objektů. V této databázi bude možné změnit parametr, například teplotu a okamžitě vidět jak dopadl výsledek, bez nutnosti následného tisku.
Ověření všech správně nastavených parametrů pak provedeme tím, že vytiskneme testovací objekt. Ideálně takový, co má dostatečné rozměry, na kterých se dá měřit odchylka. Například podle všech os 10 cm. Výsledek tisku poté změříme a parametry tiskárny případně upravíme podle odchylky. 19
1. Rešerše
1.4
Proces 3D tisku
V předchozích kapitolách jsme si popsali, jaké formáty se pro tisk používají, jaké máme i druhy tiskáren a v neposlední řadě, velice okrajově, jak je potřeba tiskárnu připravit, aby byla tisku schopná. Nyní bychom si měli říci, jaký je vlastně dnes postup člověka, který chce nějaký objekt vytisknout. Opět připomínáme, že se jedná o postup ve světe OpenSource a hlavně projektu RepRap. Budeme se tedy zabývat nástroji volně dostupnými pod licencí GPL nebo freeware. Celý proces, vynecháme-li vytváření modelu a kalibraci zařízení, které jsme popsali v kapitole 1.3, můžeme rozdělit na čtyři po sobě jdoucí kroky (znázorněno na obrázku 1.8). První co musíme udělat, je zkontrolovat vstupní soubor (mesh), zda neobsahuje chyby, umístit ho na vhodnou pozici na tiskové ploše a podle potřeby natočit. Následně z připravené správné meshe vygenerovat tiskovou dávku pro tiskárnu, tedy GCode příkazy. Na závěr musíme tento soubor vytisknout.
Kontrola 3D mesh
Správná rotace a umístění
Slicing
Tisk
Obrázek 1.8: Workflow 3D tiskaře
20
1.4. Proces 3D tisku
1.4.1
Kontrola 3D mesh
Základem dobrého tisku je dobrý model. K tomu je také zapotřebí aby vygenerovaná mesh byla bez chyby, nebo aby chyb bylo co možná nejméně. Nic nedokáže zkazit náladu (a protáhnout dobu přípravy) více, než špatná 3D mesh. Některé jsou způsobeny špatným exportem z softwaru, který jsme použili pro modelování, ale drtivé většině z nich se předejít dá. Co myslíme chybou si popíšeme dále v této kapitole. Je potřeba mít na paměti, zejména při navrhování modelu, že objekt musí být v reálném světě vyrobitelný/reprezentovatelný. Tedy nesmí jít o návrh vhodný pouze na renderování. Každá stěna musí mít objem a celý objekt musí byl hmotný. Pokud bychom vygenerovali mesh, která by obsahovala dva protínající se trojúhelníky, může se nám to sice při generování náhledu k něčemu hodit, ale v reálném světě neuděláme rovinu o tloušťce 0 mm.
1.4.1.1
Orientace normály
V kapitole 1.3.2 jsme uvedli, že 3D mesh a konkrétně STL formát je popis objektu složeného z trojúhelníkových stěn. Každá tato stěna může a nemusí mít uveden normálový vektor. Pokud uveden není, tak je dopočítáván následovně při načítání. Tedy neměl by vzniknout problém. Chyba ovšem vzniká, pokud normálový vektor uveden je, ale je uveden špatně. V tomto případě se nabízejí dvě opravy. Jedna možnost je normálový vektor nastavit na (0, 0, 0), nebo druhá možnost, opravit hodnotu na správnou. Ze zkušeností můžeme říci, že pokud je vektor uveden špatně, směřuje pouze na špatnou stranu, místo aby směřoval ven z objektu, směřuje dovnitř. Tedy není nic jednoduššího, než jeho hodnotu „obrátit“. Jinými slovy, potřebujeme obrátit jeho orientaci v prostoru. To nejsnáze uděláme tak, že příslušný vektor vynásobíme skalárem −1. Vzorec pro opravu chybně orientovaného vektoru tedy pak bude: vr = −1 · vm , kde vm je chybně orientovaný vektor a vr je výsledný správně orientovaný. 1.4.1.2
„Děravá“ mesh
Další chybou, která se již ale nevyskytuje tak často a je způsobena především špatným návrhem modelu. Při samotném exportu se tak málokdy stane. „Dírou“ v modelu myslíme chybějící část pláště, tedy jedné nebo více stěn (v našem případě trojúhelníku). Při renderování náhledů je tato chyba zanedbatelná a často přehlédnuta, ale pro 3D tisk je to poměrně problematické. Jak jsme zmínili výše, objekt musí být hmotný a musí mít nějaký objem. Chybějící část pláště nám ovšem tuto podmínku rozbije a programy připravující GCode neví, kde je vně a kde uvnitř objektu.
21
1. Rešerše Pro lepší představu se můžeme podívat na konkrétní příklad zobrazen na obrázcích 1.9. Zde je objekt koule, které chybí v plášti několik stěn (znázorněno žlutým ohraničením). Při renderování obrázku by nám to až tak nevadilo, protože by stačilo kouli otočit o 180 stupňů a ona díra by nebyla vidět. Ovšem když model načteme v programu na přípravu GCode, program celý objekt rozřeže na vrstvy. Ve vrstvách, které jsou ve výšce chybějících stěn nastane problém, který je znázorněn na druhém obrázku (1.9b). Vrstva je tvořena pouze pláštěm o teoretické tloušťce 0 a není poznat co je vnitřní a co vnější část objektu. Pro program je tedy problém určit, ve které části má být výplň. Často tak dochází k tomu, že v těchto vrstvách buď chybí výplň úplně, nebo je vrstva zcela prázdná, jelikož stěnu o tloušťce 0 mm nelze v reálném světě vyrobit.
(a) Model
(b) Řez vrstvou
Obrázek 1.9: Neuzavřená 3D mesh
1.4.1.3
Duplicitní trojúhelníky
Podobně jako předchozí problém, chybějící trojúhelníky, jsou problémové i trojúhelníky, které sdílí stejný prostor. Taková situace by neměla nastat. Ovšem není tak problematická, abychom ji potřebovali nutně vyřešit před slicováním. Některé programy tuto chybu automaticky opraví tím, že v zadané toleranci sloučí trojúhelníky. Tedy ze dvou či více na jednom místě se stane jeden. 1.4.1.4
Hrana má víc než 2 stěny
Každá hrana v modelu by měla mít přesně dvě stěny. Pokud napojíme na sebe dva trojúhelníky, nikdy nedostaneme hranu, která má více než dvě na sebe navázané stěny. Pokud model tuto podmínky splňuje, pak říkáme, že je 22
1.4. Proces 3D tisku 2-manifold. Představme si modelový příklad, kdy máme dvě kostky jež sdílí jednu hranu, neboli jejich jedna hrana je na stejných souřadnicích. Pokud bychom těmito dvěma kostkami provedli řez, dostaneme vrstvu vypadající jako na obrázku 1.10. Označená hrana má dokonce 4 na sebe napojené stěny. Tuto chybu je nejlepší řešit již při návrhu modelu a stěny od sebe oddělit, alespoň mezerou v řádech 0,0001 mm, tedy pod rozlišovací schopnosti tiskárny, pokud chceme aby se hrany skutečně dotýkaly, ale nebyly spojené v modelu. Případně vytvořit přesah, aby bylo jasné už z modelu, že hrany mají být spojené.
Sdílená hrana
Obrázek 1.10: Chyba kdy má hrana více než 2 stěny
1.4.1.5
Náprava chyb
Výše jsme si popsali chyby kterým se dá předejít částečně v návrhu modelu a částečně i výběrem vhodného software pro export. Co když ale žádnou takovou šanci nemáme? Co dělat, když máme k dispozici pouze model, který již chyby obsahuje a nemáme přístup k návrhu, abychom ho opravili? V takovém případě dochází na software, který se zabývá opravou takové „rozbité“ meshe. My zmíníme dva programy, které toto umožňují. Oba poskytují dostatek nástrojů k opravě souborů meshe, nicméně jeden je OpenSource a druhý komerční. Netfabb Studio [6] je komerční variantou softwaru na opravu a manipulaci s 3D meshí. Je možné v něm model načíst, vizuálně zobrazit, téměř libovolně modifikovat a opravovat chyby. Software poskytuje v základní neplacené verzi následující možnosti oprav: • Uzavírání děr v meshi – pokud detekuje, že v plášti objektu chybí nějaké trojúhelníky, dokáže tyto díry zacelit. V náhledu pak jsou nepropojené 23
1. Rešerše hrany trojúhelníků znázorněny žlutou barvou, stejně jako je tomu na obrázku 1.9. Toto je také možno opravit „ručně“ pomocí nástroje přidat trojúhleníky. • Spojování trojúhelníků – v zadané toleranci propojí nepropojené hrany. Chyba, která vzniká především při exportu. Hrana je sice zdánlivě na stejném místě, ale krajní body trojúhelníků mohou být od sebe vzdáleny v řádech tisícin milimetru. V reálném světě nám tato chyba nevadí, ale ve virtuálním světě při vytváření tiskové dávky by pak mohl nastat problém, protože se opět jedná o díru v meshi. • Otáčení trojúhelníků – neboli oprava převrácených trojúhelníků. Opět máme na výběr, zda je obrátit „ručně“ nebo automaticky. Program detekuje vnější plášť objektu a všechny špatně orientované trojúhelníky jsou znázorněny červenou barvou. Automatická oprava všechny tyto trojúhelníky převrátí, čili opraví jejich normálový vektor. • Odstranění duplicit – neboli odstranění trojúhelníků sdílejících stejný prostor. Vše výše uvedené nám pokrývá opravy chyb, které jsme již zmínili. Mimo možnosti spustit tuto opravu každou zvlášť disponuje netfabb Studio také automatickými skripty pro opravu, ve kterých postupně provede všechny výše uvedené a ještě řadu dalších analýz. Ve verzi professional pak umožňuje například kompletní redefinici trojúhelníků celého objektu nebo propracovanější automatické opravy. Dokonce je možné v této verzi i ovládat samotnou tiskárnu. Dostaneme tak pěkné ucelené řešení. Společnost netfabb nabízí také webovou službu pro automatické opravy meshí. Jednoduše nahrajete svůj soubor na jejich server, na pozadí serveru proběhne serie automatických oprav a jako výsledek máte k dispozici odkaz na stažení opraveného souboru. Ovšem u objemných meshí je tato varianta zdlouhavá kvůli nutnosti nahrát data na server. Zvláště pak na pomalé datové lince je jednodušší mít aplikaci nainstalovanou lokálně. ADMesh [14] je obdobným nástrojem jako netfabb Studio, ale jedná se o OpenSource software. Mimo manipulace se samotnou STL meshí, jako je škálování, rotace a přesun, umožňuje opravy stejně jako výše uvedené komerční řešení. Program nemá GUI, ale funguje jako aplikace s příkazové řádky. Je tak velice snadno napojitelný na skripty automatických oprav a díky své otevřenosti ho lze zakomponovat i do své aplikace, jako jsme to udělali i v rámci této práce.
24
1.4. Proces 3D tisku Díky přednastaveným parametrům lze program jednoduše spustit s parametrem, který určuje název souboru a aplikace se nám postará o automatickou opravu. Můžeme si poté vybrat, zda chceme soubor uložit binárně nebo v ASCII podobě. Pokud se podíváme trochu pod pokličku jedné z funkcí programu ADMesh, a to opravy orientace normály, zjistíme následující: Program pro každý facet, neboli trojúhelník, nejprve vypočítá normálový vektor, který by měl správně být podle vzorce: nn = v1 × v2 , kde v1 = b − a, v2 = c − a Vzorec odpovídá výpočtu skalárního součinu dvou vektorů. Abychom mohli vypočítat normálový vektor nn , potřebujeme nejprve znát vektory, které jsou rovnoběžné s hranami trojúhelníku v1 a v2 . Ty vypočítáme jako rozdíl vždy dvou krajních bodů jedné hrany. Pokud je původní normálový vektor trojúhelníku v toleranci (|nn −no | < 0, 001), pak je vše v pořádku a můžeme pokračovat dále. Pokud v toleranci není, musíme pokračovat v ověřování, co je špatně. Dále může nastat situace, že vektor je v toleranci, ale má opačné hodnoty, tedy jeho orientace je nesprávným směrem. V tom případě stačí pouze vynásobit vektor skalárem -1, jako jsme to již zmínili v kapitole 1.4.1.1. V případě, že normála není vůbec uvedena, resp. no = (0, 0, 0), je potřeba tento vektor nahradit nově vypočítaným. Pro hloubavého čtenáře jsou dostupné zdrojové kódy aplikace [14].
1.4.2
Kontrola tisknutelnosti modelu
Tisknutelnost je pojem který může být vyložen různými způsoby. Může být například chápán jako snaha vytisknout objekty v reálném světě nereprezentovatelné, jako například nekonečné schodiště, nebo různé jiné grafické hrátky, použitelné pouze díky renderování do 2D obrazu. V našem případě tím ale myslíme hlavně problém výroby objektu při zohlednění fyzikálních vlastností termoplastů. Ne vše totiž lze bez újmy na výsledku vyrobit. Přiliš tenká stěna je prvním problémem, na který bychom mohli při tisku velice tvrdě narazit. Musíme totiž brát v potaz, že tiskárna, kterou používáme, má tiskovou hlavu, na níž je tryska s určeným průměrem. Bohužel ale nelze přesně vyrobit stěnu o síle menší než je tento průměr. Pro názornost si představme, že máme trysku s průměrem 0,4 mm. Pokud bychom chtěli vyrobit stěnu o síle 0,2 mm museli bychom také zároveň vyrobit v každé vrstvě linku o této síle. Průměr trysky nám ale bohužel nedovolí takového dávkování docílit. Dá se tedy říci, že minimální síle stěny našeho objektu je určena průměrem trysky. Což ale neplatí u stěny, která je vodorovná s rovinou XY. V této rovině dokážeme sílu stěny kontrolovat přesněji, protože výška vrstvy je teoreticky 25
1. Rešerše nezávislá na průměru trysky, ale závisí pouze na naší schopnosti dostatečně jemně dávkovat materiál. Přiliš malá základna je další z problémů, který může při tisku nastat. Kvůli principu technologie vytlačování termoplastu je nutné, aby objekty byly v průběhu tisku pevně přichyceny na tiskovou podložku. K tomu je zapotřebí, aby ideálně měly co největší plochou základnu, která bude dostatečně přilne na povrch tiskové plochy. Naším cílem tedy je natočit objekt takovým způsobem, aby rovná základna byla co největší. Toto je zároveň jeden z parametrů, který budeme v této práci používat k určení správné rotace objektu. Tomuto problému se dá částečně vyhnout použitím vygenerované mřížky, na kterou bude následný objekt tisknut. Této generované základně říkáme raft. U slicovacího softwaru poté můžeme určit, z kolika vrstev bude tato základna složena. Negativní dopad to má však na vzhled objektu. Strana na které bude objekt při tisku postaven bude mít po odstranění z podložky nevzhledné vroubkování od mřížky. Snažíme se tedy docílit toho, abychom měli základnu co největší a nemuseli použít žádnou dodatečnou strukturu pro ukotvení. Příliš velký převis je jeden z hlavních problémů tisku technologií FFF. Převisem myslíme část objektu, která by byla tištěna bez jakékoliv podpory do vzduchu. Nemusí se vždy jednat o schod přímo do vzduchu, ale může jít například o objekt, který se od základny nahoru rozšiřuje. Toto rozšíření je pak vždy definováno nějakým úhlem. Díky technologii stavění po vrstvách jsme schopni do určitého úhlu převis vytvořit tím, že každá vrstva přidá drobný přesah. V závislosti na materiálu a na podmínkách, ve kterých tiskárna pracuje (chlad, teplo, větrno) se schopnosti tiskárny u tisku převisů liší. Obecně ale můžeme říci, že žádná tiskárna na bázi FFF by neměla mít problém zvládnout stoupání 45◦ od základny. Pokud bude tento úhel menší, je nutno domodelovat nebo dogenerovat podpůrnou konstrukci, která převis podepře a bude tak sloužit jako provizorní základna pro rizikovou část objektu. Toto řešení ale přináší opět nevzhledný výsledek tisku a zbytečně použitý materiál, který musíme po tisku obrousit. Analýza těchto problémových částí může být provedena přímo v některých programech na slicování. Pokud ovšem chceme předejít takovým problémům a máme možnost zasáhnout do modelu nebo alespoň do meshe, ideálním nástrojem na to je Blender [3]. Pomocí doplňku [4] lze snadno detekovat například příliš tenkou stěnu nebo převisy, které by mohly způsobit problémy při tisku. Není cílem této práce detailně popisovat všechny možnosti toolboxu, ale na obrázcích ukázku zde uvedeme dva mechanismy pro kontrolu modelu. Více informací lze získat z výukového DVD [24] určeného právě k vysvětlení toho, jak Blender co nejlépe využít pro 3D tisk.
26
1.4. Proces 3D tisku
(a) zvýrazněné příliš tenké stěny
(b) zvýraznění převisů
Obrázek 1.11: Detekce problémů v Blenderu [4]
1.4.3
Slicing
Další nedílnou součástí workflow je příprava GCode. Tedy tiskové dávky, kterou tiskárna následuje krok po kroku. Této přípravě říkáme slicing. Je to proces, při kterém je 3D mesh načtena, poté rozřezána na jednotlivé vrstvy a v každé vrstvě je vypočítána trajektorie podle nastavených parametrů. Existuje řada implementací tohoto zpracování. My zmíníme pouze některé z nich. 1.4.3.1
GCode
Základem technologie FFF je zejména ovládání tiskové hlavy a jejího pohybu v prostoru. K tomu slouží univerzální jazyk GCode. Jedná se o jazyk pro ovládání CNC15 zařízení jako jsou například obráběcí stroje. Příkazy jsou nejčastěji po seriové lince zasílány mikropočítači, který je převádí na instrukce pro motory. My si zde uvedeme pouze některé. Pro účely této práce není potřeba znát úplné detaily tohoto jazyka. Detailní popis každé instrukce, kterou používají tiskárny RepRap najdeme na stránkách projektu[20]. Struktura GCode příkazu je následující: každá řádka kódu značí jeden příkaz uvozený znakem N po kterém následuje kontrolní součet příkazu, dále pak znak označující typ příkazu, G, M nebo T , a parametry příkazu. V tiskárnách typu RepRap se příkazy rozdělují na několik druhů. Druh příkazu se určuje podle uvozujícího znaku. M příkazy nejčastěji slouží k nastavení nebo výpis nějakého parametru celé tiskárny, jako například příkaz M104, nastavující teplotu trysky. G příkazy jsou pak příkazy převážně pohybu a práce s pozicí tiskové hlavy. T poté slouží ke změně nástroje v případě, že máme více tiskových hlav. 15
Computer Numeric Control = počítačem číslicově ovládané zařízení
27
1. Rešerše Další způsob rozdělení příkazů je na tzv. buffered a unbuffered. Buffered příkazy jsou okamžitě označovány za potvrzené/provedené a uloženy v lokální paměti zařízení. Vzniká tedy prodleva mezi tím, co zobrazuje ovládací software a co tiskárna skutečně dělá za příkaz. Typický zástupce je příkaz G0, označován jako rapid move, tedy rychlý pohyb. Tento příkaz je okamžitě přijat a řídící elektronika začne vysílat impulzy do krokových motorů. Jelikož na RepRap tiskárnách nejsou žádné senzory o aktuální pozici (přidává zbytečně na složitosti zařízení), není ani možné elektronikou potvrdit, zda tisková hlava skutečně dojela na požadované souřadnice. Unbuffered příkazy naproti tomu nejsou potvrzeny elektronikou, dokud není příkaz proveden. Hlavní zástupci jsou hlavně M příkazy. Protože jsme v kapitole příprava objektu, tak bychom také měli zmínit proč vlastně onen GCode potřebujeme k přípravě objektu. Důvod je prostý, potřebujeme nějakým způsobem vytvořit sérii GCode příkazů, pomocí které tiskárna dokáže vyrobit námi požadovaný objekt z předloženého modelu. Celou přípravou tiskové dávky se budeme zabývat v sekci 1.4.3. Nyní si pouze na ukázce 1.3, demonstrujeme jak vypadá kód pro vyrobení obvodové čáry o rozměrech 10x10 mm a výšce 0,3 mm. Nejprve je vidět, že tisková hlava pomocí příkazu G1 s parametrem Z0.3 vyjede do výšky 0,3 mm nad tiskovou základnu, poté se opět pomocí série příkazů G1 přemisťuje po obvodu tisknutého objektu. Parametr F u příkazů určuje jakou rychlostí se má tisková hlava pohybovat a parametr E příkaz pro trysku, kolik plastu má cestou vytlačovat. G1 G1 G1 G1 G1 G1
Z0.3 X0 Y0 F1365.000 E0.28619 ; perimeter X0 Y10 E0.28618 ; perimeter X10 Y10 E0.28618 ; perimeter X10 Y0 E0.28514 ; perimeter X0 Y0 E0.28514 ; perimeter
Kód 1.3: Ukázka GCode
1.4.3.2
Společné parametry
Základní parametry jsou pro všechny programy připravující tiskovou dávku společné. Jedná se o nastavení, které je specifické pro technologii FFF. Všechny ovlivňují nějakým způsobem kvalitu tisku. Pokusíme se vysvětlit, co nám který způsobí. Výška vrstvy určuje po jak velkých vrstvách bude objekt růst. Jinými slovy na kolik vrstev se model bude řezat. Určuje nám zároveň kvalitu a rychlosti tisku samotného. Někdo by jistě mohl namítat, proč toto řešit, když můžeme, tak proč nenastavíme výšku vrstvy co nejmenší? Kvalita nám tím přece 28
1.4. Proces 3D tisku vzroste? Ano. Kvalita tisku nám v některých případech výrazně vzroste. Ale musíme také brát v úvahu dobu tisku. Pokud totiž nastavíme výšku vrstvy poloviční, čas nám vzroste přibližně dvojnásobně. Pokud řešíme tisk na 20 minut, tak nás to pravděpodobně trápit nebude, ale pokud na 20 hodin, tak je poměrně rozdíl, jestli má běžet tiskárna jeden, nebo dva dny. Je tedy důležité hledat kompromis mezi kvalitou a rychlostí tisku. Jak je znázorněno na obrázku 1.12, snižování výšky vrstvy není vždy výhra. Subjektivním pohledem dokonce můžeme tvrdit, že objekt s 0,1 mm výškou vrstvy je horší než s výškou 0,3 mm. Nutno podotknout, že toto je pouze ilustrační příklad. Pravděpodobně zde došlo k chybě v kalibraci tiskárny a buď byla příliš velká rychlost tisku nebo příliš vysoká teplota trysky.
Obrázek 1.12: Srovnání výšky vrstvy [16]
Tloušťka stěny je parametr, který se trochu liší v interpretaci. Některé programy ho určují podle zadaných milimetrů, jiné zase na počet obvodových vrstev. Pokud se podíváme na obrázek 1.3, můžeme si všimnout, že vrstva je složena ze dvou částí, výplně a obvodu objektu. A právě tento obvod se nastavuje parametrem tloušťka stěny. V některých slicerech můžeme přímo nastavit počet obvodových vrstev, neboli kolikrát tisková hlava „objede“ objekt, než začne tvořit výplň. U jiných nám stačí nastavit, jak silnou chceme mít stěnu v jednotkách mm a program následně rozhodne, kolik bude potřeba obvodových vrstev vyrobit. Počet se obvykle počítá na základě šíře linie, kterou tiskárna vytlačuje z trysky. Jak jsme zmínili v kapitole 1.4.2 minimální šíře této linie je určena šíří použité trysky. Výplň a její hustota je další z nastavení, které je společné pro všechny slicery. Zmínili jsme již v kapitole 1.1.2.3, že není nutné mít objekt zcela plný 29
1. Rešerše ani prázdný. V každém sliceru, které níže uvedeme, je možné si vybrat hustotu výplně. Proč ale hustotu výplně? To nemůžeme vše tisknout duté? Nebo plné? Samozřejmě, že plné vše tisknout můžeme. Víte ale kolik při tom spotřebujeme zbytečně plastu? U většiny objektů které tiskneme stačí pouze částečná výplň na to, aby bylo dosaženo požadované pevnosti. Pokud pak tiskneme například pouze předlohu pro formu, není nutné mít téměř žádnou podporu, pokud to tvar modelu nevyžaduje. V kapitole 1.4.2 jsme zmínili problém převisů. Ten se naneštěstí netýká pouze vnějších tvarů objektu, ale také například vrchní části objektů. To si představme například na ukázkovém modelu chobotnice [12]. Zde sice nemáme problém s převisy, protože model není příliš složitý, nicméně máme problém ve vrchní části objektu, pokud bychom chtěli vytvořit chobotnici zcela dutou. Vrchní část totiž vytvoří na vnitřní straně objektu převis, který už je problematický na tisk. Bylo by tedy potřeba vygenerovat nějakou podpůrnou strukturu. Pokud ovšem použijeme alespoň částečnou výplň, řekněme 10 %, máme již takovou strukturu v objektu vestavěnou. Pro představu jak vypadají různé typy a jejich hustoty můžeme vidět na obrázku 1.13. Rychlost tisku je samozřejmě také nastavitelná. Toto téma jsme již zmínili v kapitole 1.3.3.2, kde jsme upozornili na to, že je důležité nastavit správnou rychlost tisku kvůli výsledné kvalitě tisku. Jak je vidět na obrázku 1.12, záleží nejen na rychlosti, ale také na výšce vrstvy. Rychlost tisku je stejná a výsledek je výrazně jiný pro každou změnu výšky vrstvy. To samé by se nám ale stalo, kdybychom postupně zvyšovali rychlost tisku. Znázorněno je to na obrázku 1.7b, kde je postupně na rychlosti ubíráno, až je dosaženo požadovaného výsledku. Tento parametr je skutečně záležitost kalibrace. Můžeme si ovšem najít zkoušením například tři různé druhy nastavení, pro určení jednoho stupně kvality. Teplota trysky je další velice důležitý parametr pro výsledek tisku. Toto už je hodnota, kterou je potřeba kalibrovat pro každý druh plast zvlášť. Pokud použijeme například ABS plast, tak nejvhodnější teplota pro tisk je okolo 230◦ C. Pro PLA je to poté přibližně 190◦ C. Teplota tisku je velice problematické téma. Záleží velice na dodavateli materiálu, jakou směs plastu použije a jaké je ve směsi množství pigmentu určujícím barvu materiálu. Průměr použitého plastu je parametr, podle kterého software správně vypočítává dávkování materiálu. Není tedy moudré měření plastu podcenit. Ze zkušenosti můžeme říci, že se vyplatí měřit jeho přesnost alespoň na dvě desetinná místa. Špatný průměr plastu může způsobit hodně špatné výsledky tisku, v horším případě zasekávání motoru tiskové hlavy z důvodu nedostatečné teploty pro natavení materiálu, pokud uvedeme průměr plastu příliš malý oproti skutečnosti. V opačném případě, uvedeme–li průměr plastu pří30
1.4. Proces 3D tisku
Obrázek 1.13: Přehled vzorů a intenzity výplní [7] liš velký oproti skutečnosti, způsobí nám to, že bude tisková hlava dávkovat plastu příliš málo a objekty budou příliš křehké ve spojích vrstvy. 1.4.3.3
Software
Již v předchozích kapitolách jsme několikrát zmínili, že programy potřebné pro přípravu tiskové dávky nazýváme slicery. Těchto programů je více druhů a ač dělají všechny to samé, každý s trochu jiným přístupem. Zmíníme pouze tři různé softwary, které jsme použili k testování této práce. Náhledy jednotlivých programů najdeme v příloze A.10, A.11 a A.12 Slic3r je jedním z nejpoužívanějších slicovacích programů v RepRap komunitě. Jeho autorem je Alessandro Ranellucci, přičemž díky otevřenosti projektu je přispěvovatelů do projektu více. Jádro aplikace je napsáno v jazyku C++, 31
1. Rešerše GUI a testování pak v jazyku Perl. V aplikaci je rozděleno natavení tiskových parametrů na více částí. Nastavení tiskárny, plastu a samotného tisku. Není cílem této práce popisovat každý parametr aplikace, detailní popis je dostupný v manuálu [8]. Slic3r je možné ovládat i z příkazové řádky, díky tomu je možná jeho snadná integrace do řídící aplikace tiskárny. KISSlicer je zástupcem uzavřené skupiny slicerů. Jedná se o aplikaci umožňující mimo široké škály parametrů tisku i okamžitý náhled trajektorie každé vrstvy, výpočet spotřebovaného materiálu a i ceny celkového tisku. Ze zkušenosti můžeme říci, že tento slicer je nejlepší v oblasti generování tiskové dávky zcela dutých objektů. Cura slicer používáme v této práci jako jádro aplikace na detekci správné rotace. Díky otevřenosti projektu je možné použít knihovny, kterými Cura disponuje. Aplikace umožňuje nejenom načítání a slicování objektu, ale také detekcí převisů a schopností objekt položit na nejbližší velkou stěnu k podložce. Vytvoří se tím co největší tisková základna. V praxi jsme ale zjistili, že tato funkce ne vždy funguje správně. Nespornou výhodou oproti ostatním výše uvedeným je schopnost přímo ovládat tiskárnu. Jedná se tedy o jedno z ucelených řešení a jak později zjistíme vhodného kandidáta pro začlenění našeho algoritmu.
1.4.4
Tisk
Již jsme si popsali jak se připravuje tisková dávka, jaké jsou základní parametry slicovacích programů a jak vypadá výsledný GCode. Nic by nám tedy nemělo bránit spustit tisk. Jakým způsobem to uděláme si přiblížíme v této kapitole. V závislosti na možnostech tiskárny si můžeme vybrat jakým způsobem spustíme samotný tisk. Existuje sice nepřeberné množství řídících elektronik, ale všechny bez výjimky umožňují ovládání tiskárny za pomoci USB rozhraní a řídícího software. Takový software se pak připojí na sériový port elektroniky a zasílá jí příkazy tak jak jsou zapsány v GCode. Pokud přijde od elektroniky potvrzovací sekvence, zašle další. Takto, až dokud nedojde na konec tiskové dávky, nebo pokud nedojde k přerušení ze strany elektroniky či uživatele. Pokud nechceme mít tiskárnu stále připojenou přes sériovou linku k nějakému počítači, protože to vyžaduje spojení po celou dobu tisku, musíme zajistit, aby tiskárna byla schopna si tiskovou dávku uchovat a pracovat autonomně, bez zásahu počítače. Taková možnost je nahrát tiskovou dávku na paměťovou kartu. Po načtení karty elektronikou započne automaticky tisk vložených souborů ve správném formátu. 32
1.5. Současná řešení Printrun je soubor aplikací určených k přístupu k tiskárně a přípravě tisku. Všechny aplikace v souboru jsou psané v jazyku Python. Aplikace zvaná Pronterface umožňuje připojení k tiskárně pomocí sériového portu, ovládání tiskárny ve všech pracovních osách a spuštěné tiskové dávky. Náhled aplikace je dostupný na obrázku A.13. Po načtení tiskové dávky dojde k její analýze určené k odhadu doby tisku a množství spotřebovaného materiálu. OctoPrint je další aplikací určenou primárně pro ovládání tiskárny a spouštění tisku. Jedná se tentokrát ale o aplikaci v podobě webového serveru, který běží na počítači, ke kterému je připojena tiskárna. Stačí tedy mít vyhrazený počítač, který je možné mít trvale připojený k tiskárně a ovládání je možné například pomocí mobilního zařízení. Musíme ovšem nahrát tiskovou dávku. To provedeme přímo ve webovém prohlížeči volbou Upload. Server poté soubor zanalyzuje a odhadne jak dlouho bude tisk trvat a kolik bude potřeba materiálu. Ukázku rozhraní najdeme v přílože na obrázku A.14. Díky této aplikace ji také možné napojit webovou kameru přímo do rozhraní a sledovat tak tisk vzdáleně. V případě problému lze zasáhnout na dálku a tisk i přerušit.
1.5
Současná řešení
V současné době můžeme říci že ucelená řešení v podobě kontroly meshe, sliceru a rozhraní pro ovládání tiskárny jsou dvě. Obě aplikace jsme již zmínili. Jedná se o aplikace netfabb a Cura. netfabb Professional je aplikace komerční a verze profesional je placená. Lze stáhnout i verzi dostupnou freeware, ale ta nedisponuje důležitou částí a to je schopnost slicovat a ovládat tiskárnu. Kvůli nutnosti koupit licenci na tento produkt není aplikace určena pro každého. V další kapitole ale zmíníme, že ač se zdá, jedná se o ideální řešení a vyplatilo by se ji koupit, není tomu zcela tak. Jedna důležitá část jí chybí. Cura je aplikací skutečně všestrannou. Díky nedávno vytvořenému vlastnímu řešení sliceru (dříve totiž Cura používala, nepříliš oblíbený kvůli složitosti ovládání, Skeinforge [21]), je tato aplikace uceleným řešením od částečné analýzy modelu, až po ovládání tiskárny. Co této aplikace však chybí, tak je možnost opravit 3D mesh. Tedy chyby, které jsme si popsali v kapitole 1.4.1. Už teď si můžeme ale prozradit, že tento nedostatek se pokusíme v této práci napravit.
33
Kapitola
Návrh V předchozí kapitole jsme popsali, jaké máme technologie a jaký je dnes postup člověka, který chce vytisknout objekt na 3D tiskárně. Všechna současná řešení mají ale nějakou vadu, kvůli které není nikdy proces zcela automatický. Pokud pomineme kalibraci a přípravu tiskárny popsanou v kapitole 1.3, sestává postup vždy ze čtyři po sobě jdoucích kroků: • kontrola a případná oprava modelu, • určení optimální orientace vůči tiskové základně, • vytvoření tiskové dávky, • spuštění tisku V kapitole 1.5 jsme zmínili že existují aplikace jako netfabb [6] a Cura [22], které sjednocují některé z těchto kroků do jedné aplikace. Pokud vkročíme na pole komerčního řešení, tak aplikace netfabb poskytuje téměř vše co potřebujeme k tisku. V OpenSource světě je této aplikaci asi nejvíce podobná právě zmíněná Cura, která v sobě kombinuje slicer, možnost přípravy objektu na tiskové základně i spuštění tisku. Pokud oželíme ovládání tiskárny a předpokládáme nahrání dávky na paměťovou kartu, nebo ovládání přes webové rozhraní, pak je naším favoritem Slic3r [19], který provádí automatickou opravu pomocí vestavěné knihovny ADMesh [14].
2.1
Vymezení cíle
Cílem práce je, aby proces přípravy modelu k tisku byl co nejvíce uživatelsky přívětivý, tedy s co možná nejméně možnostmi nastavení v základním režimu a co možná nejvíce možnostmi v režimu expertním. 35
2
2. Návrh
2.2
Popis problému
Žádné z výše uvedených řešení ale nikdy nebude schopno pracovat zcela automaticky. Všechny mají společnou „vadu“, nedisponují totiž algoritmem, který by určil optimální rotaci objektu. Nejblíže tomu je aplikace Cura, která dokáže zobrazit graficky převisy spolu s možností natočení objektu na nejbližší plochou část podložce. Pokud máme tedy objekt, který je lehce natočen a plochá část objektu neleží přímo na základně, dokáže ho algoritmus na tuto plochu položit. Není to však ideální, protože se nám často stane, že plocha je detekována špatně a musíme objekt alespoň mírně natočit ručně, abychom docílili kýženého výsledku. Jak jsme zmínili v předchozím odstavci, zatím žádný software neřeší správnou orientaci zcela automaticky. Vždy je vyžadována nějaká interakce od uživatele. Naším cílem je tedy vytvořit algoritmus, který dokáže toto ideální natočení detekovat a aplikovat na 3D mesh. Abychom dosáhli co možná největší automatizace celého procesu musí všechny výše uvedené kroky spustit s předem nakonfigurovanými parametry a nechat algoritmus vše připravit, ideálně bez většího zásahu uživatele.
2.3
Popis řešení
Abychom docílili správného natočení objektu, musíme nejprve správně detekovat všechny potřebné parametry. K tomu potřebujeme, aby byla použitá mesh pokud možno bez chyb. Pomineme-li chyby v návrhu, dostáváme se k chybám, které lze celkem snadno opravit automaticky. Naše řešení bude sestávat z kroků znázorněných na diagramu 2.1. Nejprve je potřeba načíst vstupní model, opravit chyby ve 3D meshi, hlavně orientaci normálového vektoru a děravost pláště, analyzovat a detekovat nejlepší možnou rotaci objektu a výsledek uložit jako nový soubor, případně pouze vypsat parametry natočení.
Vstupní model
Oprava meshe
Detekce rotace
Obrázek 2.1: Diagram řešení problému rotace
36
Výsledek
2.3. Popis řešení
2.3.1
Použité technologie
Pro různé části algoritmu je možno použít různé technologie. Jako programovací jazyk jsme zvolili C++, kvůli rychlosti výsledné aplikace a kvůli použité technologii CuraEngine [23], která je dostupné rovněž v C++. Není cílem vymýšlet všechny algoritmy pro zpracování objektu znovu, proto se snažíme maximálně využít již dostupné technologie a zaměřit se spíše na řešení části která v těchto existujících řešeních chybí. Při výběru knihovny pro zpracování modelu jsme měli na výběr mezi řešením aplikace Slic3r a Cura. Oba tyto softwary používají v jádru aplikace C++, tedy implementace by byla v obou případech bez větších obtíží možná. Nakonec jsme zvolili část aplikace Cura, nazývanou CuraEngine. Důvod k tomuto rozhodnutí je takový, že Cura v sobě již obsahuje dvě z důležitých částí procesu tisku, vytvoření tiskové dávky a možnost ovládání tiskárny. Slic3r sice v novější verzi zvládá automatickým procesem opravit objekty, ale chybí zatím podpora přímého ovládání tiskárny. Vzhledem k tomu, že se snažíme o automatizaci celého procesu, zakomponování našeho algoritmu do této aplikace je logické. 2.3.1.1
C++
Jazyk C++ vyvinul Bjarne Stroustrup v Bell Labs začátkem 80. let. Jedná se o jazyk podporující procedurální, objektové i generické programování [18]. Díky přímému přístupu k paměti máme možnost pracovat detailněji s pamětí a můžeme tak velice ušetřit paměť například při používání pouze ukazatelů na model. C++ je možné psát ve více standardech. My jsme si pro tuto práci vybrali standard C++11 [27]. Vzhledem k nutnosti velice často procházet množství prvků ve 3D meshi, je možnost procházení pole pomocí kódu 2.1 velice přehledné. int pole[10]; for(int& i : pole) { }
Kód 2.1: Ukázka for cyklu ve standardu C++11
2.3.1.2
ADMesh
Aplikaci ADMesh [14] jsme již zmínili v kapitole 1.4.1.5. Pro připomenutí se jedná o OpenSource aplikaci určenou pro opravu 3D meshe. Právě díky otevřenosti je možné ji využít pro krok Oprava meshe v našem diagramu 2.1. Aplikace poskytuje řadu funkcí pro opravu modelu. Ne všechny pro naše účely potřebujeme, ale například oprava správné orientace trojúhelníků je pro naše výpočty stěžejní. 37
2. Návrh 2.3.1.3
CuraEngine
O aplikaci Cura jsme již hovořili v této kapitole. Aplikace je poskytována pod OpenSource licencí spolu s C++ jádrem nazvaným CuraEngine. Knihovna disponuje řadou operací s 3D meshí, jako je načítání, ukládání, aplikace transformační matice a hlavně možnost přímo objekt slicovat, což nám umožní provádět řezy objektem v zadané výšce. Získáme tím polygon reprezentující jednu vrstvu objektu, například základnu.
2.3.2
Načtení modelu
Tato část pro nás znamená projít celý soubor STL a načíst do struktury z knihovny CuraEngine, případně upravit. Jedná se o poměrně jednoduchou část algoritmu, protože stačí následovat definici datového formátu STL, kterou jsme popsali v kapitole 1.3.2.1. Datovou strukturu si popíšeme v kapitole ??. Práci máme ještě usnadněnou tím, že lze částečně použít procedury z CuraEngine.
2.3.3
Oprava meshe
Zde využijeme již hotové řešení v podobě ADMesh [14]. Není totiž nutné abychom přepracovávali již fungující algoritmy. ADMesh dostupný z [15] lze stáhnout a zkompilovat jako dynamickou knihovnu. To nám opět usnadňuje práci, protože není nutné zakomponovat zdrojové kódy do naší aplikace, ale pouze využít rozhraní popsané v hlavičkovém souboru stl.h. Opravou myslíme nastavení korektní orientace normály, zacelení děr v meshi, propojení rozpojených trojúhelníků a odstranění nespojených trojúhelníků.
2.3.4
Detekce rotace
Abychom mohli detekovat nejlepší rotaci pro vstupní model, je nutné si nejprve definovat podle čeho chceme, aby byly objekty ohodnoceny. Neboli budeme potřebovat výkonovou funkci, která nám určí jak kvalitní je rotace, kterou zkoumáme. Dříve než výkonovou funkci ale musíme definovat, co potřebujeme o rotaci vše vědět, abychom si v implementaci mohli správně definovat datovou strukturu pro uložení potřebných dat. Abychom dosáhli schopnosti otočit model podle všech os ve všech úhlech budeme předpokládat, že rotaci lze provést na základě vektoru v určujícího osu otáčení a úhlu α určujícího úhel, o který požadujeme objekt otočit. Pokud budeme tedy chtít model otočit podle osy X o 60◦ bude rotace definována jako: R = {v = (1, 0, 0), α = 60◦ }. Zobecněním tohoto příkladu dostáváme definici rotace: 38
2.3. Popis řešení
R = {(a, b, c), α}, kde |(a, b, c)| = 1, a, b, c ∈ h0; 1i, α ∈ h0; 360)
Touto kombinací atributů docílíme možnosti otočit s objektem ve všech směrech o libovolný úhel. Pro testování zakomponujeme do aplikace možnost vypočítat takto všechny kombinace těchto dvou atributů. Problém ovšem nastává, pokud budeme chtít docílit rovnoměrného rozložení. Nepředpokládáme-li, že vektor určující osu otočení není jednotkový, tedy jeho délka nemusí být 1, máme usnadněnou práci při generování kombinací. Můžeme totiž pustit testování v cyklu a zkoušet všechny kombinace tří složek vektoru. Bohužel při tomto postupu docílíme nerovnoměrnosti v rozložení těchto kombinací. Názorněji je to vidět na obrázku 2.2a (pro názornost zobrazujeme pouze ve 2D prostoru). Rovnoměrného rozložení lze dosáhnout dvěma způsoby. Pro každý úhel na jednotkové kružnici si vypočítáme složky vektoru jako goniometrické funkce a využijeme tak pravoúhlého trojúhelníku. Z matematického hlediska naprosto v pořádku. Nicméně jsme během testování aplikace zjistili, že jednodušší varianta je otočit vektor (1, 0, 0) podle osy (0, 0, 1) k dosažení rovnoměrného rozložení v rovině XY. Pokud otočení provedeme nejprve podle vektoru (0, 0, 1) a následně upravený vektor pootočíme ještě podle vektoru (0, 1, 0), dokážeme tak vytvořit všechny varianty os v 3D prostoru. Vzhledem k tomu, že vektor nám určuje osu, tedy přímku, která je nekonečná, k vytvoření os podle celé jednotkové kružnice nám stačí vytvořit vektory poloviny kružnice, tedy otočit v rozsahu h0; 180). Tím se nám zjednoduší výpočet, protože kombinací na testování bude polovina. Pro vytvoření kombinací celé jednotkové koule nám tedy stačí s vektorem vytvořit z těchto kombinací polokouli. Jako příklad předpokládejme objekt o rozměrech 20x20x10 mm (náhled v příloze na obrázku 2.3). Testovací objekt nemá ideální natočení. Bylo by potřeba ho otočit o 15◦ podle vektoru (1, 0, 0). Toto ale víme my, nikoliv algoritmus. Ten musí vyzkoušet v nejhorším případě všechny kombinace, aby zjistil, která z nich je nejlepší. Tím se dostáváme k problému ohodnocení, kterým jsme začali tuto kapitolu. Možností jak definovat výkon natočení je celá řada. My jsme zvolili ohodnocení, které se sestává ze tří parametrů: • velikost základny, • poměr celkové plochy převisů vůči povrchu pláště modelu, • největší úhel od kolmice na základnu v objektu. 39
2. Návrh
(a) kombinace pomocí složek vektoru
(b) kombinace pomocí otočení vektoru
Obrázek 2.2: Genrování kombinací osy rotace Velikost základny lze díky CuraEngine velice snadno vypočítat. V objektu provedeme řez ve výšce výšky první vrstvy, případně ve výšce 0, abychom viděli co se skutečně bude dotýkat základny, knihovna nám vrátí seznam polygonů, které tvoří základnu. Následně stačí sečíst obsah jednotlivých polygonů. Celkový obsah základny tedy bude: Sb =
n X
S(pi ),
i=0
Obrázek 2.3: Testovací objekt natočený o 15 stupňů podle vektoru (1, 0, 0) 40
2.3. Popis řešení kde n je počet polygonů ve vrstvě a pi je i-tý polygon vrstvy. S je poté funkce z knihovny CuraEngine počítající obsah polygonu. Poměr plochy převisů vůči povrchu pláště objektu lze definovat pouze tehdy, pokud máme zaveden správně pojem převis. V kapitole 1.4.2 jsme si říkali, že převis budeme brát, pokud α < 45◦ , kde α je úhel, který svírá stěna se základnou. Abychom našli takovou plochu stačí nám, když pro každý trojúhelník spočítáme, jaký úhel svítá se základnou. Toho lze snadno docílit, jelikož již máme díky ADMeshi správně uvedené normálové vektory. Stačí zjistit, jaký úhel svírá normálový vektor s rovinou XY pomocí vzorce: nz α = cos , |n|
kde n je normálový vektor trojúhelníku a nz je souřadnice Z normálového vektoru. Tímto zjistíme velikost úhlu a můžeme tedy detekovat, zda se jedná o převis nebo ne pomocí jednoduché podmínky α < 45◦ . Pokud ano, zvýšíme obsah převisů o obsah tohoto trojúhelníku. Nakonec vytvoříme poměr ploch převisů a plochy celého povrchu. Pokud je poměr 0, znamená to, že není detekován žádný převis, a takového stavu se snažíme dosáhnout. Pokud máme vypočítán úhel α, můžeme rovnou hledat nejmenší takový úhel. Protože čím menší úhel svírá trojúhelník s podložkou, tím horší převis pro tiskárnu to je. Tedy hledáme min(α), ∀α ∈ A, kde A je množina všech úhlů v modelu. Ideální rotace je taková, která má ohodnocení: • maximální velikost základny • minimální poměr převisů (ideálně žádný) • maximální úhel svírající stěna s kolmicí na základnu Řešíme tedy optimalizační problém popsaný konfiguračními proměnnými vektor v a úhel α, jak jsme uvedli výše vzorcem pro rotaci R. Hodnotící funkci navrhneme jako lineární kombinaci množiny hodnotících proměnných: fr = α · B + β · (1 − ro ) + γ · amax ; α, β, γ ∈ R, kde B je velikost základny, ro je poměr převisů k celkovému povrchu pláště a amax je největší úhel v modelu, který svírá stěna s kolmicí na základnu. Snažíme se hledat takové ohodnocení, pro které je fr maximální. Pro určení způsobu řešení si provedeme vizualizaci prostoru všech kombinací (obrázek 2.4) konfiguračních proměnných. Na první pohled vidíme, že prostor je velice 41
2. Návrh
(a) velikost základny
(c) nejvyšší úhel
(b) poměr převisů
(d) kombinace všech atributů
nejlepší
nejhorší
Obrázek 2.4: Stavový prostor kombinace osy otáčení a úhlu
42
2.3. Popis řešení složitý i pro jednoduché objekty jako je testovací objekt znázorněný na obrázku 2.3. Na obrázcích jsou zobrazeny vizualizace, kdy je pomocí přechodu bílá–černá zobrazena vždy hodnota pro konkrétní kombinaci rotace a osy otáčení. Na obrázku 2.4d je poté vizualizována kombinace hodnotících proměnných, kde každá reprezentuje jednu složku RGB barevného prostoru. Nejlepší výsledky jsou tedy zobrazeny bílé (255, 255, 255) a nejhorší možný výsledky černé (0, 0, 0). Celý stavový prostor je příliš složitý na standardní metody nelineární optimalizace i pro triviální objekty. Když nebude optimalizace provedena, mu
2
seli bychom projít hrubou silou všech 180 · 360 sv sr kombinací, kde sv je krok, o který budeme posouvat osu otáčení na jednotkové kouli, jak je vysvětleno v předchozí části této kapitoly, a sr je krok, o který budeme při iteraci měnit úhel otočení modelu. Pokud použijeme sv = sr = 1 dostáváme 11 664 000 kombinací, což by bylo řešitelné v rozumném čase pouze na mnohojádrovém počítači s vysokou úrovní paralelizace. V domácích podmínkách nám při testování tento výpočet běžel několik hodin. Za tu dobu už bychom měli poměrně složitý objekt dávno vytištěný, kdybychom detekovali rotaci ručně. Proto potřebujeme nějaký způsob optimalizace. Na základě provedené vizualizace jsme se rozhodli pro použití genetického algoritmu pro řešení problému rotace.
Genetický algoritmus [11] se obecně skládá z několika kroků, které se provádí v cyklu, jak je znázorněno na obrázku 2.5. Nejprve náhodně vytvoříme populaci o určité velikosti, ohodnotíme každého jedince a poté opakujeme sérii genetických operátorů v určeném počtu iterací. Genetické operátory jsou: • Selekce – výběr jedinců ze současné populace řešení • Křížení – křížení vybraných jedinců • Mutace – náhodná mutace jedince Pro implementaci genetického algoritmu je nutné přizpůsobit datovou strukturu. Tedy implementovat v našem algoritmu všechny potřebné genetické operátory. O konkrétním zakódování genu jednoho jedince (rotace) budeme hovořit v kapitole 3 spolu s konkrétními implementacemi genetických operátorů. Zde zmíníme pouze variantu genetického operátoru selekce, který jsme pro náš algoritmus vybrali. U operátoru selekce existuje více způsobů jak docílit výběru jedinců do nové generace. My jsme přistoupili na formu selekce turnajové. Její průběh je znázorněn na pseodokódu 2.6. Jedná se o postup, při kterém je z populace vybráno 43
2. Návrh 1: 2: 3: 4: 5:
6: 7: 8: 9:
create an initial population P0 (usually random) evaluate the fitness of each invidivual in P0 for g in range 1 .. gmax do create a new empty population Pg take individuals from Pg−1 using the selection operator and copy them into the new population Pg either directly or using crossover and mutation operators evaluate the fitness of each individual in Pg replace the old population Pg−1 by the new population Pg end for return best-ranked individual from Pg Obrázek 2.5: Pseodokód genetického algoritmu (generační model) [9]
1: 2: 3: 4: 5: 6:
take N random individuals from the population if random real number ∈ h0, 1) < 0.95 then return individual with the best fitness else return random individual end if Obrázek 2.6: Algoritmus turnajové selekce [9]
vždy náhodně N jedinců, vygenerováno náhodné číslo v intervalu h0, 1), a pokud je hodnota menší než hodnota selekčního tlaku (v případě ukázky 0, 95), je vybrán nejlepší jedinec z N vybraných do nové generace. Jinak vybereme náhodně.
2.3.5
Výstup algoritmu
Aplikace je určena pouze pro příkazovou řádku. Do budoucna chceme aby byla zakomponována do aplikace Cura. Aktuálně máme několik možností výstupu aplikace: • textový výstup s informací o vektoru a stupni rotace, • výpis transformační matice pro model, • přímé uložení modelu do nového souboru. Je také možné zapnout rozšířený režim výpisu, ve kterém bude aplikace vypisovat v jakém stavu se právě algoritmus nachází.
44
Kapitola
Implementace V předchozí kapitole jsme si popsali, jaké používáme technologie a základní princip algoritmu pro výběr ideální rotace objektu. Nyní bychom si měli říci konkrétně, jak jsme k tomuto způsobu řešení přistupovali. Nejprve si vizualizujeme, jak jsou jednotlivé části naší aplikace propojeny na diagramu tříd, popíšeme jednotlivé části aplikace a uvedeme příklady použití důležité pro následující kapitolu zabývající se testováním.
3.1
Struktura tříd
V této kapitole si popíšeme třídy v naší aplikaci a jejich funkci v celém projektu. Aplikace nevyžaduje příliš komplexní strukturu tříd, ale důležitější je pro nás optimalizace pomocí genetického algoritmu. Vzhledem k tomu, že využíváme již hotové třídy a funkce z externích knihoven CuraEngine a ADMesh, model se nám výrazně zjednodušuje. Jádro naší aplikace můžeme na diagramu najít pod názvem MeshAlyzer. V diagramu kvůli přehlednosti úmyslně neuvádíme všechny metody a atributy tříd. Detailní výčet nalezneme v následujících kapitolách určených pro konkrétní třídy a příloze.
3.1.1
NormaledModel
Začněme třídou, bez které by realizace aplikace nebyla možná, a to třída, jejíž struktura umožňuje uložit celou 3D mesh. Třída je potomkem třídy SimpleModel z knihovny CuraEngine. Používáme vlastní dědění hlavně kvůli již implementovaným metodám pro hledání minima a maxima v objektu a kvůli možnosti pracovat s objektem typu SimpleModel přímo v CuraEngine bez nutnosti převodu. Rozšíření původní třídy bylo nutné proto, že původní SimpleModel nebere, kvůli jednoduchosti, v úvahu normálový vektor. Ten pokud by byl potřeba je možné dopočítat na základě bodů trojúhelníku, pro naše účely je ale zbytečné vždy znovu počítat hodnotu, která se používá na mnoha 45
3
3. Implementace
ADMesh
CuraEngine FMatrix3x3
FPoint3
SimpleFace
Point3
SimpleVolume
SimpleModel
1 3
MeshAlyzer NormaledModel applyRotation(rotation); 1
point
volumes
normal
*
Rotation
NormaledVolume 1 faces *
NormaledFace
1
1
analyzeRotation(model); computeVector(XYangle,Zangle); crossoverWith(Rotation); mutate(); rotate(angle); rotateVectorXY(angle); rotateVectorYZ(angle);
RotationFitness Solver detectBestRotation(model);
SolverBruteForce
SolverGentics
Rotater calculateBaseSize(model); computeMatrix(vector,angle); detectOverhangs(model,threshold); faceAngle(face);
Obrázek 3.1: Diagram tříd
46
1
1
fitness
3.1. Struktura tříd místech. Doplnili jsme tedy třídu o schopnost uchovávat trojúhelníky včetně normálového vektoru. Rozšířením třídy je i schopnost aplikovat na model rotaci reprezentovanou třídou Rotation, jež obsahuje všechny potřebné informace včetně transformační matice pro body v meshi. Stejně jako původní SimpleModel obsahuje i třída NormaledModel kolekci (vektor) všech těles (volumes) v meshi. Kvůli jednoduchosti používání disponuje třída velkým množstvím přetížených konstruktorů. Metoda s názvem applyRotation provede přepočet všech souřadnic trojúhelníků na základě zadané rotace, která obsahuje i transformační matici. Pro každý bod meshe je tedy aplikována transformace implementována i knihovně CuraEngine, vracející transformované souřadnice bodu.
3.1.2
NormaledVolume
Jak jsme zmínili v předchozí kapitole, třída NormaledModel v sobě uchovává tělesa, která jsou uložena ve 3D meshi. Těchto těles může být v celé meshi libovolný počet. Každé z nich obsahuje množinu trojúhelníků, které tvoří plášť tělesa. Tyto trojúhelníky jsou reprezentovány třídou NormaledFace. Metody min a max vrací hraniční body meshe na ose Z. Tedy nejvyšší a nejnižší bod objektu. Na základě nejnižšího bodu lze poté určit, v jaké výšce bude řez základnou modelu.
3.1.3
NormaledFace
Třída, jejíž instance v sobě ukládá všechny potřebné informace o trojúhelníku z tělesa meshe.
3.1.4
Rotation
Instance třídy Rotation v sobě nese veškeré informace o rotaci. V souvislosti s genetickým algoritmem se jedná o jednoho jedince. Třída je složena z atributů: • úhel rotace vektoru v rovině XY • úhel rotace vektoru v rovině Y Z • vektor určující osu otáčení • úhel rotace podle osy otáčení • transformační matici, podle které je možné provést modifikace celého modelu 47
3. Implementace • fitness, neboli parametry hodnotící kvalitu rotace Instance třídy sama o sobě nenese informaci o modelu, ale dokáže vypočítat hodnotící parametry při předložení modelu metodě analyzeRotation. Tato metoda nejprve vytvoří kopii původního modelu reprezentovaného instancí třídy NormaledModel, aplikuje rotaci a za pomoci třídy Rotater vypočítá hodnotící parametry a uloží je do instance struktury RotationFitness.
3.1.5
RotationFitness
Struktura, která v sobě nese informace o kvalitě rotace. Jedná se o hodnotící parametry používané k porovnávání dvou rotací (jedinců). Třídu využíváme hlavně k ukládání tří hodnotících parametrů: velikost základny, poměr převisů v modelu a největší úhel kolmice na základnu a stěny modelu. Pomocí těchto tří parametrů poté dokážeme určit, která ze dvou rotací je lepší. Vzhledem k tomu, že předem neznáme nejlepší parametry celého stavového prostoru, musíme přistoupit k úpravě hodnotícího algoritmu a vytvořit určitou formu turnaje. Turnaj probíhá ve třech zápasech. V každém z nich se porovnají dva parametry a vítěz získá dva body. Pokud jsou hodnoty stejné, získají obě rotace jeden bod. Body jsou ve výsledku sečteny a vítězí rotace s vyšším počtem bodů. Tato implementace se nám ale zpočátku neosvědčila, protože kvůli chybu v detekci převisů a závislosti na limitním úhlu 45◦ jsme získali nejlepšího jedince, který měl všechny parametry nulové. Což je pro tisk problematické, jelikož by objekt neměl žádnou stabilní základnu. Proto jsme museli doplnit podmínku v případě nulové velikosti základny, a to odečtení dvou bodů z hodnocení. Tímto se degradují rotace, které neposkytují žádnou tiskovou základnu.
3.1.6
Rotater
Tato třída je pouze podpůrná a všechny její metody jsou statické. Obsahuje pomocné funkce na výpočet transformační matice na základě osy otáčení a úhlu, detekci převisů v modelu, výpočet velikosti základny a určení úhlu stěny (trojúhelníku). Pomocí této třídy tedy vypočítáme všechny hodnotící parametry rotace. Výpočet transformační matice [26] probíhá na základě osy otáčení určené vektorem (l, m, n) a úhlu otočení θ:
ll(1 − cos θ) + cos θ ml(1 − cos θ) − n sin θ nl(1 − cos θ) + m sin θ lm(1 − cos θ) + n sin θ mm(1 − cos θ) + cos θ nm(1 − cos θ) − l sin θ ln(1 − cos θ) − m sin θ mn(1 − cos θ) + l sin θ nn(1 − cos θ) + cos θ Touto transformační maticí je následně vynásobený každý bod v modelu, což nám vytvoří rotovaný objekt dle zadaných parametrů. 48
3.2. Oprava meshe
3.1.7
SolverBruteForce
Dle popisu v kapitole 2.3.4 jsme vytvořili algoritmus, který vytvoří všechny kombinace na základě zadaných parametrů jako krok rotace ve třech směrech. Všechny takové rotace jsou prozkoumány a vybrána ta nejlepší možná. Jak bylo vidět na obrázku 2.4d takových rotací může být i více a v takovém případě je vybrána první nalezená, protože mají všechny stejné ohodnocení, budou stejně kvalitní a je nám tedy jedno kterou z nich použijeme. Použití tohoto řešení problému je velice časově náročné. Při měření testovacích objektů byly i triviální objekty počítány v řádech hodin.
3.1.8
SolverGenetics
Třída poskytující prostředí pro řešení problému pomocí genetického algoritmu. Jakým způsobem algoritmus konkrétně pracuje si popíšeme v kapitole 3.3. Tato třída nám umožňuje připravit si počáteční populaci a provádět iterace vygenerováním nové generace za použití genetických operátorů. Zároveň obsahuje konfigurační proměnné genetického algoritmu. Což jsou: • počet iterací algoritmu, • velikost populace v počtu jedinců v každé generaci, • velikost turnajové selekce, • počet elitních jedinců pro přesun do další generace, • pravděpodobnost křížení, • pravděpodobnost mutace, • síla mutace.
3.2
Oprava meshe
Oprava vstupního souboru je důležitým krokem, než začneme pracovat s 3D meshí, protože jak jsme si řekli v kapitole 1.4.1, mesh může obsahovat velké množství chyb, které nám způsobí chybu v detekci některých ohodnocení a případně netisknutelnost objektu. Proto potřebujeme mesh co nejlépe, ale zároveň automaticky, opravit. K tomu nám slouží funkce z knihovny ADMesh. Oprava sestává z následujících kroků: • Propojení blízkých nespojených trojúhelníků. • Odstranění nepřipojených stěn, neboli stěn, které jsou navíc. • Uzavření všech děr v plášti těles meshe. • Oprava normálových vektorů trojúhelníků meshe. 49
3. Implementace
3.3
Genetický algoritmus
Třída Rotation je upravena pro použití v genetickém algoritmu implementací základních operátorů mutace a křížení. Mutaci je možné provádět s parametrem určujícím její sílu. Pokud tedy zadáme, že chceme aby rotace mutovala například se silou 21 bude to znamenat, že jednomu ze tří úhlů v rotaci (rotace vektoru podle rovin XY nebo Y Z, rotace modelu podle osy otáčení) se upraví podle vzorce: anew = randomh0; 2π · m), kde m je síla mutace a funkce random vrací náhodnou hodnotu z uvedeného intervalu. Genetický operátor křížení je implementován tak, že vybereme z obou jedinců úhly uvedené výše, tedy rotace vektoru podle rovin XY , Y Z a rotaci podle osy otáčení, a v intervalu jejich hodnot vybereme pro nového jedince náhodnou hodnotu. Výpočet nových hodnot poté pobíhá podle vzorce: achild = randomhmin(ap1 , ap2 ); max(ap1 , ap2 )i, kde ap1 je úhel prvního jedince a ap2 je úhel jedince druhého. Toto provedeme pro všechny tři úhly v rotaci. Když máme definovány dva základní operátory, můžeme přistoupit k implementaci samotného algoritmu. Jak napovídá pseodokód na obrázku 2.5 v předchozí kapitole, potřebujeme nejprve vytvořit počáteční populaci. Toho docílíme snadno za pomoci operátoru mutace. Předpokládejme, že dokážeme vytvořit první rotaci objektu s výchozími parametry, kde jsou všechny tři úhly rotace nulové. V takovém případě bude rotace vypadat následovně: R0 = {(1, 0, 0), 0◦ }. Znamená to tedy, že neprovedeme žádnou rotaci. Dále nám pak stačí opakovat v cyklu mutaci o síle 1 a od této rotace vytvořit náhodně počáteční populaci. Cyklus opakujeme, dokud nedosáhneme požadované velikosti populace. Generujeme tedy nové jedince, dokud currentPopulation.size() < populationSize. Pokud máme počáteční populaci, neboli nultou generaci, je vytvoření další generace. To provedeme tak, že vybereme ze současné generace jedince, kteří jsou vhodní pro křížení a mutaci. Nejprve však využijeme parametru elitismu a tolik nejlepších jedinců, kolik je tento parametr přesuneme přímo do nové generace. Tím zajistíme, že nebudou použiti pro křížení a ani nebude prováděna mutace. Ke křížení je nepoužíváme proto, abychom zamezili degeneraci a zároveň abychom neztratili současné nejlepší řešení, které by mohlo vlivem mutace zmizet z populace. Ze zbytku tedy potřebujeme vybrat jedince určené 50
3.3. Genetický algoritmus pro křížení a mutaci. To provedeme za použití turnajového výběru popsaného v kapitole 2.3.4 a na obrázku 2.6. Ke každém turnaji vybereme tolik jedinců, kolik nám určuje parametr velikost turnajové selekce a nejlepšího jedince zkopírujeme do množiny jedinců vybraných pro další operace. Vlivem selekčního tlaku se nám ale může stát, že tento jedinec nebude vždy nejlepší, ale zcela náhodný. Turnaj opakujeme dokud nemáme jedinců vybraných tolik, jako je velikost populace − elita. Nyní máme připravenu množinu jedinců, které již můžeme křížit. Pomocí operátoru implementovaného ve tříde Rotation můžeme vždy vybrat náhodně dva jedince a s určenou pravděpodobností je křížit. Jinými slovy, parametr pravděpodobnost mutace nám říká, s jakou pravděpodobností budou mít dva jedinci dva potomky. Do nové generace poté jdou pouze potomci, které ještě s určitou pravděpodobností zmutujeme. Pravděpodobnost mutace je dalším z parametrů algoritmu. Celou novou generaci musíme ještě ohodnotit naší hodnotící funkci, jejímž výstupem jsou tři parametry udávající kvalitu jedince. Takto připravenou novou generací můžeme nahradit tu současnou a celý cyklus opakovat, dokud nedosáhneme určeného počtu iterací (generací). Z finální N té generace pak stačí vybrat nejlepšího jedince a to je naše požadované řešení.
51
Kapitola
Testování Testování aplikace jsme prováděli ve dvou fázích. Nejprve bylo nutné otestovat samotný porovnávací algoritmus, zda správně hodnotí rotace. Toho bylo docíleno spuštěním aplikace s řešením hrubou silou, neboli vyzkoušením celého stavového prostoru, na sérii testovacích objektů. Ovšem výpočet pro jeden i triviální objekt trval přibližně 10 hodin. Pro výzkumné účely je toto sice možné aplikovat, protože tak dostaneme vždy nejlepší možné řešení, nicméně pokud chceme aplikaci, která je pro uživatele snadná na ovládání a nenáročná na procesorový čas, musíme dobu výpočtu značně redukovat. Ideálně, aby výpočet trval v řádech vteřin. K tomu nám slouží optimalizace pomocí genetického algoritmu popsaného detailně v kapitolách 2.3.4 a 3.3. Vzhledem k tomu, že algoritmus lze konfigurovat více parametry, je nutné otestovat které parametry mají vliv na výsledek a které ne. K tomu jsme využili schopnost naší aplikace přijímat přímo z příkazové řádky hodnoty parametrů genetického algoritmu. Bylo tak možné provést sérii testů, které uvedeme níže. Parametry k otestování a jejich výchozí hodnoty: • počet iterací – 500 • velikost populace – 500 • velikost selekčního turnaje – 10 • počet elitních jedinců – 5 • pravděpodobnost křížení – 0,5 • pravděpodobnost mutace – 0,5 • síla mutace – 0,5 53
4
4. Testování Abychom dostatečně ověřili vliv parametrů, testovali jsme každý z nich v intervalech uvedených níže. Každý parametr byl, kvůli eliminaci chyby vzniklé náhodností algoritmu měřen v cyklu stokrát a byl vybrán median naměřených hodnot. Ve všech uvedených grafech byla data normalizována do intervalu h0; 1i, abychom docílili vyváženosti hodnot. • počet iterací = h100; 5000i, krok cyklu je 100 • velikost populace = h500; 2500i, krok cyklu je 100 • velikost selekčního turnaje = h2; 50i, krok cyklu je 1 • počet elitních jedinců = h1; 20i, krok cyklu je 1 • pravděpodobnost křížení = h0, 0; 0, 9i, krok cyklu je 0, 1 • pravděpodobnost mutace = h0, 0; 0, 9i, krok cyklu je 0, 1 • síla mutace = h0, 0; 0, 9i, krok cyklu je 0, 1 V grafech je černou přerušovanou čarou zobrazen největší úhel v objektu, červenou velikost základny a zelenou přerušovanou čarou je uveden poměr převisů. Modrou plnou čarou je pak proložena aproximovaná křivka, která vznikla kombinací obou atributů. Počet iterací má při všech ostatních výchozích hodnotách vliv až od vysokých hodnot, jak je vidět na grafu 4.1. U takto vysokých hodnot je již ale výpočetní doba okolo 70 vteřin. Poměr převisů v tomto grafu není uveden, protože po seřazení naměřených hodnot vyšla konstantní hodnota, která nemá vliv na výslednou křivku. Velikost populace je další parametr u kterého poměr převisů nehraje roli, jelikož se ustálil na konstantní hodnotě. Nicméně v grafu 4.2 je již pro pořádek uveden. Velikost turnajové selekce se zdá být podle grafu 4.3 velice špatný parametr pro změnu a ideální je nechat na původní hodnotě 5. Elitismus po proložení aproximované křivky grafem 4.4 vyšlo, že nehraje příliš velkou roli. Pravděpodobně bychom mohli zkusit v příští verzi místo jednotek pro tento parametr zadat poměr vůči celkové populaci. Pravděpodobnost křížení je podle grafu 4.5 parametr, který dosahuje dobrých výsledků ve výpočtech již od hodnoty 0,2. Když se ale zaměříme na všechny parametry, začne dosahovat nejlepších výsledků ve všech parametrech až při hodnotě 0,8. 54
1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 0
500
1000
1500
2000
2500 Iterace
3000
3500
4000
4500
5000
Obrázek 4.1: Graf závislosti počtu iterací na úspěšnosti algoritmu
1.2
1
0.8
0.6
0.4
0.2
0
−0.2 500
1000
1500 Populace
2000
2500
Obrázek 4.2: Graf závislosti velikosti populace na úspěšnosti algoritmu
55
4. Testování
1.2
1
0.8
0.6
0.4
0.2
0
−0.2 0
5
10
15
20
25 Velikost turnajove selekce
30
35
40
45
50
Obrázek 4.3: Graf závislosti velikosti turnajové selekce na úspěšnosti algoritmu
1.2
1
0.8
0.6
0.4
0.2
0
−0.2 0
2
4
6
8
10 Elitismus
12
14
16
18
20
Obrázek 4.4: Graf závislosti elitismu na úspěšnosti algoritmu
56
1.4
1.2
1
0.8
0.6
0.4
0.2
0 0
0.1
0.2
0.3
0.4 0.5 Køí ení
0.6
0.7
0.8
0.9
Obrázek 4.5: Graf závislosti pravděpodobnosti křížení na úspěšnosti algoritmu Pravděpodobnost mutace je podle grafu 4.6 velice významný parametr, který zvýší rapidně úspěšnost (až na 100% všech parametrů), pokud ho nastavíme na hodnotu 0,8. 1.2
1
0.8
0.6
0.4
0.2
0
−0.2 0
0.1
0.2
0.3
0.4 0.5 Mutace
0.6
0.7
0.8
0.9
Obrázek 4.6: Graf závislosti pravděpodobnosti mutace na úspěšnosti algoritmu
Sílu mutace ideálně nastavujeme podle grafu grafu 4.6 do středních hodnot okolo 0,5, abychom dosáhli dobrých výsledků. 57
4. Testování
1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 0
0.1
0.2
0.3
0.4 0.5 Sila mutace
0.6
0.7
0.8
0.9
Obrázek 4.7: Graf závislosti síly mutace na úspěšnosti algoritmu Pokud upravíme náš algoritmus podle naměřených hodnot, tedy: • počet iterací – 2000 • velikost populace – 1500 • velikost selekčního turnaje – 5 • počet elitních jedinců – 5 • pravděpodobnost křížení – 0,8 • pravděpodobnost mutace – 0,8 • síla mutace – 0,5 dosahuje náš algoritmus úspěšnosti ideálního stavu přibližně 96 %
58
Závěr Cílem této práce bylo zmapovat současné možnosti automatizace procesu 3D tisku, navrhnout systém umožňující tuto automatizaci, implementovat a otestovat na sadě objektů. V rešeršní části práce jsme zmapovali současné možnosti aplikací určených pro přípravu modelů pro 3D tisk a zjistili jsme, že velká část je již připravena a dostupná v OpenSource variantě. Při zkoumání možností automatizace celého procesu jsme narazili na netriviální problém rotace objektu tak, aby byl co nejlépe přizpůsoben tisku. Tento problém jsme se pokusili nejprve vyřešit algoritmem hrubé síly, který se ukázal, jak jsme předpokládali, jako vysoce neefektivní. Nastoupil tedy návrh a implementace optimalizace v podobě genetického algoritmu. Ten se nám i po drobných problémech se zaokrouhlovací chybou v knihovně CuraEngine, podařilo úspěšně implementovat. Díky OpenSource knihovnám, které používáme, nebylo nutné navrhovat a implementovat celý proces přípravy modelu tisknutelné podoby, ale pouze námi nalezený problém rotace. Po otestování námi navrženého algoritmu byla aplikace schopna s naměřenou kombinací atributů dosáhnout úspěšnosti detekce rotace až 96%. Nicméně doba běhu aplikace je stále okolo 2 minut, proto bude do dalších verzí potřeba optimalizace, například v podobě paralelizace algoritmu. Dalším možným rozšířením aplikace je implementovat další problémy přípravy, jako automatická detekce tiskových parametrů. Další verze algoritmu je plánována integrovat do ovládacího rozhraní aplikace Cura, abychom docílili požadovaného zapouzdření celého procesu.
59
Literatura [1]
3DSystems: the sugar lab [online]. [cit. 3.5.2014]. Dostupné z: http:// the-sugar-lab.com
[2]
Autodesk, I.: Tinkercad [online]. [cit. 2.1.2014]. Dostupné z: http:// tinkercad.com
[3]
Blender [online]. [cit. 4.5.2014]. Dostupné z: http://www.blender.org
[4]
3D Printing toolbox[online]. [cit. 4.5.2014]. Dostupné z: http: //wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/ Modeling/PrintToolbox
[5]
Cubehero [online]. [cit. 2.1.2014]. Dostupné z: http://www.cubehero.com
[6]
netfabb GmbH: Netfabb [online]. [cit. 4.5.2014]. Dostupné z: http:// www.netfabb.com
[7]
Hodgson, G.: Infill Patterns and Density [online]. [cit. 4.5.2014]. Dostupné z: http://manual.slic3r.org/InfillPatternsAndDensity.html
[8]
Hodgson, G.: Slic3r Manual [online]. [cit. 4.5.2014]. Dostupné z: http: //manual.slic3r.org/
[9]
Hordějčuk, V.: Jazyk LaTeX – Sazba kódu a pseudokódu [online]. [cit. 6.5.2014]. Dostupné z: http://voho.cz/wiki/informatika/jazyk/ latex/latex-pseudokod/
[10] Hull, C.: Apparatus for production of three-dimensional objects by stereolithography. Březen 11 1986, uS Patent 4,575,330. Dostupné z: https: //www.google.com/patents/US4575330 [11] Hynek, J.: Genetické algoritmy a genetické programování. Pr˘ uvodce (Grada), Grada, 2008, ISBN 9788024726953. Dostupné z: http:// books.google.cz/books?id=RFlXh5Fd_7MC 61
Literatura [12] MakerBot: Cute Octopus Says Hello[online]. [cit. 2.1.2014]. Dostupné z: http://www.thingiverse.com/thing:27053 [13] MakerBot: Thingiverse.com [online]. [cit. 2.1.2014]. Dostupné z: http: //www.thingiverse.com [14] Martin, A. D.: Aplikace ADMesh [online]. [cit. 4.5.2014]. Dostupné z: http://www.varlog.com/admesh-htm [15] Martin, A. D.: Knihovna ADMesh [online]. [cit. 4.5.2014]. Dostupné z: https://github.com/admesh/admesh [16] Mckenzie, N.: Tips & Tricks: Why Layer Height Matters [online]. [cit. 4.5.2014]. Dostupné z: http://arduinoblog11.blogspot.cz/2012/04/ prusa-tips-tricks-why-layer-height.html [17] OpenSCAD Manual [online]. [cit. 2.1.2014]. Dostupné z: http:// en.wikibooks.org/wiki/OpenSCAD_User_Manual [18] Prata, S.; Sokol, B.: Mistrovství v C+. Bestseller (Computer Press), Computer Press, 2004, ISBN 9788025100981. Dostupné z: http:// books.google.cz/books?id=trzbAAAACAAJ [19] Ranellucci, A.: Slic3r [online]. [cit. 4.5.2014]. Dostupné z: http:// slic3r.org/ [20] RepRap wiki [online]. [cit. 2.1.2014]. Dostupné z: http://www.reprap.org [21] Aplikace Skeinforge [online]. [cit. 4.5.2014]. Dostupné z: http:// fabmetheus.crsndoo.com [22] Ultimaker: Cura [online]. wiki.ultimaker.com/Cura
[cit.
4.5.2014].
Dostupné
z:
http://
[23] Ultimaker: CuraEngine [online]. [cit. 4.5.2014]. Dostupné z: https:// github.com/Ultimaker/CuraEngine/ [24] Veenvliet, D.: Blender for 3D Printing[online]. [cit. 4.5.2014]. Dostupné z: http://www.macouno.com/category/projects/blender-for3d-printing/ [25] Wikipedia: Adrian Bowyer — Wikipedia, The Free Encyclopedia. 2013, [Online; cit 4.5.2014]. Dostupné z: http://en.wikipedia.org/w/ index.php?title=Adrian_Bowyer&oldid=558081238 [26] Wikipedia: Transformation matrix — Wikipedia, The Free Encyclopedia. 2014, [Online; cit 6.5.2014]. Dostupné z: http://en.wikipedia.org/w/ index.php?title=Transformation_matrix&oldid=596645759 62
Literatura [27] Wikipedie: C++11 — Wikipedie: Otevřená encyklopedie. 2014, [Online; navštíveno 5. 05. 2014]. Dostupné z: http://cs.wikipedia.org/w/ index.php?title=C%2B%2B11&oldid=11277336 [28] Zalm, E.: RepRap firmware Marlin [online]. [cit. 3.5.2014]. Dostupné z: https://github.com/ErikZalm/Marlin
63
Příloha
Obrázky
Obrázek A.1: Ukázka 3D modelu [12]
65
A
A. Obrázky
Obrázek A.2: Ukázka výtisku
66
Obrázek A.3: Princip technologie Sterolitografie
Obrázek A.4: Princip práškového tisku
67
A. Obrázky
Obrázek A.5: Princip tiskové hlavy u FFF/FDM
68
Obrázek A.6: Princip technologie FFF/FDM: 1 – Tisková hlava, 2 – Již nanesený materiál, 3 – Tisková základna
69
A. Obrázky
Obrázek A.7: Model tiskárny RepRap Rostock
70
Obrázek A.8: Ukázka vygenerovaného STL pomocí kódu 1.2
V3
N
V2
V1 Obrázek A.9: Příklad normálového vektoru
71
A. Obrázky
Obrázek A.10: Rozhraní aplikace Slic3r
Obrázek A.11: Rozhraní aplikace KISSlicer
72
Obrázek A.12: Rozhraní aplikace Cura
Obrázek A.13: Rozhraní aplikace Pronterface
73
A. Obrázky
Obrázek A.14: Rozhraní aplikace OctoPrint
74
Příloha
B
Výčet atributů a metod tříd Tato příloha obsahuje výčet všech atributů a metod tříd v projektu.
B.1
NormaledModel
atributy • volumes vector
– atribut uchovávající množinu všech těles meshe
metody • NormaledModel() • NormaledModel( stl_file& stl_in ) • NormaledModel(NormaledModel& nm) • NormaledModel(NormaledModel& nm, Rotation& rotation) • NormaledModel(NormaledModel& nm, FMatrix3x3 & matrix) • NormaledModel(NormaledModel& nm, FPoint3 vector, double angle) • NormaledModel(SimpleModel& sm) • NormaledModel(SimpleModel& sm, Rotation& rotation) • NormaledModel(SimpleModel& sm, FMatrix3x3 & matrix) • NormaledModel(SimpleModel& sm, FPoint3 vector, double angle) • void applyRotation(Rotation& rotation) 75
B. Výčet atributů a metod tříd
B.2
NormaledVolume
atributy • faces vector – atribut uchovávající množinu všech trojúhelníků tělesa
metody • NormaledVolume() • NormaledVolume( SimpleVolume& vol ) • Point3 min() • Point3 max()
B.3
NormaledFace
atributy • v[3] Point3 – body specifikující trojúhelník • normal FPoint3 – normálový vektor
metody • NormaledFace(Point3 & v0, Point3 & v1, Point3 & v2, FPoint3 & norm) • NormaledFace(SimpleFace& sf, FPoint3 & norm)
B.4
Rotation
atributy • m_matrix FMatrix3x3 – transformační matice pro aplikaci rotace • m_angle double – úhel rotace podle osy otáčení, uvedený v radiánech • m_xyAngle double – úhel o kolik je otočena osa otáčení vůči vektoru (0, 0, 1) • m_zAngle double – úhel o kolik je otočena osa otáčení vůči vektoru (0, 1, 0) • m_vector FPoint3 – jednotkový vektor určující osu otáčení • m_fitness RotationFitness – fitness, neboli ohodnocení rotace 76
B.5. RotationFitness
metody • Rotation() • Rotation(Rotation& second) • Rotation(double angle) • Rotation(FPoint3 vector) • Rotation(FPoint3 vector,double angle) • Rotation(double XYAngle, double ZAngle, double rotAngle) • void rotate(double angle) • void setRotation(double angle) • void rotateVectorXY(double angle) • void rotateVectorYZ(double angle) • void setVector(FPoint3 newVector) • void setVector(double XYAngle, double ZAngle) • FPoint3 computeVector(double XYAngle, double ZAngle) • void analyzeRotation(NormaledModel *m,ConfigSettings* config) • FMatrix3x3 & transformationMatrix() • Rotation* mutate() • Rotation* mutate(double amount) • Rotation* sover(Rotation& leftParent,Rotation& rightParent)
B.5
RotationFitness
atributy • m_overhangRatio double – poměr převisů vůči povrchu pláště celého objektu • m_baseSize double – velikost tiskové základny • m_maxOverhang double – nejvyšší úhel vůči kolmici na tiskovou základnu 77
B. Výčet atributů a metod tříd
metody • RotationFitness() • RotationFitness(double overHangRatio,double baseSize,double maxOverhang) • bool operator<(RotationFitness& a,RotationFitness& b) • bool operator>(RotationFitness& a,RotationFitness& b) • bool operator<=(RotationFitness& a,RotationFitness& b) • bool operator>=(RotationFitness& a,RotationFitness& b) • bool operator==(RotationFitness& a,RotationFitness& b)
B.6
Rotater
metody • Rotater() • FMatrix3x3 computeMatrix(FPoint3 unitVector, double angle) • std::vector<SimpleFace*> detectOverhangs(SimpleModel *m, int supportAngle, int layerHeight, double *overhangRatio, double* maxOverhang) • std::vector detectOverhangs(NormaledModel *m, int supportAngle, int layerHeight, double *overhangRatio, double* maxOverhang) • double calculateBaseSize(Slicer *slicer) • double calculateBaseSize(NormaledModel *model, ConfigSettings& config) • double faceAngle(SimpleFace* face, double* faceArea) • double faceAngle(NormaledFace* face, double* faceArea) • void roundFPoint(FPoint3 & point)
B.7
SolverBruteForce
atributy • m_angleStep double – krok určující po jak velkých rotacích má cyklus postupovat 78
B.8. SolverGenetics
metody • SolverBruteForce() • SolverBruteForce(double angleStep) • Rotation* detectBestRotation(NormaledModel* normModel, ConfigSettings& config) • void setAngleStep(double angleStep)
B.8
SolverGenetics
atributy • currentPopulation std::vector* – množina jedinců v současné populaci • g_iterationNumber int – počet iterací genetického algoritmu • g_populationSize int – počet jedinců v každé generaci • g_selectionAmount int – selekční tlak • g_eliteAmount int – počet elitních jedinců • g_crossoverProbability double – pravděpodobnost křížení • g_mutationProbability double – pravděpodobnost mutace jedinců v nové generaci • g_mutationAmount double – síla mutace
metody • SolverGenetic() • Rotation* detectBestRotation(NormaledModel* normModel, ConfigSettings& config) • void initPopulation() • std::vector* iterateGeneration() • std::vector* doSelection(int selectionSize) • std::vector* doCrossover(std::vector* selectedPopulation)
79
Příloha
Seznam použitých zkratek FFF Fused filament fabrication FDM Fused deposition modeling/method ABS Akrylonitrilbutadienstyren CAD Computer-aided design CSG Constructive solid geometry PLA Polylactic acid PCL Polycaprolactone PVA Polyvinylalkohol SLA Stereolitography SLS Selective laser sintering STL Stereolitography/Standard Tessellation Language UV Ultrafialové záření
81
C
Příloha
Obsah přiloženého CD
MeshAlyzer.1 ....................................... Manuál k aplikaci src impl...................................zdrojové kódy implementace thesis ...................... zdrojová forma práce ve formátu LATEX text ....................................................... text práce DP_Zehra_Marek_2014.pdf .............. text práce ve formátu PDF 83
D