Բովանդակություն:

Ռոբո-տեխնիկ `8 քայլ
Ռոբո-տեխնիկ `8 քայլ

Video: Ռոբո-տեխնիկ `8 քայլ

Video: Ռոբո-տեխնիկ `8 քայլ
Video: 8 պարզ հնարք միկրոալիքային վառարանով, որոնք, անկասկած, կհեշտացնեն ձեր կյանքը 2024, Հուլիսի
Anonim
Ռոբո-տեխնիկ
Ռոբո-տեխնիկ

Մի պահ պատկերացրեք, որ դուք Մարսի վրա վայրէջք կատարող տիեզերագնացներից եք: Դուք միլիոն գործ ունեք անելու, նմուշներ վերցնելու, փորձեր կատարելու, տվյալներ հավաքելու, բայց օրական մեկ կամ երկու անգամ անհրաժեշտ է շրջել բնակության և/կամ հետազոտական մոդուլների շուրջ, որտեղ դուք ապրում և աշխատում եք դրանք ստուգելու համար: Անհրաժեշտ է, ինչ -որ մեկը պետք է ապահովի, որ իրը լավ վիճակում է, որ հազարավոր կտորներն ու մասերը աշխատեն և տեղում: Բայց ինչ կլիներ, եթե լիներ ավտոմատացված օգնական ՝ ձեզ ազատելու այդ պարտականություններից մի քանիսը: Ի՞նչ կլիներ, եթե լիներ մի փոքրիկ ռոբոտ, որը կարող էր տեղաշարժվել մոդուլների ներսում ՝ համոզվելու համար, որ ամեն ինչ տեղում է, աշխատում է և անվտանգ:

Ռոբո-տեխնիկը օգնության է հասել:

