فهرست مطالب:

Gesture Hawk: روبات کنترل شده با اشاره با استفاده از رابط کاربری پردازش تصویر: 13 مرحله (همراه با تصاویر)
Gesture Hawk: روبات کنترل شده با اشاره با استفاده از رابط کاربری پردازش تصویر: 13 مرحله (همراه با تصاویر)

تصویری: Gesture Hawk: روبات کنترل شده با اشاره با استفاده از رابط کاربری پردازش تصویر: 13 مرحله (همراه با تصاویر)

تصویری: Gesture Hawk: روبات کنترل شده با اشاره با استفاده از رابط کاربری پردازش تصویر: 13 مرحله (همراه با تصاویر)
تصویری: Iran made Surena 4 Humanoid Robot, CAST University of Tehran ربات انسان نماي سورنا چهار ايران 2024, نوامبر
Anonim
Gesture Hawk: روبات کنترل شده با اشاره با استفاده از رابط مبتنی بر پردازش تصویر
Gesture Hawk: روبات کنترل شده با اشاره با استفاده از رابط مبتنی بر پردازش تصویر

Gesture Hawk در TechEvince 4.0 به عنوان یک رابط ساده پردازش تصویر مبتنی بر انسان و ماشین نمایش داده شد. کاربرد آن در این واقعیت نهفته است که هیچ سنسور اضافی یا پوشیدنی به جز دستکش برای کنترل ماشین رباتیک که بر اساس دیفرانسیل درایو کار می کند ، لازم نیست. در این دستورالعمل ، ما شما را با اصل کار پشت ردیابی اشیا و تشخیص حرکات مورد استفاده در سیستم آشنا می کنیم. کد منبع این پروژه را می توانید از Github از طریق پیوند بارگیری کنید:

مرحله 1: موارد مورد نیاز:

موارد مورد نیاز
موارد مورد نیاز
موارد مورد نیاز
موارد مورد نیاز
موارد مورد نیاز
موارد مورد نیاز
موارد مورد نیاز
موارد مورد نیاز
  1. درایور موتور L298N
  2. موتورهای DC
  3. شاسی ماشین روبات
  4. آردوینو اونو
  5. باتری های LiPo
  6. کابل USB آردوینو (بلند)
  7. کتابخانه OpenCV با پایتون

مرحله 2: اصل کار:

اصل کار
اصل کار

همانطور که در نمودار بالا مشاهده می کنید ، Gesture Hawk یک سیستم پردازش سه فاز است.

مرحله 3: برداشت و پردازش ورودی:

تصویربرداری و پردازش ورودی
تصویربرداری و پردازش ورودی

ضبط ورودی را می توان در دسته های گسترده تری که در نمودار بالا ذکر شده است ، درک کرد.

برای استخراج شکل دست از محیط ، باید از ماسک یا فیلتر یک رنگ مشخص (در این مورد - آبی بنفش) استفاده کنیم. برای انجام این کار ، باید تصویر را از فرمت BGR به HSV تبدیل کنید که می تواند با استفاده از قطعه کد زیر انجام شود.

hsv = cv2.cvtColor (قاب ، cv2. COLOR_BGR2HSV)

اکنون ، قدم بعدی این است که محدوده موردنظر از پارامترهای HSV را برای بیرون کشیدن دست از طریق ماسک یا فیلتر پیدا کنید. برای این منظور ، بهترین راه استفاده از میله های آهنگ برای یافتن محدوده مناسب است. در اینجا تصویر صفحه نوار آهنگ مورد استفاده برای این پروژه را مشاهده می کنید.

مرحله 4:

تصویر
تصویر

مرحله 5:

در اینجا ، یک قطعه کد در زیر برای ایجاد چنین نوار آهنگ برای ساخت ماسک آمده است:

واردات cv2

وارد کردن numpy به عنوان npdef هیچ چیز (x): گذر cv2.namedWindow ('image') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H'، 'image'، 110، 255، something) cv2.createTrackbar ('l_S '،' image '، 50، 255، nothing) cv2.createTrackbar (' l_V '،' image '، 50، 255، nothing) cv2.createTrackbar (' h_H '،' image '، 130، 255، nothing) cv2. createTrackbar ('h_S'، 'image'، 255، 255، nothing) cv2.createTrackbar ('h_V'، 'image'، 255، 255، nothing) while (1): _، frame = img.read ()

hsv = cv2.cvtColor (frame، cv2. COLOR_BGR2HSV) lH = cv2.getTrackbarPos ('l_H'، 'image') lS = cv2.getTrackbarPos ('l_S'، 'image') lV = cv2.getTrackbarPos ('l_V'، 'image') hH = cv2.getTrackbarPos ('h_H'، 'image') hS = cv2.getTrackbarPos ('h_S'، 'image') hV = cv2.getTrackbarPos ('h_V'، 'image') lower_R = np آرایه ([lH، lS، lV]) above_R = np.array ([hH، hS، hV]) mask = cv2.inRange (hsv، lower_R، above_R) res = cv2.bitwise_and (قاب ، قاب ، ماسک = ماسک) cv2.imshow ('image'، res) k = cv2.waitKey (1) & 0xFF if k == 27: break cv2.destroyAllWindows ()

مرحله 6: قسمت پردازش:

بخش پردازش
بخش پردازش

خوب ، ما شکل هندسی یک دست را داریم ، اکنون زمان استفاده از آن و استفاده از آن برای تشخیص حرکت دست است.

