چالش AgBot 2019

دبیرستان ایست

در دوران حضورم در دبیرستان ایست در دنور، کلرادو (2014-2018)، به‌طور جدی در فعالیت‌های بعد از مدرسه درگیر بودم و تأثیرگذارترین آن‌ها باشگاه رباتیک AngelBotics بود. تا سال دوم دبیرستانم به آن نپیوستم، چون در ابتدا تمرکزم روی فوتبال بود. این باشگاه عمدتاً در FIRST Robotics Competition (FRC) شرکت می‌کرد و به من اجازه داد مهندسی مکانیک و برق، و همچنین برنامه‌نویسی را تجربه کنم. از طریق AngelBotics، یاد گرفتم چگونه از ابزارهای CAD، چاپگرهای سه‌بعدی، و دیگر تجهیزات مهندسی استفاده کنم و با مفاهیم STEM که معمولاً برای دانشجویان دانشگاهی در نظر گرفته می‌شوند آشنا شوم. در ابتدا آرزو داشتم فیزیک‌دان کوانتومی شوم، اما تجربه‌هایم در فیزیک AP و رباتیک به من نشان داد که در فیزیک آن‌قدرها هم خوب نیستم و در نتیجه از مسیر مهندسی مکانیک دور شدم.

در عوض، جایگاه خودم را در برنامه‌نویسی پیدا کردم؛ چیزی که با نوشتن کد پایتون برای اولین Raspberry Pi من آغاز شد و با پروژه‌های جاوا در درس AP Computer Science تثبیت شد. با وجود اینکه در امتحان‌ها مشکل داشتم، معلمم، آقای ناگل، مرا تشویق کرد که به توسعه نرم‌افزار ادامه دهم و بر ارزش پروژه‌ها بیشتر از نمره‌های امتحان تأکید کرد. این موضوع باعث شد که در دانشگاه روی علوم کامپیوتر به‌عنوان رشته‌ام تمرکز کنم، با رویای تبدیل شدن به یک مهندس نرم‌افزار و در نهایت بنیان‌گذار به‌عنوان مسیر حرفه‌ای‌ام.

هرچند به‌دلیل دروس سنگین و منحنی یادگیری تند، آن‌طور که باید در AngelBotics درگیر نبودم، اما همان‌جا جرقه‌ای برای عشقی مادام‌العمر به رباتیک در من زده شد. بنابراین وقتی وارد دانشگاه شدم، مصمم بودم به یک باشگاه رباتیک دانشگاهی بپیوندم و روزی شرکتی بسازم که با رباتیک مشکلات دنیای واقعی را حل کند.

دانشکده معادن

پس از فارغ‌التحصیلی از دبیرستان ایست، کارشناسی‌ام را در رشته علوم کامپیوتر در دانشکده معادن کلرادو (2018-2022) آغاز کردم. در همان ترم اول، باشگاه‌های رباتیک Mines را بررسی کردم و یک گروه کاملاً جدید رباتیک به نام AgBot را کشف کردم.

AgBot یک باشگاه رباتیک جدید بود که با هدف ساخت رباتی برای رقابت در 2019 agBots Weed and Feed Competition تشکیل شده بود. این مسابقه دو چالش اصلی داشت:

  1. شناسایی و نابودی آفات و علف‌های هرز
  2. ایجاد روش‌های جدید برداشت از طریق رباتیک

تیم ما تصمیم گرفت روی چالش اول تمرکز کند. این نخستین‌بار بود که Mines در مسابقه agBot شرکت می‌کرد و همچنین اولین باری بود که یک باشگاه رباتیک Mines روی چیزی مرتبط با کشاورزی کار می‌کرد. همین موضوع باعث می‌شد همه‌چیز تازه و متفاوت به نظر برسد.

من بلافاصله جذب این پروژه شدم. خانواده‌ام نسل‌ها در ترکیه کشاورز بودند، تا نسل پدرم. بنابراین AgBot هم به خانه و ریشه‌هایم نزدیک بود و هم علاقه‌ام به رباتیک و برنامه‌نویسی را در خود جای می‌داد. ایده ساخت رباتی که شاید بتواند به کشاورزانی مثل پدربزرگ و مادربزرگم کمک کند، واقعاً هیجان‌انگیز بود.

توسعه

عضو بودن در تیم AgBot یکی از به‌یادماندنی‌ترین تجربه‌های دوران دانشگاه من است. همچنین یکی از سخت‌ترین کارهایی بود که تا آن زمان انجام داده بودم. این پروژه نخستین باری بود که واقعاً وارد پایتون، اوبونتو، و ROS شدم. در FRC، همه‌چیز در جاوا بود، بنابراین این‌ها برای من قلمروی کاملاً جدیدی بودند. پیش‌تر از پایتون و اوبونتو استفاده کرده بودم، اما هیچ‌وقت به ROS دست نزده بودم. یاد گرفتن اینکه ROS چگونه کار می‌کند، نبردی سربالایی بود. آن زمان حتی نمی‌دانستم محیط پایتون چیست.

بیشتر وقتم را صرف این می‌کردم که یک Lidar را وادار کنم داده‌های قابل استفاده به یک نود ROS که می‌نوشتم بفرستد. وظیفه من پیاده‌سازی یک ROS Node به نام end_detector بود که می‌توانست با استفاده از داده‌های Lidar تشخیص دهد چه زمانی ربات به انتهای یک ردیف محصول رسیده است. الان ساده به نظر می‌رسد، اما آن زمان خیلی بزرگ و پیچیده به نظر می‌آمد.

حدود دو هفته دیباگ طول کشید تا Lidar را با کدم به حرف بیاورم. کل کد یا به زبان C++ بود یا پایتون، و عمدتاً پایتون. پس کد من برای این کار فقط پایتون بود. وقتی آن بخش کار کرد، من منطق را با استفاده از تکه‌های تصادفی گیاهی که در محوطه دانشگاه پیدا می‌کردم آزمایش کردم. پایه‌ای که Lidar روی آن قرار داشت را از کنار آن‌ها عبور می‌دادم و می‌دیدم آیا کد می‌تواند تشخیص دهد که به انتهای ردیف رسیده‌ایم یا نه. بعد از ساعت‌های زیاد و دیباگ، بالاخره توانستم همه‌چیز را دست‌کم در محیط آزمایشی خودم به کار بیندازم. اما وقتی خواستیم همه‌چیز را با هم ترکیب کنیم، داستان دیگری بود.

بیشتر وقتم صرف این می‌شد که سخت‌افزار و نرم‌افزار را با هم حرف‌زن کنم. منطق واقعی تشخیص انتهای ردیف در درجه دوم قرار داشت. اما تجربه یادگیری فوق‌العاده‌ای بود. از کسی که تقریباً ROS را نمی‌فهمید، به کسی تبدیل شدم که روی یک برد Jetson نود می‌نوشت و دیباگ می‌کرد و داده‌های زنده Lidar را می‌دید. در همین دوره بود که از این‌که عمدتاً جاوا را زبان پیش‌فرض برنامه‌نویسی‌ام بدانم، به این سمت رفتم که پایتون را زبان پیش‌فرض خودم قرار دهم. و تا سال 2025، هنوز واقعاً از جاوا برای هیچ‌یک از پروژه‌هایم یا پایگاه‌های کد مرتبط با کارم استفاده نکرده‌ام.

تیم و پشته فناوری

ما Ubuntu 16.04 را با ROS Kinetic و Python 2.7 روی یک Nvidia Jetson TX2 اجرا می‌کردیم که با یک Hokuyo URG 04LX UG01 Lidar ارتباط داشت. برای ورودی‌های حسگر مانند فاصله‌سنج‌های اولتراسونیک Arduino(ها) داشتیم. کد ما مسئول ادراک، ناوبری، کنترل، و پاشش بود. مخزن را می‌توانید اینجا ببینید: مخزن GitHub. کدی که من مشخصاً نوشتم را می‌توانید در end_detector.py پیدا کنید. این هم فهرست بیشتر اجزایی است که ربات را تشکیل می‌دادند:

  • Ubuntu 16.04 Xenial
  • ROS Kinetic Kame
  • Python 2.7
  • Nvidia Jetson TX2
  • Hokuyo URG-04LX-UG01 Lidar
  • Arduino Uno & Mega
  • موتورهای DC، انکودرها، کنترل‌کننده‌های موتور، باتری، و غیره

تیم خیلی بزرگی نداشتیم، اما چند نام برجسته بودند:

تایلر رهبر و بنیان‌گذار باشگاه بود. آن زمان احترام زیادی برایش قائل بودم و هنوز هم امروز هستم. زکری رهبر توسعه نرم‌افزار باشگاه بود و خیلی چیزها درباره توسعه نرم‌افزار و ROS به من یاد داد که تا امروز هم بابتش سپاسگزارم.