Ըստ էության, այս ծածկագիրը վերահսկում է Robo-Technician- ը, քանի որ հետևում է գետնին բաց գույնի ճանապարհին: Այն կանցնի այս ճանապարհով, մինչև որ գտնի ճանապարհի հանգույց կամ շրջադարձ, ինչը կհանգեցնի լուսանկար անել պատկերի մշակման համար, որը թույլ կտա Robo-Technician- ին որոշում կայացնել, թե ուր գնալ հաջորդը: Թեթև հարվածի և հարվածի սենսորները աշխատում են պաշտպանել Robo-Technician- ը վնասներից, իսկ bump sensors- ը վերահսկում են, թե երբ է արվելու ախտորոշիչ լուսանկար: Բոլորը միասին, Robo-Technician- ը նախատեսված է Մարի մոդուլները մեծացնելու համար ՝ ազատելով տիեզերագնացների ժամանակը `ստուգման հիմնական խնդիրն իրականացնելիս, միայն մարդկության մասնակցության կոչ անելով, երբ ինչ-որ բան սխալ է գտնում:

Կրկին որպես նախազգուշացում, սա ընթացքի մեջ գտնվող աշխատանք է: Կոդն, ինչպես գոյություն ունի, աշխատում է, բայց այն ունի իր դողերը, մանավանդ որ ներգրավված են բազմաթիվ, համընկնող ծրագրեր: Բացի այդ, որպեսզի այս նախագիծը գործի Մարսի իրական առաքելության համար, անհրաժեշտ կլինի ռոբոտ կառուցել այդ հատուկ նպատակի համար, ուստի կրկին ենթադրում եմ, որ սա «հայեցակարգի ապացույց» կառուցում է:

Կան մի քանի բաներ, որոնք ձեզ հարկավոր են այս գործը սկսելու համար: Ձեզ հարկավոր կլինի թանկարժեք ծրագիր, այդ ծրագրի աջակցության փաթեթներ և կոդավորման մի փոքր նախապատմություն: Քանի որ ես ուսանող եմ, և առաջին հարկի ծածկագիրն ապահովված է (ազնվամորու pi- ի համար), ես հատուկ չեմ խոսի ստեղծման մասին: Ստորև կարող եք գտնել այդ բազային կոդի բոլոր հղումները: Եկեք անցնենք նյութերի ցանկին:

Սարքավորումներ

  • Raspberry Pi (մենք օգտագործում էինք 3 -րդ տարբերակը)
  • iRobot
  • ինչ-որ բռնակ սարք, որը կպահի Raspberry Pi- ն Robo-Technician- ին կցված
  • Raspberry Pi տեսախցիկ (անկախ նրանից, թե ինչ տեսակի, քանի դեռ ունի լավ ավտո ֆոկուս և պատկերի լուծում)
  • ինչ-որ տիպի տակդիր կամ պատյան ՝ տեսախցիկը Robo-Technician- ի վրա դեպի առաջ պահելու համար
  • նյութ, որն օգտագործվում է որպես շերտ, սպիտակ (կամ շատ բաց գույնի), որը ամուր պահվում է հատակին: Այն պետք է մի փոքր ավելի լայն լինի, քան առջևի երկու ժայռերի տվիչների միջև եղած տարածությունը:
  • 4 նշան ՝ շատ մեծ տեքստով (դրանց վրա տպված են ՝ «Պատկեր, աջ, հետ և ձախ» բառերը)
  • Գունավոր թղթի թերթեր (առնվազն երեք և նախընտրելի է կարմիր, կանաչ և կապույտ)

Ծրագրային ապահովում

  • Matlab (2018 ա և 2017 բ երկուսն էլ օգտագործվել են և, կարծես, փոքր տարբերություն ունեն)
  • Raspberry Pi աջակցության փաթեթ Matlab- ի համար
  • Raspberry Pi ծածկագիրը Matlab- ին միանալու համար (ստորև բերված աղբյուրի կոդի հղում)
  • Պատկերի մշակման գործիքների տուփ Matlab- ի համար (դուք գրեթե չեք կարող անել այս նախագիծը առանց գործիքի տուփի)
  • ԸՆՏՐՈԹՅՈՆ. Matlab Mobile- ը տեղադրված է ձեր հեռախոսի վրա, որը ես ավելի ուշ կբացատրեմ

Քայլ 1: Սարքավորման կարգավորում

ef.engr.utk.edu/ef230-2018-08/projects/roo…

Սա հիմնական կոդի հղումն է `ապահովելու համար, որ iRobot®- ը կարող է հաղորդակցվել Matlab- ի հետ ՝ հիմնական ձեռնարկի հետ միասին: Ինչպես նախկինում ասացի, ես չեմ լուսաբանի այս կոնկրետ հատվածը, քանի որ ձեռնարկը արդեն շատ լավ շարադրված է: Նշեմ, որ երբ դուք կատարեք հղման վրա կատարված քայլերը, կարող եք օգտագործել Matlab- ի «doc» հրահանգը ՝ ներառված տեղեկատվությունը դիտելու համար: Մասնավորապես.

դոկ սենյա

Եվ ևս մեկ շատ կարևոր կետ.

Երբ ֆայլերը ներբեռնում եք վերը նշված հղումից, դրանք տեղադրեք վերը նկարագրված թղթապանակում, քանի որ Matlab- ը պահանջում է, որ օգտվողի կողմից ստեղծված ֆայլերը լինեն ընթացիկ աշխատանքային թղթապանակում:

Այդ ամենից դուրս, եկեք անցնենք ծածկագրին:

Քայլ 2: Գտնել բոլոր այդ սենսորները

Գտնելով այդ բոլոր սենսորները
Գտնելով այդ բոլոր սենսորները
Գտնելով այդ բոլոր սենսորները
Գտնելով այդ բոլոր սենսորները

Մի վայրկյան վերցրեք և iRobot®- ին ստուգում տվեք: Լավ է իմանալ, թե որտեղ են դրանք, որպեսզի պատկերացում ունենաք, թե ինչ ներդրումներ է ստանում Robo-Technician- ը, և դուք կկարողանաք պարզել, թե ինչու է բանը պտտվում շրջանների մեջ, այլ ոչ թե հետևելու ձեր ստեղծած ճանապարհին (սա կարող է կամ կարող է պատահած չլինել): Ակնհայտորեն առջևում կտեսնեք մեծ ֆիզիկական հարվածի ցուցիչ: Clայռի սենսորները մի փոքր ավելի դժվար է տեսնել, դուք պետք է շրջեք այն և փնտրեք չորս, թափանցիկ պլաստիկ պատուհանները առջևի եզրին մոտ: Թեթև հարվածների ցուցիչներն ավելի թաքնված են, բայց առայժմ բավական կլինի ասել, որ սև շողշողացող ժապավենը կենդանի է անցնում iRobot®- ի առջևի մասում, որը գտնվում է ֆիզիկական հարվածների սենսորների առջևի մասում:

