معمولا پروژه ها توی دانشگاه خیلی جدی گرفته نمیشه و حتی دانشجو ها پول میدن تا شخص دیگه ای براشون پروژه انجام بده. در صورتی که پروژه میتونه نمایی از چیزهایی باشه که فرد توی دوران تحصیلش یاد میگیره، من هم پروژه کارشناسی خودم رو سعی کردم سخت انتخاب کنم تا محکی باشه برای دانسته های خودم. از طرفی دیگه تصمیم گرفتم که این پروژه رو توی سایت سیسوگ منتشر کنم تا بقیه هم بتونند از اون استفاده بکنند و اگر دوست داشتند اونها هم پروژه هاشون رو داخل سیسوگ منتشر کنند. با سیسوگ همراه باشید تا به بررسی پروژه بازوی رباتیک فیلم بردار هوشمند بپردازیم.
این پروژه به طراحی، ساخت و پیادهسازی یک بازوی رباتیک فیلمبردار هوشمند میپردازد که قادر است با ردیابی ژستهای دست کاربر، حرکت دوربین و عملیات ضبط را به صورت خودکار کنترل نماید. هدف اصلی، ارائه یک راهکار تعاملی برای هدایت دوربین بدون نیاز به اپراتور انسانی است. در بخش سختافزار، از یک بازوی رباتیک اپن سورس SO-101 با موتورهای سروو باس استفاده شده که سازه آن با پرینتر سهبعدی ساخته شده است. برای شبیهسازی و حل سینماتیک معکوس ربات از فریمورک PyBullet و برای پردازش تصویر و تشخیص ژستهای دست از کتابخانه MediaPipe گوگل بهره گرفته شده است. یکی از چالشهای کلیدی این پروژه، نگاشت موقعیت دوبعدی دست در تصویر دوربین به فضای کاری سهبعدی ربات بود که این مشکل با تعریف یک صفحه کاری مجازی و خمیده برای حرکت نرم End-Effector حل گردید. نتیجه نهایی، یک سیستم یکپارچه و کارآمد است که تعاملی نوین را برای کنترل دوربین در کاربردهای مختلف فیلمبرداری فراهم میکند.
برای بخش مکانیکی پروژه نیاز به طراحی یا استفاده از یک بازوی رباتیک آماده داشتیم. با بررسی های انجام شده بهترین راه حل استفاده از یک بازوی رباتیک آماده و ویرایش آن در صورت لزوم، بر اساس نیاز خود بود، به این دلیل که ساختار کلی بازوی مورد نیاز یک ساختار متداول است که با نام بازوی رباتیک 4R شناخته میشود. پس از بررسی های مختلف بازوی رباتیک SO-101 به عنوان یک بازوی دارای 6 درجه آزادی، بهترین گزینه برای پیاده سازی پروژه در نظر گرفته شد. بدنه این ربات جهت پرینت با پرینتر سه بعدی FDM طراحی شده است و میتوان از متریال PLA برای پرینت بدنه ربات استفاده کرد.

تصویری از بازوی رباتیک SO-101
بازوی SO-101 جهت حرکت از سروو موتور های باس مدل STS3215 استفاده میکند. این سروو موتور ها به دلیل ویژگی های خاص خود کاملا مناسب پروژه های تحقیقاتی آموزشی و یا حتی برخی پروژه های صنعتی میباشد. از جمله ویژگی این موتور ها میتوان به موارد زیر اشاره کرد:

شکل (2-2) : تصویری از سروو موتور های STS3215
برای فرمان دادن به این سروو موتور ها کافیست که موقعیت سروو موتور مورد نظر را به همراه شناسه آن سروو توسط پروتکل UART برای سروو ارسال کنیم. با توجه به این موضوع ما میتوانیم این دیتای سریال را توسط کامپیوتر و با کمک یک مبدل ارسال کنیم.
در این پروژه ما از درایور سروو سریال باس قابل استفاده برای سروو های ST و SC استفاده کردیم که یک ورودی تغذیه دارد که جهت تغذیه موتور ها استفاده میشود و میتوان توسط یک آداپتور 12V را به آن متصل کرد، همچنین دارای یک ورودی USB است که به کامپیوتر متصل میشود و دیتا های مورد نیاز برای موتور ها را دریافت و ارسال میکند. همچنین ما دو خروجی ۳ پین داریم که توسط یک کابل به موتور ها متصل میشود و تغذیه و دیتای موتور ها را تامین میکند.

