• Slide 1

انجمن تخصصی پهپاد رها

اولین انجمن گفتگوی تخصصی پرنده های بدون سرنشین

engamanc
engamanc
آفلاین
1
با سلام
در بخش فلایت کنترلر ربات با دو سیگنال که یکی از رادیو کنترل(دستوراتی که ما صادر میکنیم) و دیگری از سنسورها(که میخوان ربات رو متعادل نگه دارن)سر و کار داریم.با چه الگوریتمی میشه اونا رو ترکیب کرد؟
تشکر ها
پاسخ ها (30)
  • پاسخ پذیرفته شده

    یکشنبه, 27 مارس 2016 - #permalink
    1
    سلام دوباره;)

    سال نو مبارک:)

    اول از همه مهمه که برای چه حلقه کنترلی میخواید بنویسید!

    معمولا برای یک کوادروتور از چندین حلقه کنترلی مستقل استفاده میشه، بگذارید با ساده ترین حلقه و پایین ترین شروع کنیم:

    مولتی روتور یک ربات ۶درجه آزادی هست که فقط به ۴ درجه اون دسترسی مستقیم هست( پس Underactuated هست) یعنی ورودی های کنترلی ما کمتر از درجات آزادی ربات هست!

    برای مولتی روتور ما ۶ درجه آزادی داریم که شامل: رول، پیچ، یاو، موقعیت طولی، موقعیت عرضی و ارتفاع

    اما تنها ۴ ورودی کنترلی داریم: Aileron, Elevator, Throttle, Rudder

    یعنی اینکه ما نمیتونیم بدون اینکه ربات رو کج کنیم جابجایی داشته باشیم

    پس دسترسی مستقیم به متغیرهای X,Y (موقعیت) نداریم.

    خب اما حالا برگردیم به ساده ترین کنترلر و پایین ترین لایه حلقه کنترلی، یکی از متغیرهای حالت برای کوادروتور نرخ دوران در هر سه محور هست که میشه: Phi_Dot, Psi_Dot, Theta_Dot
    که میشه سرعت زاویه ای های هر محور.

    خب پس اگر بخوایم کنترلر سرعت زاویه ای برای یک محور رو در نظر بگیریم میشه مثل شکل زیر:
    http://myelectrical.com/Portals/0/SunBlogNuke/2/WindowsLiveWriter/ControlTheory_D9FF/controlTheory_2.png

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

    این میشه یک کنترلر سرعت زاویه ای که کارکرد اون مثل کنترلرهای KK,Hobbyking Lite,.... هست.

    اگه جایی رو متوجه نشدین یا خیلی گنگ هست بگید تا توضیح بدم:)

    امیدوارم که این بار بحث به یک خروجی مطلوب برسه.
    تشکر ها
    پاسخ به درستی کمینه شد نمایش
  • پاسخ پذیرفته شده

    engamanc
    engamanc
    آفلاین
    یکشنبه, 27 مارس 2016 - #permalink
    0
    با تشکر :)
    چند سوال:
    1-در حلقه ی بالا اگر دستوری از طرف ما صادر نشه حلقه ی کنترلی طوری باید سرعت موتورها رو تنظیم کنه که زاویه هایی که توسط ژیروسکوپ محاسبه شده اند صفر باشند درسته؟
    2-در صورتی که دستور صادر شده از طرف ما و مقدار اندازه گیری شده توسط سنسور یکسان شوند(مثلا حالت زیر که تشریح کرده ام) و خطا صفر باشد ، عملکرد حلقه ی کنترلی به چه صورت خواهد بود؟
    در حلقه ی کنترلی بالا فرضا میخواهیم ربات به جلو حرکت کنه.پس با استفاده از elevator فرمان را صادر میکنیم و سرعت موتور جلو زیاد و سرعت موتور عقب کم میشه و این امر کوادروتور رو کج میکنه.یعنی باعث میشه کوادروتور حول محور pitch چرخشی داشته باشه.ژیروسکوپ این تغییر سرعت زاویه ای را حس و اندازه میگیرد.
    تشکر ها
    پاسخ به درستی کمینه شد نمایش
  • پاسخ پذیرفته شده

    دوشنبه, 28 مارس 2016 - #permalink
    0
    ۱و۲- خروجی ژیروسکوپ سرعت زاویه ای هست نه زاویه، این یعنی ورودی شما هم همون سرعت زاویه ای هست. حالا اگر استیک وسط رو سرعت زاویه ای صفر در نظر بگیریم و کوادروتور هیچ حرکتی نداشته باشه (حالت سکون) زیروسکوپ سرعت زاویه ای صفر رو اعلام میکنه. در خروجی موجب میشه که تغییر سرعت موتور(در اون محور) نداشته باشیم. به این نکته هم توجه داشته باشید که سرعت زاویه ای با زاویه متفاوت هست، یعنی اینکه اگر شما ورودی ۱ رو به حلقه کنترلی اعمال کنید اونوقت کنترلر تلاش میکنه تا پرنده رو با ۱ درجه بر ثانیه بچرخونه. یا اینکه اگر کوادروتور کج باشه و شما ورودی صفر بدید کنترلر اون رو به حالت افقی در نمیاره اما تلاش میکنه تا در همون زاویه بمونه(سرعت زاویه ای صفر)

    یک موضوع رو در نظر داشته باشید که این حلقه خروجی خودش رو به حلقه ارتفاع میده که اگر کنترل ارتفاع نداشته باشیم مستقیما با تراتل جمع میشه.
    تشکر ها
    پاسخ به درستی کمینه شد نمایش
  • پاسخ پذیرفته شده

    engamanc
    engamanc
    آفلاین
    دوشنبه, 28 مارس 2016 - #permalink
    0
    سلام دوباره
    بله خروجی ژیروسکوپ سرعت زاویه ای است ولی برای کنترل به زاویه نیاز داریم.چون ممکنه سرعت زاویه ای صفر باشه(یعنی کوادروتور حول هیچ محوری نچرخه)ولی زاویه صفر نباشه.
    فرض میکنیم هیچ فرمانی از سمت ما صادر نمیشه.اگر مثلا باد تعادل ربات را بهم بزنه آیا حلقه ی کنترلی تلاش نمیکنه ربات رو به حالت تعادل خود برگردونه؟
    تشکر ها
    پاسخ به درستی کمینه شد نمایش
  • پاسخ پذیرفته شده

    دوشنبه, 28 مارس 2016 - #permalink
    0
    بله در اين حالت كوادروتور قابل كنترل هست اما كنترلش سخت تر هست، توي كنترلرهايي كه الان توي بازار هست اكثرا اين مد كنترلي رو هم دارند، مثلا نازا در حالت manual در واقع فقط سرعت زاويه اي رو كنترل ميكنه و يا در مولتي وي هم اين مد هست و....
    بادهم تا حدودي جبران پذير هست چون به هرصورت وقتي قراره پرنده كج بشه قطعا حركتي شتابدار داره كه موجب ايجاد سرعت ميشه
    پس وقتي استيك راديو وسط هست و باد مياد جايروسكوپ با اندازه گيري سرعت موجب ميشه كه كنترلر سعي در جبران سرعت داشته باشه.
    تشکر ها
    پاسخ به درستی کمینه شد نمایش
  • پاسخ پذیرفته شده

    engamanc
    engamanc
    آفلاین
    دوشنبه, 28 مارس 2016 - #permalink
    0
    پس وقتی از طرف ما تغییری اعمال نشود خطا همان مقدار اندازه گیری شده ی ژیروسکوپ است و اگر به هر دلیلی صفر نباشد کنترلر با تغییر سرعت موتورها سعی در صفر کردن این مقدار می نماید.
    حال اگر ما قصد تغییر جهت ربات را داشته باشیم باید با فرمانی که صادر میکنیم سرعت موتورها را تغییر دهیم که این امر سبب کج شدن ربات می شود و این تغییر توسط ژیروسکوپ اندازه گرفته می شود و حلقه کنترلی طبق روال خود سعی در صفر کردن این خطا می نماید.
    1-ما برای کنترل ربات از کنترل زاویه استفاده میکنیم یا کنترل سرعت زاویه ای؟ اگر بخواهیم از دو سنسور شتابسنج و ژیروسکوپ استفاده کنیم فک کنم باید از کنترلر زاویه استفاده بشه.
    من الان تونستم خروجی سنسورها رو به زاویه تبدیل کنم و توسط فیلتر اونا رو باهم ترکیب کنم.قدم بعدی رو نمیدونم چجوری بردارم :( یعنی نمیدونم با اطلاعاتی که در اختیار دارم(زاویه های ربات که از سنسورها استخراج و از فیلتر گذروندم و خروجیهای رسیور) چیکار کنم؟:(
    تشکر ها
    پاسخ به درستی کمینه شد نمایش
  • پاسخ پذیرفته شده

    دوشنبه, 28 مارس 2016 - #permalink
    0
    همونطور كه گفتم اگر بخوايم يكبار تمام حلقه هاي كنترلي رو مرور كنيم:
    كنترل سرعت زاويه اي
    كنترل زاويه
    كنترل ارتفاع
    كنترل موقعيت
    و...
    كه به دو دسته كلي پايداري وضعي و هدايت و ناوبري تقسيم ميشه.

    كه اين كنترلرها با همديگه ارتباط دارند، يعني اينكه مثلا خروجي حلقه كنترل موقعيت به عنوان ورودي حلقه كنترل زاويه در نظر گرفته ميشه، همينطور خروجي كنترل زاويه به ورودي حلقه كنترل سرعت زاويه اي اعمال ميشه.

    البته شما ميتونيد كنترلر زاويه داشته باشيد بدون كنترلر سرعت زاويه اي چون ساختار كنترلر ميتونه متغيير سرعت زاويه اي رو جبران كنه. اما معمولا به دليل سرعت بالاي خروجي جايروسكوپ حلقه هاي جداي از هم براي شروع بهتره.

    اما براي پياده سازي بهتره اين خروجي ها رو آماده كنيد:
    تخمين زاويه (اويلر يا هر طور كه سريعتر و راحت تره)
    سرعت زاويه اي
    ورودي ها
    خروجي ها
    تشکر ها
    پاسخ به درستی کمینه شد نمایش
  • پاسخ پذیرفته شده

    engamanc
    engamanc
    آفلاین
    دوشنبه, 28 مارس 2016 - #permalink
    0
    ممنون از شما
    من الان اطلاعاتی که در اختیار دارم به این شرح هستن:1-سرعت زاویه ای که خروجی ژیروسکوپه , 2-زاویه که خروجی فیلتره , 3-سیگنالهای ورودی از رسیور
    خروجی ای که باید تولید بشه سیگنالهایی است که باید به اسپید کنترلرها اعمال بشه
    کنترلر باید از طرفی ربات رو پایدار نگه داره و از طرفی باید دستورات ما رو اجرا کنه.
    مشکل من در استفاده از اطلاعات ورودی و چگونگیه تولید سیگنالهای خروجی جهت رسیدن به هدفه.
    میشه راهنمایی بفرمایید که از این اطلاعات چگونه استفاده کنم?
    تشکر ها
    پاسخ به درستی کمینه شد نمایش
  • پاسخ پذیرفته شده

    سه شنبه, 29 مارس 2016 - #permalink
    0
    اين ميشه همون كنترلر، اول ورودي رو از مقدار خوانده شده از سنسور ( همون سرعت زاويه اي) كم ميكنيد و خطا رو بدست مياريد.
    بعد خروجي رو به صورت زير حساب ميكنيد:
    خطا*ضريب P + مشتق خطا * ضريب D+ انتگرال خطا * ضريب I
    كه اين ميشه خروجي كنترلر، حالا اين عدد رو با مقدار خونده شده از تراتل يكبار جمع كنيد و يكبار كم كنيد اين ميشه خروجي كه به اسپيدكنترل كوادروتور ميره.
    همين!

    اگه ميخوايد تا نمونه كد PID هم بذارم، ضمن اينكه اگر با آردوينو كار ميكنيد كتابخونه اين كنترلر هم هست.
    تشکر ها
    پاسخ به درستی کمینه شد نمایش
  • پاسخ پذیرفته شده

    engamanc
    engamanc
    آفلاین
    سه شنبه, 29 مارس 2016 - #permalink
    0
    فرض میکنیم حلقه ی کنترلی را برای کنترل سرعت زاویه ای مینویسیم.
    1-پس مستقیما از خروجیهای ژیروسکوپ استفاده میکنیم.پس نیازی به استفاده از انتگرال گیری برای استخراج زاویه و استفاده از فیلترها نیست درسته؟
    2-برای اینکه اطلاعاتی که از هم کم یا با هم جمع میکنیم و همچنین اطلاعات خروجی که به موتورها میدهیم روی هم تاثیر درستی بگذارند باید رنج تغییراتشان یکسان باشد.این متغیرها را در چه رنجی قرار دهیم مناسب است؟آیا این رنج به نوع اسپیدکنترلر بستگی دارد؟
    3-در فرمول محاسبه ی خروجی در رابطه های مشتق و انتگرال مقدار dt همان فاصله ی زمانی بین دو اندازه گیری متوالی سنسور است درسته؟یعنی مدت زمانی که طول میکشد تا حلقه یکبار کامل اجرا شود درسته؟
    اگه زحمت بکشید و نمونه کد در اختیارم قرار بدین ممنون میشم.ضمنا من از آردوینو استفاده میکنم.اگه ممکنه کتابخونه ی این کنترلر رو بهم معرفی کنید.
    تشکر ها
    پاسخ به درستی کمینه شد نمایش
  • پاسخ پذیرفته شده

    سه شنبه, 29 مارس 2016 - #permalink
    0
    ١- در حلقه كنترل سرعت زاويه اي بله نيازي به زاويه نيست، اما اين رو در نظر داشته باشيد كه پس از اين حلقه و براي نوشتن حلقه كنترل زاويه بايد زاويه را بدست آورده باشيد. همونطور كه توي پستهاي قبلي گفتم ورودي حلقه كنترل سرعت زاويه اي از خروجي زاويه بدست مي آيد كه معمولا با يك كليد ٢ پله اي يا ٣ پله اي حلقه ها رو فعال و يا غيرفعال ميكنيم.

    ٢- براي اينكه فهم بهتري از مقادير داشته باشيم بهتره كه ابتدا اون ها رو به يك غالب در بياريم، يعني اينكه وقتي مثلا ورودي ٢ هست هم رنج و هم جنس سنسور باشه يعني ٢ درجه بر ثانيه كه بتونيم مستقيما با سنسور جمع كنيم و خروجي اون براي ما قابل فهم هست پس بهتر ميتونيم ديباگ كنيم، هميشه كاري كه توي كنترلر هاي موجود ميشه سيگنال ورودي راديو كنترل رو به عنوان مرجع انتخاب ميكنند. چون بر اين فرض هستيم كه اسپيد كنترلها با راديو كاليبره شده اند.
    در نتيجه شما اسپيدها رو با راديو كاليبره كنيد و بعد از اون از مقادير حداكثر و حداقل راديو بعنوان رنج خروجي استفاده كنيد.

    ٣- بله همون مدت زماني هست كه طول ميكشه تا خروجي آماده ميشه

    ٤- توي پست بعدي:)
    تشکر ها
    پاسخ به درستی کمینه شد نمایش
  • پاسخ پذیرفته شده

    سه شنبه, 29 مارس 2016 - #permalink
    0
    نمونه كد C براي PID:
    previous_error = 0
    integral = 0
    start:
    error = setpoint - measured_value
    integral = integral + error*dt
    derivative = (error - previous_error)/dt
    output = Kp*error + Ki*integral + Kd*derivative
    previous_error = error
    wait(dt)
    goto start
    تشکر ها
    پاسخ به درستی کمینه شد نمایش
  • پاسخ پذیرفته شده

    سه شنبه, 29 مارس 2016 - #permalink
    0
    كتابخانه كنترل PID براي آردوينو
    http://playground.arduino.cc/Code/PIDLibrary
    تشکر ها
    پاسخ به درستی کمینه شد نمایش
  • پاسخ پذیرفته شده

    سه شنبه, 29 مارس 2016 - #permalink
    0
    سلام به همگی چه بحث داغ و جذابی;) ;) ;)

    فکر کنم از کد مولتی وی بشه استفاده کرد؟؟!!

    من تا یه جاهایی خوندم.
    تشکر ها
    • iman
      بیش از یک ماه قبل
      آره مولتی وی هم خیلی ساده و روان هست:)
    پاسخ به درستی کمینه شد نمایش
  • پاسخ پذیرفته شده

    engamanc
    engamanc
    آفلاین
    سه شنبه, 29 مارس 2016 - #permalink
    0
    بسیار سپاسگزارم
    فرض رو بر این میذاریم که min و max رادیو کنترل 1000 و 2000 باشند.
    1-در ابتدا با حلقه ی کنترل زاویه روبرو هستیم که یکی از ورودیهایش از رسیور و ورودی دیگرش زاویه ای است که ربات در آن قرار دارد.آیا باید مقادیر زاویه را که در رنج 90- تا 90+ هستند به رنج 1000 تا 2000 منتقل کنیم؟
    2-خروجی کنترلر زاویه چه رنجی دارد؟
    3-این خروجی که ورودی کنترلر سرعت زاویه ای است باید مجددا تغییر رنج داده شود؟
    4-پالسهای خروجی نهایی که برای اسپید کنترلرها میروند را چگونه بسازیم؟
    تشکر ها
    پاسخ به درستی کمینه شد نمایش
پاسخ شما

 

تمام حقوق برای شرکت رهنوردان هلیای آسمان محفوظ است
Copyright © 2015 RAHA