超音波センサ等で自動運転するミニカーの制御プログラム。 自動運転ミニカーバトルと出前授業等で活用。
python run.pyで走行!
プログラム名 | 説明 |
---|---|
run.py | 走行時のループ処理をするメインプログラム |
config.py | パラメータ用プログラム |
ultrasonic.py | 超音波測定用プログラム |
planner.py | 走行ロジック用プログラム |
motor.py | 操舵・モーター出力/調整用プログラム |
train_pytorch.py | 機械学習用プログラム |
Note
それぞれのプログラムは単独チェック等で活用 。 なるべく授業活用しやすい、変更しやすいコードを目指す。
Note
認知(超音波センサ)→判断(モードの選択/紹介)→操作(モーター出力)の順番で教える。 説明で退屈しないように体験を上手く活用する。
python ultrasonic.py
- 体験例
- 定規で距離を測り、測定値との比較をする
- 超音波センサの測定可能範囲(角度)を手をかざして調べる
- 超音波センサの数を変える
- サンプリングサイクルを変える
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で確認。
-
走行記録を視覚化してみよう(グラフ、画像、動画)
python graph.py
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"
T.B.D.
分類 | 名称 | 個数 | 概算コスト(円) | 説明 |
---|---|---|---|---|
コンピュータ | ラズパイ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スルーホール有 |
下記を実施したイメージはこちら
-
ライブラリ類をインストール
-
hostnameの変更
/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を使って書き込み。
または、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の講座をやるときに必要です。
cf. ラズパイでPyTorchを使い、画像を音声で教えてもらうよ
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' >>> exit()
-
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
-
oledディスプレイの設定
- rc.localがある場合
- rc.localがない場合
-
donkeycar(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
-