Կան անիվների անկման տվիչներ, բայց դրանք այս նախագծում չեն օգտագործվում, այնպես որ մենք կանցնենք սենսորների փորձարկմանը:

Քայլ 3: Պարամետրեր սահմանելու փորձարկում

Պարամետրեր սահմանելու փորձարկում
Պարամետրեր սահմանելու փորձարկում

Նախքան Robo-Technician- ին աշխատանքից հեռացնելու համար մենք պետք է պարզենք դրա յուրահատուկ առանձնահատկություններն ու սենսորների տիրույթը: Քանի որ յուրաքանչյուր iRobot® մի փոքր տարբերվում է և փոխվում է ռոբոտի կյանքի ընթացքում, մենք պետք է պարզենք, թե ինչպես են սենսորները կարդում այն տարածքներում, որտեղ այն կգործի: Դա անելու ամենահեշտ ձևը բաց գույնի ուղի ստեղծելն է (Ես օգտագործել եմ սպիտակ տպիչի թղթի շերտեր, բայց բաց գույնի ցանկացած բան կանի) մակերևույթի վրա, որը կգործի Robo-Technician- ը:

Գործարկեք Matlab- ը և բացեք նոր սցենար: Պահեք սցենարը նույն թղթապանակում, որը ես նկարագրեցի ավելի վաղ և անվանեք այն ինչ ուզում եք (չնայած փորձեք կարճ պահել, քանի որ այս ֆայլի անունը կլինի գործառույթի անունը): Միացրեք ռոբոտը և օգտագործեք roomba փոփոխականի կարգավորումը ձեռնարկից ՝ հրամանները մուտքագրելով հրամանի պատուհանում:

Համոզվեք, որ Raspberry Pi- ն միացված է iRobot®- ին և ձեր համակարգիչը միացված է նույն ինտերնետային կապին: Դուք ավելի քիչ ժամանակ կծախսեք ձեր մազերը քաշելու վրա ՝ փորձելով հասկանալ, թե ինչու Matlab- ը չի միանում:

r = roomba (ձեր ստեղծած համարը)

Այս պարագայում «r» փոփոխականն անհրաժեշտ չէ, կարող եք այն անվանել այն, ինչ ցանկանում եք, բայց կյանքը հեշտացնում է մեկ տառանոց փոփոխական օգտագործելը:

Երբ ուղին կարգավորվի և սենյակը հաջողությամբ միացվի, տեղադրեք ապագա Robo-Technician- ը, որտեղ ժայռի սենսորներից մեկը կամ երկուսը գտնվում են արահետի վերևում: Ակնհայտ է, որ դա նշանակում է, որ մնացած երկուսը կամ երեքը ձեր ընտրած մակերեսի վերևում են:

Այժմ գործարկեք փորձարկման սենսորները հրամանով.

r.test Սենսորներ

Հիշեք, որ «r.» - ն այն փոփոխականն է, որը դուք սահմանել եք ավելի վաղ, այնպես որ, եթե դա «r» չէ, փոխեք «r» - ը: ինչ էլ որ որոշես: Սա կբարձրացնի թեստային սենսորի էկրանը մի տոննա տեղեկատվությամբ:

Այս նախագծի համար կենտրոնացեք լուսային բամպերների, բամպերների և ժայռերի հատվածների վրա: Տեղափոխեք Robo-Technician- ը ՝ համոզվելով, թե ինչպես են սենսորները փոխվում տարբեր մակերևույթների վրա, կամ որքան մոտ է օբյեկտը ligthBumper- ի արժեքները փոխելու համար և այլն: Հիշեք այս թվերը (կամ գրեք դրանք), քանի որ դուք նրանց պետք է մեկ վայրկյանում սահմանել ձեր պարամետրերը:

