Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Donkey Carの作り方

Tasuku Hori
September 20, 2018

Donkey Carの作り方

EVF2018発表資料。

Tasuku Hori

September 20, 2018
Tweet

More Decks by Tasuku Hori

Other Decks in How-to & DIY

Transcript

  1. Donkey Car とは • 自動運転のプラットフォーム • ソフトウェアはOSS • 前提:周回コース •

    市販のRCカーベース • Amazonで買える標準RCカー(Exceed)あり • 腕に覚えありの人は標準RC以外の自作も可能 • 誰でも かつ 安く • Raspberry Pi を搭載 • Python/TensorFlowを搭載 • Donkey Car提供イメージはSSH経由で操作 SSH 自動運転 開始 自動運転 終了
  2. Donkey Car 構成 Raspberry Pi 3B/3B+/Zero スロットル モータ RCカー用 バッテリ

    スピード コントローラ (ECS) ステアリング サーボモータ PWM サーボドライバ Raspberry Pi用 バッテリ RaspberryPi用 カメラモジュール Exceedという RCカー製品本体を そのまま使用 Donkey Carとして 拡張した部分 フレームは3Dプリ ンタがあれば誰で も形成可能(通販 での入手も可能) RCの受信機(RX)を 取り外してDonkey Carモジュールを乗 せている
  3. 車を作らずに自動運転を試したい • Donkey Simulator • Unityのグラフィックと物理エンジンを使って仮想的なコースと車両を 提供 • ランダムにコースを作成 •

    独自で学習したモデルをシミュレータ上のコースで仮想的に走行が可 能 • 走行データをイメージ&レコードファイル化可能 • シミュレータで学習データを作成できる
  4. Donkey Carの入手 • 標準Donkey Carを作る • 個々の部品を入手し、組み立てる • 米国国内在住の場合は、これが最安値 •

    キットを購入し、組み立てる • 日本からの場合は香港のRobocar shop経由が最短入手ルート • 独自Donkey Carを作る • 標準Donkey Carを作成したことのある人向け • Donkey Carサイトや独自ハッキングにより、新規プラットフォームで動 かす
  5. Robocar Store • 香港にあるコミュニティが主催している販売サイト • RCカーやRaspberry Pi含むフルキットの購入が可能 • Pay Pal

    / カード決済 • 日本では標準Donkey Car用のベースRCカーが購入困難 • タミヤTT-01は購入可能だが、サイトでは「上級者向き」とある • 実際に購入したときの価格 費目 価格 備考 Donkey Car Starter Kit HK$ 2,180.00- Pay Pal支払い Shipping(約1週間) HK$ 918.78- Pay Pal支払い 税関料(日本側) 1,500円 受け取り時支払い
  6. Donkey Car Starter Kit v2.1部品リスト1 Part Description Quantity HSP 94186

    Remote Controlled Car 1 NIMH Battery (7.2V 1100mHA) 1 NIMH Battery Charger (香港仕様ソケット) 1 Raspberry Pi 3B 1 3D Printed Roll Cage 1 Laser cut Base Plate 1 Wide Angle Camera 1 Camera Cable 1 Female-Female Jumper Wire 4 16GB Micro SD Card 1 SD Card Adapter 1
  7. Donkey Car Starter Kit v2.1部品リスト2 Part Description Quantity 16-Channel Servo

    Driver PCA9685 1 DC-DC 5V/2A Voltage Converter 1 Mini Tamiya splitter 1 USB Cable 1 M2.5 Hexagon Copper Standoff Spacer 12 M3x12mm PT Screws (プレートとケージの固定用) 3 M2.5 nuts 12 M2.5x5mm Screws 10 M1.8x6mm PT Screws (カメラ固定用) 1
  8. 追加した部品 追加部品 実際に購入した商品 備考 M2.5スクリュー&ナット 十字穴付き ボルト セット ステンレス マ

    シンネジ 修理ツール ナット ロックワッ シャ 平ワッシャー 収纳ケース付き 400本 入り M2 M2.5 M3 M4 M5 キット同梱品のみだと全部の穴 を締める事ができない。 M2.5 ワッシャ 推奨、キットに入っていなかった。 海外コンセント変換ア ダプタ コンセント変換アダプタBF,SE,C,B3,O,B 日本国内で同型バッテリが入手 できないため、アダプタを購入 して同梱バッテリを活用するしか ない。 • ニッパ • ワイヤストリッパ • ラジオペンチ • プラスドライバ(小、極小) • マイナスドライバ(小、極小) • マスキングテープ • プラスチックを削るヤスリ • WiFiルータ(インターネット接続) • PC • スマートフォン • USBマウス • USBキーボード • USB micro-B ケーブル • 5V ACアダプタ ※灰色部は推奨 BFタイプ
  9. バッテリの種類 種類 説明 Ni-Cd いわゆるニッカドバッテリ。使い切らず充電すると性能が落ちる。ディスチャージャ(放電 器)を使って放電させてから充電が推奨されている。 Ni-MH ニッケル水素バッテリ。Ni-Cdより容量が大きくパワーもあり、値段が手頃。ただし自然放電 が大きいため長時間放置すると再充電不可になることも。上級者向け。 Li-Fe

    リチウムフェライトバッテリ、やや高価だが軽量で初心者向き。自然放電がほとんどなく、 スマホのような使い方が可能。逆に過放電・過充電に弱い。 Li-Po リチウムポリマバッテリ、扱いがとても難しく、充電方法を間違えると発火したり、放置す ると膨張して使えなくなる。が、軽量、大容量、ハイパワー。上級者向け。 バッテリ種類が同じでも、コネクタの種類が違うと、 コネクタの加工や変換コネクタ(殆ど無い)が 必要になる。 赤破線内が同梱のバッテリ。 このタイプのコネクタは国 内で殆ど見かけない。 同梱品 7.2V 1100mAh Tamiya Connector Tamiya mini Connector
  10. HOBBYWING QuickRUN WP-1625 Brushed • Donkey Car Starter Kit 2.1

    同梱のESC • ブラシ付きモータ専用 • 電源スイッチ付き • Ni-MHもしくはLi-Po(2~3C)バッテリに対応 • 要ジャンパピンで設定変更 Ni-Mh、Li-Po以外のバッテリを使用する場合は、ECSおよびスロッ トルモータも合わせて交換すること
  11. バッテリを充電する • バッテリチャージャをバッテリにつなぎ、ACコンセントを挿す • 海外変換プラグを使って日本国内コンセントへ接続する • 充電している間に次の作業を行う • PCはWiFiルータへ接続しておく 赤破線枠内が同梱品。上

    はタミヤ純正バッテリ、 コネクタサイズも異なる。 同梱品のACアダプタは 香港のコンセント型(BF タイプ)だが、対応電圧 が100~240Vなので複数 の国で運用可能な仕様 になっている
  12. SDカードにイメージを焼く • Robocar shopより購入したフルキットには書き込み済みSCカードが同 梱されている • 自前で作成する場合は、Raspberry Pi用OSイメージをSDカードに書き 込む •

    OSイメージはDonkey Car サイトからダウンロード可能 • 要PC/SDカードリーダ • 書き込む際にはWin32DiskImagerなどのツールが必要 • WiFiルータ設定ファイルを作成し、SDカードへ保存 • wpa_supplicant.conf という名前でSDカードへ保存 • Raspberry Pi初回起動時にWiFi設定として自動で取り込まれる country=US ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="<your network name>" psk="<your password>" } ※以下の設定でファイルを作成する • 文字コード:UTF-8 • 改行コード:LF
  13. Raspberry Piのセットアップ • Raspberry PiにSDカードを挿す • microBポートとPCをUSBケーブルで接続→起動開始 • ssh接続(pi/raspberry) •

    キーボード、モニタを接続すればコンソール編集可能 • USキー配列となるので注意 • ホスト名を変更する(複数台orレース出走の可能性がある場合) • /etc/hostname, /etc/hosts をsudo vi で編集しsudo reboot • Raspberry PiのIPアドレスを調べる • ifconfig wlan0 注意:Starter Kit同梱SDカードの初期パスワードは”asdfasdf”
  14. donkeycarセットアップ • Raspberry Piにdonkeycarをインストール • pip install donkeycar[pi] • python

    -c “import donkeycar sa dk; print(dk.__version__)” • donkeycarパッケージのバージョン番号が表示される • ドライブスクリプトを生成 • donkey createcar --template donkeycar2 --path ~/mycar • cat ~/mycar/config.py を実行しPCA9685のチャネル番号を確認 • STEERING_CHANNEL (1前提で以後解説) • THROTTLE_CHANNEL (0前提で以後解説) • SDカード全体を使用する場合は、sudo raspi-config で拡張 • 7 → A1 → OK → Finish • 終わったら sudo shutdown -h now Donkey Carドキュメントに誤りあり。
  15. 結線する • RCカーのカバーを外しケーブルを束ねる結束バンドを切る • ベースボードに銅スペーサをつける • ECSスイッチOFF • ジャンパをNiMhに設定 •

    バッテリをチャージャから取り外す • 結線図に従って結線する • カメラーケーブルの向きに注意 • DCDCコンバータの赤黒位置に注意 • ECS-サーボドライバのケーブルは穴を通す • バッテリのコネクタはのこしておく • ベースプレートに各ボードを固定する • 追加部品を買ってないとここでネジが不足する
  16. ケージの取り付け • ケージの前足にM2.5M3ナットを埋め込む • 下の穴からネジが通るように • ここが最大の難所 • 前足2箇所のみ、後ろ足は不要 •

    ケージにカメラを組み付ける • ケージをベースボードへ組み付ける • ベースボードと本体を取外し可能なピンでとめる 注意:キット内にM3ナットは同梱されていない
  17. PC(ホスト)側セットアップ • Anaconda python3.6 64bit/Git 64bitをインストール • Anaconda Consoleを起動 •

    プロジェクトディレクトリを作成 • mkdir ~/projects • cd ~/projects • Git cloneする • git clone -b master https://github.com/wroscoe/donkey • cd donkey • Anaconda環境構築 • conda env create -f install/envs/windows.yml • activate donkey Issue279よりmasterブラン チを指定しないと動かない。 Donkey Carドキュメントに誤りあり。
  18. ホスト側プロジェクトディレクトリの用意 • 関連パッケージをインストール • pip install -e . • GPU装備の場合は、pip

    install -e .[tf_gpu] • プロジェクトディレクトリを作成しテンプレートを格納 • donkey createcar --template donkey2 --path ~/mycar Donkey Carドキュメントに誤りあり。
  19. キャリブレーション • Donkey Carのシャーシの下に四角い台を置く(亀の子状態) • 駆動輪が浮いている状態にする • 操舵輪が左右動ける状態にする • Donkey

    Carの電源ケーブルを結線し、ECSスイッチON • ホスト側からRaspberry Pi へssh接続 • スロットル(ch0)のキャリブレーション • donkey calibrate --channel 0 • アングル(ch1)のキャリブレーション • donkey calibrate --channel 1 • 結果を nano ~/mycar/config.py に反映
  20. ステアリングのキャリブレーション • Raspberry Pi上で次のコマンドを実行 • donkey calibrate --channel 0 •

    370と入力して操舵輪が直進位置になることを確認する • 動作しない場合は400、300と値を変える • 基準値が決まったら +/- 10 しながらフルに左右の状態の値を 調べる • ~/mycar/config.py を編集して以下の値を変更する • STEERING_RIGHT_PWM フルに右へ動かしたときの値 • STEERING_LEFT_PWM フルに左へ動かしたときの値
  21. スロットルのキャリブレーション • Raspberry Pi上で次のコマンドを実行 • donkey calibrate --channel 0 •

    360と入力して駆動輪が停止状態になることを確認する • 停止しない場合は400、300と値を変える • 同様に400と入力し直進値を確定する • 同様に310と入力して逆進値を確定する • ~/mycar/config.py を編集して以下の値を変更する • THROTTLE_FORWARD_PWM 直進時の値 • THROTTLE_STOPPED_PWM 停止時の値 • THROTTLE_REVERSE_PWM 逆進時の値
  22. コース設営 • 周回コースを推奨 • 非周回コースもできなくはない • 起点・終点の目印が要る、長さもまちまちなので難易度が高い • 地面は灰色~黒色を推奨 •

    両端は白線、中央線は黄色の破線を推奨 • ともにSimulatorにもあるため • ビニールケーブルを貼るだけなので作りやすい • 実際の道路はコンプライアンス的にもサイズ的にもNG • 事故は自己責任、自動運転の場合はラジコン保険も効きません
  23. 手動運転開始 • コースを用意 • Donkey Carの電源ケーブルを結線し、ECSスイッチON • ホスト側からRaspberry Pi へssh接続

    • Rasberry Pi上で cd ~/mycar && python manage.py drive • スマホを同じWiFiルータに接続 • 携帯を横に持ち、ニュートラルにしたい位置にする • 位置を変えずに以下のURLをブラウザで開く • http://<Raspberry PiのIP>:8887
  24. パーツ • 運転ループ上に追加可能なPythonクラスオブジェクト • Vehicle.start() により追加順にパーツクラスのrun()が呼び出される • 既存パーツはdonkeycarパッケージ内を参照のこと • 独自パーツ作成可能

    • 以下のメソッドを実装する • run(self, x) • パーツを実行するために使用される関数 • 別スレッド実行可能なパーツ(Theaded Part)クラスの場合、さらに以下のメ ソッドを実装する • update(self) • スレッド関数 • run_threaded(self, x) • 直近の値をすばやく返す • shutdown(self)
  25. LocalWebController • 手動運転ツール、運転データを記録可能 • 自動運転用NNの学習コーパスを採取する • Control Mode • Device

    Tilt スマホを傾けて動かす • その他は事前デバイス設定や実行オプションが必要 • Max Throttle:最大スロットルの設定 • Throttle Mode:手動範囲を指定 • User(すべて手動)、Local Angle(操舵のみ手動)、Local Throttle & Angle (すべてAI) • スマホは傾き、PCはキーボードで操作 • ジョイスティック使用時はmanage.py実行時に--jsを指定 • Web UI操作の詳細はこちらを参照のこと
  26. tubデータ • donkeyコマンド/donkeycar Pythonパッケージで取り扱うデータ 形式 • イメージ • 120 x

    160 RGB • ファイル名: <連番>_cam-image_array_.jpg • レコード • JSON形式 • 対応するイメージファイル名→ “cam/image_array” • スロットルPWM値→ “user/throttle” • ステアリングPWM値 → “user/angle” • ユーザモード → “user/mode” • ファイル名: record_<連番>.json • 12分間走行データで約64MB(モデルデータ化すると3.2MB)
  27. 学習用データのコピー • トレーニング処理はRaspberry Piでは遅くて実行不可能 • 学習用データをトレーニング実行機(ホスト側のPC)へコピー • rsync や WinSCPなどを利用

    • ホスト上からrsync実行例) rsync -r pi@<Raspberry PiのIPアドレス>:~/mycar/models/ ~/mycar/models/ • コピー元 • Raspberry Pi上の ~/mycar/data/ • コピー先 • PC上の~/mycar/data/
  28. 学習済みモデルデータのコピー • ホスト側(PC)の学習済みモデルファイルを、Raspberry Pi上へ コピーする • rsync や WinSCPなどを利用 •

    ホスト上からrsync実行例) rsync -r ~/mycar/models/ pi@<Raspberry PiのIPアドレス >:~/mycar/models/ • コピー元(PC) • ~/mycar/models/mypilot • コピー先(Raspberry Pi) • ~/mycar/models/mypilot
  29. 自動運転の開始 • Donkey Car本体をコースに配置 • バッテリを接続し、ECSのスイッチON • ホスト側PC上からssh接続 • 以下のコマンドを実行

    • cd ~/mycar • python manage.py --model ~/mycar/models/mypilot • Donkey Simulator上で自動運転させる場合 • donkey sim --model ~/mycar/models/mypilot • Generated Road Sceneでランダムにコースを選択
  30. Donkey Car Starter Kit 2.1 H/W構成 Raspberry Pi 3B 電動ブラシ付

    モータ (前後進) 駆動用バッテリ 7.2V 1100mMH (NiMh) HOBBYWING QuickRUN-WP- 1625-Brushed サーボ モータ (操舵) PCA9685搭載16ch サーボドライバ ワイドアングル RaspberryPi カメラ Exceedという RCカー製品本体を そのまま使用 Donkey Carとして 拡張した部分 香港Robocarストア にて通販されている フルキットの構成 Donkeyイメージ v2.5.1 DC-DC 5V/1A コンバータ
  31. Donkey Car Starter Kit 2.1 結線図 電動ブラシ付 モータ (前後進) HOBBYWING

    QuickRUN-WP- 1625-Bruched 電源スイッチ HSP製バッテリ 7.2V1100mAH (-) (+) DC-DC 5V/2A 電圧コンバータ U S B Raspberry Pi 3B + Donkey イメージv2.5.0 T y p e B サーボ モータ (操舵) PCA9685搭載16ch サーボドライバ ch0 ch1 (白) (白) (GND) (GND) (SCL) (SDA) (VCC) (3.3V) (抵抗付きGPIO2) (抵抗付きGPIO1) (白) (給電) ワイドアングル Raspberry Pi カメラ (帯状ケーブル) (via SSH/WiFi) (ジャンパ:NiMh)
  32. 実際の配線例 カメラケーブル はひねった状態 で接続する miniUSBを Raspberry Pi側に、 USBをDCDCコンバー タ側に接続 通電時は供給電圧

    が表示される バッテリ側赤がプラス、 黒がマイナス プラスドライバで挟 み込む サーボ系2本はこ の穴から結線する すべて内側 のGPIOピン カメラコネクタは プラスチックの枠を 上下に動かす SDカードは裏から 抜き差しする
  33. donkey コマンド リファレンス(1/2) donkeyの第1引数 概要 createcar 新規のDonkey Carのためのディレクトリを作成する。テンプレートには donkey2(KerasLinear)、square(KerasCategorical)がある。 例)

    donkey cratecar --template donkey2 ~/mycar findcar nmapコマンド(Windowsでは使えない)を使って同一LAN上にあるDonkey Carを発 見する。 例) sudo apt install nmap && donkey findcar calibrate Donkey Carの調整を行う際に使用する。 例) donkey calibrate --channel 0 tubclean tub内の悪いデータを削除するためのWebサーバをオープン。 例) donkey tubclean ~/mycar/data tubhist 指定されたtub内のレコード値のヒストグラムを示すポップアップを表示する。 例) donkey tubhist ~/mycar/data tubplot トレーニング済みモデルからの予測値と実測値を描画する。 例) donkey tubplot ~/mycar/data
  34. donkey コマンド リファレンス(2/2) donkeyの第1引数 概要 tubcheck (任意/すべて)のtub内にいくつのレコードが含まれているか確認する。 例) donkey tubcheck

    ~/mycar/data makemovie (要ffmpeg)tub内のイメージファイルから動画を作成する。 例) donkey makemovie ~/mycar/data --out=my_movie.mp4 sim Donkey Simulator用のシミュレータサーバを起動する 例) donkey sim --model=~/mycar/models/mypilot consync (要rsync、要その他設定)ロボットからホストへファイルをコピーする 例) donkey consync --dir=~/mycar/data --delete=n contrain 各エポックの終わりに新規データを調べモデルのトレーニングに適用する。 例) donkey contrain --tab=~/mycar/data -- model=~/mycar/models/mypilot createjs ジョイスティックを使う場合の手順をウィザード表示する。 例) donkey createjs
  35. output: (None, 27, 37, 32) KerasLinear モデル構造 C o n

    v o l i t i o n 2 D C o n v o l i t i o n 2 D C o n v o l i t i o n 2 D C o n v o l i t i o n 2 D C o n v o l i t i o n 2 D F l a t t e n input: (None, 120, 160, 3) output: (None, 120, 160, 3) output: (None, 58, 78, 24) input: (None, 58, 78, 24) input: (None, 120, 160, 3) output: (None, 5, 8, 64) output: (None, 12, 17, 64) input: (None, 12, 17, 64) input: (None, 27, 37, 32) input: (None, 3, 6, 64) input: (None, 5, 8, 64) output: (None, 1152) output: (None, 3, 6, 64) D e n s e D r o p o u t input: (None, 100) input: (None, 1152) output: (None, 100) output: (None, 100) D e n s e D r o p o u t input: (None, 50) input: (None, 100) output: (None, 50) output: (None, 50) D e n s e input: (None, 50) output: (None, 15) D e n s e input: (None, 50) output: (None, 1) スロットル ステアリング
  36. 《vehicle》 Vehicle 《clock》 Timestamp 《actuator》 PCA9685 (Ch.1) python manage.py drive

    の構造 《camera》 PiCamera 《controller》 LocalWeb Controller 《transform》 Lambda (pilot_condition) 《keras》 KerasLinear 《transform》 Lambda (drive_mode) 《actuator》 PWMSteering 《actuator》 PCA9685 (Ch.0) 《actuator》 PWMThrottle 《datastore》 TubWriter 運転ループ(無限ループ) ループ開始 ループ終了 学習済チェックポイント tubファイル HTTP:8887 manage.py [[drive]] Python donkeycar パッケージ パーツ
  37. ハードウェア カメラ・ESC・インターネット通信など 基本アーキテクチャ 《vehicle》 Vehicle 《key/value》 Memory 《Logger Factory》 Log

    《parts》 《parts》 《parts》 《parts》 《parts》 《parts》 順番に 実行 メモリ 読書 Loggerを 提供 Tub Tub Tub Tub 《Application Façade》 Base donkeyコマンドの エントリポイント 《Template》 manage.py drive/train エントリポイント [drive] キャラクタ デバイス IoTでいうところの 「ゲートウェイ」 いわゆるInvoker いわゆる Fanctor [createcar] 《Initial Parameter》 config.py アプリケーション全体の パラメータを定義
  38. ESC • エレクトロニックスピードコントローラの略、アンプと呼ばれる ことも • ブラシ付きモータの場合(標準Donkey Carはこっち) • バッテリ電圧が流れ入る時間、流れていない時間を制御(ぱする制御) しモータスピードをコントロールする

    • ブラシレスモータの場合(タミヤ製の場合8,000円以上) • モータの磁界を制御して回転数をコントロールする • 物理的な電気抵抗や電気ノイズが発生しないので耐久性、効率に優れ ている • かならずモータに適合するESCを選択する • BEC回路搭載しているものもある(標準Donkey Carも搭載)
  39. BEC • 動力用電源から受信機やサーボを駆動する電気を確保する回路 • ヘリなどの軽量させたい場合や、小型機向き • 大きめなサーボは動かせない • 5Aクラスのアンプでも受信機側には1A程度 •

    40Aクラスのアンプでも主審気側には2~3A程度 • 動力用電源の電圧が高ければ、使えるサーボ数が減る • 大電圧を5Vに落とす際にBEC回路の負担が増えるため • リチウムポリマの場合は有効 • LiPo3セルはNiMh10セルと同じBEC回路の負担となる
  40. DC/DC(電圧)コンバータ • DC(直流)からDC(直流)へ変換する装置 • 電圧を下げる:降圧、電圧を上げる:昇圧 • 標準Donkey Car v2.1の場合は、降圧コンバータを使用 •

    NiMhバッテリの電圧は7.2V、 これを降圧してRaspberry Piに5Vを給電す る • 標準Donkey Car は別途5Vバッテリを使って個別給電だった
  41. I2C • アイ・スクエアド・シー、Inter-Intergrated Circuit • 低速な周辺機器をマザーボードへ接続組込システムや携帯など で使用される • ピン数消費が少ない→GPIOの少ないマイクロコンピュータ向け •

    SDA:データ用出力、SCL:クロック用出力+GND&VCC • センサによっては上記以外にも使用 • 複数のデバイスをピン数を増やさず操作可能 • ArduinoやRaspberry Piでは常套技術のひとつ
  42. PWM • pulse width modulation、パルス幅変調 • Arduino や Raspberry Piにおける常套技術のひとつ

    • デジタル(0か1)で擬似的にアナログ(0から1までの値)を表現す る方法 • 昔のゲーム機の音源などでも使用されている • GBA、ワンダースワン、ファミコンディスクシステムなど
  43. 電源コネクタ • タミヤコネクタ • 白い半透明なプラスティックコネクタ • 国内ではタミヤ製RCカーで使用されている • 最初は間違えて買ってしまいがちなので注意! •

    タミヤミニコネクタ • 薄緑半透明なプラスティックコネクタ • Robocar storeのフルキットはこれ • 国内では東京マルイ製エアガンで主に使用されている • タミヤミニコネクタ・タミヤコネクタ変換 • 基本自作するしかない • エアガン系モデルショップで入手できることもある Tamiya mini コネクタ Tamiya コネクタ