超音波センサ等で自動運転するミニカーの制御プログラム。
自動運転ミニカーバトルと出前授業等で活用。
python run.pyで走行!
プログラム名 | 説明 |
---|---|
run.py | 走行時のループ処理をするメインプログラム |
config.py | パラメータ用プログラム |
ultrasonic.py | 超音波測定用プログラム |
planner.py | 走行ロジック用プログラム |
motor.py | 操舵・モーター出力/調整用プログラム |
train_pytorch.py | 機械学習用プログラム |
Note
それぞれのプログラムは単独チェック等で活用 。 なるべく授業活用しやすい、変更しやすいコードを目指す。
Note
認知(超音波センサ)→判断(モードの選択/紹介)→操作(モーター出力)の順番で教える。
説明で退屈しないように体験を上手く活用する。
python ultrasonic.py
- 体験例
- 定規で距離を測り、測定値との比較をする
- 超音波センサの測定可能範囲(角度)を手をかざして調べる
- 超音波センサの数を変える
- サンプリングサイクルを変える
TODO:超音波センサの検知範囲の絵
Note
ここでは、モードの詳解とお手本で動きをみせるだけ。
config.pyを変更して保存。
# 判断モード選択
model_plan_list = ["GoStraight","Right_Left_3","Right_Left_3_Records","RightHand","RightHand_PID","LeftHand","LeftHand_PID","NN"]
mode_plan = "Right_Left_3"
PWMの数値を入れてEnterを押していく。
python motor.py
- ステアリングのPWMの値を探す。
- 真ん中、左最大、右最大
- アクセルのPWMの値を探す。
- ニュートラル(モータードライバーがピッピッピとなる), 前進の最大値、後進進の最大値
- config.pyにその値を保存する。
## ステアのPWM値
例
## ステアのPWM値
STEERING_CENTER_PWM = 370
STEERING_WIDTH_PWM = 80
STEERING_RIGHT_PWM = STEERING_CENTER_PWM + STEERING_WIDTH_PWM
STEERING_LEFT_PWM = STEERING_CENTER_PWM - STEERING_WIDTH_PWM
## アクセルのPWM値(motor.pyで調整した後値を入れる)
## モーターの回転音を聞き、音が変わらないところが最大/最小値とする
THROTTLE_STOPPED_PWM = 370
THROTTLE_FORWARD_PWM = 500
THROTTLE_REVERSE_PWM = 300
config.pyを変更して保存。
# 復帰モード選択
mode_recovery = "Stop"
recovery_time = 0.3 #総復帰時間
recovery_braking = 1 #ブレーキ回数、ブレーキにはReverseを利用
# モーター出力パラメータ (デューティー比:-100~100で設定)
# スロットル用
FORWARD_S = 40 #ストレートでの値, joy_accel1
FORWARD_C = 30 #カーブでのの値, joy_accel2
REVERSE = -100
config.pyを変更して保存。
mode_plan = "RightHand_PID"
#mode_plan = "LeftHand_PID"
## PIDパラメータ(PDまでを推奨)
K_P = 0.7 #0.7
K_I = 0.0 #0.0
K_D = 0.3 #0.3
- config.py内下記修正
# NNパラメータ
HAVE_NN = True
...
## 学習済みモデルのパス
model_dir = "models"
model_name = "model_20240709_record_20240624_023159.csv_epoch_30_uls_RrLH_FrLH_Fr_FrRH_RrRH.pth"
model_path = os.path.join(model_dir, model_name)
## モデルと学習のハイパーパラメータ設定
hidden_dim = 64 #(隠れ層のノード数)
num_hidden_layers = 3 #(隠れ層の数)
batch_size = 8
## モデルの種類
model_type = "categorical" #linear, categorical
# カテゴリの設定、カテゴリ数は揃える↓
num_categories = 3
# -100~100の範囲で小さな値→大きな値の順にする(しないとValueError: bins must increase monotonically.)
categories_Str = [RIGHT, NUTRAL, LEFT]
categories_Thr = [FORWARD_C, FORWARD_S, FORWARD_C] #Strに合わせて設定
...
- train_test_pytorch.pyで学習
python train_pytorch.py
- test_pytorch.pyで確認
python train_pytorch.py
model_type = "categorical"の場合、正解ラベルの正解率とconfusion matrix(混合行列)を表示。 下記の例では、1.0が予測されていない。
...
正解率_Str: 92 %
confusion matrix_Str:
Predicted 0.0 2.0 All
True
0.0 519 33 552
1.0 11 38 49
2.0 2 586 588
All 532 657 1189
planner.pyとrun.pyを各自変更
myparam_run.py内のパラメータを変更し、パラメータの変更による走行の変化を体験する
- 超音波センサの値を確認しよう(実測値のバラツキ)
➔recordsのフォルダとconfigの値変更し、マシンのラズパイ上plotterで確認。
TODO:プロッターの絵
- 走行記録を視覚化してみよう(グラフ、画像、動画)
python graph.py
TODO:グラフの軸修正
config.の値を変更。ローカルネットに接続
# FPV 下記のport番号
## fpvがONの時は画像保存なし
fpv = False #True
port = 8910
gyroセンサーを追加し、値を計測してみる。
python gyro.py
config.の値を変更。
# ジャイロを使った動的制御モード選択
HAVE_IMU = False #True
mode_dynamic_control = "GCounter" #"GCounter", "GVectoring"
*工事中
分類 | 名称 | 個数 | 概算コスト(円) | 説明 |
---|---|---|---|---|
コンピュータ | ラズパイ3B+ | 1 | ---- | 販売終了 |
コンピュータ | ラズパイ3A | - | 5000 | (代替) |
コンピュータ | ラズパイ4B | - | 10000 | (代替) |
SDカード | 配布時期による | 1 | ---- | 64GB以上、書き込み速度30MB/s以上推奨 |
距離センサ | 超音波距離センサー HC-SR04 | 5 | 1500 | データシート |
ジャイロ加速度センサ | BNO055使用 9軸センサーフュージョンモジュールキット | 任意 | 2500 | データシート |
カメラ | ラズベリー•パイ(Raspberry Pi)160°広角500MP | 任意 | 3000 | コース内特徴を捉えるため、広角推奨。 |
シャーシ | RCスターユニット 1/14 エアロ アバンテ | 1 | 6500 | 販売終了 |
モーター | シャーシに含む | 1 | ---- | |
コンピュータ用バッテリ | Anker PowerCore Fusion 5000 | 1 | 3600 | |
駆動用バッテリ | 単3電池 | 4 | 400 | |
モータドライバ | RC ESC 20A ブラシモーター | 1 | 1500 | |
サーボドライバ | PCA9685 16チャンネル 12-ビット PWM Servo モーター ドライバー | 1 | 1000 | |
コントローラー | Logicool G ゲームパッド コントローラー F710 | 1 | 4000 | |
締結部品 | 2mm六角スペーサ | 16 | 1000 | ラズパイマウント用 |
締結部品 | 2mm六角スペーサ | 6 | ↑ | サーボドライバ用 |
マウント | ラズパイ/バッテリマウント | 1 | 1000 | 材料費のみ換算 |
マウント | カメラマウント | 1 | 300 | 材料費のみ換算 |
マウント | 超音波センサマウント | 1 | 500 | 材料費のみ換算 |
ケーブル | ジャンパワイヤ メス-オス | 5 | 1000 | 超音波センサ用 |
ケーブル | ジャンパワイヤ メス-メス | 1 | 1000 | サーボドライバ用 |
togikai基盤 | サーボドライバ代替 | 任意 | --- | HC-SR04*8個接続用ジャンパピン・ PCA9685 2ch・OLED・ファン電源搭載、秋月BNO055モジュール追加搭載用I2Cスルーホール有 |
TODO: 情報入れる
TODO: 情報入れる
*下記を実施したイメージはこちら 3GB程の要領で、ダウンロードする際にGoogleDriveから警告がある。
/etc/hostsと/etc/hostnameをそれぞれ下記に変更し、マシン配布時にはtogikaiの後に番号xxを付ける
donkeypi➔togikaixx
- デスクトップ環境のインストール(お好みで)
- guiのインストール
sudo apt install -y xserver-xorg raspberrypi-ui-mods
raspi-config
「1.System Options」>>「S5 Boot / Auto Login」>>「B4 Desktop Autologin」で設定。
- ブラウザのインストール
sudo apt install firefox-esr
- 日本語入力環境のインストール
$ sudo apt purge fcitx fcitx-mozc
$ sudo apt autopurge
$ sudo apt update
$ sudo apt install ibus-mozc -y
- Thonny(エディター)のインストール
$ sudo apt install thonny
VScodeはラズパイから直接使うには重かった...
-
利用するOSは2021-01-11-raspios-buster-i386.iso
donkeycar 4.4.0を利用しやくするため、busterを採用。 -
Win32diskimagerを使って書き込み。 https://sourceforge.net/projects/win32diskimager/
または、Raspberry Pi Imagerを使ってSDカードへ書き込み
-
togikaidriveをgit cloneする
git clone https://github.com/autonomous-minicar-battle/togikaidrive.git
-
パスワードなしSSHログイン:参考
-
wifiの設定ファイル設置と暗号化:参考
- 過去wifi設定ミスっているやつでつながらない場合: 参考
-
メモリが少ないのでswapを増やす: 参考
-
デフォルトでPython3系の利用
busterのpythonはデフォルトではpython2系になっているので、python3を利用する。ついでにpip3をpipにしておく。$ cd /usr/bin $ sudo unlink python $ sudo ln -s python3 python $ sudo ln -s pip3 pip
-
VNC リモートPCからマシン(ラズパイ)を操作するために活用:参考
-
VNCビューアーをPCにインストール
-
ラズパイでVNCサーバーを設定
- スタートメニューから、「設定 -> Raspberry Piの設定」をクリックします。
- 設定ツールが起動するので、上部タブから「インターフェイス」を選択し、VNCの項目を有効にして、「OK」をクリックします。
- ラズパイのIP address、またはホスト名を入れて接続
-
その他
-
イメージの書き出し手順 参考
-
Win32 Disk Imager でラズパイのSDカードからイメージを作成 GoogleDriveとの兼ね合いのため、改良版を使うことをオススメします。
-
Pishrinkを使ってイメージファイルを圧縮。 書きだしたイメージはSDカードのサイズと同じで大きな容量になってしまうのと、 新しく書き込むSDカードが元のイメージより小さい(同じでもたまに失敗)場合書き込めないため、拡張がされるように圧縮します。 *Linuxが必要なため、WindowsPCの人はWSLを利用。
-
圧縮されたイメージファイルをbalenaEtcherやRaspberry Pi Imagerで新しいSDカードに焼く。
-
-
sudo apt install python3-opencv
-
pip install Flask
-
Pytorch ビルドからやると大変(でした)なので、先人のをありがたく使います。NNの講座をやるときに必要です。
参考:https://zenn.dev/kotaproj/articles/c10c5cb3a03c52
sudo apt update sudo apt upgrade sudo apt install libopenblas-dev libblas-dev m4 cmake cython python3-dev python3-yaml python3-setuptools sudo apt install libatlas-base-dev git clone https://github.com/Kashu7100/pytorch-armv7l.git cd pytorch-armv7l-main pip install torch-1.7.0a0-cp37-cp37m-linux_armv7l.whl pip install torchvision-0.8.0a0+45f960c-cp37-cp37m-linux_armv7l.whl
git clone出来ないことがあるがその場合は直接ダウンロードしてから、pip installを実施する。
エラーがないことを確認
$ python >>> import torch >>> import torchvision >>> torch.__version__ '1.7.0a0+e85d494' >>> torchvision.__version__ '0.8.0a0+45f960c'
-
matplot グラフ作成用ライブラリ
pip install matplotlib
-
Adafruit_PCA9685 モーターを動かすのに使います。
pip install Adafruit_PCA9685
-
pygame コントローラーを使うときに使います。
sudo apt install lightdm libsdl2-2.0-0 pip install pygame
-
ジャイロに挑戦する方はインストール たくさん種類があります。
- BNO055使用 9軸センサーフュージョンモジュールキット、togikai基盤にそのまま乗ります。
参考
sudo nano /etc/modules
下記を追記
i2c-bcm2708
i2c-devモジュールとプログラムをインストール
sudo apt-get install python-smbus sudo apt-get install i2c-tools git clone https://github.com/ghirlekar/bno055-python-i2c.git
i2cの接続確認テスト
sudo i2cdetect -y 1
サンプルプログラムの実行
cd bno055-python-i2c python BNO055.py
- BNO055使用 9軸センサーフュージョンモジュールキット、togikai基盤にそのまま乗ります。
-
oledディスプレイの設定
-
OSSのdonkeycar(ver. 4.4.0)を使う
TODO: 講座スライドを入れる
-
環境設定(制限部門配布マシンにはラズパイ版ver. 4.4.0がインストール済み) 公式ドキュメント
- 依存環境セットアップ
sudo apt-get install build-essential python3 python3-dev python3-pip python3-virtualenv python3-numpy python3-picamera python3-pandas python3-rpi.gpio i2c-tools avahi-utils joystick libopenjp2-7-dev libtiff5-dev gfortran libatlas-base-dev libopenblas-dev libhdf5-serial-dev libgeos-dev git ntp
- 仮想環境セットアップ
python3 -m virtualenv -p python3 env --system-site-packages echo "source ~/env/bin/activate" >> ~/.bashrc source ~/.bashrc
- プロジェクトをまとめるフォルダ作成し、移動
mkdir projects cd projects
- gitでdonkeycarプロジェクトを取ってくる
git clone https://github.com/autorope/donkeycar cd donkeycar git fetch --all --tags -f git checkout 4.4.0 pip install -e .[pi] pip install https://github.com/lhelontra/tensorflow-on-arm/releases/download/v2.2.0/tensorflow-2.2.0-cp37-none-linux_armv7l.whl
- コマンドを打って確認、下記のような表示とエラーが出なければOK
donkey ________ ______ _________ ___ __ \_______________ /___________ __ __ ____/_____ ________ __ / / / __ \_ __ \_ //_/ _ \_ / / / _ / _ __ `/_ ___/ _ /_/ // /_/ / / / / ,< / __/ /_/ / / /___ / /_/ /_ / /_____/ \____//_/ /_//_/|_| \___/_\__, / \____/ \__,_/ /_/ /____/ using donkey v4.4.0 ... Usage: The available commands are: ['createcar', 'findcar', 'calibrate', 'tubclean', 'tubplot', 'tubhist', 'makemovie', 'createjs', 'cnnactivations', 'update', 'train', 'models', 'ui']
-
学習
-
学習環境
ローカルPC クラウド 導入コスト ✖ PC購入 ○ ランニングコスト ○ ✖ ネットワーク費用 データ転送 ○ ✖ インターネットへの転送時間 学習速度 ▲PCによる ▲インスタンスによる 所要時間 ○ ✖ 総評:練習時間やレースまでの準備時間が限られていること、継続的なAIやプログラミングの学習をするのであれば、PCを準備することをお勧めします。
[!NOTE] Donkeycarはデフォルトでは小さなモデルを利用していますので、比較的ライトGPU付PCで学習可能です。ローカルPCは筆者経験上MX230以上の搭載ノートPC、例えばInspiron 5491等であれば問題なく学習やコース現場での作業ができます。勿論大きなモデルの学習やCAD等の他の用途があればそれ以上の高性能PCを準備できれば尚良いです。
-
ローカルPCで学習する場合 下記URLを参考に環境をセットアップし、学習をしてください。 https://docs.donkeycar.com/guide/install_software/#step-1-install-software-on-host-pc
-
クラウドで学習する場合 下記を参考に4.4.0をGoogle Colab上で学習します。ノートブックはtogikaidrive内にも保存されていますので、ご自身のDriveにアップロードし、 https://faboplatform.github.io/DonkeyDocs/7.SD%E3%82%AB%E3%83%BC%E3%83%89%E4%BD%9C%E6%88%90/02.donkey4/
-
-
Donkeycarの改造
-
超音波センサを追加して自動復帰ロジックを組み込む
TODO: 講座スライドを入れる
-
IMUで周回検知して走行モデルを切替える
TODO: 講座スライドを入れる
-
-