Քայլ 4: Գործարկել կոդը

Սկզբից դուք կկառուցեք գործառույթ: Ես այն անվանեցի «ուղի», բայց նորից, անունը պարտադիր չէ, բայց այսուհետ ես դրան կանդրադառնամ որպես «ճանապարհ»:

Կոդի վերին հատվածը սահմանում է օգտվողի մուտքի որոշ տարբերակներ: Այն կառուցում է որոշ ցուցակներ, որոնք կօգտագործվեն in listdlg- ում և այնուհետև բերում է ցուցակի երկխոսության տուփ: Սա թույլ է տալիս օգտվողին ընտրել, թե որ ուղու գույնն է ցանկանում հետևել, որն ավելի ուշ ուժի մեջ է մտնում:

ցուցակ = {'Կարմիր', 'Կապույտ', 'Կանաչ'}

problist = {'Պատահականություն, Պահել պատկերը', 'Բաղադրիչը տեղում, Պահել պատկերը', 'Սպասվում է, Շարունակել'} pathcolor = listdlg ('PromptString', 'Select a Path Color',… 'SelectionMode', 'single', 'ListString', list) prob = 0; դրիվ = ;

«Prob» և «driv» փոփոխականները պետք է հայտարարվեն այստեղ, քանի որ դրանք կօգտագործվեն գործառույթի հիմնական հանգույցի ներսում, բայց կրկին, եթե ցանկանում եք վերանվանել այս փոփոխականներից որևէ մեկը կամ փոխել ցուցակի ընտրությունը, լավ է, քանի դեռ Դուք հետևողական եք մնացած ծածկագրում:

Քայլ 5. Մինչև օղակի վերևը. Ֆիզիկական հարվածի սենսորներ

While օղակի գագաթը պարունակում է ֆիզիկական հարվածի սենսորների տրամաբանություն: Հիմնականում, երբ Robo-Technician- ը բախվում է ինչ-որ բանի հետ, որը կանգ է առնում (կամ առջևի հարվածի սենսորի համար այն հետ է կանգնում 0.1 մետր), այնուհետև դիրքավորվում է `լուսանկարելու համար: Եկեք նախ ծածկենք արագության և դիրքի կառավարման մասը:

Եթե նախորդ քայլերում փորձարկեցիք Robo-Technician- ի բոլոր սենսորները, ապա կիմանաք, որ բախման տվիչները տրամաբանական արժեք ունեն (0 կամ 1), զրոյով, որը ներկայացնում է սենսորի նորմալ, ոչ սեղմված դիրքը: Հիշեք դա կոդի համար:

իսկ ճշմարիտ %հիմնական, իսկ հանգույցը %ստանում է բամպերի տեղեկատվություն S = r.getBumpers եթե S. ձախ? 0 = 0 ռ. դադարեցնել այլևս

Սա հիմնական «եթե ինչ -որ բանի հարվածում է, կանգ առ» հատվածն է: Եթե սենսորներն իսկապես հայտնաբերում են բախում, ապա այն անցնում է ծածկագրի հաջորդ հատվածին, որը ճշգրտում է Ռոբո-տեխնիկի դիրքը `լուսանկար ստանալու համար:

եթե S.left ~ = 0 %եթե loop- ը վերցնում է բամպերի տվյալները և հավասարեցնում լուսանկարչական ապարատի տեսախցիկը r.turnAngle (5) դադար (0.5) img = r.getImage %-ը լուսանկարում և ցուցադրում է պատկեր (img) %երկխոսության տուփ prob = listdlg (' PromptString ',' Un անսպասելի խոչընդոտ է հայտնաբերվել, խնդրում ենք բացահայտել '…,' SelectionMode ',' single ',' ListString ', problist) elseif S.right ~ = 0 r.turnAngle (-5) դադար (0.5) img = r. getImage image (img) prob = listdlg («PromptString», «Գտնվել է անսպասելի խոչընդոտ, նշեք»…, «SelectionMode», «միայնակ», «ListString», problist) elseif S.front ~ = 0 r.moveDistance (- 0.1) դադար (0.5) img = r.getImage image (img) prob = listdlg ('PromptString', 'Found a Un անսպասելի խոչընդոտ, խնդրում ենք բացահայտել'…, 'SelectionMode', 'single', 'ListString', problist) ավարտ

