Robottechnika projektfeladat Rubik kocka megforgatása Kovács Dániel (G6HEBK) Pethő Ádám (GMQYM2)
Robottechnika projekt
Rubik kocka megforgatása
A feladat leírása 2x2x2-es Rubik kocka megkeverése több lépésben.
Célkitűzések
A Rubik kockát lehessen forgatni Mindhárom tengelye körül megoldott legyen a forgatás A műveletek módosítása kellően egyszerű legyen
Kivitelezés A robot a 45mm oldalhosszúságú Rubik kocka felső sorainál fogja meg a kockát, hogy az a későbbiekben forgatható legyen. Ezután a robotkar az asztal széle fölé viszi, majd lassú mozgással a kocka alsó sorait az asztal pereméhez nyomja. Ezzel meggátolja, hogy a robot utolsó, J6 tengelyének forgatásával az alsó és felső sorok is együtt mozogjanak. A kocka másik két tengelye körüli forgatás is megvalósítható, ehhez azonban le kell tenni az asztallapra a kockát, és felvenni azt egy másik irányból megközelítve. Ilyen típusú parancs kiadásakor a robot az asztal sarka fölé megy és leteszi az alkatrészt. Ezután a robot addig helyezgeti a kockát, amíg annak a művelet során kiválasztott lapja felül nem lesz. A forgatás parancs eztán újból kiadható. A műveletek befejezésével a robot visszateszi a kockát a kezdeti helyére, majd visszatér a HOME pozíciójába.
Tárolt értékek Regiszterek
R[i] = 0 R[LENGTH] = 0
Az i változó értéke adja meg, hogy egy forgatási művelet hányszor menjen végbe. i=1 esetén a robot 90°-ot, i=2 esetében 2x90°-ot forgat a kockán. A LENGTH változó a kockán elvégzett forgatások számát adja vissza.
Pozíció regiszterek
PR[HOME] PR[PICK0] PR[PICK] PR[TURN X0] PR[TURN X] 1
Robottechnika projekt
Rubik kocka megforgatása
PR[TURN Y0] PR[TURN Y] PR[TURN Z0] PR[TURN Z] PR[ROTATE0] PR[ROTATE] PR[TMP]
A HOME regiszter a robot kezdeti pozíciója. A PICK és PICK0 regiszterek a kocka helyét jelölik. Minden 0-ra (nullára) végződő regiszter azt a helyet jelöli, ahova a robotnak mennie kell, mielőtt a tényleges pozícióba jutna. A TURN X, TURN Y, TURN Z és ezek nullára végződő megfelelőik a kocka egészének forgatásában segítenek. Előbbi a kockát az asztal X irányából, második Y irányából, legutóbbi pedig felülről határolja be. Ez a három megfogási irány elegendő ahhoz, hogy a kockát bármelyik lapjával felülre forgassuk. A ROTATE regiszter a kocka tengelye körüli forgatás helyét jelöli. Ez a pozíció az asztal pereménél van. A TMP-nek nincs kitüntetett pozíciója, csak a segédváltozó szerepét tölti be. Értékét a program változtathatja.
Sztringek
SR[STEPS] = ’’ SR[TOP] = ’T’ SR[FRONT] = ’F’ SR[RIGHT] = ’R’ SR[CURRENT] = ’’
A STEPS változó tárolja, hogy a program futása során a Rubik kocka mely tengelyei körül lett megforgatva. Ezáltal a program végeztével kiolvasható a regiszterből az a lépéssorozat, amelyet fordítva lejátszva kirakható a kocka forgatás előtti állapota. A TOP, FRONT és RIGHT a kocka oldalait jelöli, ezek értékei kerülnek a STEPS-be a program futása során. A CURRENT értéke mindig a kockának a felül lévő oldala.
2
Robottechnika projekt
Rubik kocka megforgatása
Programok MAIN A MAIN a főprogram, amelyet a robotnak le kell futtatnia ahhoz, hogy a Rubik kocka megforgatása megvalósuljon. Mindenekelőtt a program inicializálja magát, azaz törli az előző program „szemetét”; a STEPS változó értékét törli, illetve a CURRENT, azaz a kocka aktuálisan felfele néző oldalának kijelöli a TOP oldalt. Majd ezek után beáll a HOME pozícióba. Az inicializálás után a robot megfogja a kockát. Hogy a Roboguide szoftverben is látható legyen a megfogás, meghívja a PICKUP1 szimulációs programot. Ezek után felemeli az asztallapról és nekilát a forgatáshoz. Minden forgatási parancs előtt be kell állítani az i regiszternek azt az értéket, ahányszor meg szeretnénk forgatni a kockát. Maga a forgatás a ROTATE program meghívásával adható ki. Amennyiben a kocka másik tengelyei körül is szeretnénk forgatni, úgy kell forgatni a kocka egészét, hogy az adott tengely függőleges legyen. Ezekért a SELECT_TOP, SELECT_FRONT és SELECT_RIGHT programok felelnek, amelyek úgy forgatják a kockát, hogy annak rendre a felső, elülső és jobb oldalai felfelé nézzenek. Az alábbi program a következő műveleteket végzi el: Kétszer forgatja a kocka felső (TOP) oldallapját, egyszer az elülsőt (FRONT), majd kétszer a jobb oldalit (RIGHT), végezetül kiválasztja a felső oldalt (TOP). 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
! Inicializálás SR[1:STEPS] = SR[25] SR[5:CURRENT] = SR[2:TOP] J PR[1:HOME] 100% FINE ! Kocka felvétele J PR[2:PICK0] 50% FINE L PR[3:PICK] 50mm/sec FINE ! Megfogás WAIT .50(sec) CALL PICKUP1 WAIT .50(sec) ! Felemel L PR[2:PICK0] 50mm/sec FINE ! Műveletek a kockával ! Forgat kétszer R[1:i] = 2 CALL ROTATE ! A kocka Front oldalára vált és egyszer megforgat CALL SELECT_FRONT R[1:i] = 1 CALL ROTATE ! A kocka Right oldalára vált és kétszer megforgat CALL SELECT_RIGHT R[1:i] = 2 3
Robottechnika projekt 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44.
Rubik kocka megforgatása
CALL ROTATE ! A kiinduló Top oldalt teszi aktívvá CALL SELECT_TOP ! Kockát visszaviszi a kezdőhelyére J PR[2:PICK0] 50% FINE L PR[3:PICK] 50mm/sec FINE ! Kocka elengedése WAIT .50(sec) CALL DROPDOWN1 WAIT .50(sec) ! Visszatérés a Home pozícióba L PR[2:PICK0] 50mm/sec FINE J PR[1:HOME] 100% FINE ! Műveletek számának mentése regiszterbe R[2:LENGTH] = STRLEN SR[1:STEPS]
A műveletek elvégzése után a program visszatér a kocka kezdőhelyére, elengedi azt a DROPDOWN1 szimulációs program meghívásával, majd visszatér a robot a HOME pozíciójába. Végezetül megszámolja az elvégzett műveletek és elmenti azt a LENGTH regiszterbe.
ROTATE Ez a program felel a Rubik kocka oldalainak elforgatásáért. A robot viszonylag lassan, 50mm/sec sebességgel hozzáérinti a kocka alsó sorát az asztal széléhez. A TMP pozíció regiszterbe a program eltárolja a ROTATE értékét. Erre azért van szükség, hogy a forgatáshoz ne kelljen felülírni a ROTATE eredeti koordinátáit. Az LBL, JMP és IF utasításokkal létrehozunk egy For ciklust, amely mindaddig forgatja a kockát 90°-kal az óramutató járásával ellentétes irányba, amíg az i regiszter értéke nagyobb, mint 0. Minden ciklus végén a lépéssorozathoz hozzáadódik a kocka aktív oldallapjának kódja (T/F/R). Amint az 1. 2. 3. 4. 5. 6. 7. 8.
egyenlőtlenség igaz lesz, a program LBL[2]-re ugrik és ezzel kilép a ciklusból.
! A kockát az asztal széléhez érinti J PR[10:ROTATE0] 100% FINE L PR[11:ROTATE] 50mm/sec FINE ! Shiftelés PR[12:TMP] = PR[11:ROTATE] ! Ciklus eleje 4
Robottechnika projekt 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
Rubik kocka megforgatása
LBL[1] IF R[1:i] <= 0, JMP LBL[2] ! Lépésszám dekrementálása R[1:i] = R[1:i] - 1 ! Forgatás WAIT .50(sec) ! Z tengely körüli forgatás +90 fokkal PR[12,6:TMP] = PR[12,6:TMP] + 90 L PR[12:TMP] 30mm/sec FINE WAIT .50(sec) ! Művelet hozzáadása a lépésekhez SR[1:STEPS] = SR[1:STEPS] + SR[5:CURRENT] ! Visszaugrik a ciklus elejére JMP LBL[1] ! Forgatás befejezése, vissza ROTATE0 pozícióba LBL[2] L PR[10:ROTATE0] 30mm/sec FINE
SELECT_TOP, SELECT_FRONT, SELECT_RIGHT E három program nem lesz külön részletezve, hisz mindegyik hasonló elven működik. Céljuk, hogy a kocka egészét úgy forgassák, hogy egy adott oldala felülre kerüljön, hogy a ROTATE program más tengelyek körül tudja megforgatni a munkadarabot. Szemet szúrhat, hogy a kocka 6 oldalából csak 3hoz tartozik program. A BOTTOM, BACK és LEFT oldalak elhagyása esetünkben lehetséges, mivel egy 2x2x2-es Rubik kockánál ezek irrelevánsak. A program először összeveti az aktuálisan felül lévő oldalt a kívánttal. Amennyiben a kettő megegyezik, nincs több teendő. Ellenkező esetben a mutató arra a címkére ugrik, amelyik megvalósítja azt a forgatás-sorozatot, amellyel a kiválasztott oldal felülre kerül. SELECT_TOP 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
IF SR[5:CURRENT] = SR[2:TOP], JMP LBL[1] IF SR[5:CURRENT] = SR[3:FRONT], JMP LBL[2] IF SR[5:CURRENT] = SR[4:RIGHT], JMP LBL[3] ! Top -> Top LBL[1] END ! Front -> Top LBL[2] CALL TURN_X CALL TURN_X CALL TURN_X SR[5:CURRENT] = SR[2:TOP] END ! Right -> Top LBL[3] CALL TURN_Y SR[5:CURRENT] = SR[2:TOP] END
5
Robottechnika projekt
Rubik kocka megforgatása
SELECT_FRONT 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
IF SR[5:CURRENT] = SR[2:TOP], JMP LBL[1] IF SR[5:CURRENT] = SR[3:FRONT], JMP LBL[2] IF SR[5:CURRENT] = SR[4:RIGHT], JMP LBL[3] ! Top -> Front LBL[1] CALL TURN_X SR[5:CURRENT] = SR[3:FRONT] END ! Front -> Front LBL[2] END ! Right -> Front LBL[3] CALL TURN_Y CALL TURN_X SR[5:CURRENT] = SR[3:FRONT] END
SELECT_RIGHT 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
IF SR[5:CURRENT] = SR[2:TOP], JMP LBL[1] IF SR[5:CURRENT] = SR[3:FRONT], JMP LBL[2] IF SR[5:CURRENT] = SR[4:RIGHT], JMP LBL[3] ! Top -> Right LBL[1] CALL TURN_Y SR[5:CURRENT] = SR[4:RIGHT] END ! Front -> Right LBL[2] CALL TURN_X CALL TURN_X CALL TURN_X CALL TURN_Y SR[5:CURRENT] = SR[4:RIGHT] END ! Right -> Right LBL[3] END
6
Robottechnika projekt
Rubik kocka megforgatása
TURN_X, TURN_Y Lényegében e két program döntögeti a kockát. A TURN_X az asztal X tengelye körül, a TURN_Y értelemszerűen az Y tengelye körül. A programok megfelelő sorrendjével és kellő számú ismétlésével a kocka bármely oldalát felső helyzetbe lehet forgatni, eltérő lépésszámmal. TURN_X A program az asztal sarkához viszi a kockát, mert ott mindkét (X és Y) irányból könnyen hozzáférhető. Ezután leteszi a DROPDOWN2 szimulációs program meghívásával. A külön indexelésre azért van szükség, mert a DROPDOWN1 program által a kiinduló pozíciójába „ugrott” volna a kocka. Természetesen ez csak offline környezetben van így megoldva, a valóságban a két elengedési és megfogási mód közt nincs különbség. Miután a satus megfogó nyitott állapotba került, a robot oldalirányból (PR[TURN X]) ismét felemeli a kockát, majd felső helyzetbe megy (PR[TURN Z]). Ezeknél a mozgásoknál fontos a lineáris mozgás, mert jointos esetén könnyen megváltozhatnak a Rubik kocka geometriai jellemzői. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
! Mozgás az asztal sarka fölé és leteszi a kockát J PR[8:TURN Z0] 100% FINE L PR[9:TURN Z] 50mm/sec FINE ! Kocka elengedése WAIT .50(sec) CALL DROPDOWN2 WAIT .50(sec) L PR[8:TURN Z0] 50mm/sec FINE ! Felvétel oldalról és eldöntés az X tengely körül L PR[4:TURN X0] 50mm/sec FINE L PR[5:TURN X] 50mm/sec FINE ! Kocka megfogása WAIT .50(sec) CALL PICKUP2 WAIT .50(sec) L PR[4:TURN X0] 50mm/sec FINE ! Mozgás a sarok fölé, a kezdeti pozícióba L PR[8:TURN Z0] 50mm/sec FINE
TURN_Y A módszer hasonló az előzőhöz, azonban mégis van egy lényeges különbség. Az előző programoknál feltűnhetett, hogy néhány oldalkiválasztás egyszerűbben, vagy másképp is megvalósítható lett volna. Amennyiben a rövidebb megoldásokat választottuk volna, bekövetkezett volna az a probléma a sokadik forgatás után, hogy a program hamisan ítéli meg, melyik oldal van felül. Például, ha a felső lap után a jobbat választjuk, majd a jobb után ismét a felsőt, nem biztos, hogy a kocka kezdeti és végső állapota ugyanaz lett volna. Természetesen ez a probléma kiküszöbölhető komplexebb algoritmusokkal. 7
Robottechnika projekt
Rubik kocka megforgatása Ebből a problémából adódóan hosszabb a TURN_Y program a TURN_X-nél. Miután a robot elvégezte a kocka forgatását az asztal Y tengelye körül, el kell engednie a kockát. Erre azért van szükség, mert az effektor 90°-kal el van fordulva az eredeti pozíciójához képest, viszont a kockát nem szeretnénk tovább forgatni, mert abban az esetben fellépne a fentebb vázolt probléma. A forgatásnál memória-takarékosság céljából ismét használatba vettük a TMP pozíció regisztert.
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
! Mozgás az asztal sarka fölé és leteszi a kockát J PR[8:TURN Z0] 100% FINE L PR[9:TURN Z] 50mm/sec FINE ! Kocka elengedése WAIT .50(sec) CALL DROPDOWN2 WAIT .50(sec) L PR[8:TURN Z0] 50mm/sec FINE ! Felvétel oldalról és eldöntés az Y tengely körül L PR[6:TURN Y0] 50mm/sec FINE L PR[7:TURN Y] 50mm/sec FINE ! Kocka megfogása WAIT .50(sec) CALL PICKUP2 WAIT .50(sec) L PR[6:TURN Y0] 50mm/sec FINE
! A döntés irányából adódóan a megfogás 90 fokkal el van forgatva 20. PR[12:TMP] = PR[8:TURN Z0] 21. PR[12,6:TMP] = PR[12,6:TMP] + 90 22. 23. ! Kocka letétele az asztal sarkára 24. L PR[12:TMP] 50mm/sec FINE 25. ! A Z magasság az asztal lapjára essen 26. PR[12,3:TMP] = PR[9,3:TURN Z] 27. L PR[12:TMP] 50mm/sec FINE 28. ! Kocka elengedése 29. WAIT .50(sec) 30. CALL DROPDOWN2 31. WAIT .50(sec) 32. PR[12,3:TMP] = PR[8,3:TURN Z0] 33. L PR[12:TMP] 50mm/sec FINE 34. 35. ! Helyes megfogás 36. L PR[8:TURN Z0] 50mm/sec FINE 37. L PR[9:TURN Z] 50mm/sec FINE 38. WAIT .50(sec) 39. CALL PICKUP2 40. WAIT .50(sec) 41. L PR[8:TURN Z0] 50mm/sec FINE 8
Robottechnika projekt
Rubik kocka megforgatása
Értékelés A programmal teljesítettük az eredeti célokat. A Rubik kockát lehessen forgatni Mindhárom tengelye körül megoldott legyen a forgatás A műveletek módosítása kellően egyszerű legyen A feladat továbbfejleszthető az alábbiakkal:
A program visszafelé is hajtsa végre a műveleteket, kirakva ezzel az eredeti állapotot A bemutatott problémától független legyen a forgatás 3x3x3-as Rubik kocka
9