پروژه فرود کاوشگر مریخی با پایتون

در ناسا، برای فرود محموله کاوشگر سیاره ای مریخی سه مرحله: ورود(Entry)، فرود(Descent) و نشستن(Landing) تعریف می شود که به طور کلی بهش میگن (EDL). در واقع EDL به مجموعه ای از اتفاقات از زمانی که محموله کاوشگر به اتمسفر جو مریخ می رسه تا لحظه ای که زمین مریخ را لمس کنه گفته میشه. حالا ما میتونیم این پروسه رو با زبان های برنامه نویسی مثل پایتون مدل کنیم. به طور خاص در این پروژه ساده ما می خوایم چند مرحله از EDL رو برنامه نویسی کنیم: مثلا فاصله محموله کاوشگر رو از سطح مریخ اندازه گیری و سنجش کنیم.

موارد مورد نیاز پروژه:

  • بردی که بشه روش کد پایتون اجرا کرد مثل: رزپبری پای یا آردوینو یا esp32
  • نرم افزار که بشه توش کد پایتون نوشت مثل: MU, Atom, pycharm و غیره
  • سنسور نور
  • ال ای دی های چند رنگ
  • دکمه های برنامه پذیر
  • سنسور اولتراسونیک
  • بازر یا بلندگو
  • بردبورد و کانکتور و کابل
عکس ۱: پروسه فرود کاوشگر مریخی

قدم اول: ببینیم چه چیزهایی برای فرود لازم است!:

فرود فضاپیما روی مریخ کار ساده ای نیست. با توجه به فاصله زیادی که بین مریخ و کره زمین وجود داره، ما نمیتونیم به صورت آنلاین مثل یه بازی کامپیوتری فضاپیما یا محمولمونو برای فرود کنترل کنیم (البته شاید بعدا ما به این تکنولوژی دست پیدا کنیم!). در واقع تمام ارتباطات ما به وسیله قانون سرعت نور محدود شده هستند. به همین خاطر تقریبا ۷ دقیقه طول میکشه سیگنال ما به مریخ برسه و ۷ دقیقه طول میکشه سیگنال برگرده.پس در نتیجه فضاپیما یا سفینه ما باید بتونه به صورت خودکار (اتوناموس) با توجه به برنامه ها، دستور العمل ها و الگوریتمهایی که روی پردازنده های اون برنامه نویسی شده روی سطح مریخ فرود بیاد.

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

  • اندازه گیری فاصله محموله (فضاپیما) تا سطح مریخ
  • اطلاع دقیق از لحظه انجام هر مانور و عملیات، مثلا چه وقت چتر نجات باید باز شود
  • مخابره وضعیت با مرکز کنترل ماموریت روی زمین
  • شروع عملکرد امن با رسیدن به سطح مریخ

توضیحات عکس ۱ (بالا): این تصویر دقایق آخر فرود کاوشگر مریخی ناسا رو در طول سفر ۷ ماهش به مریخ نشون میده برای توضیحات بیشتر به سایت خود ناسا (این لینک) مراجعه کنید.

قدم دوم: راه اندازی:
در این بخش باید تصمیم بگیریم که برای فرود کاوشگر روی سطح مریخ به چه سنسورها و ابزارهایی نیاز داریم.ممکنه شما از یک سنسور تشخیص رنگ بخواهید استفاده کنید تا با اون رنگ سطح مریخ رو تشخیص بدید یا از دوربین برای پردازش تصویر سطح مریخ استفاده کنید.اینها همش بستگی به شما داره، به نبوغ و خلاقیت شما بستگی داره. به طور مثال یکی از سنسورهایی که ناسا در کاوشگر کنجکاوی (Curiosity) استفاده کرده برای اینکه بتونه ارتفاعش رو از سطح مریخ اندازه گیری کنه سنسورهای اولتراسونیک هستند. علاوه بر این ها فرض کنید شما چند ال ای دی هم برای نمایش وضعیت کاوشگرتون میخواهید استفاده کنید. کد زیر یک کد خیلی خیلی ساده (البته این کدهای ساده رو دست کم نگیرید!) برای معرفی المانهایی هست که ما می خواهیم استفاده کنید:

برای اینکه به کارمون نظم بدیم مراحل و کارهایی که انجام میدیم رو دسته بندی می کنیم و با عنوان تسک (Task) معرفی میکنیم:

تسک اول: اضافه کردن سنسورها و ابزارها:

کد زیر اضافه کردن سنسور اولتراسونیک و LED رو نشون میده:

from components import UltrasonicSensor, LED
from time import sleep

#If your kit doesn't automtically detect the port being used, you can specify
ultrasonic = UltrasonicSensor("D1")