اعضای دیگری هم بودند، مثل Kevin Barnard و Amit Rotem. اما متأسفانه نام‌ها و راه‌های ارتباطی همه اعضای اولیه را به خاطر ندارم، چون بیش از 5 سال از تعطیل شدن باشگاه گذشته است.

بیشتر توسعه ربات در آخر هفته‌ها و تا دیروقت شب، بعد از پایان کلاس‌هایمان انجام می‌شد. کار روی یک مدرک مهندسی و AgBot بسیار طاقت‌فرسا بود، اما دوام آوردیم.

سفر و هرج‌ومرج

یکی از بخش‌های این تجربه که هرگز فراموش نخواهم کرد، خودِ سفر بود. مسابقه در وست لافایت، ایندیانا، نزدیک محوطه دانشگاه Purdue برگزار می‌شد. و کل مسابقه درست بعد از تمام شدن هفته امتحانات پایانی در Mines برگزار شد، بنابراین هیچ فرصتی برای ریکاوری از آن هفته جهنمی نداشتیم.

از گلدن، کلرادو تا ایندیانا با کامیون تایلر رفتیم تا ربات و همه ابزارهایمان را هم حمل کنیم. نکته خنده‌دار این بود که عملاً فقط یک روز قبل از هفته مسابقه حرکت کردیم. همه چیزهایی را که داشتیم، ربات، ابزارها، باتری‌ها، کامپیوترها، همه‌چیز را جمع کردیم و از گلدن، کلرادو به وست لافایت، ایندیانا رانندگی کردیم. روی کاغذ این مسیر 18 ساعت رانندگی است. با توقف برای بنزین و سرویس بهداشتی، بیشتر نزدیک به 20 یا 22 ساعت طول کشید.

تایلر تمام مدت رانندگی کرد و با نوشیدنی‌های Coffee Monster سر پا ماند. یکی دیگر از هم‌تیمی‌ها، اسمش را یادم رفته ولی در عکس‌ها هست، گاهی جای او رانندگی را به عهده می‌گرفت. در طول مسیر، باران سیل‌آسا شروع شد. مجبور شدیم کنار یک پمپ‌بنزین بسته و تصادفی بزنیم و یک برزنت برداریم تا از ربات محافظت کنیم. دست‌وپا‌ساز بود، هرج‌ومرج بود، رباتیک دانشگاهی بود. somehow به مقصد رسیدیم.

وقتی رسیدیم، سایبانمان را در میدان برپا کردیم و همه ابزارهایمان را چیدیم. من روی نهایی کردن کد و راه‌اندازی آن تمرکز کردم. بیشتر مسابقه را صرف دیباگ کردن رباتمان و واداشتنش به کارکرد بهتر کردیم و همزمان ربات‌های خلاقانه تیم‌های دیگر را هم تماشا می‌کردیم.

پس برنده شدیم؟

نه

با نگاه به گذشته، ما فقط چند دانشجو بودیم که می‌خواستیم چیزی بسازیم که بسیار فراتر از سطح تجربه‌مان بود. تیم‌های دیگر در سطح کاملاً متفاوتی بودند. بعضی از آن‌ها از استارتاپ‌ها آمده بودند. بعضی از آزمایشگاه‌های تحقیقاتی. بعضی‌ها پشتیبانی کامل دانشگاهی داشتند. ما یک گروه کوچک از دانشجویان کارشناسی بودیم که شب‌بیداری می‌کشیدیم و امیدوار بودیم پایتون داده‌های Lidar را به چیزی مفید تبدیل کند.

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

اما چند نفر از ما ماندیم

من تسلیم نشدم… تایلر تسلیم نشد… و آدم‌های داخل عکس هم تسلیم نشدند!

حتی با اینکه برنده نشدیم یا حتی یک ربات کاملاً کارآمد هم نداشتیم، این تجربه را با هیچ چیز عوض نمی‌کنم. درباره ROS، دیباگ سخت‌افزار، ساخت سیستم‌ها تحت فشار، و درباره وفاداری یاد گرفتم. فهمیدم که چقدر مهم است انسان کارها را تا آخر دنبال کند.

تأمل، تا سال 2025

پس از فصل 2019، AgBot فعالیتش را متوقف کرد. این عمدتاً به‌دلیل شروع COVID تقریباً یک سال بعد بود که باعث شد همه باشگاه‌های Mines برای 1 تا 2 سال تعطیل شوند و تا وقتی دنیا داشت دوباره به حالت «عادی» برمی‌گشت، من فارغ‌التحصیل شده بودم.