Հիմնականում, պատկերը վերցնելուց հետո կհայտնվի մեկ այլ երկխոսության տուփ ՝ երեք տարբերակով: Առաջին երկու տարբերակները պահում են լուսանկարը նշված թղթապանակում, որը ես կանդրադառնամ ավելի ուշ, իսկ երրորդ տարբերակը պարզապես փակում է երկխոսության տուփը և շարունակում է հանգույցի միջով: Եթե չեք հիշում ընտրանքները, նայեք նախորդ քայլին:

Այժմ ես տեղադրեցի ծածկագրի հատվածը բախման ցուցիչի և լուսանկարը պահող հատվածի միջև: Սա վերցնում է lightBumper- ի արժեքները և դնում շարժիչի արագությունը 0,025 մ/վրկ (շատ դանդաղ), որն իրականում անհրաժեշտ չէ, բայց դա նվազեցնում է Robo-Technician- ը, որը հարվածում է իրերին և, ի վերջո, մաշում ֆիզիկական հարվածի տվիչները:

L = r.getLightBumpers եթե L. ձախից> 100 || L.leftFront> 100 || L.rightFront> 100 || L.right> 100 driv = 0.025 r.setDrive Արագություն (0.025) այլ դրիվ = 0.1 վերջ

Սա այն հատվածն է, որտեղ արժեքները, որոնք դուք նկատել եք (և հուսով ենք, որ գրել եք) ավելի վաղ, ուժի մեջ կմտնեն:

«L. (սենսորի կողմը և ուղղությունը)> 100» հիմնված էր իմ դիտարկած արժեքների վրա, այնպես որ, եթե ձեր դիտարկումները տարբեր են, փոխեք այս թվերը: Գաղափարն այն է, որ եթե Ռոբո-տեխնիկը ինչ-որ բան զգա իր առջևից մի քանի սանտիմետր հեռավորության վրա, այն կդանդաղի, ինչը ավելին ավելորդ է:

Հաջորդ հատվածը այն վայրն է, որտեղ լուսանկարները պահվում են ավելի ուշ:

%եթե առաջին կամ երկրորդ տարբերակը ընտրված է prob երկխոսության մեջ, պահում է պատկերը, եթե prob == 1 %, եթե հանգույցը ստեղծում է ֆայլի մասին տեղեկություններ լուսանկարի համար, գրում է ժամանակային նշանով t = ժամացույց; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); թղթապանակ = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = ամբողջական ֆայլ (թղթապանակ, բազային անուն); imwrite (img, fullFileName) փակել Նկար 1 դադար (2) elseif prob == 2 t = ժամացույց; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); թղթապանակ = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = ամբողջական ֆայլ (թղթապանակ, բազային անուն); imwrite (img, fullFileName) փակել Նկար 1 դադար (2) վերջ

Բոլոր ֆայլերի անուններն ու վայրերը, որտեղ պահվում են լուսանկարները, պարտադիր չեն: Ես ընտրեցի մի թղթապանակ, որը տեղադրված է ներածման փուլում իմ ստեղծած roomba պանակի ներսում, բայց այն կարող է լինել ձեր ընտրած ցանկացած վայրում: Բացի այդ, լուսանկարները պահվում են ժամանակային նշանով, բայց դա հատկապես անհրաժեշտ չէ (չնայած այն ենթադրաբար օգտակար կլիներ Մարս առաքելության համար):

Coveredածկված ֆիզիկական հարվածների սենսորներով մենք կարող ենք շարժվել դեպի ժայռի տվիչները և հետևել դրան:

Քայլ 6: Followingանապարհին հետևելը

Այռի տվիչների ծածկագիրը տեղադրված է երկու առջևի և երկու կողային սենսորների արժեքների համեմատության համար: Դուք պետք է փոխեք այս արժեքները (հավանաբար) ՝ ձեր դիտարկված արժեքների հիման վրա: Դուք նույնպես հավանաբար պետք է խմբագրեք այս արժեքները մի քանի փորձարկումներից հետո և դրանք փոխեք ՝ հիմնվելով շրջապատի լույսի, օրվա ժամի (կախված նրանից, թե որքան լավ լուսավորված է թեստի տարածքը) կամ երբ տվիչների պատուհանները կեղտոտ են:

