2019 AgBotチャレンジ
イースト高校
コロラド州デンバーにあるイースト高校(2014年〜2018年)に通っていた頃、私は放課後の活動に非常に熱心に取り組んでおり、その中でも最も大きな影響を与えたのがロボットクラブのAngelBoticsでした。参加したのは高校2年生のときで、それまではサッカーに重点を置いていたためでした。クラブは主にFIRST Robotics Competition(FRC)に参加しており、機械工学や電気工学、そしてプログラミングを探究する機会を与えてくれました。AngelBoticsを通じて、CADツール、3Dプリンター、その他の工学機器の使い方を学び、大学生向けとされることの多いSTEMの概念に触れることができました。当初は量子物理学者になることを志していましたが、AP物理とロボティクスでの経験を通して、自分は物理がそれほど得意ではないと気づき、結果として機械工学の道から離れることになりました。
その代わりに、私はプログラミングに自分の居場所を見つけました。最初のRaspberry Pi向けにPythonコードを書いたことから始まり、APコンピュータサイエンスでのJavaプロジェクトを通じてその基盤が固まりました。試験では苦戦していたものの、先生のナゲル氏は私にソフトウェア開発を追求するよう励まし、テストの点数よりもプロジェクトの価値を強調してくれました。これがきっかけで、大学ではコンピュータサイエンスを専攻し、将来的にはソフトウェアエンジニア、そして最終的には創業者になるという夢を持つようになりました。
課題が多く、学習曲線も急だったため、私はAngelBoticsにはそれほど深く関わっていたわけではありませんでしたが、それでもロボティクスへの生涯続く情熱に火をつけてくれました。だからこそ大学に進学したとき、私は大学のロボットクラブに参加し、いつかロボティクスで現実世界の問題を解決する会社を立ち上げると決意していました。
マインズ大学
イースト高校を卒業した後、私はコロラド・スクール・オブ・マインズ(2018年〜2022年)でコンピュータサイエンスの学士課程を始めました。最初の学期の間に、私はマインズのロボットクラブを調べ、AgBotという新しいロボティクスグループを見つけました。
AgBotは、2019年 agBots Weed and Feed Competitionに出場するロボットを作ることを目標に結成された新しいロボットクラブでした。この競技には主に2つの課題がありました。
- 害虫と雑草の識別および除去
- ロボティクスを通じた新しい収穫方法の創出
私たちのチームは1つ目の課題に取り組むことを選びました。マインズがagBot競技に出場するのは初めてであり、マインズのロボットクラブが農業関連のことに取り組むのも初めてでした。そのため、全体としてとても新鮮に感じられました。
私はすぐにこのプロジェクトに惹かれました。私の家族はトルコで何世代にもわたって農家でしたが、それは父の世代まで続いていました。だからAgBotは、ロボティクスとプログラミングへの私の情熱と結びつきながら、どこか身近に感じられました。祖父母のような農家を助けるかもしれないロボットを作るというアイデアは、とても刺激的でした。
開発
AgBotチームの一員であったことは、私の大学時代の最も思い出深い経験のひとつです。それはまた、それまでの時点で私が取り組んできた中でも最も大変なことのひとつでした。このプロジェクトは、私がPython、Ubuntu、そしてROSに本格的に取り組んだ最初の機会でした。FRCではすべてJavaで行っていたので、これは私にとって完全に新しい領域でした。PythonとUbuntuは以前に使ったことがありましたが、ROSには触れたことがありませんでした。ROSの仕組みを学ぶのは困難でした。当時はPythonの環境が何なのかさえ知りませんでした。
私は、LiDARからのデータを、私が書いていたROSノードに使える形で送らせることに大半の時間を費やしました。私の担当は、end_detectorというROSノードを実装することで、LiDARデータを使ってロボットが作物列の端に到達したことを検知できるようにすることでした。今でこそ単純に聞こえますが、当時はとても大きな課題に感じられました。
LiDARを私のコードとやり取りさせるまで、デバッグに約2週間かかりました。コード全体はC++かPythonで書かれており、主にPythonでした。なので、この作業で私が書いたコードはPythonだけでした。それが動くようになってから、私はキャンパス内で見つけたランダムな植物の区画を使ってロジックのテストを始めました。LiDARを載せた台をそれらの前まで転がし、コードが端に到達したことを判断できるか確認していました。長時間の作業とデバッグの末、最終的には少なくとも私のテスト環境ではすべてを動かせるようになりました。しかし、すべてを組み合わせようとしたときは別の話でした。
私の時間の大半は、ハードウェアとソフトウェアを互いに通信させることに費やされました。列の端を検知する実際のロジックはその後でした。しかし、それは素晴らしい学習経験でした。私はROSをほとんど理解していない状態から、Jetsonボード上でライブのLiDARデータを使ってノードを作成し、デバッグできるようになりました。また、この時期に私は、主にJavaをプログラミング言語として選ぶ癖から、代わりにPythonを標準にするようになりました。そして2025年現在に至るまで、私は自分のプロジェクトや仕事関連のコードベースでJavaを本格的に使ったことはまだありません。
チームと技術スタック
私たちは、Nvidia Jetson TX2上でUbuntu 16.04、ROS Kinetic、Python 2.7を動かし、Hokuyo URG 04LX UG01 Lidarと接続していました。超音波距離センサーなどのセンサー入力用にArduinoも使っていました。私たちのコードは、認識、ナビゲーション、制御、散布を担当していました。リポジトリはこちらで見ることができます: GitHub Repo。私が書いた具体的なコードは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モーター、エンコーダー、モーターコントローラー、バッテリーなど
私たちのチームは大規模ではありませんでしたが、特に印象に残っている名前がいくつかあります。
Tylerはクラブのリーダーであり、創設者でした。当時も彼をとても尊敬していましたし、今でもそうです。Zacharyはクラブのソフトウェア開発のリーダーであり、ソフトウェア開発とROSについて多くのことを教えてくれました。そのことに私は今でも感謝しています。
他にもKevin BarnardやAmit Rotemのようなメンバーがいました。しかし、クラブが終わってからすでに5年以上が経っているため、残念ながら最初のメンバー全員の名前と連絡先は覚えていません。
ロボットの開発の大半は、週末や授業が終わった後の深夜に行われました。工学の学位取得とAgBotの両立は非常に負担が大きかったですが、私たちはなんとかやり遂げました。
旅と混乱
この経験全体の中で、決して忘れられないのがその旅そのものでした。競技会はインディアナ州ウェストラファイエットで開催され、パデュー大学のキャンパスの近くでした。そして、競技会はマインズでの期末試験週が終わった直後に行われたため、あの地獄のような1週間から回復する時間はありませんでした。
私たちはTylerのトラックを使って、ロボットと全ての工具を運びながらコロラド州ゴールデンからインディアナまで車で向かいました。面白いことに、私たちは文字通り競技会の1日前に出発しました。ロボット、工具、バッテリー、コンピューター、その他持っているものすべてを荷造りし、コロラド州ゴールデンからインディアナ州ウェストラファイエットまで運転しました。地図上では18時間の道のりです。ガソリン補給やトイレ休憩も含めると、実際には20〜22時間ほどかかりました。
Tylerがずっと運転していて、Coffee Monsterのドリンクでしのいでいました。別のチームメイト、名前を忘れてしまって申し訳ないのですが、写真には写っている彼女が、時々運転を交代してくれました。道中で大雨が降り始めました。私たちは、閉鎖されていた見知らぬガソリンスタンドに立ち寄り、ロボットを守るためにブルーシートを手に入れなければなりませんでした。雑で、混沌としていて、まさに大学ロボティクスでした。どうにかして、私たちはたどり着きました。
到着すると、私たちはフィールドにキャノピーを設置し、工具一式も広げました。私はコードの仕上げと実行に集中しました。競技の大半では、主にロボットのデバッグと動作改善に取り組みつつ、他のチームのかっこいいロボット構築も見て回っていました。
では、勝てたのか?
いいえ
振り返ってみると、私たちは自分たちの経験レベルをはるかに超えたものを作ろうとしていた、ただの若者の集まりでした。他のチームはまったく別のレベルにいました。スタートアップ出身のチームもあれば、研究室出身のチームもありました。完全な学術的支援を受けているところもありました。私たちは、PythonがLiDARデータを何か役立つものに変えてくれることを願いながら、徹夜を重ねる少人数の学部生チームでした。
私たちのロボットには欠陥がありました。雑でした。そして正直なところ、競技会に到着した時点でほとんど動いていませんでした。チームの多くの人は、時間内に完成しないかもしれないと気づいた時点で、次第に離脱し始めました。そもそも来なかった人もいました。期末試験は終わり、ロボットは準備できておらず、士気はかなり低かったのです。
でも、何人かは最後まで踏ん張りました。
私は諦めませんでした……Tylerも諦めませんでした……そして写真の人たちも、諦めませんでした!
勝てなかったし、完全に機能するロボットも持っていなかったけれど、この経験を何にも代えたくはありません。私はROS、ハードウェアのデバッグ、プレッシャーの中でシステムを構築することを学び、そして忠誠心についても学びました。物事を最後までやり遂げることがどれほど大切かを実感しました。
振り返り、2025年時点
2019年シーズンの後、AgBotは活動を終了しました。主な理由は、COVIDが約1年後に発生し、マインズのすべてのクラブが1〜2年間活動停止になったことでした。そして、世界が「普通」に戻り始めた頃には、私は卒業していました。
2025年になった今、AgBotを振り返ると、それは私にとってすべての始まりだったと思います。そこで私はロボティクスの初めての本当の経験を得て、技術チームと協働する方法を学びました。それは、私を素晴らしい機会へとつながる道へと導いてくれました。
それ以来、私はeBayでバックエンドエンジニアとして働き、データセンター全体にわたって数百万のメトリクスを取り込むサービスを展開してきました。AIによる自動化されたサイバーセキュリティのペネトレーションテストの構築に焦点を当てた最初のスタートアップを創業しました。Notify Cyberを立ち上げ、何万もの訪問者を獲得しました。Docker、Kubernetes、Postgres、そして高度なAIインフラ向けのソフトウェアも書いてきました。
しかし、AgBotは今でも私の人生で最高の経験の一つとして際立っています。混沌としていて、ストレスが多く、時には不可能に思えましたが、どんな授業やチュートリアルよりも多くのことを教えてくれました。完璧な計画がなくても、十分な資金がなくても、最高のハードウェアがなくても、それでも何かを作り、多くを学び、その過程で素晴らしい人たちに出会えるのだと学びました。
2019年のAgBotチームの皆さん、本当にありがとう。あの2019年のロードトリップ、閉まっていたガソリンスタンドで拾った防水シート、そして眠れない夜の数々、本当にありがとう。どれほど不可能に見えても、大きなプロジェクトを自信を持って追い求めるための粘り強さを、あなたたちは私に与えてくれました。
リソースとリンク
- コロラド鉱山学校ロボティクスクラブのメインウェブサイト
- AgBot 2019 コードベース
- パーデュー大学 AgBot 記事
- パーデュー大学 ビジュアル要約記事
- DTN Progressive Farmer 記事
- AgBot の Twitter/X アカウント
- AgBot の公式ウェブサイト
- ザックの GitHub
- ケビンの GitHub
- タイラーの GitHub
写真ギャラリー
マインのAgBotチーム、私たち
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
私たちのAgBotロボット
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
動画/GIF
競技フィールド
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
競技での他チーム
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
FRC 1339(2014-2017)
![]() |
![]() |
その他のランダム画像
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |































