قدم سوم: اندازه گیری فاصله بین کاوشگر و سطح مریخ:

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

تسک اول: تعیین محل فرود:

ما باید بتونیم محل فرودمون رو با استفاده از تجهیزاتی که برای شبیه سازی فرود استفاده می کنیم مشخص نمائیم، به طور مثال، فرض کنید یه فضاپیمای اسباب بازی دارید و می خواید کف اتاق فرود بیاید برای اینکار میتونید اونو با یه نخ به لبه یه میز وصل کنید و آروم نخو آزاد کنید و روی کف اتاق در یک نقطه مشخص و فاصله معین از یک دیوار فرود بیاید. پس قدم اول باید نقطه فرود مشخص بشه!

تسک دوم: سنسورهاتونو راه اندازی کنید:

یکی از بهترین سنسورها سنسورهای اولتراسونیک هستند که برای تشخیص فاصله تا سطوح بسیار کاربردی و مناسب هستند. در این مرحله باید بتونید سنسور اولتراسونیک خودتونو راه بندازید. مثلا از کدهای زیر برای راه اندازی سنسور و خوندن فاصله تا سطوح استفاده کنید و بعد اونو پرینت (نمایش) بدید:

while True:
    distance = ultrasonic.distance
    print(distance)
    sleep(0.1)

در کد بالا که با زبان پایتون نوشته شده در خط اول ما میگیم که دائما کدهای خطوط ۲، ۳ و ۴ رو اجراکن. در خط دوم از سنسوز اولتراسونیک فاصله رو میخونیم و در یک متغیر به اسم distance می ریزیم، در خط سوم این فاصله رو در خروجی نرم افزار نمایش میدیم و در خط آخر یک استراحت به کدمون میدیم که مثلا ۰.۱ ثانیه صبر کن و دوباره از اول بخون.

تسک سوم: از LED ها برای نشان دادن وضعیت فاصله استفاده کنید:

با استفاده از led ها ما میتونیم یک خروجی نمایشی سریع ایجاد کنیم برای اینکه بتونیم نتایج اندازه گیری توسط سنسورهای اولتراسونیک رو نمایش بدیم. برای اینکار میتونیم از یک الگوری سه وضعیتی : “حرکت، احتیاط، توقف” استفاده کنیم. اما خب میتونیم هر الگویی که خودمون دوست داریم هم تعریف کنیم. مثلا کد این تسک میتونه به صورت زیر باشه:

red_led = LED("D2")
yellow_led = LED("D3")
green_led = LED("D4")

if distance < 10:
    red_led.on()
    yellow_led.on()
    green_led.on()
elif distance < 20:
    red_led.off()
    yellow_led.on()
    green_led.on()
else:
    red_led.off()
    yellow_led.off()
    green_led.on()

قدم چهارم: راه اندازی یک آلارم برای هر فاز از فرود:

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

تسک اول: عبور بین مراحل:

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

from components import Buzzer
buzzer = Buzzer("D5")
if distance < 10:
    red_led.on()
    yellow_led.on()
    green_led.on()
    buzzer.on()
elif distance < 20:
    red_led.off()
    yellow_led.on()
    green_led.on()
else:
    red_led.off()
    yellow_led.off()
    green_led.on()

تسک دوم: تنظیم ارتفاع موردنظر:

کد نمونه ای که در بالا نوشتیم (در تسک اول: عبور بین مراحل) وقتیکه در کد به یک محدوده ای از ارتفاع مشخص برسیم شروع می کند به آلارم دادن و روشن کردن ال ای دی. حالا شما مثلا می تونید یک ارتفاع دقیقتر تعیین کنید که وقتی به اون رسید چراغ یا ال ای دی سبز روشن بشه

قدم پنجم: تامین توان الکتریکی کاوشگر:

در حالیکه کاوشگرهای استقامت ( Perseverance) و کنجکاوی (Curiosity) از طریق سیستم تامین انرژی RTG که یک نوع پیل یا باتری پیشرفته است برق خود را تامین می کنند، سایر کاوشگران در مریخ از انرژی خورشیدی استفاده می کنند. در واقع به محض اینکه کاوشگرها با موفقیت روی مریخ فرود می آیند شروع می کنند به ذخیره انرژی و شارژ باتریهاشون از طریق سلولهای خورشیدی و بعد با ایستگاه زمینی ارتباط برقرار می کنند.

خب مثل قدم چهارم اینجا هم دوتا تسک داریم که باید انجام بدیم:

تسک اول: جمع آوری نور خورشید برای تامین برق کاوشگر:

با استفاده از سنسورهای نوری و یا سلولهای خورشیدی می تونیم بفهمیم چقدر انرژی داریم دریافت می کنیم:

from components import LightSensor
from time import sleep, time

