آموزش ماشین برای رانندگی-برنامه ریزی مسیر بزرگراه
رانندگی خودرو در بزرگراه < /img>
این اولین پروژه از ترم 3 مهندسی اتومبیل رانندگی خودکار Udacity Nanodegree است. همه کد های مربوط به این پروژه را می توانید در github بیابید. همچنین می توانید پست های من در پروژه های قبلی را بخوانید:
دوره 1 - پروژه 1: تشخیص خطوط خط با استفاده از دید رایانه ترم 1 - پروژه 2: طبقه بندی علائم راهنمایی و رانندگی با استفاده از یادگیری عمیق ترم 1 - پروژه 3: پیش بینی زاویه فرمان با استفاده از یادگیری عمیق ترم 1 - پروژه 4: تشخیص خط پیشرفته با استفاده از دید کامپیوتر دوره 1 - پروژه 5: خودرو تشخیص با استفاده از یادگیری ماشین و بینایی رایانه ای برنامه ریزی مسیری که هم ایمن و هم کارآمد باشد یکی از سخت ترین مشکلات در توسعه یک وسیله نقلیه خودران است. در واقع ، این مرحله که به برنامه ریزی مسیر معروف است ، هنوز یک منطقه فعال تحقیقاتی است. دلیل اینکه برنامه ریزی مسیر کار بسیار پیچیده ای است این است که شامل همه اجزای یک وسیله نقلیه خودران است ، اعم از محرک های سطح پایین ، سنسورهایی که برای ایجاد یک تصویر فوری از جهان ، همراه با محلی سازی و ماژول های پیش بینی برای درک دقیق اینکه ما کجا هستیم و موجودات مختلف در جهان ما (سایر وسایل نقلیه ، انسان ، حیوانات و غیره) چه اقداماتی را در چند ثانیه آینده انجام می دهند. یکی دیگر از م obviousلفه های آشکار ، تولید کننده مسیر است که می تواند مسیرهای نامزد را برای ارزیابی توسط برنامه ریز محاسبه کند.
در این پست ، ما بر توصیف نحوه اجرای برنامه ریز مسیر C ++ که قادر به ایجاد ایمن است ، تمرکز می کنیم. و مسیرهای کارآمد در شبیه ساز ، با استفاده از تکنیک های به حداقل رساندن حرکت تند و سریع. محدودیت های پروژه عبارتند از: 10 متر بر ثانیه حداکثر حرکت تند 10 متر بر ثانیه خودرو نمی تواند بیش از 3 ثانیه بین خطوط بین خودروها خودرو نتواند از 3 خارج شود خطوط بزرگراه خودرو نمی تواند در سمت اشتباه بزرگراه رانندگی کند
ما در تکمیل این پروژه با مشکلات زیادی روبرو شدیم و تصویر زیر برخی از محدودیت های اولیه ما را نشان می دهد
شروع نادرست
برای شروع ، بیایید نگاهی دقیق تر به موارد مختلف بیندازیم لایه های درگیر در برنامه ریزی مسیر.
لایه های عملکردی در اتومبیل خودران mNT1_8kBfGssr84gssA7Jw.png "> لایه های درگیر در برنامه ریزی مسیر - از Udacity
همانطور که قبلاً ذکر شد ، برنامه ریزی مسیر نیاز به همکاری لایه های مختلف یک دستگاه خودکار دارد وسیله نقلیه وحشتناک نمودار بالا مروری بر چگونگی لایه بندی چنین اجزایی در یک سیستم خودران دارد: این لایه با سریعترین مقیاس زمانی Sensor Fusion کار می کند: مسئول ادغام خروجی های سنسور (به عنوان مثال RADAR + LIDAR) است. وسیله نقلیه روی نقشه است ، و مکانهای دیگر (به عنوان مثال ماشین های دیگر) در رابطه با وسیله نقلیه ما پیش بینی: مسئول شناسایی ماهیت موجودیت های تشخیص داده شده با حسگرها (با نام مستعار ادراک) و همچنین پیش بینی آینده نزدیک تغییرات در صحنه بر اساس مسیر حرکت اتومبیل ، مسیر دیگر وسایل نقلیه و عناصر متفرقه در صحنه (به عنوان مثال چراغ راهنمایی). یکی از وظایف مهم این لایه استپیش بینی برخوردها نیز است. رفتار: لایه هماهنگ کننده ای که تمام اطلاعات را از لایه های پایینی می گیرد و وضعیت آینده را برای گذار به همراه مسیر اتخاذ تصمیم می گیرد مسیر: مسئول مسیرهای محاسبه با مجموعه ای از محدودیت ها (به عنوان مثال سرعت ، مسافت ، خط ، حرکت تند ، و غیره)
روش های زیادی برای ایجاد مسیر وجود دارد ، و در این پروژه ما محاسبه مسیرها را در یک سیستم مختصات Frenet انتخاب کرده ایم .
تشخیص داده های تلفیقی سنسور
وسیله نقلیه ما در شبیه ساز به طیف وسیعی از حسگرها مجهز است که خروجی آنها برای ایجاد اندازه گیری دقیق تر ، ذوب شده است. اکثر شرکت هایی که در استقلال سطح 4 کار می کنند از Radar ، Lidar و Camera در مجموعه حسگر خود استفاده می کنند. داشتن انواع مختلف سنسورها بسیار مهم است زیرا هر کدام نقاط قوت و ضعف خود را دارند. علاوه بر این ، داشتن موارد متعدد از یک سنسور یکسان برای کاهش خرابی های سخت افزاری در یک سنسور مشخص ، بسیار مهم است.
در مورد ما ، شبیه ساز اطلاعات زیر را از ماژول همجوشی سنسور خود ارائه می دهد: موقعیت ، سرعت و جهت وسیله نقلیه ما موقعیت و سرعت وسایل نقلیه دیگر (می توان جهت را با استفاده از مثلثات کوچک محاسبه کرد - به مستطیل رنگ مراجعه کنید) در محدوده حسگر بقیه مسیرهای پیشتر برای اجرا
با استفاده از این اطلاعات می توانیم فاصله وسیله نقلیه خود را با سایر وسایل نقلیه دیگر محاسبه کنیم. ما این مراحل را بسیار فراتر می گذاریم و سعی می کنیم برخوردها را بر اساس مسیر خودرو و مسیرهای برآمده سایر خودروها پیش بینی کنیم. ما از این اطلاعات در توابع هزینه ای که بعداً تعریف می کنیم به نفع خود استفاده می کنیم.
ایجاد مسیر
سیستم مختصات Frenet
ما اغلب از یک سیستم مختصات سنتی دکارتی استفاده می کنیم نشان دادن یک نقطه معین (x ، y) در یک هواپیما ، و این در واقع سیستم پیش فرض مورد استفاده در شبیه ساز برای شناسایی ماشین ما در جاده است. با این حال ، در دنیای واقعی ، جاده ها همیشه مستقیم نیستند و بنابراین عملیات "آسانی" که انسانها انجام می دهند مانند تشخیص اینکه خودرو در کدام خط قرار دارد ، تکرار آن با استفاده از سیستم دکارتی برای رایانه بسیار دشوارتر است. تصویر زیر مشکلی را که در سیستم مختصات سنتی (X، Y) با آن روبرو هستیم نشان می دهد:
جاده منحنی در سیستم دکارتی (برگرفته از درس Udacity)
آیا اگر سیستم مختصات ما از انحنای جاده حمایت کند ، آسان تر نخواهد بود مسیری که ماشین ما جلو می رود و در خط خود می ماند ، مانند خط زیر به صورت یک خط مستقیم ظاهر می شود؟
مسیرها در سیستم های مختصات فرنت (چپ) و دکارتی معمولی (راست)
این دقیقاً همان چیزی است که یک سیستم مختصات Frenet ارائه می دهد: در چنین سیستمی ، هواپیمای خود را به صورت طولی و محور جانبی ، به ترتیب S و D. اما می توانید تصور کنید که منحنی که از مرکز جاده می گذرد محور S را تعیین می کند و نشان می دهد که چقدر در جاده قرار داریم. محور D به جابجایی جانبی خودرو می پردازد. تصویر زیر نشان می دهد که این سیستم در جاده های منحنی چگونه به نظر می رسد:
جاده منحنی ضبط شده در مختصات Frenet -از Udacity
به حداقل رساندن لرزش
تکان دادن به عنوان میزان تغییر شتاب در طول زمان تعریف می شود. در همین حال ، شتاب به عنوان نرخ تغییر سرعت در طول زمان تعریف می شود. اساساً حرکت تند و سریع به ترتیب مشتقات شتاب و سرعت هستند. به عنوان مسافران ، تغییرات ناگهانی شتاب در یک وسیله نقلیه باعث حرکت سریع می شود که در نهایت باعث ناراحتی رانندگی می شود. بنابراین به حداقل رساندن حرکت تند در هنگام برنامه ریزی یک مسیر ضروری است.
به نظر می رسد که محاسبه حداقل خط حرکت تند و سریع در یک بعد با گسترش معادله سینماتیکی برای محاسبه مسیر با توجه به موقعیت فعلی ما s_0 بسیار آسان است. ، سرعت فعلی s_0_v ، و شتاب فعلی s_0_a. برای یک بازه زمانی مشخص T (به عنوان مثال 1 ثانیه) ، می توانیم بیان کنیم:
موقعیت نهایی مورد نظر (در زمان t) s_f سرعت نهایی مورد نظر s_f_v شتاب نهایی مورد نظر s_f_a با استفاده از چند جمله ای کوینتیک (یعنی درجه 5) که تا مشتق دوم حرکت تند حرکت می کند. معادلات با توجه به مقادیر شروع به شرح زیر است:
تکان به حداقل رساندن معادلات مسیر - از Udacity
مقادیر سمت چپ علامت معادل مقادیر پیش بینی شده برای موقعیت ، سرعت و شتاب در زمان t ≤ T. در مورد ما t بر روی کنترل کننده تنظیم شده است نرخ به روز رسانی ، که 20 میلی ثانیه (0.02 ثانیه) است. ما می توانیم همه اینها را با تعیین شرایط مرزی مناسب به حل کننده چند جمله ای متصل کنیم. در مورد ما ، ما شتاب مورد نظر خود را بر روی 0 تنظیم می کنیم ، زیرا ما می خواهیم حرکت تند و سریع را انجام دهیم. متأسفانه این فقط شتاب نهایی را برای t = T تعیین می کند و ما هیچ کنترلی بر شتاب خودرو هنگام t ≠ T نداریم. بنابراین ما باید مقادیر مختلف T را آزمایش کنیم تا مشخص کنیم کدام افق زمانی را انتخاب کنیم تا مسیرهای کمینه حرکت تند و سریع ایجاد شود. در مورد ما T = 1.7 ثانیه را انتخاب کردیم. مسئله دیگر این است که ما یک کنترل کننده کامل داریم که بدون توجه به قوانین فیزیک ، خودرو را به هر نقطه بعدی در مسیر حرکت می دهد (به عنوان مثال می تواند در 20 میلی ثانیه 1 کیلومتر بیشتر حرکت کند) ، بنابراین ما باید بسیار مراقب باشیم. مسیرهایی که ارسال می کنیم.
از آنجا که از مختصات Frenet استفاده می کنیم ، می توانیم حداقل مسیرهای حرکت یک بعدی را در ابعاد s و d به طور جداگانه ایجاد کنیم. این مقاله از ورلینگ و کمل برای آشنایی بیشتر با این موضوع خواندن خوبی است.
از آنجا که شبیه ساز مسیرهای بیان شده در مختصات Frenet را قبول نمی کند ، ما برای محاسبه مختصات مختصات Frenet به مختصات دنیای واقعی تبدیل می کنیم. (x ، y) نقطه ای که به یک نقطه (ها ، د) Frenet مربوط می شود.
بهبود محلی سازی
ایجاد مسیرهای روانتر
فرض می کنیم که آهنگ دارای قبلاً نقشه برداری شده است و دارای نقاطی است که خط زرد میانی را دنبال می کند و دو طرف بزرگراه را از هم جدا می کند. این به ما کمک می کند تا در مورد نزدیکترین نقاط بین راهی که هستیم قرار بگیریم.
متأسفانه نقاط نقشه ای که به ما داده می شود بسیار پراکنده هستند و می توانند منجر به مسیرهای بسیار "زاویه ای" شوند که هنگام تلاش برای تبدیل از Frenet ایجاد می شود. بازگشت به مختصات دنیای واقعی این به نوبه خود باعث افزایش ناگهانی شتاب و حرکت تند و سریع می شود. به عنوان تابع toRealWorld (s، d) -> (x، y) از درون یابی اولیه بین دو نقطه بین راه استفاده می شودبرای یافتن بهترین مقادیر تقریبی برای x و y ، ما همیشه در معرض خطر ایجاد یک مسیر غیر هموار هستیم.
تغییر مسیر با نقاط درشت
برای بهبود این امر چه کاری می توانیم انجام دهیم؟ از برخی پروژه ها در شرایط قبلی ، ما مشاهده کرده ایم که خطوط مشتق شده از چند جمله ای تمایل به ایجاد مسیرهای بسیار صاف دارند. بنابراین ما باید از این تکنیک به جای درون یابی اولیه که در حال حاضر استفاده می شود ، استفاده کنیم. ما برای به دست آوردن مختصات دنیای واقعی x ، y و خنثی کردن dx و dy به استفاده از spline های ایجاد شده با گرفتن موقعیت s در مختصات Frenet متوسل می شویم. سپس این فرمول را وصل می کنیم تا نزدیکترین مختصات در دنیای واقعی را بدست آوریم
x = spline_s_x (s) + d * spline_s_dx (s)
y = spline_s_y (s) + d * spline_s_dy (s)
اکنون می توانیم ببینیم که مسیر ما به طرز چشمگیری هموار شده است.
رانندگی روان از نقاط بهتر
ماشین حالت دو بعدی
یکی از بصری ترین روش های تفکر در مورد رانندگی این است که ما انسانها بر اساس شیوه رانندگی ، اطلاعات خارجی که در اختیار داریم و همچنین مقصدی که در ذهن داریم ، وسیله نقلیه خود را به حالتهای مختلف تبدیل می کنیم. به نظر می رسد که ما می توانیم حالت ها را برای ماشین ها کدگذاری کنیم و به آنها آموزش دهیم که بر اساس وضعیت فعلی و سایر لایه های پشته خودروهای خودکار به کدام حالتها حرکت کنند.
در مورد ما ، ماشین حالت محدود ما کاملاً ساده است و تصویر زیر: img>
متداول ترین حالت Keep Lane خواهد بود اما هر زمان که بخواهیم خط را تغییر دهیم ، ماشین ابتدا به حالت آماده سازی تغییر مسیر چپ/راست منتقل می شود و پس از اطمینان از سالم بودن سوئیچ خط ، به خط اصلی حرکت می کند. تغییر حالت حالت میانی که قبل از تغییر خط وارد می کنیم شبیه خودروهایی است که قبل از تغییر خط سیگنال های چپ/راست خود را روشن می کنند (و البته رانندگان نیز مطمئن می شوند که تغییر خط ایمن است).
در مورد اجرای وضعیت ما ما از مختصات Frenet برای طراحی این روش الهام گرفتیم. ما تصمیم گرفتیم یک حالت معین را به اجزای طولی و جانبی آن تقسیم کنیم. دلیل انجام این کار این است که ما معتقدیم تصور ما در مورد رانندگی در بزرگراه با تغییرات احتمالی خط ساده می شود.
اساساً حالت جانبی حالتهای بالقوه بعدی را تعیین می کند که می توانیم در آن قرار بگیریم ، در حالی که هزینه هزینه ممکن است یک حالت طولی را بر حالت دیگر انتخاب کند. پیاده سازی ماشین حالت را می توان در خلاصه زیر یافت: بهترین ”اقدامی که باید انجام شود. اینجاست که توابع هزینه مفید هستند. توابع هزینه برای "آموزش" وسیله نقلیه به منظور آموزش "اقدامات" موردنظر ما و اعمال آنها به میزان کمتر یا شدیدتر با وزنه های مختلف ضروری است.
همه توابع هزینه ما به رابط زیر که در آن تعریف کرده ایم پایبند هستند. فایل cost_functions.h در مخزن پروژه:
typedef function &، const Trajectory &، const State &، const double &)> CostFunction؛
این باعث می شود که یک تابع هزینه بسیار بی اهمیت باشد (وزن آخرین پارامتر است). ما تعریف کردیمتوابع هزینه زیر ، جایی که وزن به طور کامل قابل تنظیم است: مرکز خط هدف laneChangeCostFunction: عملکردی که همیشه تغییر خط را مجازات می کند ، زیرا معمولاً خطرناک تر از رانندگی در همان خط distanceToClosestCarAheadCostFunction است: عملکردی که ما را مجازات می کند نزدیکترین خودرو به خودروی پیش رو distanceToClosestCarAheadFutureLaneCostFunction: عملکردی که هنگام تعویض خط در صورتی که به وسایل نقلیه جلو یا عقب نزدیک باشد جریمه می کند averageLaneSpeedDiffCostFunction: یک تابع این خطی را که خودرو می خواهد بر اساس سرعت متوسط وسایل نقلیه پیش رو در این خط جریمه کند speedDifferenceWithClosestCarAheadCostFunction: تابع هزینه ای است که وسیله نقلیه ما را جریمه می کند e اگر کندتر از وسیله نقلیه پیش رو collisionTimeCostFunction باشد: عملکردی که درصورت برخورد احتمالی با وسیله نقلیه دیگر مسیر ما را جریمه می کند futureDistanceToGoalCostFunction: عملکردی که مسیر ما را جریمه می کند هرچه بیشتر به هدف برسد (یعنی پایان مسیر در s = 6945.554)
ما پیکربندی های مختلف وزن زیادی را امتحان کردیم اما در نهایت تصمیم گرفتیم که چون نمی خواهیم در مورد ایمنی به خطر بیفتیم بالاترین وزن را با 10000 به collisionTimeCostFunction نسبت می دهیم. وزن ها بسیار متفاوت است ، اما ما برای مثال وزن بسیار کمی به speedCostFunction دادیم زیرا داشتن سرعت بالا بسیار خوب است اما به هیچ وجه به اندازه عدم برخورد مهم نیست.
نتایج نهایی
جریان برنامه ریز مسیر بسیار خوب عمل می کند و خودرو را قادر می سازد چندین بار در اطراف مسیر حرکت کند. با این حال می توان با افزایش وزن بیشتر و بهبود برخی از عملکردهای هزینه ، آن را بهبود بخشید. علاوه بر این ، ما معتقدیم که با استفاده از برخی از یادگیری ماشین در لایه پیش بینی خود می توان برخی از موارد حاشیه ای که می تواند منجر به برخورد شود را حذف کنیم. یکی از رفتارهای جالب برنامه ریز ما این است که می تواند چندین بار به سرعت خط را تغییر دهد. ما در ابتدا تصور می کردیم که این یک اشکال در طراحی ماشین حالت نهایی ما است ، اما معلوم می شود که یک عارضه جانبی جالب است!
تغییر دوطرفه صاف (دومین بار به دلیل قرمز بودن خودرو در جلو)
همچنین می توانید ویدیوی یک دور کامل بارگذاری شده در YouTube را مشاهده کنید:
پیشرفت
برنامه ریز مسیر فعلی نسبتاً محافظه کار است و برای حداکثر سرعت بهینه نشده است. این بدان معناست که در حالی که سرعت می تواند در برخی مواقع به 48 MPH (77.2 KPH) برسد ، به طور کلی زیر این سرعت باقی می ماند و تقریباً هرگز به سرعت مجاز 50 MPH (80.4 KPH) نمی رسد. این یک معامله است که ما خوشحالیم که در حال حاضر آن را می پذیریم ، اما باید کار شود تا ماشین بتواند با سرعت نزدیک به 50 مگاپاسکال حرکت کند.
علاوه بر این ، برنامه ریز فقط خطوط مجاور خودرو را در نظر می گیرد و بنابراین هرگز "نمی بیند" که یک خط غیر مجاور انتخاب بهتری خواهد بود (به عنوان مثال ماشین در خط 1 قرار دارد و برنامه ریز فقط خطوط 1 و 2 را ارزیابی می کند ، در حالی که خط 3 در سمت راست می تواند آزاد باشد و بنابراین یک خط کاندیدای خوب برای حرکت است. به سمت). این امر به روش ارزیابی پیچیده تری نیاز دارد که در آن برنامه ریز تمام خطوط را ارزیابی کرده و در نهایت تصمیم گیری می کندبر اساس این واقعیت که خط کنار خط مجاور ما به یک خط مجاور حرکت می کند ، هنگامی که وسیله نقلیه به خط مجاور رسید ، می توانید به آن حرکت کنید. نگرانی دیگر ما در مورد این رویکرد مربوط به ایمنی است ، زیرا اجرای چنین حرکتی جسورانه خطرناک تر و دشوارتر است ، به دلیل فاصله جانبی که باید طی شود و همچنین مشکل پیش بینی رفتار سایر وسایل نقلیه در جاده.
یکی دیگر از پیشرفت هایی که باید به آن توجه داشته باشیم این است که از تکنیک های آماری برای پیش بینی بهتر اقدامات سایر وسایل نقلیه استفاده کنیم ، به ویژه پیش بینی زمانی که آنها در خط ما ادغام می شوند زیرا این امر خطر تصادف مرگبار را افزایش می دهد. ما می توانستیم با استفاده از Naive Bayes کار خود را شروع کنیم اما زمان کافی برای اختصاص دادن به آزمایش و سپس انتخاب متمایزترین ویژگی ها برای پیش بینی کننده خود را نداشتیم.
سرانجام ، برنامه ریز فعلی ما فقط یک مسیر واحد را برای یک مورد مشخص ایجاد می کند. حالت بعدی احتمالی ، به این معنی که ما می توانیم مسیرهای بهتری را برای همان وضعیت آینده نادیده بگیریم (به عنوان مثال دورتر/عقب تر ، یا بیشتر در سمت چپ یا راست یک خط مشخص). ما برای خط سیرهای متعددی در هر حالت ، پیاده سازی داریم ، که فرض می کند که تمام موقعیت های نهایی Frenet s و d (که با محاسبه حداقل مسیر حرکت تند و سریع به دست می آید) از توزیع گوسی با میانگین داده شده و انحراف استاندارد (میانگین_ ، std_s) و (میانگین_d ، پیروی می کنند. std_d) به ترتیب برای توزیع G (s) و G (d). با این حال ، ما باید مقادیر مناسب برای انحرافات استاندارد را انتخاب کنیم ، در حالی که میانگین ها در موقعیت های نهایی مورد نظر end_s و end_d ثابت باقی می مانند.
قدردانی
تا اینجا بدون شک دشوارترین پروژه ای که من به عنوان بخشی از این نانو درجه اتومبیل خودران انجام داده ام ، در هر سه دوره. مطمئن نبودم که بتوانم آن را کامل کنم و حتی نمی دانستم دقیقاً از کجا شروع کنم!
فیلم آموزشی کوچک دیوید سیلور و آرون براون به من کمک کرد تا شروع کنم. از آنجایی که من یک روش کمینه سازی تند و تیز را برای ایجاد مسیر انتخاب کردم ، تعداد زیادی پست وبلاگ یا ارجاعاتی از دانش آموزانی که این تکنیک را انتخاب کرده اند پیدا نکردم ، زیرا بیشتر مقاله ها در مورد استفاده از تکنیک اسپلاین در آموزش دیوید و هارون بود. اما مقاله ورلینگ و کمل در زمینه ایجاد مسیر مطلوب برای سناریوهای خیابانی پویا در قاب فرنت واقعاً به بهبود شهود من در مورد این تکنیک کمک کرد (هرچند من همه چیز را کاملاً درک نکردم).
علاوه بر این ، من بسیار لذت بردم و از مقاله های Mithi در این پروژه و همچنین پست های دیگر دانش آموزان الهام گرفته شده است. در نهایت ، من از همه تیم Udacity و شرکای آنها در Daimler تشکر می کنم که چنین محتوا و پروژه ای چالش برانگیز را گردآوری کرده اند!
سارا کاریرا در 21 سالگی در تصادف وحشیانه خودرو جان خود را از دست داد
[ بازدید : 30 ] [ امتیاز : 3 ] [ نظر شما :
]