کنترل و حفظ تعادل کوادکوپتر

پروژه Course object


کنترل و حفظ تعادل کوادکوپتر1 در شرایط‌ مختلف به پارامتر‌های بسیاری بستگی دارد. اغلب محاسبه و در نظر گرفتن تمامی این پارامتر‌ها کار بسیار دشواری است. در این پروژه سعی شده است تا تعادل یک کوادکوپتر را با استفاده از یادگیری تقویتی2 در فضا حفظ کرد.

۱. مقدمه

کوادکوپتر یک وسیله‌ی مکانیکی است که از ۴ چرخنده3 تشکیل شده است. برای به حرکت در آوردن این وسیله به هر‌کدام از چرخنده‌های آن می‌توان یک نیروی محرک و دورانی وارد کرد. هرکدام از چرخنده‌ها یک زاویه دارند که آن زاویه جهت نیروی وارد به وسیله از سمت آن چرخنده را مشخص می‌کند. با دوران این چرخنده‌ها می‌توان یک نیروی گشتاوری4 تولید کرد که نتیجه آن پرواز‌ و به حرکت در آمدن کوادکوپتر می‌شود.
در یک محیط ۳ بعدی تصادفی پرواز یک کوادکوپتر به شرایط و عوامل بسیاری بستگی دارد. اتفاقاتی که در محیط اتفاق می‌افتد به طور کامل تصادفی است. این تصادفی بودن اتفاقات در این محیط منجر به این می‌شود که فضای حالت5 در این محیط بی‌نهایت باشد. در نتیجه‌ی آن نمی‌توان تعداد بی‌نهایت if-else برای این محیط تعریف کرد تا هر زمان که کوادکوپتر در یک وضعیتی قرار می‌گیرد، اکشن متناسب با آن وضعیت را انجام دهد. همچنین این مساله با در نظر گرفتن پارامتر‌های موثر فیزیکی نیز بسیار دشوار حل می‌شود. زیرا ممکن است از یک پارامتر کمتر تاثیر‌گذار صرف نظر شود و همین باعث غیر دقیق شدن محاسبات یا دنباله‌ای از محاسبات گردد. البته برای حل این مساله راه حل‌های بسیاری ممکن است وجود داشته باشد که اشاره کردن به آن‌ها خارج از هدف این پژوهش است. راه حلی که برای بررسی در نظر گرفته شده، یک راه حل یادگیری است. در این راه حل سعی شده است که ویژگی‌هایی انتخاب شود که به موجب آن‌ها بتوان تعادل یک کوادکوپتر را در فضا حفظ کرد. البته باید توجه داشت که این ویژگی‌ها باید به طریقی انتخاب شوند که حداکثر تعداد پارامتر‌های ممکن را پوشش دهند.

۲. کار‌های مرتبط

تا کنون راه حل‌های متفاوتی برای این مساله ارائه شده است که در زیر به طور خلاصه به بعضی از آن‌ها اشاره می‌کنیم.

۲.۱. استفاده از معادلات فیزیکی

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

۲.۲. استفاده از سنسور‌های حرکتی و تعادلی

در این روش سنسور‌های مختلفی روی کوادکوپتر نصب می‌شوند. مانند سنسور‌های شتاب‌سنج، ژیروسکوپ و ... . از یک پردازنده‌ی اصلی و چند پردازنده‌ی فرعی (پردازنده فرعی برای پیش‌پردازش اطلاعات گرفته شده از سنسور است) استفاده می‌شود. برای رسیدن به تعادل کافی است پارامتر‌های در نظر گرفته شده از پیش برای پردازنده‌ی اصلی تعریف شده باشند.

۳. چالش‌ها

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

۳.۱. شبیه‌ساز AirSim

شبیه‌ساز AirSim یکی از شبیه‌ساز‌های متن‌باز[3] ارائه شده توسط مایکروسافت است. برای پیاده‌سازی این شبیه‌ساز از موتور Unreal استفاده کرده اند. یکی از ویژگی‌های این شبیه‌ساز این است که می‌توان تصاویر بسیار زیادی در فریم‌های مختلف از محیط تهیه کرد که این تصاویر برای کار‌های DeepLearning ظاهرا مناسب هستند. ویژگی دیگر این شبیه‌ساز این بود که می‌توان کنترل خوبی روی پهباد داشت. از دیگر ویژگی‌های آن داکیومنت جامع و کامل آن بود. البته پس از بررسی این شبیه‌ساز مشاهده گردید که بعضی از قسمت‌هایی که در داکیومنت آن آمده است پیاده‌سازی نشده است. همچنین این شبیه‌ساز انعطاف پذیری خوبی در مقابل تغییراتی که روی آن باید اعمال می‌شد نداشت. فیزیک این شبیه‌ساز نیز غیر واقعی به نظر می‌آمد. مثلا وقتی کوادکوپتر در یک ارتفاعی قرار گیرد انتظار این وجود دارد که در آن ارتفاع به علت کنش-واکنش نیرو‌های دورانی و جاذبه‌ای نوسان کند.

۳.۲. شبیه‌ساز RoboND-Controls-Lab

این شبیه‌ساز[4] که توسط تیم udacity طراحی و توسعه یافته است به طور متن‌باز ارائه شده است. برای پیاده‌سازی آن از موتور Unity استفاده کرده اند. از ویژگی‌های این شبیه‌ساز جدا بودن محیط شبیه‌ساز و محیط عامل6 است. محیط عامل به طور کامل روی بستر ROS7 پیاده‌سازی شده است تا امکان این فراهم شود که روی یک وسیله‌ی واقعی به جای شبیه‌ساز نیز بتوان آن را گسترش داد. همچنین این شبیه‌ساز در مقابل تغییرات روی کد منبع آن بسیار منعطف بود و به راحتی امکان آن وجود داشت تا تغییرات مطلوب روی فیزیک آن داده شود. تنها ایرادی که می‌توان به آن وارد کرد نداشتن داکیومنت بود که البته از این موضوع به دلیل سادگی آن می‌توان چشم‌پوشی کرد.

۴. روش‌ پیاده‌سازی

روش پیاده‌سازی در این پژوهش از چند قسمت تشکیل شده است که به صورت سلسله مراتبی موجب پیاده‌سازی کلی پروژه می‌شوند. در هر‌کدام از قسمت‌ها به جزئیات پیاده‌سازی آن پرداخته شده است.

۴.۱. ساده سازی فیزیک

همانطور که قبلا گفته شد، کوادکوپتر ۴ چرخنده دارد و هرکدام از این چرخنده‌ها زاویه و نیروی محرک خود را دارند. اگر در ویژگی‌8های یادگیری تقویتی برای هر‌کدام از چرخنده‌ها این ۲ پارامتر در نظر گرفته شود، یک مدل نسبتا پیچیده حاصل می‌شود و محاسبه وزن و امتیاز در این حالت کار دشواری خواهد شد. به منظور ساده کردن این بخش در گام اول برآیند گشتاوری نیرو‌های ۴ چرخنده با توجه به زاویه آن‌ها محاسبه گردید.


\vec{\tau} = \vec{R}_1 \times F_1 + \vec{R}_2 \times F2 + \vec{R}_3 \times F_3 + \vec{R}_4 \times F4

به طور کلی برای هر متحرکی که در ۳ بعد می‌تواند حرکت کند(مانند هواپیما،‌ هلی‌کوپتر، زیردریایی و حتی ماهی)، به جای در نظر گرفتن بردار‌های سرعت متحرک در جهت‌های مختلف، می‌توان از ۳ پارامتر Roll-Pitch-Yaw (به اختصار RPY)استفاده کرد


همانطور که در تصویر فوق مشاهده می‌شود،‌ پارامتر R برای حرکت کوادکوپتر در راستای چرخنده‌های سبز در نظر گرفته شده، پارامتر P برای حرکت در راستای چرخنده‌های قرمز و پارامتر Y برای حرکت گردشی به دور محور z است.
از آنجایی که پارامتر Y تاثیری روی ارتفاع و تعادل کوادکوپتر ندارد، از مقدار آن صرف نظر گردیده است. نکته‌ی دیگری که وجود دارد این است که در صورتی که پارامتر‌های RP هر‌کدام مقدار بسیار زیاد نوسانی داشته باشند، کوادکوپتر به دور محور‌های x و y خود خواهد چرخید.
برای تعادل در ارتفاع ثابت نیز طبق رابطه‌ی فیزیکی زیر، کافی است نیرو در راستای عمودی (z) برابر با وزن جسم باشد. از این می‌توان نتیجه گرفت که سرعت خطی در راستای محور z برابر صفر باشد.
\vec{F}_z = m_{quad} \times g_{gravity} \Rightarrow LinearVelocity_z = 0

۴.۲. مدل مارکوف

در مدل مارکوف سعی شده است تا پارامتر‌های تاثیر‌گذار بر مساله را در نظر گرفت و با دادن وزن9 و امتیازات10 مناسب برای یال یک حالت به حالت دیگر مساله را مدل کرد و از این مدل در یادگیری تقویتی استفاده کرد.
رسم شکل مدل مارکوفی مساله به دلیل بزرگ بودن فضای حالت کمی دشوار است. ترجیح داده شده است که به جای رسم شکل آن، آن را به صورت زیر توضیح داد.
گفته شد که برای حفظ تعادل در راستای عمود باید سرعت خطی در راستای عمود برابر صفر شود. پس هر گاه عامل تلاش کند که به هدف صفر شدن سرعت خطی در راستای عمود برسد امتیاز مثبت برای آن در نظر گرفته می‌شود.
برای حفظ تعادل در صفحه xy نیز می‌توان از پارامتر از RP استفاده کرد. عامل باید جهت جلوگیری از چرخش به دور محور y پارامتر R را و جهت جلوگیری از چرخش حول محور x پارامتر P را به صفر برساند. وزن‌هایی که برای این دو پارامتر در نظر گرفته می‌شود به صورت زیر است.

R \propto w_1 \times V_i + w_2 \times V_j

P \propto w_1 \times V_i + w_2 \times V_j

۴.۳. یادگیری تقویتی


به منظور ایجاد کردن یک بستر یادگیری برای عامل از روی مدل ابتدا مقادیر اولیه‌ای برای هر یک از پارامتر‌های داده شده نسبت داده شده است. این مقدار دهی اولیه شامل مقدار دهی اولیه‌ی وزن‌ها و مجموع امتیازات برای هرکدام از حالت‌ها می‌شود.

  • مقدار دهی اولیه وزن‌ها:
    این مقدار دهی برای وزن‌ها به صورت کاملا تصادفی در نظر گرفته شده است. البته باید این نکته را توجه داشت که برای حالت‌هایی که عامل یک کار غلط انجام دهد وزن‌ها منفی در نظر گرفته شده است.

  • پارامتر تعادل در ارتفاع ثابت:
    مقدار اولیه مجموع امتیازات برای این حالت منفی بی‌نهایت در نظر گرفته شده است.

  • پارامتر تعادل در راستای محور‌های x و y:
    این مقدار برابر مثبت بی‌نهایت به طور جداگانه برای هرکدام در نظر گرفته شده است. ولی از آنجایی که حرکت در صفحه‌‌ xy توسط این دو انجام می‌گیرد در ارزیابی مجموع این دو باهم در نظر گرفته شده است.


برای عامل یک متد تعریف شده است به نام قدم11. در این متد، عامل با توجه به حالتی که در آن قرار گرفته است با توجه به وزن‌های تخصیص داده شده باید گام بعدی را محاسبه کند و بازگرداند. هیچ یادگیری در این بخش در نظر گرفته نمی‌شود مگر آن که یک episode انجام کامل شود. یک episode را می‌توان به این صورت تعریف کرد: یک بازه‌ی زمانی است که قبل از اتمام آن، عامل هیچ یادگیری روی داده‌های به دست آمده انجام نمی‌دهد و صرفا مجموع امتیازات را در جمع آوری می‌کند. پس از اتمام یک episode متد یادگیری فراخوانی می‌شود. در این متد است که وزن‌ها و مجموع امتیازات آپدیت می‌شوند.


شبه کد زیر کلاس عامل را به همراه متد‌های آن نمایش می‌دهد.

class ControlQuad(BaseAgent):

def init(self, task):...
def step(self, state, reward, end_episode):...
def act(self, state):...
def learn(self):...


از شبه کد زیر نیز برای پیاده‌سازی تابع یادگیری استفاده شده است.

score = total_rewards / float(count)
if score > best_score:

best_score = score
best_weight = weight
noise_scale = 0.5 * noise_scale

else:

w = best_weight
noise_scale = 2.0 * noise_scale
weight = weight + noise_scale

۵. آزمایش‌ها و نتایج


در نتایج به دست آمده بعد از گذشت ۱۳ ساعت از عملیات یادگیری، مشاهده گردید که کوادکوپتر قادر به حفظ کنترل خود در حالت های مختلف شده است. بعد از ذخیره سازی وزن‌های به دست آمده، یک آزمایش تصادفی نیز طراحی گردید که در آن کوادکوپتر در شرایط کاملا تصادفی قرار می‌گرفت و عامل سعی در برقرار تعادل با بیشترین دقت ممکن می‌کرد.
نکته حائز اهمیت دیگر در مورد مجموع امتیازات است. بعد گذشت حدود ۳۰۰ اپیزود (۱۵۰۰ ثانیه) در حالت تعادل در ارتفاع مشاهده گردید که داده به یک عدد خاص میل می‌کنند و بعد از آن در حدود فقط اندکی نوسان داشتند. شکل زیر مجموع امتیازات داده شده برای رسیدن به برقراری تعادل در محور z را نمایش می‌دهد.

همین‌طور در نمودار‌های زیر که تعادل به دست آمده در صفحه xy را نمایش می‌دهد. به طور تقریبی از نمودار‌ها دریافت می‌گردد که مجموع دو نمودار امتیازات در راستای x و y با امتیاز کلی که در آن بخش بدست آمده برابر شده است.

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


نکته‌ای که در مورد آزمایش‌های دیگر وجود داشت،‌ این بود که در این پژوهش برای جمع آوری داده یادگیری، یک‌ بار نیز آزمایش بدون ساده سازی فیزیک در نظر گرفته شده بود. در آن حالت بعد از گذشت حدود ۶ ساعت، هیچ پیشرفتی مشاهده نمی‌شد. پس از بررسی روابط فیزیکی دلیل این امر تا حدودی مشخص شد و آن این بود که این پارامتر‌ها به شدت به یکدیگر وابسته هستند. با کوچکترین تغییری در وزن ویژگی‌ها، تاثیر زیادی روی ویژگی‌های دیگر می‌گذاشت. همین سبب شده بود تا بعد گذشت مدتی طولانی به نتیجه مطلوبی نرسد.

۶. کار‌های آینده

در مقاله‌ای [6]که قبل از پیاده‌سازی کل پروژه مورد بررسی قرار گرفت، از یک روش یادگیری تقویتی استفاده کرده بودند. در آن مقاله از یک شبکه عصبی به عنوان نگه‌دارنده وزن‌ها استفاده کرده بودند. یکی از کار‌هایی که در آینده می‌تواند صورت بگیرد این است که با همین ساده سازی فیزیک منتها با در نظر گرفتن چند پارامتر دیگر یا تعیین کردن هدف برای مسیر یابی و جستجو این مساله حل شود.
از دیگر کار‌های جالبی که می‌تواند در آینده صورت بگیرد این است که میتوان یک بار12 اضافی روی این کوادکوپتر نصب شود به طوری که وزن آن را متغیر سازد. با متغیر بودن پارامتر وزن دیگر نمی‌توان سرعت خطی در جهت محور z را ثابت و برابر صفر در نظر گرفت.

۷. مراجع

[1] no. 7 MDPs slides of the AI course Fall-2018
[2] no.8 Reinforcement Learning slides of the AI course Fall-2018
[3]Microsoft AirSim
[4]Udacity RoboND Controls Lab
[5]the Robot Operating System
[6] Jemin Hwangbo, Inkyu Sa, Roland Siegwart, Marco Hutter: Control of a Quadrotor with Reinforcement
Learning


  1. QuadCopter

  2. Reinforcement Learning

  3. Rotor

  4. Torque

  5. State Space

  6. Agent

  7. Robot Operating System

  8. Feature

  9. Weight

  10. Reward

  11. Step

  12. payload