light = LightSensor("D6")
while True:
    lightlevel = (light.reading)
    print lightlevel

تسک دوم: ترسیم نمودار توان خورشیدی:

بسته به اینکه از چه سیستم یا کیتی استفاده می کنید میتونید بفهمید در لحظه چه انرژی رو از طریق سلولهای خورشیدی دریافت می کنید و یا حتی می تونید در طول زمان نمودار توان خورشیدی رو هم ترسیم کنید مثل کد زیر:

plt.ion()
fig = plt.figure()
x_data = []
y_data = []
start_time = time()

x_data.append(elapsed_time)
y_data.append(lightlevel)

plt.title("Light Sensor input over time")
plt.ylabel("Light Level")
plt.xlabel("Time in seconds")

plt.plot(x_data, y_data)
plt.draw()
plt.pause(0.01)

قدم ششم: تماس با خونه (ارتباط با ایستگاه زمینی):

خب توجه داشته باشید با توجه به فاصله زیاد مریخ تا زمین و تاخیر زمانی در ارسال و دریافت اطلاعات ما تا وقتی که اطلاعات رو از کاوشگر دریافت نکنیم نمیتونیم بفهمیم که آیا با موفقیت فرود اومده یا نه! در اینجا هم برای برقراری ارتباط باید دوتا تسک رو انجام بدیم:

تسک اول: ارسال یک پیام با استفاده از صدا:

با استفاده از کد نویسی یک بازر را فعال کنید تا با استفاده از اون به ایستگاه زمینی اطلاع دهید که فرود با موفقیت انجام شد برای اینکار از قانون ساده مورسی (Morse) استفاده کنید:

from components import Button
button = Button("D7")

while True:
    if button.is_pressed:
        buzzer.on()
    else:
        buzzer.off()

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

توجه داشته باشید که ما نمیتونیم امواج صوتی در فضا برای ایجاد ارتباط ارسال کنیم ولی در عوض میتونیم از کدهای مورسی استفاده کنیم و از طریق نور اونهارو ارسال و دریافت کنیم. مثل کد زیر:

Morse_Dict = { 'A':'.-', 'B':'-...', 'C':'-.-.', 'D':'-..', 'E':'.',
'F':'..-.', 'G':'--.', 'H':'....', 'I':'..', 'J':'.---', 'K':'-.-',
'L':'.-..', 'M':'--', 'N':'-.', 'O':'---', 'P':'.--.', 'Q':'--.-',
'R':'.-.', 'S':'...', 'T':'-', 'U':'..-', 'V':'...-', 'W':'.--',
'X':'-..-', 'Y':'-.--', 'Z':'--..'}

def encrypt(message):
    convert = ' '
    for letter in message:
        if letter != ' ':
            convert += Morse_Dict[letter] + ' '
        else:
            convert += ' '
    return convert

def decrypt(message):
    message += ' '
    decode = ''
    text = ''
    for letter in message:
        if (letter != ' '):
            i = 0
            text += letter
        else:
            i += 1
            if i == 2:
                decode += ' '
            else:
                decode += list(Morse_Dict.keys())[list(Morse_Dict.values()).index(text)]
                text = ''
    return decode

def main():
    text = input("Enter Message: ")
    output = encrypt(text.upper())
    print(output)
if __name__ == '__main__':
    main()

با استفاده از کد ساده بالا تقریبا میشه فهمید که کاوشگر های ناسا چجوری ارتباط باینری با ایستگاه زمینی برقرار می کنن که به صورت امواج نوری ارسال و دریافت میشه. البته اینکار نیاز به دیشهای ماهواره ای بزرگ داره. کلا به این نوع ارتباط DNS گفته میشه.

قدم هفتم: قدم آخر: ترکیب همه قسمت ها:

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

۱- اندازه گیری فاصله تا سطح، نشان داده فاصله ها از طریق چراغ های قرمز، زرد و سبز

۲- به مضح اینکه کاوشگر به ارتفاع مطلوب رسید چراغ سبز روشن و بازر صداش دراد.

۳- با صدای بازر و اعلام فرود موفق، جمع آوری نور برای تامین توان

۴- بعد از ۳۰ دقیقه جمع آوری نور ارسال پیام به ایستگاه زمینی با استفاده از کدگذاری مورسی جهت اعلام فرود موفق

۵- به محض دریافت مجدد کد مورسی از ایستگاه زمینی چراغ های ال ای دی خاموش شوند و دوباره کاوشگر شروع به جمع آوری نور برای تامین انرژی کنه.

و این پایان کار کاوشگر ما تا به اینجای کار خواهد بود!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

قبلا حساب کاربری ایجاد کرده اید؟
گذرواژه خود را فراموش کرده اید؟
Loading...