ロボットの自律走行コンテスト「つくばチャレンジ2024」完走したので実装内容を振り返る

はじめに

ロボットが遊歩道環境を2km程度走行する走行コンテストに個人サークル、週末組2024として参加し、完走&信号認識課題を達成したので、実装内容について共有します。
自己開発した部分はさほど多くなく、かつシンプルな実装となっているため、他の完走チームよりも学術的な新規性は低いかと思いますが、こんな簡単なやり方でも完走できるのか、という気づきになればと幸いです。

つくばチャレンジって何?と言う方は↓を参照してください。
tsukubachallenge.jp

ソースコード

今回走行に使用した全ソースコードは以下にアップロードしてあります。不明点があればコードを確認してください。これを使って環境構築すれば完走できるはず…。
github.com

ロボットの設計と構成

参加チームの多くが大学・もしくは企業で、外部から予算がついている中、我々は個人参加でロボットの費用もすべて持ち出しのため、できる限りシンプルに、最小のセンサ構成で完走を目指しました。
ベースとなるのは、T-frog Projectの iCart middle。これに、安価なLivox製のLidarとカメラを搭載し自律走行を実現しました。安価なといっても1つ10万円程度と、個人で買うには結構なお値段・・・。

作成したロボット このロボットにいくらかけたんだろう・・・苦笑

[Lidar構成]

  • 障害物回避用 : Top-URG(水平270度・測距距離60m)
  • 自己位置推定・地図生成用 : Livox製mid-360(水平360度スキャン)
  • (ベロダイン社製のVLP-16も搭載したが、今回は未使用)


[カメラ構成]

  • 信号認識用 : ロジクールC920n をロボット前方に設置

自律走行システムの構築

こちらもすべてのSWを自作していたのでは時間が足りないので、ROS1をベースとして可能な限り評判の良いOSSを活用し、走行に足りない部分のみ自作する方針で作業を行いました。

地図作成&ウェイポイントの生成

ロボットを自律走行させるために事前に自律ルートを走行し、環境の3次元地図とウェイポイントを同時生成しました。基本的にはMid-360のポイントクラウドデータをもとにFast-lioを使いて地図を生成し、地図生成を行う際の自己位置を用いてウェイポイントを同時に生成しています。

[地図作成の流れ]
複数回同じルートを走行し、それぞれのログを用いて以下のループを回し、一番破綻の少なく、かつパーティクルの広がりの少ない地図を本走行で使う地図に採用しました。

  1. センサのログデータを取得(複数回)
  2. fast-lioを用いて地図を生成
  3. 別のログデータを用いてmcl-3dlを用いて自己位置推定し、破綻がないか確認。走行中のパーティクルの広がりの平均値を地図の安定性の指標として記録

[ウェイポイントの設定]
ロボットの走行経路は上記の地図生成時の自己位置をもとに、以下の3種類のウェイポイントを自動選択するよう設定しました。特に指定がない限りは3mおき、もしくはロボットが50度以上回転した場合に通過型のウェイポイントを設定し、一時停止・信号のキーが押された場合にそれぞれのウェイポイントを設定することとしています。

  • 通過型:単なる経路上の通過点
  • 一時停止型:ユーザーの指示があるまで停止
  • 信号型:信号認識の結果により発進指示

自己位置推定

自己位置推定は、mcl_3dlを用い、fast-lioのLidarオドメトリを利用することで、ホイールオドメトリに頼らない構成にしました。ホイールオドメトリを使ってしまうと、落ち葉や障害物にかすってしまったときに車輪が空転し、そこで自己位置推定が破綻することがままありましたが、ライダーオドメトリを使用することで自己位置推定の安定性が大幅に向上しました。本走行でも、縁石に車輪を擦って空転したり、他のロボットと衝突したりと色々あった中でも自己位置が破綻せずに完走できたのは、LiDARオドメトリが1番効いていたと思っています。

経路計画

ウェイポイントをたどる経路計画は、昨年まではROS1のMoveitを使用していましたが、能動的に障害物を回避することにより想定していた経路を外れ、ロボットが走行不可能になることが多くありました。また、動作計画を行うアルゴリズムがブラックボックスのため、想定外の動作をした場合に原因が究明できない問題がありました。
そこで、今年度は経路計画の部分を自作し、シンプルにウェイポイントに対する距離と角度のPID制御とすることにより、ウェイポイントにスムーズに追従できるようにしました。このようにすることによって、想定外の障害物がない場合は確実に走行できますが、想定外の障害物があった場合には回避ができなくなります。そのため、次節のようにルールベースで障害物回避を行うような仕組みを構築しました。

障害物検知と回避行動

障害物や人、ロボットにぶつかってはいけないため、前方障害物に接近時(0.7m以内)には停止し、移動障害物なら停止して待機、静止障害物なら回避行動を実行(90度回頭+バイパス移動)といったルールを導入し、最低限の障害物回避機能を組み込みました。
静止障害物かどうかの判定には、gpt-4oのVLMを使用しており、ここは別の記事で詳細に記載しようと思います。

(追記)以下に障害物検知と回避行動判断の詳細をまとめました。
www.robotech-note.com

信号認識システムの開発

つくばチャレンジには、信号機を自動認識して停止、走行開始する選択課題があります。今回はこの選択課題にも取り組み、課題を達成しました。

画像合成による学習データ作成

物体検出AIによる信号認識には YOLOv5n を採用しました。問題は、学習データの確保です。通常は大量のデータをアノテーションする必要がありますが、アノテーションコストが大きいため、試走会で 実際の信号機を撮影し、赤・青・未点灯のフレームを抽出、そのうえで、背景画像に ランダム回転・縮小・変形した信号画像を合成 して60,000枚の学習データを作成し、学習させました。

学習&評価結果

学習結果と評価結果は以下の通りです。実際の試走会でも、信号機の認識精度は十分。人工データを用いた学習でも、実環境でのドメイン適応性は良好でした。

フレームワーク:YOLOv5(モデルはYOLOv5n)
GPU環境:Geforce GTX1080
学習時間:約20時間
mAP50(精度):0.995
推論時間:1フレーム110-140ms(約3Hzで認識可能)

まとめと今後の課題

おおざっぱではありますが、上記の方針でOSSを接続し、最低限の実装を行うことによって遊歩道環境2kmの自律走行を達成しました。もともと、OSSを組み合わせることで省エネでつくばチャレンジを完走することを目標にしていたため、目標が達成できて満足です。ここまで来るまでに5年かかりましたが・・・。
来年はより多くの選択課題の達成を目指して実装していきたいと思いますので、週末組2025を見かけたらぜひお声掛けください。