اکنون سال ۲۰۲۵ است، و وقتی به AgBot نگاه می‌کنم، آن را آغاز همه‌چیز برای خودم می‌بینم. این پروژه نخستین تجربه واقعی من با رباتیک را به من داد و به من آموخت که چگونه با یک تیم فنی همکاری کنم. این پروژه مرا در مسیری قرار داد که به فرصت‌های شگفت‌انگیزی منتهی شده است.

از آن زمان، من به‌عنوان یک مهندس بک‌اند در eBay کار کرده‌ام و سرویس‌هایی را مستقر کرده‌ام که میلیون‌ها معیار را در سراسر مراکز داده دریافت می‌کنند. اولین استارتاپ خودم را بنیان‌گذاری کردم که بر ساخت آزمون نفوذ امنیت سایبری خودکار با هوش مصنوعی تمرکز داشت. Notify Cyber را راه‌اندازی کردم، که به ده‌ها هزار بازدیدکننده رسید. برای Docker، Kubernetes، Postgres، و زیرساخت پیشرفته هوش مصنوعی نرم‌افزار نوشته‌ام.

اما AgBot همچنان یکی از بهترین تجربه‌های زندگی من به‌حساب می‌آید. هرج‌ومرج‌زده، پراسترس، و گاهی غیرممکن به نظر می‌رسید، اما بیشتر از هر کلاس یا آموزشی به من یاد داد. فهمیدم که حتی اگر برنامهٔ بی‌نقص، بودجهٔ کافی، یا بهترین سخت‌افزار را نداشته باشید، باز هم می‌توانید چیزی بسازید، چیزهای زیادی یاد بگیرید، و در این مسیر با آدم‌های فوق‌العاده‌ای آشنا شوید.

به همهٔ اعضای تیم AgBot در سال ۲۰۱۹، ممنونم. به آن سفر جاده‌ای ۲۰۱۹، برزنتی که از یک پمپ‌بنزینِ بسته برداشتیم، و شب‌های بی‌خوابی، ممنونم. شما به من استقامت لازم را دادید تا پروژه‌های بزرگ را با اعتمادبه‌نفس دنبال کنم، فرقی نمی‌کند چقدر غیرممکن به نظر برسند.

منابع و پیوندها

گالری عکس

تیم AgBot معدن، ما

GetStoredImage-1.jpeg GetStoredImage.jpeg IMG_9005.jpeg IMG_9006.jpeg
IMG_9663.jpeg IMG_9684.jpeg IMG_9685.jpeg IMG_9686.jpeg
IMG_9687.jpeg IMG_9688.jpeg IMG_9691.jpeg

ربات AgBot ما

IMG_8854.jpeg IMG_8855.jpeg IMG_8856.jpeg IMG_8867.jpeg
IMG_8976.jpeg IMG_8977.jpeg IMG_9007.jpeg IMG_9008.jpeg
IMG_9037.jpeg IMG_9038.jpeg IMG_9039.jpeg IMG_9040.jpeg
IMG_9695.jpeg r1.jpeg r3.jpeg r5.jpeg
r6.jpeg r7.jpeg r9.jpeg

ویدیوها/GIFها

زمین‌های مسابقه

IMG_8848.jpeg IMG_8849.jpeg IMG_8850.jpeg IMG_8851.jpeg
IMG_9042.jpeg IMG_9666.jpeg IMG_9668.jpg land.jpeg

تیم‌های دیگر در مسابقات

IMG_8827.jpeg IMG_8828.jpeg IMG_8857.jpeg IMG_8858.jpeg
IMG_8880.jpeg IMG_9651.jpeg IMG_9669.jpeg IMG_9671.jpeg
IMG_9672.jpeg IMG_9673.jpeg IMG_9674.jpeg IMG_9675.jpeg
IMG_9677.jpeg IMG_9678.jpeg IMG_9679.jpeg IMG_9696.jpeg
IMG_9697.jpeg gpage_2019.jpeg robot.jpeg

FRC 1339 (۲۰۱۴-۲۰۱۷)

IMG_9629.jpeg IMG_9630.jpeg

تصاویر تصادفی دیگر

IMG_8825.jpeg IMG_8826.jpeg IMG_8852.jpeg IMG_8853.jpeg
IMG_8980.jpeg IMG_8981.jpeg IMG_9002.jpeg IMG_9003.jpeg
IMG_9043.jpeg mines_logo.png