کنترلر PID در کوادکوپتر ها

مدیران انجمن: parse, javad123javad

ارسال پست
نمایه کاربر
rohamavation

نام: roham hesami radرهام حسامی راد

محل اقامت: 100 مایلی شمال لندن جاده آیلستون، لستر، لسترشر. LE2

عضویت : سه‌شنبه ۱۳۹۹/۸/۲۰ - ۰۸:۳۴


پست: 3222

سپاس: 5492

جنسیت:

تماس:

کنترلر PID در کوادکوپتر ها

پست توسط rohamavation »

کنترلر PID در کوادکوپتر ها
PID مخفف Proportional, Integral, Derivative است، بخشی از یک نرم افزار کنترل پرواز است که داده ها را از حسگرها می خواند و محاسبه می کند که موتورها با چه سرعتی باید بچرخند تا سرعت چرخش مطلوب کوادکوپتر را حفظ کند. ورودی در هر حلقه که سرعت موتورها است.هدف اصلی یک کنترلر PID در یک هواپیمای بدون سرنشین FPV اصلاح "خطا" با تنظیم سرعت موتور است. حلقه کنترل به طور مداوم داده های سنسور را می خواند و سرعت موتور را محاسبه می کند تا خطا را به حداقل برساند.
از رایج‌ترین نمونه‌های الگوریتم کنترل بازخوردی است که در بسیاری از فرایندهای کنترلی نظیر کنترل سرعت موتور DC، کنترل فشار، کنترل دما و… کاربرد دارد. کنترل کننده PID مقدار «خطا» بین خروجی فرایند و مقدار ورودی مطلوب (setpoint) محاسبه می‌کند. هدف کنترل‌کننده، به حداقل رساندن خطا با تنظیم ورودی‌های کنترل فرایند است.
PID از سه قسمت مجزا به نام‌های Proportional (تناسبی)،Integral (انتگرال‌گیر) و Derivative (مشتق‌گیر) تشکیل شده که هر کدام از آن‌ها سیگنال خطا را به عنوان ورودی گرفته و عملیاتی را روی ان انجام می‌دهند و در نهایت خروجی شان با هم جمع می‌شود. خروجی این مجموعه که همان خروجی کنترل‌کننده PID است برای اصلاح خطا (error) به سیستم فرستاده می‌شود.
در بسیاری از کنترل کننده ها به علت حساسیت عبارتِ مشتق نسبت به نویز و دشواری اجرا، از آن صرف نظر و کنترل را به صورت PI پیاده سازی می‌کنند. سیگنال $ {\displaystyle u(t)}$ (خروجی PID) بر اساس نسبتی از خطای کنونی سیستم (عملکرد حاضر)، به اضافه مجموع خطاهای سیستم (رفتار گذشته)، به اضافه مشتق خطای کنونی (تخمین خطی رفتار اینده) محاسبه می‌شود و برای اصلاح خطا به سیستم اعمال می‌گردد. ضرایب$ K، ${\displaystyle T_{i}} و$ {\displaystyle T_{d}} $نیز می‌توانند با روش های شناخته شده‌ای مانند تابع انتقال به صورت بهینه محاسبه شوند، اگرچه در کاربردهای عملی، بطور رضایت بخش می‌توانند با آزمون و خطا و مشاهده رفتار سیستم بطور تقریبی تعیین گردند.
اثر تغییر پارامترهای مختلف یک کنترل‌کننده PID‌ ایده‌آل روی پاسخ پله یک سیستم خطی. ضریب Kp‌ سرعت سیستم را افزایش می‌دهد و خطای حالت دائم را تا حدودی کاهش می‌دهد (اما صفر نمی‌کند). افزودن جمله انتگرالی (ضریب Ki) خطای حالت دائم را صفر می‌کند، اما مقدار زیادی نوسانات ناخواسته (overshoot) به پاسخ گذرا اضافه می‌نماید. جمله مشتقی (Kd) نوسانات پاسخ گذرا را تضعیف کرده و پاسخ پله را به شکل پله ایده‌آل نزدیک می‌نماید.
کنترلر پی آی دی PID یک سیستم کنترلی حلقه بسته مخفف سه کلمه Proportional Integral Derivative است که سعی می کند نتایج مورد انتظار مارا با توجه به مقادیر ورودی برآورده سازد. کنترلر PID به اساس سه زمان کار می کند: زمان کنونی، زمان گذشته و زمان آینده. یعنی کنترلر PID شرایط فعلی را بررسی می کند از اتفاقات گذشته استفاده کرده و نهایتا آینده را نیز پیش بینی می کند. کوادکوپتر ها و مولتی روتورها از این سیستم کنترلی جهت رسیدن به تعادل استفاده می کنند.
مقدار فعلی: مقداری که کوادکوپتر در لحظه کنونی در آن قرار دارد. مثلا کوادکوپتر ۱۰ درجه با سطح افق فاصله دارد.
مقدار مورد انتظار: مقداری که انتظار داریم کوادکوپتر در آن قرار داشته باشد. مثلا کوادکوپتر باید منطبق با سطح افق باشد تا در حالت تعادل قرار گیرد. لذا مقدار مورد نظر ۰ است.
خطا: به اختلاف مقدار موردنظر و مقدار فعلی خطا می گویند.
ثابت ها: جهت بهبود کارایی کنترلر PID سه ثابت D, I, P را نیاز داریم تا میزان تاثیر هر یک از زمانها را با آن مشخص کنیم.
سه الگوریتم در یک سیستم کنترلی PID به نام های D, I, P وجود دارد. P وابسته به خطای کنونی سیستم است، I حاصل جمع خطاهای قبلی و D تخمین خطای آینده است. این سه الگوریتم نهایتا بصورت کد در آمده و در سیستم مورد استفاده قرار می گیرند.
محور رسپبری پای – کار با PWM
هدف این است که با ست کردن ثابت های این کنترلر، کنترل بهتری روی کوادکوپتر داشته باشیم و تا حد امکان خطا را صفر کنیم.
ویژگی P:
این ویژگی مهمترین ویژگی کنترلر است زیرا کوادکوپتر فقط با استفاده از این ویژگی میتواند پرواز کند. یعنی بدون استفاده از دیگر ویژگی ها و فقط با ای ویژگی میتواند در حالت تعادل قرار گیرد.
اگر ثابت خیلی کوچک باشد:
کوادکوپتر خیلی دیر پاسخ می دهد. ( در کوادکوپتر های نامتعادل ممکن است پاسخ ندهد.
کنترل کوادکوپتر مشکل می شود.
اگر ثابت خیلی بزرگ باشد:
در حالی که کوادکوپتر در حالت تعادل قرار دارد نوسان زیادی خواهد داشت.
حساسیت کوادکوپتر نسبت به تغییرات زاویه زیاد می شود.
اگر ثابت مقدار صحیح باشد:
کوادکوپتر سریع پاسخ می دهد
کوادکوپتر دقیقا در زاویه دلخواه قرار می گیرد.
کوادکوپتر نوسان جزیی دارد که قابل جبران است.
ویژگی I:
این ویژگی برای واکنش به تاثیرات محیطی مثل باد، عدم تعادل فریم و … کاربرد دارد. مثلا ممکن است باد کوادکوپتر را ۱۰ درجه منحرف کرده باشد. این ویژگی باعث می شود که کواد ۱۰ درجه را جبران کرده و مجددا در زاویه ای که قبلا بود قرار گیرد. در واقع این ویژگی عامل های بیرونی را جبران می کند.
اگر ثابت خیلی کوچک باشد:
عوامل بیرونی تاثیر زیادی در رفتار کوادکوپتر خواهند داشت.
اگر ثابت خیلی بزرگ باشد:
پاسخ کوادکوپتر مقدار کند است (به دلیل اینکه با افزایش این ثابت تاثیر ثابت P کمتر می شود).
کوادکوپتر نوسان خواهد کرد ولی فرکانس نوسان نسبت به ویژگی P کمتر است.
مقدار صحیح باشد:
کوادکوپتر به نرمی حرکت می کند در کنار اینکه پاسخ سریعی دارد.
از نظر مفهومی ویژگی I کنترلر همانند یک حافظه عمل می کند. مثلا ۱۰۰۰ حالت قبلی خود را در حافظه دارد و رفتار خود را با استفاده از اتفاقات گذشته تنظیم میکند. به عنوان مثال دیگر اگر فریم کوادکوپتر نامتعادل باشد باید موتوری که در قسمت سنگین تر قرار دارد با دور بیشتری بچرخد تا کوادکوپتر به تعادل برسد. این افزایش دور یک موتور در حافظه کوادکوپتر ثبت می شود تا در تصمیمات بعدی دخیل شود. همچنین هیچ دو موتوری دارای دور و ویژگی های یکسان نیستند لذا ویژگی I به کمک ا آمده تا این عوامل بیرونی که در رفتار کوادکوپتر تاثیر دارند را حذف کند.
ویژگی D:
این ویژگی به کوادکوپتر کمک می کند تا خیلی سریع از مقدار فعلی به مقدار مورد انتظار برسد. بعضی این ویژگی را به نام شتاب دهنده می شناسند به دلیل اینکه ورودی کاربر را چند برابر می کند. همچنین این ویژگی با کاهش سریع خطا سریعا کاهش پیدا می کند. به عنوان یک مثال وقتی شما شدیدا گرسنه هستید با سرعت بیشتری غذا می خورید تا وقتی که نسبتا سیر شوید و پس از آن سرعت غذا خوردن شما نیز کاهش می یابد. این ویژگی در عمل باعث افزایش سرعت پاسخ گویی کوادکوپتر می شود و بعضی مواقع تاثیر ویژگی P را افزایش می دهد.
محور آردوینو – نور سنج
اگه مقدار بزرگی برای ثابت این ویژگی انتخاب شود کوادکوپتر با فرکانس بالا نوسان می کند.
بصورت مفهومی این ثابت ها میزان تاثیر ویژگی های متناظر را مشخص می کنند. به عنون مثلا وقتی ثابت I زیاد است یعنی کوادکوپتر بیشتر تابع گذشته خود است تا حال و آینده.
روش تنظیم ثابت های کنترلر:
قبل از هر چیزی باید کوادکوپتر را با نخ یا سیمی در جایی ثابت کنید تا کوادکوپتر فقط بتواند حول یک محور بچرخد ( Roll یا Pitch ).
نکته: اگر فریم شما متقارن باشد میتوان از ثابت های یافته شده یک محور برای محور دیگر هم استفاده کرد.
چند روش برای تنظیم قابت های کنترلر PID وجود دارد که سه تا از آنها را نام می بریم:
روش سعی و خطا: این روش یکی از ساده ترین و عمومی ترین روشهای تنظیم ثابت های کنترلر می باشد که با سعی و خطا می توانیم به مقادیر نسبتا دقیقی برسیم.
استفاده از الگوریتم های اکتشافی همانند الگوریتم های ژنتیک که با استفاده از تکامل داروین سعی در پیدا کردن این ثابت ها می کنند. در این الگوریتم اعداد نسبتا ( و تا حدودی هوشمند ) تصادفی برای ثابت ها در نظر گرفته می شود و هر بار خروجی مورد بررسی قرار می گیرد تا بهترین ثابت ها مشخص شوند.
روش Ziegler–Nichols: در این روش با استفاده از محاسبات ریاضی ثابت ها محاسبه می شوند.
روش سعی و خطا:
ثابت های D و I را صفر در نظر بگیرید و کم کم مقدار P را افزایش دهید تا زمانی که کوادکوپتر شروع به نوسان کند. سپس مقدار P را کمی کم کنید تا دیگر نوسانی نداشته باشد. بهترین حالت برای این ثابت زمانی است که کوادکوپتر در حالی که سریع واکنش می دهد نوسانی هم ندارد.
پس از اینکه مقدار مشخصی را برای ثابت P بدست آوردید کم کم ثابت I را افزایش دهید. کوادکوتر را حول محور بچرخوانید و به زمانی که طول می کشد تا کوادکوپتر به حالت تعادل برسد توجه کنید. این زمان باید خیلی کوتاه باشد. همچنین این ویژگی را در محیط های مختلف با عوامل خارجی تست کنید تا به بهترین مقدار I برسید.
حال نوبت به ثابت D می رسد. به آرامی این مقدار را زیاد کنید تا نوسانات از بین برود. جهت بهبود کارایی پس از تنظیم ثابت D می توانید مجددا به سراغ ثابت P رفته و مقدار آن را افزایش دهید.
در حال کلی P و D رابطه مستقیم با هم دارند و رابطه عکس با I و لذا تغییر در ثابت ها یک روند حلقوی است یعنی پس از طی کردن ۳ مرحله فوق مجددا باید به مرحله ۱ برگشت و مقادیر را تغیر داد تا زمانی که بهترین نتیجه حاصل شود.
نهایتا دو مدل پروازی وجود دارد که با توجه به نیاز خود می توانید ثابت ها را تنظیم کنید.
پرواز آکروباتیک: در این نوع پرواز واکنش کوادکوپتر خیلی سریع است. این مدل نیازمند ثابت های P و D زیاد و I کم است
پرواز نرم و ملایم: در این نوع پرواز واکنش کوادکوپتر آرام و نرم است. این مدل نیازمند ثابت های P و D کم و I زیاد است.
من سعی می کنم با استفاده از میکروکنترلر سری C Tiva یک کنترل PID را روی کوادکوپتر خود پیاده کنم اما در ایجاد ثبات PID سیستم مشکل دارم.
در حالی که داشتم PID را آزمایش می کردم، متوجه پاسخ کند یا ضعیف کنترلر PID شدم (چهار در زوایای کوچک پاسخی نشان نمی دهد). به عبارت دیگر، به نظر می رسد که محدوده زاویه کواد باید نسبتاً بزرگ باشد (بالای 15 درجه) تا بتواند پاسخی را نشان دهد. حتی در آن صورت، بدون توجه به اینکه من چه دستاوردهایی را برای سیستم خود انتخاب می‌کنم، پاسخ همیشه بالا می‌رود. در P پایین، می‌توانم از افزایش بیش از حد جلوگیری کنم، اما پس از آن خیلی ضعیف می‌شود.
من مطمئن نیستم که آیا الگوریتم PID مشکل دارد یا اینکه پیکربندی سخت افزاری آن تا حدی بد است (نرخ نمونه IMU پایین یا شاید تنظیمات PWM بد)، اما من در مورد کد PID خود شک دارم زیرا متوجه شدم تغییر برخی از دستاوردها انجام نشده است. بهبود پاسخ سیستم
اگر کسی بتواند به این نکته اشاره کند که آیا در قطعه PID برای کامپوننت pitch که پست کردم، کار اشتباهی انجام می‌دهم، سپاسگزار خواهم بود. مسئله آشکاری که من در حال حاضر می بینم این است که شما قطبیت را در شرایط I و D تحمیل می کنید. به طور کلی، شما از تعداد زیادی چک علامت، تخصیص علامت و برنامه‌نویسی مشروط استفاده می‌کنید.
$void pitchPID(int16_t pitch_conversion)
{
float current_pitch = pitch_conversion;
//d_temp_pitch is global variable
//i_temp_pitch is global variable
float pid_pitch=0; //pitch pid controller
float P_term, I_term, D_term;
float error_pitch = desired_pitch - current_pitch;

//if statement checks for error pitch in negative or positive direction
if ((error_pitch>error_max)||(error_pitch<error_min))
{
if (error_pitch > error_max) //negative pitch- rotor3&4 speed up
{
P_term = pitch_kp*error_pitch; //proportional
i_temp_pitch += error_pitch;//accumulate error
if (i_temp_pitch > iMax)
{
i_temp_pitch = iMax;
}
I_term = pitch_ki*i_temp_pitch;
if(I_term < 0)
{
I_term=-1*I_term;
}
D_term = pitch_kd*(d_temp_pitch-error_pitch);
if(D_term>0)
{
D_term=-1*D_term;
}
d_temp_pitch = error_pitch; //store current error for next iteration
pid_pitch = P_term+I_term+D_term;
if(pid_pitch<0)
{
pid_pitch=(-1)*pid_pitch;
}
//change rotor3&4
pitchPID_adjustment (pid_pitch, 'n'); //n for negative pitch
}
else if (error_pitch < error_min) // positive pitch- rotor 1&2 speed up
{
P_term = pitch_kp*error_pitch; //proportional
i_temp_pitch += error_pitch;
if (i_temp_pitch < iMin)
{
i_temp_pitch = iMin;
}
I_term = pitch_ki*i_temp_pitch;
if(I_term > 0)
{
I_term=-1*I_term;
}
D_term = pitch_kd*(d_temp_pitch - error_pitch);
if(D_term < 0)
{
D_term=-1*D_term;
}
d_temp_pitch = error_pitch;
pid_pitch = P_term+I_term+D_term;
if(pid_pitch<0)
{
pid_pitch=(-1)*pid_pitch;
}
print(pid_pitch);//pitch
printString("\r\n");
//change rotor1&2
pitchPID_adjustment(pid_pitch,'p'); //p for positive pitch
}
}
}$
هیچ کدام از اینها به یک کنترلر PID تعلق ندارد. کل کنترلر باید به شکل زیر باشد:

$pError = Input - Output;
iError = iError + pError*dt;
dError = (pError - previousError)/dt;
previousError = pError;

ControlSignal = kp*pError + ki*iError + kd*dError;$
خودشه. بدون نیاز به بررسی، تکالیف، و غیره. پاسخ مرتبط من را در مورد تقسیم سیگنال کنترل به جای کنترل هر جفت موتور به صورت جداگانه ببینید (که من معتقدم هدف شما با کد if elseif است).
تصویر

نمایه کاربر
rohamavation

نام: roham hesami radرهام حسامی راد

محل اقامت: 100 مایلی شمال لندن جاده آیلستون، لستر، لسترشر. LE2

عضویت : سه‌شنبه ۱۳۹۹/۸/۲۰ - ۰۸:۳۴


پست: 3222

سپاس: 5492

جنسیت:

تماس:

Re: کنترلر PID در کوادکوپتر ها

پست توسط rohamavation »

انتگرال - این به همان مقدار خطای پروپورشنال نگاه می کند، اما آن را با مدت زمانی که به این طریق بوده است مقایسه می کند. اظهارات این شخص عبارتند از:
شما خطای مزمن/حاد دارید (خطای کوچک برای مدت طولانی یا خطای بزرگ برای مدت زمان کوچک) - یک اقدام بزرگ انجام دهید.
شما خطای خفیفی دارید (خطای کوچک برای مدت کوتاهی) - یک اقدام کوچک انجام دهید.
سابقه خطای شما خنثی است (زمان * خطای مثبت برابر است با زمان * خطای منفی) - هیچ اقدامی نکنید.
مشتق - این به همان مقدار خطای پروپورشنال نگاه می کند، اما آن را با نحوه تغییر آن مقایسه می کند. اظهارات این شخص عبارتند از:
خطای شما بزرگتر می شود - اقدام بزرگتری انجام دهید.
خطای شما در حال کوچکتر شدن است - یک اقدام منفی انجام دهید.
خطای شما تغییر نمی کند - اقدامی نکنید.
توجه به بیانیه شماره 2 Mr. هر چه به آنها نزدیک می شوید (خطا کوچکتر می شود) نه تنها می خواهید گاز را رها کنید بلکه می خواهید ترمز کنید! کنش مشتق همان چیزی است که به شما «ترمز» می‌دهد - هیچ عبارت دیگری (P یا I) به شما عمل منفی نمی‌دهد تا زمانی که نقطه تنظیم را پشت سر بگذارید. مشتق تنها اصطلاحی است که به شما می‌گوید سرعت خود را کم کنید زیرا در حال نزدیک شدن هستید.
راه دیگری برای کمک به درک این اصطلاحات، درک فیزیکی معنای آنهاست. بگویید مرجع شما یک سرعت است. این یعنی:
خطای متناسب سرعت شما را با سرعت هدف مقایسه می کند. می خواهید 60 شوید و 55 می شوید؟ سرعت دادن. رفتن 65؟ آهسته تر. این آسان است.
خطای انتگرال انتگرال سرعت هدف را با انتگرال سرعت واقعی مقایسه می کند. این بدان معنی است که موقعیت هدف را با موقعیت واقعی شما مقایسه می کند. آیا قرار بود قبلاً در شهر باشید؟ سپس باید سرعت خود را افزایش دهید. قرار بود تو شهر باشی و هنوز خونه ات باشی؟ سرعت در تمام راه.
خطای مشتق مشتق تفاوت بین سرعت هدف و واقعی را مقایسه می کند. آیا فرد مقابل شما در حال عقب نشینی است؟ سرعت دادن! آیا فرد مقابل شما ترمز خود را فشار می دهد؟ آهسته! همانطور که در بالا ذکر کردم، اگر هدف شما این است که بلافاصله پشت سر فرد مقابل قرار بگیرید، متناسب و انتگرال هر دو به شما می گویند که سرعت خود را افزایش دهید. مشتق تنها "شخصی" است که به شما می گوید اگر ترمز را شروع نکنید، آنها را به عقب برگردانید.
بنابراین، چه اتفاقی می‌افتد وقتی علائم خطا را مجبور می‌کنید؟
فرض کنید در ماشینی هستید و سعی می کنید یکی از دوستانتان را به یک رستوران دنبال کنید. در اینجا سرعت دوست نشان دهنده مرجع سرعت و سرعت شما نشان دهنده بازخورد سرعت شما است. محدودیت سرعت در جاده 35 مایل در ساعت (55 کیلومتر در ساعت) است. این چیزی است که اتفاق می افتد:
دوست شما شروع به حرکت می کند.
شما هنوز ساکن هستید، بنابراین خطاهای زیر رخ می دهد:
خطای تناسبی مثبت است (شما می خواهید به 35 بروید و در واقع 0 می شوید).
خطای انتگرال کمی مثبت است (دوست شما از شما دورتر است).
خطای مشتق بزرگ و مثبت است (دوست شما به سرعت از شما دور می شود).
شما علائم را مجبور می کنید: خطای انتگرال را مثبت (از قبل وجود دارد) و خطای مشتق را به منفی بودن وادار کنید.
این به این معنی است که خطای مشتق به شما می‌گوید که ماشین از شما دورتر می‌شود، اما شما آن را برعکس می‌کنید و فرض می‌کنید که خطای مشتق به معنای نزدیک‌تر شدن به دوستتان است. این اشتباه است.
اقدامات: متناسب - گاز را به مقدار متوسط فشار دهید. انتگرال - پدال گاز را کمی فشار دهید. مشتق - باید پدال گاز را زیاد فشار دهید، اما آن را معکوس کرده اید، بنابراین در عوض ترمز را زیاد فشار دهید.
در نهایت دوست شما به اندازه‌ای دور می‌شود که خطای تناسبی و انتگرال به اندازه‌ای بزرگ می‌شود که عبارت مشتق (به اشتباه معکوس‌شده) شما را لغو می‌کند. در این مرحله:
خطای تناسبی بزرگ است (هنوز به صفر می رسد و می خواهید به 35 بروید).
خطای انتگرال بسیار بزرگ است
عبارت مشتق هنوز بزرگ است (دوست همچنان فعالانه از شما دور می شود)، اما شما همچنان آن را مجبور به منفی بودن می کنید.
اقدامات: متناسب - گاز را زیاد فشار دهید. یکپارچه - پدال گاز را کف کنید. مشتق - باید پدال گاز را فشار دهید، اما شما آن را معکوس کرده اید، بنابراین در عوض ترمز را فشار دهید.
پس از مدتی به سرعت 34.999 مایل در ساعت می رسید. خطای نسبی هنوز (کمی) مثبت است زیرا می خواهید به عدد 35 بروید و در واقع روی 34.999 هستید، بنابراین خطای تناسبی 0.001 است.
خطای متناسب به سختی مثبت است (هنوز کندتر از 35 مایل در ساعت پیش می رود)
خطای انتگرال در بیشترین حد خود است (شما تا کنون از دوست خود دورتر هستید زیرا دوست شما در تمام مدت 35 بوده است)
خطای مشتق تقریباً صفر است (شما تقریباً همان سرعتی هستید که دوستتان دارد، بنابراین اکنون خطای تناسبی تثبیت می شود)
شما علائم را مجبور می‌کنید: خطای انتگرال را وادار کنید که مثبت باشد (در حال حاضر) و خطای مشتق را منفی (تقریباً صفر است، بنابراین تغییر ناچیز است).
اقدام: متناسب - هیچ اقدامی انجام نمی شود زیرا تقریباً در سرعت 35 مایل در ساعت هستید. انتگرال - شما اکنون واقعاً از دوست خود دور هستید، بنابراین گاز را کف می کنید. مشتق - هیچ اقدامی وجود ندارد زیرا خطای تناسبی تقریباً پایدار است.
حالا چون گاز را کف می کردید، سرعت 35 مایل در ساعت را پشت سر می گذارید و به سرعت 35.01 مایل در ساعت می رسید. اکنون، خطای تناسبی شما منفی می شود (35 می خواهید، 35.01 می شوید، بنابراین خطا 0.01- است).
خطای تناسبی تقریباً صفر است (کمی بیش از حد مجاز)
خطای انتگرال بسیار بزرگ است و هنوز هم بسیار مثبت است زیرا شما در واقع خیلی از دوست خود عقب هستید.
خطای مشتق تقریباً صفر است (زیرا خطای تناسبی هنوز تقریباً صفر است).
شما علائم را مجبور می کنید: خطای مشتق را وادار به مثبت بودن کنید - تغییر اندکی زیرا به هر حال تقریباً صفر است. مشکل اینجا زمانی پیش می‌آید که خطای انتگرال را مجبور می‌کنید منفی باشد - بسیار بزرگ و بسیار مثبت بود! حالا داری مجبورش میکنی منفی باشه این بدان معناست کهنتییجه انتگرال به شما می‌گه که شما خیلی از دوستتان عقب هستید، اما شما آن را برعکس می‌کنید و فرض می‌کنید که خطای انتگرال به این معناست که شما خیلی از دوستتان فاصله دارید.
اقدام: متناسب - هیچ اقدامی انجام نمی شود زیرا شما با سرعت 35 مایل در ساعت حرکت می کنید. انتگرال - شما خیلی عقب تر از دوست خود هستید و باید پدال گاز را کف کنید، اما آن را برعکس کردید و اکنون فکر می کنید که خیلی از دوست خود جلوتر هستید، بنابراین به جای آن پدال ترمز را فشار می دهید! مشتق - هیچ اقدامی وجود ندارد زیرا خطای تناسبی بسیار پایدار است.
در این مرحله شما به یک حلقه برخورد می کنید - زمانی که سرعت شما فقط از 35 مایل در ساعت می گذرد، ترمز می کنید، زیرا خطای انتگرال را معکوس می کنید، سپس گاز را هنگام سقوط به زیر 35 مایل در ساعت کف می کنید زیرا خطای انتگرال را برعکس می کنید. این باید (به شدت!) (هواپیما) را به اطراف تکان دهد و از حذف هرگونه خطای حالت پایدار جلوگیری کند.
بدتر از آن، من مطمئن نیستم که وقتی به موقعیت تنظیم شده برسید چگونه رفتار می کند، اما فکر می کنم چرخش مداوم علامت ممکن است مانع از توقف شما در هر جایی نزدیک به جایی که می خواهید شود (اگر اصلاً ثابت شود).
کنترلر PID کوادکوپتر برای فاصله
ن سعی می کنم از یک کنترلر PID برای متوقف کردن یک کوادکوپتر در یک مکان خاص در حین حرکت افقی استفاده کنم، با این حال در حال حاضر بسته به حداکثر سرعت، بیش از حد یا کمتر می شود. من سعی کردم به صورت دستی دستاوردهای P،I و D را با موفقیت محدود تنظیم کنم. اساساً سرعت باید از maxSpeed به 0 در انتهای مسیر پرواز برسد.

از DJI SDK استفاده می‌کند، بنابراین ورودی‌های کوادکوپتر بسیار ساده هستند، ورودی گام به کوادکوپتر بر حسب m/s است و من فاصله(m) تا هدف را در هر تکرار دوباره محاسبه می‌کنم.
من یک حلقه اجرا می کنم که هر 0.1 ثانیه اجرا می شود. چند کد شبه:
$kP = 0.25
kI = 0.50
kD = 90
timeStep = 0.1
maxSpeed = 10
currentError = initialDistanceToLocation - currentDistanceToLocation
derivativeError = (currentError - previousError) / timeStep
previousError = currentError
output = kP * currentError + kI * integralError + kD * derivativeError
integralError = integralError + currentError * timeStep

if >= maxSpeed {
output = maxSpeed
} else if output <= 0 {
output = 0
}
return output$
خروجی برگشتی
آیا راهی برای تنظیم قابل اعتماد این کنترلر PID روی این سیستم وجود دارد که برای حداکثر سرعت های مختلف کار کند، یا اینکه خیلی ساده است و فاکتورهای دیگری وجود دارد که باید در نظر بگیرم؟من نمی دانم تا چه حد می توان شبه کد شما را به عنوان نماینده کد واقعی شما در نظر گرفت، اما می توانم نگرانی های زیر را در مورد آن ببینم.
اصطلاح مشتق
در کاربردهای عملی، عبارت مشتق که به عنوان یک تفاوت متناهی یک مرحله ای محاسبه می شود، کاملاً بی فایده است:
derivativeError = (currentError - previousError) / timeStep
دلایل زیادی برای آن وجود دارد که عمدتاً به این واقعیت مربوط می شود که سیگنال های فیزیکی دقیقاً مانند فاصله اندازه گیری شده از هدف به شدت تحت تأثیر نویز قرار می گیرند که به نوبه خود دارای اجزای فرکانس بالا است که با این عملیات تقویت می شود و به ناچار باعث کاهش کیفیت می شود. عملکرد PID و ایجاد بی ثباتی.
بنابراین، در عوض باید به تکنیک‌های پیچیده‌تری مانند مشاهده‌گرهای سرعت (مثلاً تخمین‌گر حالت کالمن) یا فیلترینگ قوی (مانند فیلتر ساویتزکی-گولای)، یا حتی حسگرهای بهتری که برای اندازه‌گیری سرعت به صورت بومی مناسب هستند متوسل شوید (آن‌ها کمیاب و کاملاً هستند. هر چند دستگاه های گران قیمت).
نترسید/نگران نباشید، فقط عبارت مشتق را با خیال راحت رها کنید. به یاد داشته باشید که 90٪ از کنترل کننده های PID در سراسر جهان به سادگی PI هستند
اصطلاح انتگرال
این مشکل ترین بخش است. شما نمی توانید خروجی کنترلر را در داخل [0، maxSpeed] بدون اینکه به PID بگویید چه اتفاقی می افتد آستانه گذاری کنید. این به سادگی کار نخواهد کرد. با انجام این کار، در واقع، نوسانات ناخواسته ای را ایجاد خواهید کرد که درست همان
در اصل، شما باید تفاوت بین خروجی آستانه و خروجی خالص را نیز یکپارچه کنید
integralError += (currentError + thresOutput - sheerOutput) * timeStep
یکپارچه ضد باد
اظهارات پایانی
هنگامی که تمام نکات بالا را بررسی کردید، مطمئناً شانس بیشتری برای کاهش بیش از حد / کمتر از حد معمول خواهید داشت. همانطور که گفته شد، یک کنترل کننده سرعت خالص به نوعی رویکرد ساده تبدیل می شود. بنابراین برای تاثیرگذاری و دقت بیشتر، در نهایت باید با مدل دینامیکی کوادکوپتر بازی کنید.
کد منبع ارسال شده وضعیت فعلی سیستم را اندازه گیری می کند و سپس عمل کنترل تعیین می شود. حتی اگر محاسبه 10 بار در ثانیه انجام شود، بر اساس یک اندازه گیری در حال حاضر است. رفتار مطلوب برای توقف روان کوادکوپتر و جلوگیری از شتاب بیش از حد یک مشکل چند مرحله ای است. حالت چندگانه به این معنی است که بیش از یک تصمیم و اندازه گیری مورد نیاز است. در ساده ترین حالت، کد منبع باید با یک مقدار ورودی دوم گسترش یابد، به طوری که معادله t و t-1 را به عنوان ورودی بگیرد.
از منظر پیاده سازی، معماری با استفاده از یک شبکه عصبی بازگشتی و یک کنترل کننده pid مشترک است. این به بهبود کیفیت اقدامات کنترلی کمک می کند.
امیدوارم کمک کند.
کنترل کننده موقعیت برای کوادروتور
در رابطه با اجرای کنترلر موقعیت کوادروتور یک سوال دارم. در مدل Matlab من، کوادروتور 4 ورودی می گیرد: ارتفاع دلخواه (Zdes
) و زوایای نگرش مورد نظر (Φdes، Θdes، Ψdes) که حرکت توصیف شده توسط معادلات دیفرانسیل مدل را منعکس می کند
کنترل کننده حلقه نظری برای یک کوادروتورتصویر
تصویر
در اینجا بینشی از مدل پویا Matlab پیاده سازی شده است. همانطور که می بینید ساختاری مانند کنترل کننده حلقه داخلی دارد:
به هر حال ... کاملاً روی نقطه شروع شناور است. (نمودارهای عالی :) ) حالا من فقط باید یک نوع کنترل کننده موقعیت را اجرا کنم تا به کوادروتور اجازه دهم از ابتدا به یک نقطه هدف برسد که طبق معمول از طریق 3 مختصات تعریف شده است [Xd,Yd,Zd]
.این مشکل است زیرا من متغیرهای حالت فضایی مشابه ورودی و خروجی سیستم را ندارم. بنابراین کنترلر باید بردار سه مختصات را بگیرد و بتواند 3 زاویه مختلف را خروجی بگیرد تا به آنجا برسد. تنها استثنا ارتفاع است زیرا به سادگی توسط کنترلر دور می زند و به حلقه محاسباتی دیگری نیاز ندارد. داستان متفاوتی برای سه زاویه است...
اولین ایده من این بود که به سادگی یک بازخورد بین موقعیت داده شده در خروجی سیستم شبیه سازی شده و موقعیت مورد نظر مانند شکل بالا ایجاد کنم. اما این سوال دیگری را مطرح می کند: مدل کوادروتور من سیستم معادله زیر را حل می کند:
$\large \cases{
\ddot X = ( \sin{\psi} \sin{\phi} + \cos{\psi} \sin{\theta} \cos{\phi}) \frac{U_1}{m} \cr
\ddot Y = (-\cos{\psi} \sin{\phi} + \sin{\psi} \sin{\theta} \cos{\phi}) \frac{U_1}{m} \cr
\ddot Z = (-g + (\cos{\theta} \cos{\phi}) \frac{U_1}{m} \cr
\dot p = \frac{I_{YY} - I_{ZZ}}{I_{XX}}qr - \frac{J_{TP}}{I_{XX}} q \Omega + \frac{U_2}{I_{XX}} \cr
\dot q = \frac{I_{ZZ} - I_{XX}}{I_{YY}}pr - \frac{J_{TP}}{I_{YY}} p \Omega + \frac{U_3}{I_{YY}} \cr
\dot r = \frac{I_{XX} - I_{YY}}{I_{ZZ}}pq - \frac{U_4}{I_{ZZ}}
}$
این بدان معناست که آنها (مانند مدل متلب بالا) زاویه و ارتفاع مورد نظر را انتظار دارند. اما در حال حاضر من به درستی برعکس نیاز دارم: با توجه به موقعیت دلخواه، زوایای راست را محاسبه کنید!!! زیرا راه حل بسیار ساده است، زیرا می توانم چیزی شبیه به:
$Psi = atan2( (yd - yactual), (xd - xactual) );$
جایی که y و x روی صفحه افقی قرار دارند. این برای دو زاویه دیگر چندان ساده نیست. پس در این مرحله چه کاری می توانم انجام دهم؟ فقط معادلات داده شده را "معکوس" کنید تا زوایای مورد نظر به دست آید؟
ایده دیگر می تواند پیاده سازی یک کنترلر PD یا PID ساده باشد. با توجه به این واقعیت که من می توانم با استفاده از Simulink خیلی سریع آزمایش کنم و نتایج بسیار خوبی بگیرم، این بسیار ساده تر است. اما مشکل دوباره اینجاست: چگونه زوایای مورد نظر را از یک موقعیت دلخواه به دست بیاورم؟
رایج ترین راه حل برای این مشکل استفاده از 2 کنترلر مجزا است. کنترلر حلقه داخلی همان چیزی است که قبلاً دارید: دستورات زاویه و ارتفاع را ردیابی می کند.
کنترل‌کننده حلقه بیرونی فرض می‌کند که زاویه‌ها کاملاً ردیابی می‌شوند و زاویه‌ها را به‌جای حالت‌های جداگانه به عنوان ورودی در نظر می‌گیرد. بنابراین خطای موقعیت را می گیرد و آن را به یک رول/پیچ دلخواه تبدیل می کند (از طریق PID، درست مانند هر سیستم دیگری که از کنترل کننده برای محاسبه ورودی های سیستم مورد نظر استفاده می کنید)، و آن زوایای مورد نظر به کنترل کننده حلقه داخلی منتقل می شود.
معنی دارد؟
اگر می خواهید پیچیده تر شوید، کنترل کننده حلقه بیرونی شما می تواند شتاب دلخواه را تعریف کند. با استفاده از ریاضیات کمی پیچیده تر می توانید آن را به زوایای دلخواه تبدیل کنید. این از نظر تئوری تمیزتر است، اما در عمل شما هنوز فقط حلقه‌های PID را تنظیم می‌کنید، بنابراین سود واقعی ممکن است زمان و تلاش را توجیه نکند.
برای تفصیل. حلقه بیرونی چیزی شبیه به این است. (برای سادگی، yaw=0 را فرض کنید)
$\begin{align}
\hat{\phi}^d &= k_{p,y} (y-y^d) + k_{d,y} (v_y - v_y^d) + k_{i,y} \int_0^t (y-y^d) dt
\\
\hat{\theta}^d &= -k_{p,x} (x-x^d) = k_{d,x} (v_x - v_x^d) - k_{i,x} \int_0^t (x-x^d) dt
\end{align}$
جایی که $\hat{\phi}^d$
زاویه رول مورد نظر و $\hat{\theta}^d$ است
زاویه گام مورد نظر است. وقتی yaw ≠
0 شما این دو را با هم ترکیب می کنید. چیزی مثل
$\begin{align}
\phi^d &= \cos(\psi) \hat{\phi}^d - sin(\psi) \hat{\theta}^d
\\
\theta^d &= \sin(\psi) \hat{\phi}^d + cos(\psi) \hat{\theta}^d
\end{align}$
جایی که ψ
زاویه انحراف استسپس، در حلقه داخلی، کنترلر موجود خود را دارید.
تصویر

ارسال پست