بدنه محدب:

از طریق بدنه محدب ، ما سعی می کنیم چند ضلعی تقریبی را از طریق نقاط شدید موجود در شکل متناسب کنیم. تصویر موجود در سمت چپ چند ضلعی تقریبی را نشان می دهد که به شکل با نقاط محدب با قرمز مشخص شده است.

نقاط محدب آن نقاطی هستند که از نظر شکل از هم دورتر از یک ضلعی هستند. اما ، مشکل بدنه محدب این است که در حین محاسبه آن ، ما یک آرایه از تمام نقاط محدب دریافت می کنیم ، اما آنچه ما نیاز داریم نقطه محدب نوک تیز آبی است. ما به شما خواهیم گفت که چرا مورد نیاز است.

برای یافتن این نقطه محدب ، ما باید فرمول عمود بر فاصله را برای یافتن فاصله نقطه محدب با نزدیکترین طرف اعمال کنیم. ما مشاهده کردیم که نقطه نوک آبی دارای حداکثر فاصله از طرف است و بنابراین ما این نقطه را بدست می آوریم.

مرحله 7:

تصویر
تصویر

مرحله 8:

تصویر
تصویر

در مرحله بعد ما باید شیب خطی را که به نوک انگشت شست (یا نقطه شدید) به این نقطه محدب با افقی متصل می شود ، پیدا کنیم.

مرحله 9:

تصویر
تصویر

در حالت فوق ، اگر حرکت برای چرخش به چپ باشد ، باید زاویه α بین 0 تا 90 درجه باشد. یعنی برنزه (α) باید مثبت باشد.

مرحله 10:

تصویر
تصویر

در حالت بالا ، اگر حرکت برای چرخش راست باشد ، باید زاویه α بین 180 تا 90 درجه باشد. یعنی برنزه (α) باید منفی باشد.

بنابراین ، اگر Tan α مثبت است ، سپس به چپ بپیچید. اگر Tan α منفی است ، سپس به راست بپیچید. اکنون وقت آن است که ببینیم چگونه می توان مهمترین دستور توقف را تشخیص داد.

در اینجا ، یک نسبت مشخص شده (با ضربه و آزمایش یافت می شود) مورد بررسی قرار می گیرد و در بیشتر موارد این نسبت فاصله ها در این محدوده خاص باقی می ماند.

مرحله 11:

تصویر
تصویر

در نهایت ، حرکت جلو به وسیله تابع matchShape () در OpenCV مورد تجزیه و تحلیل قرار می گیرد. این عملکرد ، شکل دو شمارنده را مقایسه می کند ، در این مورد ، بین مثال تمرین در thight در تصویر بالا با خط در سمت چپ تصویر بالا. با توجه به تغییرات موجود در شکل دو خط ، مقداری از 0 تا 2 یا 3 را باز می گرداند. برای همان کانتور ، 0 را برمی گرداند.

ret = cv2.match شکل (cnt1 ، cnt2 ، 1 ، 0.0)

در اینجا ، cn1 و cnt2 دو کانتور هستند که باید مقایسه شوند.

مرحله 12: کنترل حرکت:

کنترل حرکت
کنترل حرکت

PySerial:

ما از کتابخانه PySerial python برای تبدیل داده های پردازش شده به داده های سریال برای ارتباط با Arduino Uno از طریق کابل USB Arduino استفاده کردیم. هنگامی که یک حرکت خاص توسط opencv تشخیص داده شد ، یک متغیر موقتی به نام 'x' ایجاد کردیم و مقدار منحصر به فردی به آن اختصاص دادیم و آن را با استفاده از خط فرمان زیر به ورودی سریال تبدیل کردیم:

وارد کردن سریال #برای وارد کردن کتابخانه Pyserial

serial. Serial (''، baudrate = '9600'، timeout = '0') # تنظیم خروجی سریال.. PORT NAME نام پورتی است که انتقال داده ها توسط آن انجام می شود.

serial.write (b'x ') # x الفبایی است که به پورت ارسال می شود … b برای تبدیل این رشته به بایت است.

پردازش آردوینو:

اکنون آردوینو به گونه ای کدگذاری شده است که هر سری x متفاوت به صورت خطی برای یک عمل خاص که مسئول حرکت روان روبات است ترسیم می شود (به عنوان مثال تشخیص حرکت چپ باعث می شود موتورهای سمت راست به چپ بپیچند). ما می توانیم حرکت هر چرخ را به صورت ترجمه و همچنین چرخشی با تغییر صحیح کد کنترل کنیم.

L298N راننده موتور:-

درایور موتور به عنوان واسطه بین موتور و منبع تغذیه استفاده می شود زیرا موتورها به دلیل ولتاژ پایین نمی توانند مستقیماً تغذیه شوند. باتری Li-Po به ترمینال ورودی 12 ولت آن متصل است و ما سوکت 5 ولت arduino را به سوکت ورودی 5 ولت راننده موتور وصل می کنیم و سرانجام زمین Li-Po و همچنین arduino را در یک سوکت زمین مشترک راننده موتور متصل می کنیم.

اکنون پایانه های موتورها در پریزهای داده شده متصل می شوند. در نهایت ما پایانه های ورودی موتور را به سوکت های خروجی PWM آردوینو متصل می کنیم که به ما این امکان را می دهد تا جنبه های چرخشی و ترجمه ای حرکت را به طور دقیق تعیین کنیم.

توصیه شده: