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

Rpibot - Ռոբոտաշինություն սովորելու մասին. 9 քայլ
Rpibot - Ռոբոտաշինություն սովորելու մասին. 9 քայլ

Video: Rpibot - Ռոբոտաշինություն սովորելու մասին. 9 քայլ

Video: Rpibot - Ռոբոտաշինություն սովորելու մասին. 9 քայլ
Video: rpibot 2024, Հուլիսի
Anonim
Rpibot - Ռոբոտաշինություն սովորելու մասին
Rpibot - Ռոբոտաշինություն սովորելու մասին

Ես ներդրված ծրագրային ապահովման ինժեներ եմ գերմանական ավտոմոբիլային ընկերությունում: Այս նախագիծը սկսեցի որպես ներդրված համակարգերի ուսուցման հարթակ: Նախագիծը վաղաժամ չեղարկվեց, բայց ես այնքան վայելեցի այն, որ շարունակեցի ազատ ժամանակ: Սա արդյունքն է…

Ես ունեի հետևյալ պահանջները.

  • Պարզ սարքավորում (ծրագրաշարը կենտրոնացած է)
  • Էժան սարքավորում (մոտ 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րագրային ապահովման ենթակառուցվածք

Softwareրագրային ապահովման ենթակառուցվածք
Softwareրագրային ապահովման ենթակառուցվածք
Softwareրագրային ապահովման ենթակառուցվածք
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: Հաջորդ քայլերը…

Հաջորդ քայլերը…
Հաջորդ քայլերը…
Հաջորդ քայլերը…
Հաջորդ քայլերը…

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

  • Հորթի և ազդանշանային ազդանշանների սենսորային միաձուլում
  • Խցիկի պատկերի մշակում (դրա համար մատչելի է միայն ցածր պրոցեսոր)
  • Բախման հայտնաբերում (ուլտրաձայնային հեռավորություն և տեսախցիկ)
  • Քարտեզի կառուցում կամ կողմնորոշում

Այժմ գնացեք և ստեղծեք ձեր սեփական մարտահրավերները կամ թիրախները…

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