Hugmynd
Hugmyndin varð til þegar ég var að reyna að finna hugmyndir að lokaverkefni úr rafvirkjun í Fjölbrautaskóla Vesturlands Akraness. Ég sá myndband af Jeff Bezos með hanska sem stjórnaði róbot arm og skemmti sér konungslega. Ég vissi að ég vildi taka að mér flott og metnaðarfullt lokaverkefni og datt mér í hug að gera það sem ég sá í myndbandinu með því sem ég hafði aðgengi að.
Planið var nokkuð einfalt: þrívíddarprenta róbota arm, nota myndavél til að finna staðsetningu handar, reikna miðað við staðsetningu handar hvar róbotinn ætti að vera, og finna hvernig hver mótor þarf að snúa til að koma arminum þangað.
Róbot armur
Armurinn var prentaður á Ender 3 3D prentara. Ég hannaði hann ekki sjálfur, sem betur fer. Val á róbot arm snerist aðallega um einfaldleika og lítinn kostnað annars búnaðs, eins og mótorar og legur. Armurinn gat teygt sig áfram og upp, ásamt þess að geta snúist, sem gaf honum ágætt svæði til að hreyfa sig um. Hann var einnig með „gripper“ á enda handar til að geta gripið og fært hluti. Það var stýrt með sér minni mótor.
Skynjun handar
Ég ætlaði nú ekki að fara að finna upp hjólið í computer vision, þannig ég nýtti mér mediapipe. Mediapipe er pakki frá Google sem gerir mannig kleift að finna staðsetningu handa, líkamshluta og andlita með myndum, myndböndum eða beinu streymi úr myndavél. Upprunalega var planið að keyra þetta á Raspberry Pi með myndavél tengda í. En eftir að hafa fengið það til að virka var nokkuð ljóst að smátölvan var ekki nógu öflug til að keyra mediapipe í Python. Þá fór ég beint í plan B, sem var að keyra Python scriptuna í fartölvunni minni og nota myndvélina á henni, og senda upplýsingar um hvernig mótorarnir ætti að hreyfa sig á Arduino Uno tölvu í gegnum USB.
Mediapipe skilar af sér mörgum punktum af hendinni, en ég hafði bara áhuga á nokkrum. Hnúi löngutangar var góður miðjupunktur til að finna X og Y hnit handarinnar. X og Y hnit komu bara frá því að finna staðsetningu þess punkts í myndinni í pixlum. Z hnit voru örlítið flóknari. Ég notaði fjarlægð á hnúa litlafingurs og vísifingurs til að finna fjarlægð handarinnar frá myndavélinni. Því styttra á milli punktuna, því lengra var hendin frá myndavélinni. Hinsvegar kom svo í ljós að hlutfall fjarlægð handar frá myndavél og fjarlægð punkta handar í mynd var ekki línulegt. Ég endaði á því að nýta formúlu sem ég fann á netinu sem notar brennivídd myndavélar til að fá nákvæmari útreikning. Það virkaði nógu vel, en var ekki fullkomið.
Einnig notaði ég lengd á milli vísifingurs og þumals til að opna og loka gripper hendinni á arminum, og gat það tekið utan um hluti og fært þá.
Staðsetning mótora (Inverse kinematics)
Ég vissi að þetta yrði umfangsmesti hluti verkefnisins, enda gerði ég þetta viljandi erfitt fyrir mig því mig langaði smá að finna upp hjólið hér sem þraut. Ég sat lengi yfir mynd sem ég teiknaði af arminum að reikna og hugsa hvernig ég gæti fundið staðsetningu mótora út fá gefinni staðsetningu enda arms (end effector.) Ég taldi mig hafa fundið lausn, sem notaði skurðpunkta tveggja hringja til að finna réttu gráðurnar. Mesti tíminn fór í þetta, að leysa þessa þraut. Ég fékk það til að virka, en um leið og ég bætti við snúningnum á arminum fór allt í hakk. Ég skildi ekki hvað virkaði ekki. Hér stóð ég fastur í nokkrar vikur.
Eftir ákveðinn tíma ákvað ég að einbeita mér að því að klára verkefnið frekar en að finna upp hjólið, og rakst þá á python kóða á github sem gerði það sem ég var að reyna, nema rétt. Kóðinn var líka fyrir nákvæmlega arminn sem ég hafði prentað, þannig ég þurfti lítið að breyta.
Útkoma
Útkoma verkefnisins var róbot armur á plötu, tengdur við Arduino tölvu sem var tengd fartölvu með USB. Python forrit var keyrt sem birti mynd af því sem myndavélin sá og reiknaði staðsetningu fyrir arminn, og sagði honum til.
Allt í allt kom þetta virkilega vel út og vakti þetta mikla athygli. Ég var beðinn um að sýna verkefnið mitt til á Mín Framtíð í Laugardalshöllinni fyrir hönd skólans og rafvirkjunardeildarinnar.
Vinsamlegast ekki rýna of mikið í kóðann. Bæði var ég ekki jafn reyndur og nú þegar ég skrifaði hann, og um leið og armurinn fór að virka hafði ég misst allan metnað fyrir kóðanum og fór að vinna í lokaskýrslunni. Dæmi um lélegan kóða er að ég forritaði aldrei bannmörk fyrir staðsetningar. Þótt armurinn gæti ekki teygt sig eitthvert, þá reyndi hann það. Ég vissi að ég gerði þetta ekki en ég ætlaði að passa mig bara. Það var svo mikið svekkelsi þegar á síðasta deginum á Mín Framtíð þar sem ég gat bara sýnt bilaðan róbot arm því ég bræddi úr einum mótor...