Մինչև ժայռի սենսորային կոդին հասնելը, կա կարճ կոդի հատված, որը ես տեղադրել եմ `Matlab- ից որոշ անհարկի տվյալներ մաքրելու համար: Այս հատվածը պետք չէ, բայց ես այն օգտագործել եմ ծրագիրը գործարկելու համար պահանջվող պահեստը կրճատելու համար:

clear img clear t clear basename clear fullFileName clear folder

Հաջորդ կոդի հատվածը նախագծի միսն է: Այն թույլ է տալիս Robo-Technician- ին գնալ բաց գույնի արահետով, որը տեղադրված է հատակին: Մի խոսքով, այն փորձում է ինքն իրեն ուղղորդել այնպես, որ ժայռի առջևի երկու սենսորները շեմից բարձր լինեն ՝ հիմնված ձեր դիտարկված արժեքների վրա, և թույլ է տալիս ծրագրին մի փոքր ուշ սկսել պատկերի մշակման քայլերը:

C = r.getCliff Սենսորներ %եթե հանգույցը հետևում է գունային գոտուն (սպիտակ), եթե C.leftFront> 2000 && C.rightFront> 2000 %ուղիղ ուղեցույց r.setDriveVelocity (driv) elseif C.leftFront 2000 %թեքվում է աջ, եթե ռոբոտը չափազանց հեռու է գնում ձախ r.turnAngle (-2.5) elseif C.leftFront> 2000 && C.rightFront <2000%թեքվում է ձախ, եթե ռոբոտը չափազանց հեռու է գնում r.turnAngle (2.5) elseif C.leftFront <2000 && C. RightFront 100 || L.leftFront> 100 || L.rightFront> 100 || L.right> 100 img = r.get Պատկերի վերջնական %-ը ստուգում է ՝ արդյոք ճանապարհի թեքություն կա, եթե C.left> 2800 && C. <2800 r.turnAngle (2.5) elseif C.left 2800 r.turnAngle (- 2.5) ճանապարհի պատկերի ճանաչման տարածքի վերջի %տեղի սեփականատեր («Ստանալով պատկեր») վերջի վերջնական վերջը

Հիշեք, որ իմ ընտրած փոփոխականների անունները պարտադիր չեն, բայց կրկին կարծում եմ, որ հնարավորության դեպքում ավելի հեշտ է դարձնում մեկ տառանոց փոփոխականների օգտագործումը:

Կոդի միջին հատվածը բացատրելու համար, երբ երկու առջևի սենսորները դուրս են գալիս ճանապարհի եզրից (երբ խոսքը վերաբերում է խաչմերուկին կամ երբ հասնում է ճանապարհի վերջը), թվում է, թե արդյոք դրա դիմաց ինչ -որ բան կա:. Thisանապարհի վերջում կամ որևէ խաչմերուկում օբյեկտ տեղադրելու համար ձեզ հարկավոր է առարկա տեղադրել:

Լուսանկարն արվելուց հետո այն օգտագործում է պատկերի ճանաչումը `պարզելու, թե ինչ անել: Կոդի այս բաժնում կա նաև տեղապահ.

ուղու պատկերի ճանաչման համար %տեղի սեփականատեր

Ես սա օգտագործեցի այս պահին, քանի որ ցանկանում էի հատուկ խոսել տեքստի և գույնի մշակման մասին, որը հաջորդ քայլում է:

Քայլ 7: Պատկերի մշակում