شکل (2-3) : تصویری از برد درایور سروو موتور های باس
با توجه به اینکه پروژه ما دارای یک بازوی رباتیک است که قابل جابجایی در محیط و اعمال نیرو را دارد، لازم است که ابتدا قسمت نرم افزار و کنترل ربات در شبیه ساز تست شود و پس از اطمینان خاطر از عملکرد قسمت کنترلی، کد بر روی سخت افزار واقعی اجرا شده و در صورت نیاز اصلاحاتی انجام شده و مشکلاتی که در شبیه سازی قابل بررسی نبودند، بررسی و اصلاح شود.
ما در این پروژه نیاز داریم تا موقعیت End Effector بازو را در فضا مشخص و جابجا کنیم، به همین دلیل نیاز است تا سینماتیک معکوس بازو پیاده سازی شود و با کمک حل معادلات موقعیت موتور ها مشخص شود.
جهت پیاده سازی سینماتیک معکوس ربات از چند روش میتوان استفاده کرد. روش کلاسیک تشکیل معادلات به صورت دستی و پیاده سازی آن در کد است. اما روش دیگر استفاده از فریمورک های آماده برای اینکار است که در ادامه آن را توضیح میدهیم.
فریمورک هایی مانند move it یا pybullet وجود دارند که میتوان به آنها فایل مدل شده ربات با فرمت ufrd یا فرمت های مشابه را داد، سپس خود فریم ورک بر اساس فایل مدل شده ربات، معادلات آنرا بدست می آورد و آنها را حل میکند. فایل URDF یا Unified Robot Description Format در واقع یک فایل متنی (XML) است که شرح کامل هندسه و ویژگیهای مکانیکی ربات را به موتورهای شبیهسازی (PyBullet، Gazebo، MoveIt و …) میدهد و شامل لیست تمام لینکها، مفصلها، مقیاسها و مختصات اجزای ربات، رنگها، متریالها و … است. به دلیل اینکه ما از بازوی آماده SO-101 استفاده کردیم، فایل ufrd آن از قبل آماده بوده و ما از آن استفاده کردیم. ما برای پیاده سازی سینماتیک معکوس ربات و شبیه سازی آن از pybullet استفاده کردیم، چرا که نسبت به move it سبک تر، ساده تر و سریع تر است اما move it قابلیت های بسیار بیشتری دارد و در پروژه های صنعتی قابل استفاده است.
pybullet از روش حل عددی برای حل سینماتیک معکوس ربات استفاده میکند. الگوریتم اصلی مورد استفاده، روش Damped Least Squares (DLS) بر پایه ماتریس ژاکوبین (Jacobian Matrix) است. این روش نسخهای پایدارتر از روش نیوتن-رافسون است.
موقعیت نهایی (x) تابعی از زوایای مفاصل (θ) است:
ما تغییرات کوچک در موقعیت (Δx) را به تغییرات کوچک در مفاصل (Δθ) از طریق ماتریس ژاکوبین (J) مرتبط میکنیم:
در اینجا:
برای پیدا کردن Δθ، به طور ایده آل باید معکوس J را محاسبه کنیم:
اما J اغلب مربعی نیست (تعداد مفاصل با درجات آزادی برابر نیست) و یا ممکن است “تکین” (Singular) باشد که معکوسپذیر نیست.
pybullet برای حل این مشکل و جلوگیری از پرشهای ناگهانی در نزدیکی نقاط تکین (Singularities)، از فرمول DLS استفاده میکند.
برای بخش پردازش تصویر ما نیاز به تشخیص ژست های حرکتی دست و ضبط ویدیو توسط دوربین داریم. برای بخش تشخیص ژست های حرکتی ما از کتابخانه mediapipe که توسط شرکت گوگل توسعه داده شده استفاده کردیم.
سیستم MediaPipe از چند pipeline یا «خط پردازش» تشکیل میشود که هر pipeline شامل تعدادی calculator است. هر calculator یک وظیفه خاص دارد (مانند تشخیص ناحیه دست، تخمین نقاط کلیدی و غیره).
برای تشخیص دستها، pipeline معمولاً دو مرحله دارد:
مرحله Palm Detection (مدل تشخیص کف):
مدل Palm Detection بر پایه شبکه عصبی BlazePalm کار میکند. هدف آن پیدا کردن مستطیلهایی است که ناحیهی احتمالی کف دست را در تصویر مشخص میکنند. بهجای اینکه مستقیماً کل دست را شناسایی کند، فقط کف دست را تشخیص میدهد چون کف از زاویههای مختلف بهتر قابل شناسایی است و نرخ خطا را پایین میآورد. خروجی این مرحله یک bounding box برای هر دست در تصویر است. این مدل روی ورودی تصویر RGB عمل کرده و معمولاً روی GPU یا CPU اجرا میشود.
در این بخش از مدل BlazeHand Landmark استفاده میشود که یک شبکه عصبی سبک است و بر اساس regression عمل میکند (مختصات دقیق نقاط را عددی تخمین میزند، نه طبقهبندی). ورودی این مدل تصویر بریده شده از ناحیه دست (از مرحله قبل) است و خروجی آن مختصات سهبعدی (x, y, z) برای ۲۱ نقطه اصلی دست شامل مچ، بندهای انگشتان و نوک انگشتان.
به طور مثال شناسه یکسری از نقاط دست به این صورت است:
MediaPipe فقط نقاط را تحویل میدهد. اما برای تشخیص ژست باید با منطق یا مدل دیگری روی این نقاط کار کرد. دو رویکرد متداول برای تشخیص ژست وجود دارد، قوانین هندسی و استفاده از مدل یادگیری ماشین جداگانه.
با اندازهگیری زاویه بین انگشتها، فاصلهی مفاصل و غیره، میتوانید حالتهایی مثل “OK”, “Thumbs Up”, “Peace” یا “Fist” را تشخیص دهید. به طور مثال اگر زاویه بین انگشت اشاره و شست کمتر از مقدار مشخصی بود علامت “OK” تشخیص داده میشود.
مختصات (x, y, z) به عنوان ورودی به مدل (مثل SVM یا شبکه نورونی کوچک) داده میشود تا ژست را بهصورت خودکار طبقهبندی کند. در این پروژه ما از این روش استفاده کرده ایم.
MediaPipe Hands خروجی زیر را به ما میدهد:
از بازوی رباتیک SO-101 جهت پیاده سازی مکانیک بازو استفاده شده است، اما ۲ درجه آزادی از ربات جهت جابجایی اجسام استفاده میشد که به دلیل عدم کاربرد از ربات حذف شد. بخش های مختلف سازه ربات در سایت گیتهاب در دسترس هستند. با استفاده از این فایل ها بخش های مختلف سازه ربات را توسط پرینتر سه بعدی پرینت کردم.

شکل (3-1) : سازه پرینت شده بازو
مرحله بعدی مونتاژ بخش های مختلف و اتصال موتور ها بود که بر اساس راهنمای خود بازو انجام شد که در سایت هاگینگ فیس قابل دسترسی است.

شکل (3-2) : نمونه ای از راهنمای مونتاژ بازوی ربات SO-101
پس از مونتاژ موتور ها و تکمیل سازه مراحل از قبل آماده به پایان میرسد و بقیه مراحل بدون راهنمای مشخص و بر اساس پروژه نهایی انجام میشوند.
موتور هایی که در این پروژه استفاده شده از نوع باس هستند و میتوان تا 253 موتور را به یکدیگر متصل کرد و از طریق یک سیم دیتا تمامی آنها را کنترل کرد. برای اینکه بتوان موتور ها را به صورت جداگانه کنترل کرد، هر موتور قابلیت گرفتن یک شناسه (ID) به خصوص را دارد. برای تغییر شناسه موتور ها، هر موتور به صورت جداگانه توسط برد مبدل به کامپیوتر متصل شد و توسط نرم افزار FD که نرم افزار مخصوص شرکت FEETECH میباشد، شناسه آن تغییر داده شد. شماره گذاری موتور ها از 1 تا 6 انجام شد که به ترتیب از اولین موتور بعد از اتصال سازه به زمین شروع شده و تا آخرین موتور که برای End Effector استفاده میشود، شماره گذاری انجام شد.
پس از آن موتور ها هر کدام بصورت جداگانه حرکت داده شد و از اتصالات سازه اطمینان حاصل شد. پس از کمی بررسی مشخص شد که به دلیل اینکه بازه حرکتی کامل موتور ها قابل دسترس نیست به خاطر محدودیت مکانیکی سازه اگر به موتور دستور داده شود که در آن محدوده حرکت کند (به اشتباه) فشار زیادی به موتور ها وارد میشود و بهتر است که از این مشکل جلوگیری شود که در تست ها به موتور و سازه آسیبی نرسد.

شکل (3-3) : بررسی پارامتر های موتور در نرم افزار FD
سروو موتور های STS3215 قابلیت این را دارا هستند که بازه حرکتی آنها به یک حداقل و حداکثر محدود شود تا در صورت فرمان اشتباه به سازه یا موتور آسیبی نرسد، به همین دلیل تمامی موتور ها به صورت جداگانه حرکت داده شدند و بازه حداقل و حداکثر اونها توسط نرم افزار FD بررسی شد و داخل پارامتر های هر موتور به صورت جداگانه وارد شد.

شکل (3-4) : تنظیم پارامتر های سروو موتور در نرم افزار FD
پس از راه اندازی موتور ها و تست کامل حرکت سازه، نوبت به توسعه قسمت نرم افزاری پروژه میرسد. ابتدا آماده سازی و نصب pybullet در سیستم عامل لینوکس انجام شد و پس از آن بارگزاری مدل ufrd ربات و حرکت آن به صورت دستی در شبیه ساز و تست آن انجام شد.

شکل (3-5) : مدل سه بعدی بازو در شبیه ساز
برای بررسی عملکرد صحیح بخش سینماتیک معکوس، یک برنامه گرافیکی ساده طراحی شد که در آن بتوان چند نقطه را در فضا مشخص کرد و با انتخاب هر کدام، معادلات سینماتیک معکوس ربات حل شده و End Effector جابجا شود.

شکل (3-6) : تست حرکت ربات در فضا با کمک نقاط
پس از تست های اولیه نیاز به دو تغییر در ساختار ربات و کدها بود که بازو با پروژه دوربین همخوانی داشته باشد، ابتدا نیاز به حذف 2 درجه آزادی از انتهای ربات بود، به این دلیل که نیازی به گریپر و نیازی به چرخش دوربین نیز در حال حاضر نداریم، پس از آن هم نیاز بود تا بازو در هر زاویه ای نقطه ای که قرار میگیرد، End Effector همیشه عمود بر سطح زمین باقی بماند تا دوربین متصل به آن دید خود را از دست ندهد. این کار با ورودی دادن یک آرایه که شامل سه زاویه x,y,z میشود به تابع حل سینماتیک معکوس قابل انجام است.
در اینجا نیاز است که زاویه End Effector بر اساس کواترنیون (Quaternion) داده شود به جای زوایای اویلر.
زوایای اویلر (چرخش حول محورهای X، Y و Z) برای انسان قابل فهم هستند اما یک مشکل بزرگ به نام قفل گیمبال (Gimbal Lock) دارند. در این حالت، دو محور از سه محور دوران روی هم منطبق میشوند و ربات یک درجه از آزادی حرکتی خود را از دست میدهد که باعث حرکات ناگهانی و غیرمنتظره میشود. کواترنیونها این مشکل را ندارند و برای درونیابی (interpolation) بین دو جهتگیری بسیار نرمتر و پایدارتر عمل میکنند.
پس از تشخیص ژست های حرکتی نیاز به اجرای یک فیدبک پس از نمایان شدن هر ژست داریم. در اینجا ما از ژست حرکتی دست باز و بسته برای شروع و توقف ضبط فیلم استفاده کردیم. نحوه کار به این صورت است که زمانی که دست بسته را تشخیص داد، یک تایمر شروع شده و بعد از 1 ثانیه منتظر دست باز میماند و اگر دست باز تشخیص داده شد، در صورتی که در حال ضبط بود آن را متوقف میکند و در غیر این صورت شروع به ضبط میکند. با کمک این روش از شروع و توقف ناخواسته ضبط جلوگیری میکنیم.

شکل (3-7) : تشخیص ژست حرکتی دست باز و شروع تایمر
همچنین از ژست حرکتی “انگشت اشاره” برای حرکت دوربین استفاده می کنیم و با کمک کتابخانه MediaPipe زمانی که این ژست حرکتی تشخیص داده شد، موقعیت آن در صفحه را خروجی گرفته تا در مراحل بعدی بر اساس آن بازو را حرکت دهیم

شکل (3-8) : تشخیص موقعیت در زمانیکه ژست تشخیص داده شده
برای حرکت بازو توسط دوربین ابتدا به صورت ساده موقعیت دست در خروجی دوربین به تابع سینماتیک معکوس بازو داده شد و بر اساس آن بازو حرکت داده شد، اما به دلیل اینکه دوربین محیط را به صورت 2 بعدی بررسی میکند و موقعیت دست را به صورت 2 بعدی تشخیص میدهد، زمانیکه ما این xوy را به برای حرکت در 3 بعد خروجی میدادیم، بازه حرکت بازو بسیار محدود و معمولا اشتباه بود. پس از بررسی راه حل های مختلف به این نتیجه رسیدیم که باید برای بازو یک فضای کاری 2 بعدی تعریف کنیم که End Effector فقط بر روی آن حرکت کند، همچنین برای اینکه بتوان از تمام درجات آزادی ربات استفاده کرد و بازه حرکتی ربات محدود نشود، این محدوده به صورت یک صفحه خمیده در جلوی ربات تعریف شد. پس از بررسی و تست مجدد، خروجی کاملا قابل قبول بود

شکل (3-9) : محدوده حرکتی ربات
در این پروژه یک بازوی رباتیک هوشمند فیلمبردار با قابلیت ردیابی حرکات دست طراحی، ساخته و پیادهسازی شد. هدف اصلی، ایجاد یک سیستم تعاملی برای کنترل موقعیت و زاویه دید دوربین تنها از طریق حرکات دست بود؛ سیستمی که بتواند بدون نیاز به اپراتور، عملیات فیلمبرداری را آغاز، متوقف و هدایت کند. برای دستیابی به این هدف، ابتدا بخش مکانیکی بازو با استفاده از مدل اپنسورس SO-101 ساخته و برای نیازهای پروژه بهینه شد. سپس بخش کنترلی شامل راهاندازی سروو موتورهای باس، تنظیم بازههای حرکتی و ایجاد ارتباط پایدار میان موتورها توسعه یافت.
در ادامه، بخش نرمافزاری پروژه با شبیهسازی کامل ربات در PyBullet پیش رفت و سینماتیک معکوس با روشهای عددی مبتنی بر ماتریس ژاکوبین پیادهسازی شد تا بازو قادر به دنبالکردن نقاط هدف با دقت مناسب باشد. برای پردازش تصویر نیز از MediaPipe استفاده شد تا سیستم بتواند ژستهای مختلف دست مانند دست باز، بسته و انگشت اشاره را تشخیص داده و بر اساس آنها فرمانهای حرکتی لازم را تولید کند. یکی از چالشهای اصلی، تبدیل مختصات دوبعدی دوربین به فضای سهبعدی ربات بود که با تعریف یک صفحه کاری خمیده در جلوی ربات و محدود کردن حرکت End Effector روی آن، به شکل پایدار و قابل اعتماد حل شد.
نتیجه نهایی پروژه، یک سیستم یکپارچه بود که میتواند موقعیت دوربین را بر اساس حرکت دست کنترل کند و فرآیند فیلمبرداری را تنها با ژستهای ساده مدیریت نماید.
فیلمی از عملکرد پروژه:
سورس کد این پروژه در گیتهاب سیسوگ قرار داده شده که از طریق لینک زیر میتونید بهش دسترسی داشته باشید
فایل گزارش این پروژه رو هم میتونید از این لینک دانلود کنید.در نهایت هم اگر مشکلی در توضیحات هست یا نکته ای داره خوشحال میشیم برامون کامنت بزارید و نظرتون رو بگید.
همچنین اگر دوست داشتید که خودتون این پروژه رو بسازید میتونید قطعاتش رو از فروشگاه امبددتک تهیه کنید.
علاقه مند به سیستم های امبدد | http://mahdi2001h.ir
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.