صرفهجویی در زمان شبیهسازی: ابزار تولید موقعیت UE من برای OMNeT++ و Simu5G
همانطور که هر کسی که با شبیهسازهای شبکه کار میکند میداند، بخش قابل توجهی از زمان صرف راهاندازی و پیکربندی میشود، حتی قبل از اینکه به بخش جالب ماجرا یعنی اجرای خود شبیهسازی برسیم. اخیراً، هنگام کار بر روی پروژهای با Simu5G، شبیهساز شبکه 5G که بر بستر OMNeT++ ساخته شده، به یک مانع آشنا و خستهکننده برخوردم: موقعیتدهی تعداد زیادی از تجهیزات کاربری (UE).
مشکل: دریایی از مختصات
هدف من شبیهسازی سناریوهای مختلف با دهها و گاهی صدها UE بود که با یک gNodeB مرکزی (ایستگاه پایه 5G) تعامل داشتند. من نیاز داشتم که آنها در الگوهای خاصی قرار گیرند: گاهی ایستا، گاهی متحرک و اغلب در یک حلقه با فاصله معین. تنها راه برای انجام این کار به صورت پیشفرض، محاسبه و نوشتن دستی مختصات initialX
و initialY
برای تک تک UEها در فایل omnetpp.ini
بود.
انجام این کار برای ۱۰ عدد UE آزاردهنده است. انجام آن برای ۱۰۰ عدد، اتلاف وقت محض و طاقتفرساست. میدانستم که باید راه بهتری وجود داشته باشد. من میخواستم روی تحلیل نتایج شبیهسازی تمرکز کنم، نه اینکه یک ماشین ورود مختصات انسانی باشم. به همین دلیل تصمیم گرفتم ابزاری ساده بسازم تا تمام این فرآیند را خودکار کند.
راهحل: یک وب اپلیکیشن با Streamlit
من تولیدکننده موقعیت UE برای OMNeT++ را ساختم؛ یک برنامه تحت وب ساده با استفاده از کتابخانه Streamlit در پایتون. هدفم ساخت چیزی بصری، تعاملی و سریع بود که بتواند دقیقاً همان پیکربندی .ini
مورد نیازم را تنها با چند کلیک تولید کند.
این ابزار کارهای زیر را انجام میدهد:
- کنترلهای تعاملی: یک نوار کناری تمیز به شما امکان میدهد تمام پارامترهای کلیدی را تنظیم کنید: مختصات gNodeB، تعداد کل UEها و قوانین جایگذاری.
- جایگذاری انعطافپذیر: شما میتوانید بین یک استقرار ایستا (Static)، که در آن UEها در یک حلقه قرار میگیرند و حرکت نمیکنند، یا یک استقرار متحرک (Mobility) انتخاب کنید.
- مدلهای تحرک: برای سناریوهای متحرک، میتوانید از مدلهای رایجی مانند تحرک خطی (Linear Mobility) (که در آن UEها در یک خط مستقیم حرکت میکنند) یا نقطه مسیر تصادفی (Random Waypoint) (که در آن به صورت تصادفی در یک منطقه تعریفشده حرکت میکنند) انتخاب کنید.
- تجسم آنی: این برنامه یک نمودار دو بعدی از استقرار تولید میکند، بنابراین میتوانید دقیقاً ببینید gNodeB و UEهای شما کجا قرار دارند. برای تحرک خطی، حتی فلشهایی برای نشان دادن جهت حرکت اولیه UEها ترسیم میکند!
- تولید کد: مهمترین بخش! این ابزار یک بلوک تمیز از متن پیکربندی
.ini
تولید میکند که میتوانید مستقیماً آن را در پروژه OMNeT++ خود کپی و جایگذاری کنید.
چگونه کار میکند
این برنامه در باطن به طرز شگفتانگیزی ساده است. از numpy
برای محاسبات ریاضی استفاده میکند—محاسبه مختصات قطبی تصادفی (یک فاصله و یک زاویه) برای هر UE و سپس تبدیل آنها به مختصات دکارتی (X
, Y
) نسبت به gNodeB. از matplotlib
برای تولید نمودارها استفاده میشود و البته، streamlit
به طرز جادویی کل اسکریپت پایتون را به یک وب اپلیکیشن تعاملی تبدیل میکند.
هندسه جایگذاری
هسته منطق جایگذاری بر اساس هندسه ساده است. برای قرار دادن یک UE، اسکریپت در ابتدا به X
و Y
فکر نمیکند. در عوض، از مختصات قطبی استفاده میکند:
۱. یک فاصله تصادفی از gNodeB انتخاب میکند (در محدوده حداقل و حداکثری که شما تعیین میکنید).
۲. یک زاویه تصادفی انتخاب میکند (از ۰ تا ۳۶۰ درجه).
با داشتن یک فاصله و یک زاویه، سپس از مثلثات (کسینوس
و سینوس
) برای تبدیل این مختصات قطبی به مختصات نهایی دکارتی (X
, Y
) برای فایل .ini
استفاده میکند.
رابطه بین دو نقطه توسط فرمول فاصله اقلیدسی تعریف میشود:
که در آن:
- $D$ فاصله بین UE و gNodeB است.
- $(X_{UE}, Y_{UE})$ مختصات تجهیزات کاربری است.
- $(X_{gNB}, Y_{gNB})$ مختصات gNodeB است.
ابزار من به سادگی این منطق را به صورت معکوس به کار میگیرد تا تضمین کند UEها دقیقاً در جایی که باید، قرار میگیرند.
برنامههای آینده و دیگر مدلهای تحرک
این ابزار در حال حاضر سه سناریوی اصلی اما بسیار رایج را پیادهسازی میکند. با این حال، فریمورک INET برای OMNeT++ فوقالعاده قدرتمند است و مدلهای تحرک بسیار پیچیدهتری را ارائه میدهد که میتوان آنها را پیادهسازی کرد. شاید در آینده این مدلها را اضافه کنم، اما میخواستم منابعی را برای کسانی که علاقهمند به بررسی آنها هستند به اشتراک بگذارم.
برخی از مدلهای جالب عبارتند از:
- GaussMarkovMobility: مدلی که در آن سرعت و جهت یک گره در طول زمان بر اساس یک فرآیند تصادفی گاوس-مارکوف تغییر میکند. این برای ایجاد الگوهای حرکتی واقعیتر و کمتر قابل پیشبینی عالی است.
- MassMobility: سناریویی را شبیهسازی میکند که در آن گروه بزرگی از گرهها با هم به سمت یک مقصد مشترک حرکت میکنند، مانند جمعیتی که در یک کنسرت حرکت میکنند.
- CircleMobility: یک مدل ساده که در آن گرهها در یک الگوی دایرهای حول یک نقطه مرکزی حرکت میکنند.
- TurtleMobility: به شما امکان میدهد حرکت را با استفاده از یک اسکریپت به سبک LOGO با دستوراتی مانند “forward”، “turn” و غیره تعریف کنید.
میتوانید مستندات دقیق در مورد این مدلها و بسیاری دیگر را در مستندات رسمی تحرک فریمورک INET پیدا کنید.
این پروژه به عنوان یک ابزار شخصی برای حل یک مشکل خستهکننده شروع شد، اما امیدوارم بتواند برای سایر محققان در جامعه OMNeT++ و Simu5G نیز مفید باشد. میتوانید کد منبع کامل را در گیتهاب در آدرس KourosZanbouri/OMNET-UE-Generator پیدا کنید. با خیال راحت آن را بررسی کنید، در تحقیقات خود استفاده کنید و اگر ایدهای برای بهبود دارید، مشارکت کنید!