Պատկերի մշակման երկու մաս կա. Առաջինը `գույնի ճանաչումն է, որը հաշվարկում է նկարի գույնի ինտենսիվությունը` որոշելու `շարունակել տեքստի ճանաչումը, թե ոչ: Գույնի հաշվարկները հիմնված են այն բանի վրա, թե ինչ ընտրություն է կատարվել սկզբում այդ առաջին երկխոսության տուփում (ես օգտագործել եմ կարմիր, կապույտ, կանաչ, բայց դուք կարող եք ընտրել ցանկացած գույն, քանի դեռ գույնի ինտենսիվության միջին արժեքները կարող են ճանաչվել Raspberry Pi տեսախցիկ):

img = r.getImage img = imcrop (img, [0 30 512 354]) imgb = imcrop (img, [0 30 512 354]) imgt = imcrop (img, [0 30 512 354]) կարմիր = միջին (միջին (imgb (:,:, 1))); g = միջին (միջին (imgb (:,:, 2))); b = միջին (միջին (imgb (:,:, 3)));

Սա ինտենսիվության ստուգում է: Սա կօգտագործվի հաջորդ հատվածում `որոշելու, թե ինչ է ուզում անել:

եթե կարմիր> g && red> b if pathcolor == 1 imgc = imcrop (img, [0 30 512 354]) R = ocr (img) if R. Բառեր {1} == ՆԿԱՐ || Ռ. Բառեր {2} == ՆԿԱՐ || R. Բառեր {3} == IMAGE t = ժամացույց; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); թղթապանակ = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = ամբողջական ֆայլ (թղթապանակ, բազային անուն); imwrite (img, fullFileName) դադար (2) elseif R. Words {1} == RԻՇՏ || R. Բառեր {2} == IGHԻՇՏ || R. Bords {3} == RIGHT r.turnAngle (-75) elseif R. Words {1} == ՁԱՅՆ || Ռ. Բառեր {2} == ՁԱՅՆ || R. Bords {3} == LEFT r.turnAngle (75) elseif R. Words {1} == BACK || Ռ. Բառեր {2} == Ե B Ե | || R. Բառեր {3} == BACK r.turnAngle (110) վերջ այլապես r.turnAngle (110) վերջ

Այս հատվածը որոշում է, թե արդյոք առաջին երկխոսության վանդակում ընտրված գույնը համընկնում է տեսախցիկի տեսած գույնի հետ: Եթե դա անում է, այն գործարկում է տեքստի ճանաչում: Այն նայում է տեսնելու, թե որ բառը (ՆԿԱՐ, ՎԵՐԱԴԱՐՁ, ԱIGHԻ or կամ ԱՌԱ) հայտնվում է, այնուհետև կամ շրջվում (աջ և ձախ), պտտվում է շուրջը (հետևի համար) կամ լուսանկարում և պահում այն նույն կերպ, ինչպես նախկինում:

Ես տրամադրել եմ ծածկագրի միայն մեկ հատված `տարբեր գույների համար:

Որպեսզի ծածկագիրը կարողանա ճանաչել կապույտը և կանաչը, պարզապես պատճենեք ծածկագիրը և փոխեք հատվածի վերևի տրամաբանական ստուգումը և սահմանեք «pathcolor == (number)», որը կհամապատասխանի վերևի երկխոսության տուփի գույնի ընտրություններին (ծածկագրի ցուցադրման դեպքում կապույտը կլինի 2, իսկ կանաչը `3):

Քայլ 8: Պատրաստի արտադրանք

Պատրաստի արտադրանք
Պատրաստի արտադրանք

Այժմ Robo-Technician- ը պետք է խոշորացնի Մարսի առաքելության մոդուլները և զեկուցի տիեզերագնացներին, երբ որևէ բան տեղում չէ:

Հիշեք, որ ժայռի սենսորի և lightBumper- ի բոլոր արժեքները պետք է փոխվեն ձեր դիտարկված արժեքների: Բացի այդ, փորձից ես ավելի լավ գտա, որ այս նախագիծը փորձարկվի մուգ գույնի հատակի վրա և նույնիսկ ավելի լավ է, եթե այդ հատակը չանդրադարձնող է: Getsանապարհի և հատակի միջև հակադրությունը մեծանում է, ինչը ավելի հավանական է դարձնում, որ Ռոբո-տեխնիկը ճիշտ հետևի դրան:

Հուսով եմ, որ ձեզ դուր եկավ Մարսի առաքելության համար մի փոքր օգնականի ստեղծումը և զվարճացեք կառուցելով:

Խորհուրդ ենք տալիս: