Բովանդակություն:
- Քայլ 1: Կառուցեք շասսի
- Քայլ 2: Էլեկտրոնիկա և էլեկտրամոնտաժ
- Քայլ 3. Softwareրագրային ապահովման ենթակառուցվածք
- Քայլ 4: Օգտվողի միջերես
- Քայլ 5. Ռոբոտների պլատֆորմի ծրագրավորում
- Քայլ 6: Սենսորների չափագրումներ
- Քայլ 7: Այլընտրանքային ձևավորում
- Քայլ 8: Պատկերի մշակում
- Քայլ 9: Հաջորդ քայլերը…
Video: Rpibot - Ռոբոտաշինություն սովորելու մասին. 9 քայլ
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:45
Ես ներդրված ծրագրային ապահովման ինժեներ եմ գերմանական ավտոմոբիլային ընկերությունում: Այս նախագիծը սկսեցի որպես ներդրված համակարգերի ուսուցման հարթակ: Նախագիծը վաղաժամ չեղարկվեց, բայց ես այնքան վայելեցի այն, որ շարունակեցի ազատ ժամանակ: Սա արդյունքն է…
Ես ունեի հետևյալ պահանջները.
- Պարզ սարքավորում (ծրագրաշարը կենտրոնացած է)
- Էժան սարքավորում (մոտ 100 €)
- Ընդարձակելի (որոշ ընտրանքներ արդեն նկարագրության մի մասն են)
- Մատակարարման լարումը բոլոր բաղադրիչների համար մեկ 5V աղբյուրից (powerbank)
Սովորելուց բացի իրականում նպատակ չկար: Հարթակը կարող է օգտագործվել ուսուցման, հսկողության, ռոբոտային մրցումների,…
Դա սկսնակների ձեռնարկ չէ: Ձեզ անհրաժեշտ են հիմնական գիտելիքներ հետևյալի մասին.
- Mingրագրավորում (Python)
- Հիմնական էլեկտրոնիկա (մոդուլները ճիշտ լարման միջոցով միացնելու համար)
- Հիմնական վերահսկման տեսություն (PID)
Վերջապես, հավանաբար, խնդիրներ կունենաք, ինչպես ես: Որոշ հետաքրքրասիրությամբ և տոկունությամբ դուք կանցնեք նախագծի միջով և կլուծեք մարտահրավերները: Իմ ծածկագիրը հնարավորինս պարզ է, և քննադատական կոդի տողերը մեկնաբանվում են ՝ հուշումներ տալու համար:
Ամբողջական աղբյուրի ծածկագիրը և ֆայլերը հասանելի են այստեղ ՝
Պարագաներ:
Մեխանիկա
- 1x նրբատախտակ (A4 չափ, 4 մմ հաստություն)
- 3x M4 x 80 Պտուտակ և ընկույզ
- 2x Gear շարժիչներ `երկրորդական ելքային լիսեռով` կոդավորողի համար: Անիվներ.
- 1x անվճար անիվ
1x թավայի և թեքության խցիկի տեղադրում (ըստ ցանկության)
Էլեկտրոնիկա
- 1x Raspberry Pi Zero ՝ վերնագրով և տեսախցիկով
- 1x PCA 9685 սերվոյի հսկողություն
- 2x Օպտիկական ծածկագրիչ անիվ և միացում
- 1x կանացի թռիչքային լարեր
- 1x USB հզորության բանկ
- 1x DRV8833 երկշարժիչով վարորդ
- 2x Micro servos SG90 ֆոտոխցիկի և թեքության համար (ըստ ցանկության)
- 1x MPU9250 IMU (ըստ ցանկության)
- 1x HC-SR04 ուլտրաձայնային հեռավորության տվիչ (ըստ ցանկության)
- 1x ծակոտ տախտակ և զոդման մետաղալար, գլխիկներ,…
Քայլ 1: Կառուցեք շասսի
Ես լավ մեխանիկ դիզայներ չեմ: Նաև նախագծի նպատակը շասսիում շատ ժամանակ չանցկացնելն է: Ամեն դեպքում, ես սահմանեցի հետևյալ պահանջները.
- Էժան նյութեր
- Արագ հավաքում և ապամոնտաժում
- Ընդարձակվող (օրինակ ՝ լրացուցիչ սենսորների համար տարածք)
- Էլեկտրոնիկայի համար էներգիա խնայող թեթև նյութեր
Նրբատախտակից կարելի է պատրաստել հեշտ և էժան շասսի: Հեշտ է մշակել սղոցով և ձեռքի փորվածքով: Սենսորների և շարժիչների համար պահարաններ ստեղծելու համար կարող եք սոսնձել փայտե փոքր մասեր:
Մտածեք թերությունների բաղադրիչների փոխարինման կամ էլեկտրական վրիպազերծման մասին: Հիմնական մասերը պետք է ամրացվեն պտուտակներով `փոխարինելի լինելու համար: Տաք սոսինձով ատրճանակը կարող է պարզ լինել, բայց, հավանաբար, շասսի կառուցելու լավագույն միջոցը չէ … Ինձ շատ ժամանակ էր պետք, որպեսզի մտածեի դետալներն ապամոնտաժելու հեշտ հայեցակարգի մասին: 3D տպագրությունը լավ այլընտրանք է, բայց կարող է լինել բավականին թանկ կամ ժամանակատար:
Անվճար անիվը վերջապես շատ թեթև է և հեշտ է տեղադրվում: Այլընտրանքները բոլորը ծանր էին կամ շփումներով լի (ես մի քանիսը փորձեցի վերջնականը գտնելուց առաջ): Հիմնական անիվները ամրացնելուց հետո ինձ մնում էր միայն փայտե միջանցք կտրել `պոչից անիվը հավասարեցնելու համար:
Անիվի հատկություններ (ծրագրային ապահովման հաշվարկների համար)
Շրջապատ ՝ 21, 5 սմ Իմպուլսներ ՝ 20 զարկերակ/պտույտ: Բանաձև ՝ 1, 075 սմ (վերջապես 1 զարկերակը մոտ 1 սմ է, ինչը հեշտ է ծրագրային հաշվարկների համար)
Քայլ 2: Էլեկտրոնիկա և էլեկտրամոնտաժ
Նախագծում օգտագործվում են տարբեր մոդուլներ, ինչպես ցույց է տրված գծապատկերում:
Raspberry Pi Zero- ն հիմնական վերահսկիչն է: Այն կարդում է սենսորները և կառավարում շարժիչները PWM ազդանշանով: Այն միացված է հեռակա համակարգչին wifi- ով:
DRV8833- ը երկշարժիչ H- կամուրջ է: Այն ապահովում է շարժիչներին բավարար հոսանք (ինչը Raspberry Pi- ն չի կարող անել, քանի որ ելքերը կարող են հաղորդել միայն որոշ mA):
Օպտիկական կոդավորիչը քառակուսի ազդանշան է տալիս ամեն անգամ, երբ լույսը անցնում է կոդավորիչի անիվների միջով: Մենք կօգտագործենք Raspberry Pi- ի HW ընդհատումները `տեղեկատվությունը ստանալու համար ամեն անգամ, երբ ազդանշանը միանում է:
Pca9695- ը servo կառավարման տախտակ է: Այն հաղորդակցվում է I2C սերիական ավտոբուսի միջոցով: Այս տախտակն ապահովում է PWM ազդանշանները և մատակարարման լարումը, որոնք վերահսկում են սպասարկուները խցիկի թավայի և թեքության համար:
MPU9265- ը 3 առանցքի արագացում է, 3 առանցքի անկյունային պտտման արագություն և 3 առանցքի մագնիսական հոսքի տվիչ: Մենք այն հիմնականում կօգտագործենք կողմնացույցի վերնագիրը ստանալու համար:
Տարբեր մոդուլները բոլորը միացված են իրար jumper մետաղալարով: Հացատախտակը հանդես է գալիս որպես դիսպետչեր և ապահովում է մատակարարման լարումներ (5V և 3.3V) և հող: Կապերը բոլորը նկարագրված են կապի աղյուսակում (տես հավելվածը): 5V- ը 3.3V մուտքի հետ միացնելը, հավանաբար, կկործանի ձեր չիպը: Careգուշացեք և երկու անգամ ստուգեք ձեր բոլոր էլեկտրագծերը մատակարարելուց առաջ (այստեղ պետք է հաշվի առնել հատկապես կոդավորիչը): Բոլոր տախտակները միացնելուց առաջ դուք պետք է չափեք դիսպետչերական տախտակի հիմնական մատակարարման լարումները բազմիմետրով: Մոդուլները ամրացվեցին նեյլոնե պտուտակներով `շասսիի մեջ: Նաև այստեղ ես ուրախ էի, որ դրանք անսարքության դեպքում կարող էին ամրագրվել, բայց նաև շարժական:
Միակ զոդումը վերջապես շարժիչներն էին, հացահատիկը և վերնագրերը: Beիշտն ասած, ինձ դուր են գալիս ցատկող լարերը, բայց դրանք կարող են հանգեցնել չամրացված կապի: Որոշ իրավիճակներում որոշ ծրագրային մոնիտորինգներ կարող են օգնել ձեզ վերլուծել կապերը:
Քայլ 3. Softwareրագրային ապահովման ենթակառուցվածք
Մեխանիկայի ձեռքբերումից հետո մենք կստեղծենք ծրագրային ենթակառուցվածք `զարգացման հարմարավետ պայմաններ ունենալու համար:
Git
Սա անվճար և բաց կոդով տարբերակի կառավարման համակարգ է: Այն օգտագործվում է մեծ նախագծեր կառավարելու համար որպես Linux, բայց կարող է նաև հեշտությամբ օգտագործվել փոքր նախագծերի համար (տես Github և Bitbucket):
Changesրագրի փոփոխությունները կարող են հետևվել տեղական մակարդակով, ինչպես նաև մղվել դեպի հեռավոր սերվեր `ծրագրակազմը համայնքի հետ կիսելու համար:
Հիմնական օգտագործվող հրահանգներն են.
git clone https://github.com/makerobotics/RPIbot.git [Ստացեք աղբյուրի կոդը և git կազմաձևումը]
git pull ծագման վարպետ [ստացեք վերջինը հեռավոր պահոցից]
git կարգավիճակ [ստացեք տեղական շտեմարանի կարգավիճակը: Կա՞ն ֆայլեր փոխված:] git log [ստացեք հանձնարարականների ցանկը] git add: [ավելացրեք բոլոր փոփոխված ֆայլերը հաջորդ կատարման համար դիտարկվող փուլին] git commit -m «comment for commit» [կատարել փոփոխությունները տեղական պահեստում] git push origin master [բոլոր հանձնառությունները մղել հեռավոր շտեմարան]
Ծառահատում
Python- ն ապահովում է ներկառուցված անտառահատումների գործառույթներ: Furtherրագրային ապահովման կառուցվածքը պետք է սահմանի անտառահատումների արդեն բոլոր շրջանակները `հետագա զարգացումն սկսելուց առաջ:
Լոգերը կարող է կազմաձևվել տերմինալում կամ տեղեկամատյանում սահմանված ձևաչափով մուտք գործելու համար: Մեր օրինակում անտառահատը կազմաձևված է վեբ սերվեր դասի կողմից, բայց մենք կարող ենք դա անել նաև ինքնուրույն: Այստեղ մենք միայն մուտքագրման մակարդակը սահմանում ենք DEBUG:
անտառահատ = logging.getLogger (_ անունը_)
logger.setLevel (գրանցում. DEBUG)
Չափում և գծագրում
Signalsամանակի ընթացքում ազդանշանները վերլուծելու համար լավագույնը դրանք գծապատկերում գծելն է: Քանի որ Raspberry Pi- ն ունի միայն մխիթարել տերմինալ, մենք տվյալները կհետևենք csv ստորակետով բաժանված ֆայլում և գծագրելով դրանք հեռավոր համակարգչից:
Կիսակետերով առանձնացված հետագծման ֆայլը ստեղծվում է մեր հիմնական պիթոնի ծածկագրի կողմից և պետք է ունենա այսպիսի վերնագրեր.
timestamp; yawCorr; encoderR; I_L; odoDistance; ax; encoderL; I_R; yaw; eSpeedR; eSpeedL; pwmL; speedL; CycleTimeControl; wz; pwmR; speedR; Iyaw; hdg; m_y; m_xime; eYaw;
1603466959.65;0;0;25;0.0;-0.02685546875;0;25;0;25;25;52;0.0;23;0.221252441406;16;0.0;0;252.069366413;-5.19555664062;-16.0563964844;0;6; 1603466959.71;0;0;50;0.0;0.29150390625;0;50;0;25;25;55;0.0;57;-8.53729248047;53;0.0;0;253.562118111;-5.04602050781;-17.1031494141;0;6; 1603466959.76;0;-1;75;0.0;-0.188232421875;1;75;2;25;25;57;0;52;-24.1851806641;55;0;0;251.433794171;-5.64416503906;-16.8040771484;2;7;
Առաջին սյունակը պարունակում է ժամանակային նշան: Հետևյալ սյուներն անվճար են: Սյուժեի սցենարը կոչվում է սյուների ցուցակ, որոնք պետք է գծագրվեն.
հեռավոր@համակարգիչ: ~/python rpibot_plotter -f trace.csv -p speedL, speedR, pwmL, pwmR
Սյուժեի սցենարը հասանելի է գործիքի թղթապանակում ՝
Գծանկարիչը օգտագործում է mathplotlib- ը Python- ում: Դուք պետք է պատճենեք այն ձեր համակարգչում:
Ավելի հարմարավետության համար պիթոնի սցենարը կոչվում է bash սցենար (plot.sh), որն օգտագործվում է Raspberry Pi հետագծման ֆայլը հեռավոր համակարգչում պատճենելու և ազդանշանի ընտրությամբ գծագրողին զանգահարելու համար: Bash սցենարը «plot.sh» հարցնում է. եթե ֆայլը պետք է պատճենվի: Սա ինձ համար ավելի հարմար էր ՝ ամեն անգամ ձեռքով պատճենելու փոխարեն: «sshpass» - ը օգտագործվում է Raspberry Pi- ից ֆայլը scp- ի միջոցով հեռավոր համակարգչին պատճենելու համար: Այն կարող է պատճենել ֆայլը ՝ առանց գաղտնաբառ խնդրելու (այն փոխանցվում է որպես պարամետր):
Ի վերջո, պատուհանը բացվում է գծապատկերով, ինչպես ցույց է տրված նկարում:
Հեռավոր հաղորդակցություն
Raspberry Pi- ի զարգացման ինտերֆեյսը SSH է: Ֆայլերը կարող են խմբագրվել անմիջապես թիրախում կամ պատճենվել scp- ի կողմից:
Ռոբոտին կառավարելու համար Pi- ով աշխատում է վեբ սերվեր, որը վերահսկողություն է ապահովում Websockets- ի միջոցով: Այս ինտերֆեյսը նկարագրված է հաջորդ քայլին:
Կարգավորեք Raspberry Pi- ն
Կա ֆայլ, որը նկարագրում է Raspberry Pi- ի կարգավորումը աղբյուրի կոդի «doc» թղթապանակում (setup_rpi.txt): Չկան շատ բացատրություններ, բայց շատ օգտակար հրամաններ և հղումներ:
Քայլ 4: Օգտվողի միջերես
Մենք օգտագործում ենք թեթև Tornado վեբ սերվերը ՝ օգտվողի միջերեսը հյուրընկալելու համար: Դա Python մոդուլ է, որը մենք կոչում ենք ռոբոտների կառավարման ծրագրակազմը սկսելիս:
Softwareրագրային ապահովման ճարտարապետություն
Օգտվողի միջերեսը կառուցված է հետևյալ ֆայլերով. Gui.html [Նկարագրում է վեբ էջի կառավարման և դասավորությունը] gui.js [Պարունակում է javascript կոդ ՝ կառավարման տարրերը կառավարելու և մեր ռոբոտին ցանցային կապ բացելու համար] gui.css [Պարունակում է ոճերը html- ի վերահսկում: Կառավարիչների դիրքերը սահմանվում են այստեղ]
Վեբ ցանցային հաղորդակցություն
Օգտվողի միջերեսը ամենաթեժը չէ, բայց կատարում է իր աշխատանքը: Ես այստեղ կենտրոնացա այն տեխնոլոգիաների վրա, որոնք ինձ համար նոր էին, օրինակ ՝ Վեբ կայքերը:
Վեբ կայքը ռոբոտների վեբ սերվերի հետ շփվում է Websockets- ի միջոցով: Սա երկկողմանի հաղորդակցման ալիք է, որը բաց կմնա կապի սկզբնավորման պահին: Մենք ռոբոտի հրամանները Websocket- ի միջոցով ուղարկում ենք Raspberry Pi և տեղեկատվություն (արագություն, դիրք, տեսախցիկի հոսք) հետ ենք ստանում ցուցադրման համար:
Ինտերֆեյսի դասավորությունը
Օգտվողի միջերեսն ունի ձեռնարկի մուտքագրում հրամանների համար: Սա սկզբում օգտագործվում էր ռոբոտին հրամաններ ուղարկելու համար: Նշման տուփը միացնում և անջատում է տեսախցիկի հոսքը: Երկու լոգարիթմերը վերահսկում են տեսախցիկը և թեքությունը: Օգտվողի միջերեսի վերին աջ մասը վերահսկում է ռոբոտների շարժը: Դուք կարող եք վերահսկել արագությունը և նպատակային հեռավորությունը: Հիմնական հեռաչափության մասին տեղեկատվությունը ցուցադրվում է ռոբոտի գծագրում:
Քայլ 5. Ռոբոտների պլատֆորմի ծրագրավորում
Այս մասը նախագծի հիմնական նպատակն էր: Ես վերափոխեցի ծրագրակազմի մեծ մասը, երբ ներկայացրեցի նոր շասսին DC շարժիչներով: Ես Python- ը որպես ծրագրավորման լեզու օգտագործեցի տարբեր պատճառներով.
- Այն Raspberry Pi- ի հիմնական լեզուն է
- Այն բարձր մակարդակի լեզու է `բազմաթիվ ներկառուցված հատկանիշներով և ընդարձակումներով
- Այն օբյեկտին ուղղված է, բայց կարող է օգտագործվել նաև հաջորդական ծրագրավորման համար
- Ոչ կոմպիլյացիա, ոչ էլ գործիքի շղթա անհրաժեշտ չէ: Խմբագրեք կոդը և գործարկեք այն:
Հիմնական ծրագրային ճարտարապետություն
Theրագրակազմը օբյեկտին ուղղված է ՝ բաժանված մի քանի օբյեկտների: Իմ գաղափարն էր ծածկագիրը բաժանել 3 ֆունկցիոնալ բլոկի.
Sense Think Գործարկել
Sense.py
Հիմնական սենսորների ձեռքբերում և մշակում: Տվյալները պահվում են բառարանում, որոնք կօգտագործվեն հաջորդ փուլում:
Control.py
Գործարկման ենթադասը վերահսկում է շարժիչներն ու սպասարկիչները որոշ վերացարկումներից հետո: Հիմնական Control օբյեկտը բարձրակարգ հրամանների և շարժիչի կառավարման ալգորիթմների (PID) վարումն է:
rpibot.py
Այս հիմնական նպատակը Tornado վեբ սերվերի կառավարումն է և առանձին թեմաներում իմաստների և վերահսկման դասերի ստեղծումը:
Յուրաքանչյուր մոդուլ կարող է գործարկվել միայնակ կամ որպես ամբողջ ծրագրի մաս: Դուք կարող եք զգալ միայն և տպել սենսորային տեղեկատվությունը `ստուգելու համար, որ տվիչները ճիշտ են միացված և տալիս են ճիշտ տեղեկատվություն:
PID- ի վերահսկում
Առաջին խնդիրն է պարզել, թե ինչ ենք ուզում վերահսկել: Ես սկսեցի փորձելով վերահսկել դիրքը, որը շատ բարդ էր և շատ չէր օգնում:
Ի վերջո, մենք ցանկանում ենք վերահսկել յուրաքանչյուր անիվի արագությունը և նաև ռոբոտի ուղղությունը: Դա անելու համար մենք պետք է կասկադային երկու հսկիչ տրամաբանություն ունենանք:
Քայլ առ քայլ բարդությունը բարձրացնելու համար ռոբոտը պետք է վերահսկվի.
բաց օղակ (մշտական հզորությամբ)
pwm = K
ապա ավելացրեք փակ հանգույցի ալգորիթմը
pwm = Kp.speedError+Ki. Ինտեգրում (speedError)
և վերջապես ավելացրեք ուղղության հսկողությունը որպես վերջին քայլ:
Արագության կառավարման համար ես օգտագործել եմ «PI» հսկիչ և «P» ՝ միայն հորանջելու համար: Ես ձեռքով սահմանեցի պարամետրերը ՝ փորձարկելով: Հավանաբար, այստեղ շատ ավելի լավ պարամետրեր կարող էին օգտագործվել: Իմ թիրախը պարզապես ուղիղ գիծ էր, և ես գրեթե հասա դրան: Createdրագրակազմում ստեղծեցի ինտերֆեյս `որոշ փոփոխականներ օգտագործողի միջերեսով գրելու համար: Kp պարամետրը 1.0 -ին դնելը պետք է օգտագործողի միջերեսի հետևյալ հրամանին.
SET; Kp; 1.0
Ես կարող էի P պարամետրը բավականաչափ ցածր դնել, որպեսզի խուսափեմ որևէ գերազանցումից: Մնացած սխալը ուղղվում է I պարամետրով (ինտեգրված սխալ)
Ինձ համար դժվար էր պարզել, թե ինչպես կարելի է կասկադ անել երկու հսկիչ սարքերի վրա: Լուծումը պարզ է, բայց ես նախկինում շատ այլ եղանակներ էի փորձել… Այսպիսով, վերջապես, ես փոխեցի անիվների արագության թիրախը ՝ պտտվելու այս կամ այն ուղղությամբ: Արագության հսկողության ելքի ուղղակի փոփոխությունը սխալ էր, քանի որ արագության կառավարիչը փորձում էր հեռացնել այս խռովությունը:
Օգտագործված կառավարման սխեման կցվում է: Այն ցույց է տալիս ռոբոտի կառավարման միայն ձախ կողմը:
Քայլ 6: Սենսորների չափագրումներ
Առաջին բանը, որ պետք է հաշվի առնել, այն է, որ ամբողջ IMU- ն պետք է ճիշտ աշխատի: Ես պատվիրեցի 3 մաս և ուղարկեցի դրանք մինչև աշխատող սենսոր ունենալը: Յուրաքանչյուր նախորդ սենսորին սենսորի որոշ հատվածներ ճիշտ չէին աշխատում կամ ընդհանրապես չէին գործում: Ես որոշ սցենարներ օգտագործեցի ՝ հիմքերը ստուգելու համար ՝ նախքան այն ռոբոտում տեղադրելը:
IMU սենսորային ազդանշանները օգտագործելուց առաջ պետք է չափագրվեն: Որոշ սենսորային ազդանշաններ կախված են տեղադրման անկյունից և դիրքից:
Արագացման և պտտման արագության ճշգրտումներ
Ամենահեշտ ճշգրտումը երկայնական արագացման համար է (A_x): Կանգնած տեղում պետք է լինի մոտ 0 մ/վ 3: Եթե սենսորը ճիշտ պտտեք, կարող եք չափել ծանրությունը (մոտ 9, 8 մ/վ 3): A_x- ը չափագրելու համար պարզապես պետք է այն ճիշտ ամրացնել, այնուհետև սահմանել օֆսեթը ՝ 0 մ/վ² -ի վրա կանգնելու համար: Այժմ A_x- ը չափագրված է: Դուք կարող եք ռոտացիայի արագությունների փոխհատուցումները ստանալ նման վիճակում `կանգնած վիճակում:
Մագնիսաչափի տրամաչափումը կողմնացույցի համար
Ավելի բարդ ճշգրտում է անհրաժեշտ մագնիսական դաշտի տվիչների համար: Մենք կօգտագործենք m_x և m_y ՝ մագնիսական դաշտը հորիզոնական մակարդակում ստանալու համար: M_x և m_y ունենալը մեզ հնարավորություն կտա հաշվարկել կողմնացույցի վերնագիրը:
Մեր պարզ նպատակի համար մենք միայն կկարգավորենք կոշտ երկաթի շեղումը: Սա պետք է կատարվի, քանի որ սենսորը գտնվում է վերջնական դիրքում, քանի որ այն կախված է մագնիսական դաշտի խաթարումներից:
Մենք արձանագրում ենք m_x և m_y, մինչ ռոբոտը պտտեցնում ենք z առանցքի շուրջը: Մենք m_x vs m_y- ն գծում ենք XY գծապատկերում: Արդյունքն էլիպսի է, ինչպես ցույց է տրված նկարում: Էլիպսիսը պետք է կենտրոնացած լինի սկզբնաղբյուրի վրա: Այստեղ մենք հաշվի ենք առնում m_x և m_y առավելագույն և նվազագույն արժեքները ՝ երկու ուղղություններով փոխհատուցումները ստանալու համար: Վերջապես մենք ստուգում ենք ստուգաչափումը և տեսնում, որ էլիպսիսն այժմ կենտրոնացած է:
Փափուկ երկաթի չափաբերումը կնշանակի, որ մենք պատկերը էլիպսից փոխում ենք շրջանագծի: Դա կարող է կատարվել ՝ յուրաքանչյուր սենսորային արժեքի վրա գործոն ավելացնելով:
Փորձնական ռեժիմն այժմ կարող է ծածկագրվել ՝ նորից չափագրելու կամ գոնե ստուգելու համար, որ տվիչները դեռ ճշգրտված են:
Կողմնացույցի վերնագիր
Այժմ մագնիսաչափի տվյալները կօգտագործվեն կողմնացույցի վերնագիրը հաշվարկելու համար: Դրա համար մենք պետք է m_x և m_y ազդանշանները վերածենք անկյունի: Python- ն ուղղակիորեն տրամադրում է math.atan2 գործառույթը, որն ունի այս նպատակը: Ամբողջական հաշվարկը սահմանվում է mpu9250_i2c.py ֆայլում ("calcHeading (mx, my, mz)"):
Քայլ 7: Այլընտրանքային ձևավորում
Նախագիծը շատ ժամանակ պահանջեց, քանի որ դիզայնը լիովին բաց էր: Յուրաքանչյուր բաղադրիչի համար ես պատրաստեցի նախատիպի իրականացում և փորձեցի համակարգի սահմանափակումները:
Ամենաբարդ թեման անիվի կոդավորողն էր: Ես փորձարկել եմ 3 տարբեր տարբերակ ՝ մինչ այժմ օգտագործված օպտիկական կոդավորիչը գտնելը: Կարծում եմ, որ վիժված լուծումները նույնպես շատ հետաքրքիր են նման նախագծում: Դա վերաբերում է այն հատվածներին, որտեղ ես ամենից շատ եմ սովորել:
Շարունակական պտտման servo ՝ կապված pca 9695 -ի հետ
DC շարժիչի համար լրացուցիչ H- կամուրջից խուսափելու համար ես սկզբում սկսեցի անընդհատ պտտվող սերվերով: Դրանք վարում էր արդեն առկա pca 9695 սերվո վարորդը: Բոլոր շարժիչ մեխանիկաներն ու համապատասխան էլեկտրոնիկան շատ ավելի պարզ էին: Այս դիզայնն ուներ երկու թերություն.
- Սպասարկողների վատ կառավարման տիրույթը:
- Բացակայող կոդավորիչը պահելու վայրը
Սերվոները սկսում են շարժվել 50% pwm- ով և ունեն ամբողջ արագությունը մոտ 55% -ով: Սա շատ վատ վերահսկման տիրույթ է:
Առանց ծածկագրիչի պահման, շատ դժվար էր գտնել կոդավորիչ պատրաստ լինելու համար: Ես փորձարկեցի 3 տարբեր անդրադարձման ծածկագրիչ, որոնք տեղադրված էին շասսիի վրա: Ես անիվի արտաքին մասում սև և սպիտակ հատվածներով կպցրեցի ինքնագործ կոդավորող անիվ: Ես օգտագործել եմ QTR-1RC սենսորները, որոնք մեծ ազդանշանի մշակման կարիք ունեն ճիշտ ազդանշան ստանալու համար: Raspberry Pi- ն ի վիճակի չէր իրական ժամանակի այդ տեսակ մշակման: Այսպիսով, ես որոշեցի NodeMCU D1 mini- ն ավելացնել որպես ռոբոտի իրական ժամանակի վերահսկիչ: Այն միացվել է ազնվամորի Pi- ի հետ UART սերիայի միջոցով `մշակված սենսորների տվյալները փոխանցելու համար: NodeMCU- ն նաև ղեկավարում էր HC-SR04 սենսորը: Մեխանիկան դժվար էր և ոչ այնքան ամուր, սերիական գիծը աղմուկ էր ստանում I2C գծից և շարժիչներից, ուստի վերջապես ես կառուցեցի շասսիի երկրորդ տարբերակը `պարզ հանդերձանքով շարժիչներով H կամուրջ Այս շարժիչներն ունեն երկրորդային ելքային լիսեռ `օպտիկական կոդավորիչ տեղադրելու համար:
Քայլ 8: Պատկերի մշակում
Ինքնավար վարումը բարելավելու համար մենք կարող ենք կատարել որոշ պատկերի մշակում:
Opencv գրադարանը դրա համար հղում է: Այն կարող է օգտագործվել Python- ի կողմից խոչընդոտների հայտնաբերման արագ իրականացման համար:
Մենք նկարում ենք պատկեր և կիրառում պատկերի մշակման որոշ առաջադրանքներ.
Առաջին փորձարկումները կատարվեցին Քենի և Սոբելի փոխակերպումներով: Քենին կարող է լինել լավ թեկնածու, բայց բավականաչափ խելամիտ չէ: Սոբելը չափազանց խելամիտ է (չափազանց շատ օբյեկտներ են հայտնաբերվել):
Ի վերջո, ես պատրաստեցի իմ սեփական զտիչը ՝ հորիզոնական և ուղղահայաց գրադիենտները խառնելու համար (կահույքի հայտնաբերում).
- Գունավոր պատկերը փոխակերպեք մոխրագույն մակարդակի պատկերի
- Փոքր աղմուկը հեռացնելու համար պղտորեք պատկերը
- Պատկերը շեմը դարձրեք սև և սպիտակ պատկերին
- Այժմ մենք հայտնաբերում ենք հորիզոնական և ուղղահայաց գրադիենտներ ՝ օբյեկտները որպես պատեր և կահույք հայտնաբերելու համար
- Մենք զտում ենք միայն մնացած մեծ ուրվագծերը (տես նկարի գունավոր ուրվագծերը)
Այժմ մենք կարող ենք օգտագործել այս նոր տեղեկատվությունը ՝ խոչընդոտները հայտնաբերելու համար…
Քայլ 9: Հաջորդ քայլերը…
Այժմ մենք ունենք պարզ ռոբոտային հարթակ ՝ սենսորներով, շարժիչներով և տեսախցիկով: Իմ նպատակն է ինքնավար տեղաշարժվել և վերադառնալ կայան ՝ առանց լրացուցիչ սենսորներ ավելացնելու: Դրա համար ինձ կպահանջվեն հետևյալ քայլերը.
- Հորթի և ազդանշանային ազդանշանների սենսորային միաձուլում
- Խցիկի պատկերի մշակում (դրա համար մատչելի է միայն ցածր պրոցեսոր)
- Բախման հայտնաբերում (ուլտրաձայնային հեռավորություն և տեսախցիկ)
- Քարտեզի կառուցում կամ կողմնորոշում
Այժմ գնացեք և ստեղծեք ձեր սեփական մարտահրավերները կամ թիրախները…
Խորհուրդ ենք տալիս:
RGB ժամացույց ՝ երեխաներին ժամանակի մասին սովորեցնելու համար. 4 քայլ
RGB ockամացույց ՝ երեխաներին ժամանակի մասին սովորեցնելու համար. Երեկ երեկոյան ես միտք ծագեցի, թե ինչպես կարող եմ օգնել իմ 5 տարեկանին ժամանակի զգացում ունենալ: Հասկանալի է, որ երեխաները կողմնորոշվում են ամենօրյա իրադարձությունների վրա ՝ պատկերացում կազմելու, թե ինչ է սպասվում հաջորդին: Բայց նախորդ իրադարձությունները սովորաբար մի փոքր խառնաշփոթ են և հազիվ թե երբևէ կարգին: Քանի որ պատմում է
Օգտագործելով Python ՝ ոչ անգլերեն ստեղնաշարի դասավորություններ սովորելու համար. 8 քայլ
Օգտագործելով Python ՝ ոչ ստեղնաշարի դասավորություններ սովորելու համար. Բարև, ես Julien եմ: Ես համակարգչային գիտությունների ուսանող եմ, և այսօր ես ձեզ ցույց կտամ, թե ինչպես կարող եք օգտագործել Python- ը ՝ ձեզ ոչ անգլերեն լեզվի ստեղնաշարի դասավորությունը սովորեցնելու համար: Մեր օրերում շատ լեզուների ուսուցում է տեղի ունենում, և մի բան մարդիկ կարող են գիտակցել
Սովորելու ընթացքում ձեր երեխաներին դադարեցրեք խաղերից. 4 քայլ
Սովորելիս ձեր երեխաներին թույլ մի տվեք խաղալ Շատ ուսանողներ տառապում են խաղեր խաղալուց `սովորելու փոխարեն, ինչը նրանց վատ գնահատականներ է տալիս: Նողները զայրացած և անհանգստացած են իրենց երեխայի համար, ուստի որոշեցին
PiTanq - Ռոբոտ -տանկ Raspberry Pi- ի և Python- ի հետ ՝ AI սովորելու համար. 10 քայլ
PiTanq-Ռոբոտ-տանկ Raspberry Pi- ի և Python- ի հետ ՝ AI սովորելու համար. Pitanq- ը ռոբոտ-տանկ է `Raspberry Pi- ով սնուցվող տեսախցիկով: Դրա նպատակն է օգնել սովորել ինքնագնացության արհեստական բանականությանը: Տանկի AI- ն ապահովված է OpenCV- ով և Tensoflow- ով, որոնք կառուցվել են հատուկ Raspbian Jessie- ի համար: Հիմնվելով ամուր ալյումինի վրա
Roomblock: ROS նավարկություն սովորելու հարթակ Roomba- ով, Raspberry Pi- ով և RPLIDAR- ով. 9 քայլ (նկարներով)
Roomblock: ROM նավարկություն սովորելու հարթակ Roomba- ով, Raspberry Pi- ով և RPLIDAR- ով. Ի՞նչ է սա: " Roomblock " ռոբոտային հարթակ է, որը բաղկացած է Roomba- ից, Raspberry Pi 2 -ից, լազերային սենսորից (RPLIDAR) և շարժական մարտկոցից: Մոնտաժման շրջանակը կարող է պատրաստվել 3D տպիչների միջոցով: ROS նավիգացիոն համակարգը հնարավորություն է տալիս կազմել սենյակների քարտեզ և օգտագործել