AIラジコンカーで障害物を回避させる



# 目次 
1. [はじめに](#1-はじめに) 
2. [AI学習の環境構築について](#2-AI学習の環境構築について ) 
   - [2.1 ハードウェア](#21-ハードウェア)
   - [2.2 ソフトウェア](#22-ソフトウェア) 
3. [教師データ作成と機械学習](#3-教師データ作成と機械学習) 
   - [3.1 障害物なしで走行させる](#31-障害物なしで走行させる) 
   - [3.2 障害物を置いて回避させる](#32-障害物を置いて回避させる) 
4. [おわりに](#4-おわりに) 

# 1. はじめに 
　本記事では、名城大学目黒研究室で製作したAIラジコンカーについてまとめました(2024.4).今回の製作では以下のサイトの記事を参考にさせていただきました。ここからは統一して「参考記事」と書きます。
 
 http://ma2.la.coocan.jp/AI_Driver/tt02/ 
 
 説明を始める前に、まずは完成形の動画をご覧ください. 

<iframe width="560" height="315" src="https://www.youtube.com/embed/1z4PMsyuiQQ?si=khq8vbaatGurDRoX" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> 

機械学習を使ったラジコンで障害物を回避できるように学習させ、人間vsAIでタイムを競う走行会まで実施しました。 
良かったらぜひ、最後までご覧ください！！ 


# 2. AI学習の環境構築について 
　まず、今回の製作で使ったラジコンやマイコン、OSやドライバのバージョンについて説明します。学習させて走らせるまでにかなり時間がかかったので、苦労した点を中心にまとめました。 

## 2.1 ハードウェア 

　今回の製作で使用したハードウェアについて説明します。まず、完成品の外観写真です。 

![IMG_0204.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750253/7db4471d-4d07-b348-dfe2-ad1cb7016f73.jpeg) 

△AIラジコンカーの外観写真
  
- ラジコン...**TAMIYA XB/TT-02** 
- コントローラ...**TAMIYA ファインスペック 2.4G** 
- マイコン...**Raspberry Pi 4 モデルB** 
- カメラ...**ラズパイカメラV2** 
- ラズパイ拡張基板、アッパーデッキ、カメラマウント...**自作**（詳細は後述） 
- モバイルバッテリー...**汎用品**（ラズパイの電源） 

　ラジコンとコントローラの接続方法や組み立て等は[参考記事](http://ma2.la.coocan.jp/AI_Driver/tt02/)をご覧ください。ここでは、[参考記事](http://ma2.la.coocan.jp/AI_Driver/tt02/)には記載がない「自作」の部分の内容について補足します。カメラマウントの3Dデータは[参考記事](http://ma2.la.coocan.jp/AI_Driver/tt02/)からダウンロードできます。 

　まず、ラズパイの拡張基板についてです。主な機能としては、モード選択用のLEDとボタン、冷却ファンなどです。回路図については[参考記事](http://ma2.la.coocan.jp/AI_Driver/tt02/)に記載がありますが実体配線図や裏面の写真がないので今回の製作で作成したものを以下に掲載します。ポイントはラズパイカメラの配線と干渉しないように基板を加工することです。 

  ![Screenshot from 2024-06-07 13-24-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750253/e31ca56d-5a61-e2a1-ed54-9ea9c7574628.png) 

△ラズパイ拡張基板（左：表面、右：裏面） 

<img width=400 alt="haisenzu.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750253/a550c7c5-7209-5003-348f-6e5c0045a940.png"> 

△実体配線図 

　次に、アッパーデッキについてです。これはラジコンに対してラズパイやカメラを固定する土台です。穴の寸法や配置を示した図面はありませんが、固定さえできていれば問題ありません。今回製作したものを例として以下に写真を掲載します。 

<img width=400 alt="upperplate" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750253/0f75c15f-ed2f-14ab-534a-81b6ca5e3ba9.png"> 

△アッパーデッキ 
  

## 2.2 ソフトウェア 

　今回の製作のOSやドライバのバージョン等についてです。 
- ラズパイOS（デスクトップ版）...**Raspberry Pi OS(Legacy,64-bit)Full** 
- 学習を行ったPCのOS...**Ubuntu18.04** 
- ドライバのバージョン...**NVIDIA Driver ver.510.108,CUDA ver.11.6** 

　まずはじめに、ラズパイにOSをMicroSDにダウンロードするところから始めますが、このとき最新版(2024.4時点)の **「Bookworm」ではラズパイカメラV2が動きません！** 一つ前の型「Bullseye」の環境で動作するので注意してください。また、ラズパイカメラV3を使おうとすると、今回使用したOpenCVのvideocaptureとの相性が悪く、うまく動作してくれなかったので、諦めてV2を使うことにしました。参考になる記事がいくつかあったので、挑戦したい方はぜひ、V3使用に改良してみてください！ 

https://zenn.dev/ncdc/articles/dcc8f28bf54279 

　次に手動運転で取った教師データを学習させる環境について説明します。[参考記事](http://ma2.la.coocan.jp/AI_Driver/tt02/)では、Google Colaboratolyを使う方法と、UbuntuでCUDAを使う方法が提案されています。前者についてですが、Googleアカウントさえ持っていれば環境構築の必要がありません。しかし、誰でもブラウザ上で簡単に機械学習ができるというメリットがある一方で、無料版ではGPUのメモリ上限や学習の制限時間があります。ある程度のスペックのGPUが搭載されたPCをお持ちの方は後者の**CUDAを使った学習がおすすめ**です。

# 3. 教師データ作成と機械学習 

　ここからがメイントピックです！実際にコースを走らせて学習のもととなる教師データを集め、AIに渡して学習してもらいます。主な流れとしては、障害物を置かずにコースを周回できるようにデータを取り、安定した自動走行ができたら障害物を置いて学習させます。このとき、障害物を置く位置を変えたり、数を増やしたり、向きを変えたりと、様々な条件でデータを取り、教師データに蓄積することで、より柔軟な自動走行が実現できました。 

## 3.1 障害物なしで走行させる 

　まずは障害物を置かずにデータを取ります。[参考記事](http://ma2.la.coocan.jp/AI_Driver/tt02/)には手動運転モードでコースを10周程度させて..といった内容がありますが、実際にやってみて、**1つの条件につき最低でも20周分のデータは必要**だと感じました。何も置かずに手動運転で20周分のデータを記録し、学習させた結果がこちらです！

<iframe width="560" height="315" src="https://www.youtube.com/embed/uDmWEpuR_io?si=APhhJhItb9Sjow4c" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> 

　この通り、かなり安定していい走りを見せてくれました。教師データを取るときのコツとしては、できる限り車線からはみ出すことなく**正確に手動運転すること**です。また、自動運転の車両のスピードに関しては手動運転のときの速さに比例します。 
　また、教師データを記録するときの周囲の環境（椅子、机などの配置）と、**学習させて自動運転させるときの周囲の環境はできる限り近づけること**が重要です。今回の走行では大学の教室で机と椅子を移動してスペースを作って実施しましたが、教室が変わると自動走行できなくなる、人が映り込むとコースアウトするといった事象が見られました。

## 3.2 障害物を置いて回避させる 

　次に、コース内に障害物を置き、自動運転走行で回避できるように改良します。今回の製作では、障害物をダンボールに色紙を貼ったものを使用しました。今回のコースでは道が黒色、周辺が緑色だったので障害物であると認識しやすいように赤色の色紙を使用し、カメラに映る面だけに貼りました。また、カーブ中の障害物はカメラに写りにくく、回避が難しかったため、直線コース2箇所に限定しました。 
　障害物を置いての記録は全4条件で合計80周分のデータを記録しました。 

![IMG_0066.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750253/574e7c23-06d1-c188-3b04-d06f4a6a70c4.jpeg) 

　1つ目の条件では、上の写真のようにコース内2箇所に**片側車線を完全にふさぐ形で配置して、20周分のデータを記録**しました。このときの手動運転で意識したことは、基本的にセンターラインを走り、障害物の手前ギリギリで回り込むように運転しました。この辺からはスピードよりも正確性を意識して運転することも重要となってきます。 
　2つ目の条件では、1つ目の条件の配置の**反対車線にそれぞれ移して、20周分のデータを記録**しました。 
　3つ目の条件では、障害物を**進行方向に移動させて20周分記録**し、4つ目の条件では**その反対車線に移して20周分記録**しました。 
これで障害物ありのデータが80周分のデータが集まり、学習させて自動運転走行を実施した結果がこちらです！ 

<iframe width="560" height="315" src="https://www.youtube.com/embed/9o9q_uHtLpI?si=ZiCdLeCJG0KU5RHE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> 

　多くのデータを蓄積して学習した分、かなり柔軟な走行ができました。動画でご覧の通り、障害物を進行方向に移動させたり、車線を変えても上手に避けて走ってくてました。しかし、カーブから抜けてすぐの直線の位置に置くと、カメラ写ってから回避するまでの余裕がなく、衝突してしまいました。カメラをより広角なものに変えることで改善されるかもしれません。 

　最後に、走行会で勝負させるために障害物なしの20周分のデータとありの80周分のデータを合わせ、**100周分の最強データ**を作りました。これらの統合を行うことで、はじめに掲載した動画のように、障害物の有無に関係なく安定した自動運転走行ができました。 
 
# 4. おわりに 

　今回の製作ではハードウェアやソフトウェアはほぼ[参考記事](http://ma2.la.coocan.jp/AI_Driver/tt02/)のまま実施し、学習の条件や回数を中心に改良しました。AIとは言っても学習させるためのデータは人間が記録するわけで、自動走行についても記録した人の操縦そっくりになります。何百周も記録したおかげで中の人のラジコン運転技術の腕がかなり上がりました😅 

　大きな課題としては記録した周囲の環境と自動走行させるときの周囲の環境の違いでうまく走らなくなることです。コース中に壁を設けたり、カメラの角度を調節したり、画像処理のプログラムから変えるなど改善方法は様々だと思います。興味のある方はぜひやってみてください！ 

  

最後まで読んでいただき、ありがとうございました。 

　 

  

  

  

  

[ページの冒頭へ戻る](#目次)