Ishning nazariy ma’lumoti


Download 1.26 Mb.
bet5/6
Sana14.12.2022
Hajmi1.26 Mb.
#1004629
1   2   3   4   5   6
Bog'liq
Kurs ishi O\'T va UDT

Kengaytma:


Ushbu bosqichda sinashni xohlashingiz mumkin bo'lgan ba'zi boshqa narsalar:

  • Uzoq yoki ingichka narsalarni aniqlangan narsalardan olib tashlang. Har bir blobning kengligi va balandligi nisbatlarini tekshirib, siz vertikal yoki gorizontal bo'lganda uzun narsalarni topishingiz mumkin, ammo ob'ektlar burchak ostida bo'lganda nima bo'ladi?

  • Mutlaq piksel maydonidan kichik bo'lgan narsalarni olib tashlang.

  • Bir rangdagi ob'ekt chegaralari boshqa rangdagi narsalar chegarasida bo'lganligini aniqlang (masalan, konsentrik halqalardan qilingan nishon). Buning uchun ikkita xroma tugmachasi va blobni aniqlashning ikkita o'tishi kerak bo'ladi.



Yo‘riqnoma (2 qism):


Ushbu so'nggi bosqichda biz robotni boshqarish uchun yangi aniqlangan yuzlar va bloklardan foydalanamiz. 'Chase.py' deb nomlangan yangi fayl yarating.
Biz oddiy kutubxonalarni va robot boshqaruvi uchun zarur bo'lganlarni kiritishimiz kerak.
from imgproc import *

# robot control module


import i2c

cam = Camera(160, 120)


view = Viewer(cam.width, cam.height, "Chase")
Biz hali ham tomoshabinni yaratamiz, chunki u robotga ulanmagan holda sinov / disk raskadrovka uchun foydalidir. Keyingisi:
# create our robot control
robot = i2c.I2C()
Keyingi qism uchun siz o'zingiz yozgan yuzni aniqlash skriptidan yoki blobni aniqlash skriptidan kodingizni nusxalashingiz mumkin. Blobni topish kodi ushbu misolda ishlatilgan.
Robotni boshqarish uchun bizni qiziqtirgan kodning asosiy qismi maqsad ob'ekt chegaralari. Biz eng katta ob'ektni nishon sifatida ishlatamiz, so'ngra markaziy nuqtani hisoblaymiz.
# initialisation and detection goes here
...
# check the largest_blob is set
if largest_blob is not None:
# extract largest blob's information
x, y, width, height, area = largest_blob

# draw a purple rectangle around it on the image copy


image_copy.drawRect(x, y, width, height, 128, 0, 255)

# now extract the centre of the largest blob


target_x = (x + x + width) / 2.0
target_y = (y + y + width) / 2.0
(Izoh: aks holda 2.0uning o'rniga yozish muhim , 2aks holda Python tamsayı bo'linmasidan foydalanadi , boshqacha yo'l tutadi .)
Rasmdagi mavqei bo'yicha biz maqsadli pozitsiyamizga egamiz. Bizning robotimiz uchun bu rasmning chap yoki o'ng tomonida bo'lishi kerak. Maqsad pozitsiyasini -1.0 dan +1.0 oralig'ida normallashtirishga imkon beradi, bu erda -1.0 ekranning chap tomonida va +1.0 o'ng tomonda joylashgan. Ehtimol, bu target_ypozitsiya ob'ektning ekranda chapga yoki o'ngga qanchalik masofani farq qilmasligi aniq, shuning uchun siz ushbu satrni o'zingizning kodingizdan olib tashlashingiz mumkin.
-1,0 dan +1,0 gacha normallashtirishdan oldin biz +0,0 dan +1,0 gacha normallashamiz. Potentsial x pozitsiyalari 0,0 dan o'zgaradi, image.widthshuning uchun biz buni bo'linish orqali amalga oshirishimiz mumkin image.width.
# normalise to the range +0.0 to +1.0
target_direction = target_x / image.width
Endi biz 0,5ni olib tashlab, buni -0,5 dan 0,5 gacha o'zgartiramiz.
# range -0.5 to +0.5
target_direction -= 0.5
Nihoyat biz kerakli sonni -1.0 dan 1.0 gacha olish uchun 2 ga ko'paytiramiz.
# range -1.0 to +1.0
target_direction *= 2.0
Endi target_directionrobotlarni boshqarish uchun yaxshi formatda. Robot motorlarining tezligini sozlash uchun biz ushbu funktsiyadan foydalanamiz setSpeeds(). Bu har bir g'ildirakning tezligini -100 dan +100 gacha bo'lgan parametr sifatida qabul qiladi. Dastlab biz robotni blob tomon yo'naltiramiz, rasmda blob chapga yoki o'ngga qancha bo'lganiga mutanosib ravishda burilamiz.
# The speed scale of 100 corresponds to full speed
# when the object is on the far left or right of the image
speed_scale = 100.0

left_speed = target_direction * scale_factor


right_speed = - target_direction * scale_factor
E'tibor bering, yuqoridagi kodda to'g'ri tezlik natija tezligining salbiy tomoniga o'rnatiladi. Buning sababi shundaki, ob'ekt eng o'ng tomonda bo'lsa, maqsad yo'nalishi ijobiy bo'ladi, lekin biz to'g'ri motorni oldinga emas, orqaga qarab boshqarishni xohlaymiz.
Endi kodni sinab ko'rish uchun yaxshi vaqt.
Siz kodni sinab ko'rganingizda robotning shunchaki o'z joyida o'girilishini sezasiz. Buning sababi shundaki, biz tezlikni bir-biriga qarama-qarshi yo'nalishda bir xil sozlaymiz. Shuningdek, siz robotning kameraning ko'rish chizig'idan qanchalik chapga yoki o'ngga qarab mutanosib ravishda burilishini sezasiz, demak siz robot va ob'ekt o'rtasida kichik burchak paydo bo'lganda sekin burilishlarni amalga oshirasiz va u bo'lganda ko'rish chetiga yaqin.
Robot aylanayotganda oldinga siljishi uchun biz doimiy tezlik koeffitsientini qo'shishimiz kerak. Men burilish tezligiga +100.0 dan oshadigan tezlik ta'sir qilmasligi uchun men tezlik skalasini tushirdim, lekin bunga hojat yo'q.
# scale factor for the speed
speed_scale = 75.0
# constant forward speed to add
speed_const = 25.0

# set the speeds


left_speed = speed_const + (target_direction * speed_scale)
right_speed = speed_const – (target_direction * speed_scale)

# drive the motors


robot.setSpeeds(left_speed, right_speed)
Oxirgi qadam - bu ssenariy chiqqandan keyin robot motorlarining to'xtatilganligiga ishonch hosil qilishdir. Shunday qilib, hodisani qayta ishlash paytida ushbu qatorni joylashtiring:
# finally, stop driving the motors
robot.setSpeeds(0,0)

Download 1.26 Mb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling