6
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

JetBot をハード無改造で Donkey Car 化する

この記事について

この記事は AI RC Car Adventcalendar 2019 の7日目の記事です。今日は JetBot をハード無改造で Donkey Car 化する方法について書いてみます。

Donkey Carについて簡単に

IMG_4908.jpeg

Donkey Carは2017年に米オークランドで始まった趣味の AI カーレースのコミュニティ DIY ROBOCARSの入門機として開発されたものです。機体はRCカーをベースとして、ラズパイ or Jetson Nano、カメラ、モータドライバをのせたものが基本となります。カメラから入力した画像から PilotNet で推論を行いスロットルとステアリングの値を出力して、モータドライバに与えることで走行する仕組みです。

Donkey Carの組み立て方法やソフトウェアのインストール方法はDonkey CarのDocsサイトで公開されています。車体のキットは香港の Robocar Storeや日本の FaBo Storeで購入できます。

Donkey Carを始めること自体はそれほど難しいことではないのですが、元々レース目的であることもあり、RCカーがベースであるのでスピードが出過ぎて、日本の家屋事情では走行場所の確保に難儀されることでしょう。 私の普段は Donkey Car 本来の車体を使わずに、JetBot に Donkey Car のソフトウェアを移植したもので楽しんでいます。

JetBotについて簡単に

IMG_5236.jpeg

JetBot は Maxwell 世代のGPUであるTegra X1を搭載した1ボードPC「Jetson Nano」を使って、画像認識可能なAIカーを組み立てるプロジェクトです。JetBotの仕様はGitHubで公開されていて、そこに公開されているドキュメントにしたがって必要なパーツを購入/3Dプリントして組み立てるだけで、簡単にAIカーを作成できます。組み立てキットも各所から購入できます

JetBot はレースを目的としたものではなく、スピードも出ませんので、狭い場所でも動かすことができます。

JetBotをDonkey Car化する

JetBotはデフォルトではPCなどのWebブラウザからJupyter labを使って制御します。今回はこの環境を壊さずに、適時 Donkey Car に切り替えられるようにします。

virtualenvwrapper のインストール

Donkey Carソフトウェアのインストールが既存環境に影響を与えないように Python の仮想環境を用意します。以下の手順で virtualenvwrapper をインストールします。

$ sudo apt update
$ sudo apt install python3-virtualenv virtualenvwrapper
$ echo 'export WORKON_HOME=$HOME/.virtualenvs' >> ~/.bashrc
$ mkdir ~/.virtualenvs
$ source ~/.bashrc

Donkey Car用の仮想環境作成

ここでは仮に "donkey" という名前で仮想環境を作成します。

$ mkvirtualenv donkey

作成した仮想環境に入るには workon コマンドを使います。仮想環境に入るとコマンドラインのプロンプトの前に仮想環境名がつきます。

$ workon donkey
(donkey) $

ちなみに仮想環境から抜けるには以下のようにします。

(donkey) $ deactivate
$ 

作成した仮想環境に Donkey Car のソフトウェアをインストールする

本家のドキュメントの手順にしたがって、Step2からインストール作業を実施してください。

インストールが完了したら、自分用の Donkey Car 環境を作成します。

(donkey) $ donkey createcar --path ~/mycar

足まわりの制御のセットアップ

標準のDonkey Carの足まわりはスロットル用のモーターとステアリング用のサーボモーターが別になっていますが、JetBotの場合は左右のDCモーターの差動によってスロットルとステアリングを制御します。

Donket Car のパーツ parts/actuator.py にはいちおうこのような構成のモータを制御するための TwoWheelSteeringThrottle クラスが用意されているので、これを利用することにします。

まず、Adafruit_MotorHAT パッケージをインストールします。

(donkey) $ pip install Adafruit-MotorHAT

次に、このパッケージを使った Donkey Car プログラムに若干問題があるので、以下の改造を加えます。

diff -ur donkeycar.org/donkeycar/parts/actuator.py donkeycar/donkeycar/parts/ac\
tuator.py
--- donkeycar.org/donkeycar/parts/actuator.py   2019-12-07 22:22:18.438620446 +\
0900
+++ donkeycar/donkeycar/parts/actuator.py       2019-11-24 10:26:04.518697679 +\
0900
@@ -265,9 +265,13 @@
         from Adafruit_MotorHAT import Adafruit_MotorHAT, Adafruit_DCMotor
         import atexit

-        self.FORWARD = Adafruit_MotorHAT.FORWARD
-        self.BACKWARD = Adafruit_MotorHAT.BACKWARD
-        self.mh = Adafruit_MotorHAT(addr=0x60)
+        #self.FORWARD = Adafruit_MotorHAT.FORWARD
+        #self.BACKWARD = Adafruit_MotorHAT.BACKWARD
+        #self.mh = Adafruit_MotorHAT(addr=0x60)
+        self.FORWARD = Adafruit_MotorHAT.BACKWARD
+        self.BACKWARD = Adafruit_MotorHAT.FORWARD
+        self.RELEASE = Adafruit_MotorHAT.RELEASE
+        self.mh = Adafruit_MotorHAT(i2c_bus=1)

         self.motor = self.mh.getMotor(motor_num)
         self.motor_num = motor_num
@@ -276,6 +280,8 @@
         self.speed = 0
         self.throttle = 0

+    def turn_off_motors(self):
+        self.mh.getMotor(self.motor_num).run(self.RELEASE)

     def run(self, speed):
         '''
@@ -297,7 +303,9 @@


     def shutdown(self):
-        self.mh.getMotor(self.motor_num).run(Adafruit_MotorHAT.RELEASE)
+        #self.mh.getMotor(self.motor_num).run(Adafruit_MotorHAT.RELEASE)
+        self.mh.getMotor(self.motor_num).run(self.RELEASE)
+


 class Maestro:

次に、mycar/manage.py に TwoWheelSteeringThrottle を使うための修正を行います。

@@ -483,6 +483,20 @@
         V.add(left_motor, inputs=['left_motor_speed'])
         V.add(right_motor, inputs=['right_motor_speed'])

+    elif cfg.DRIVE_TRAIN_TYPE == "DC_TWO_WHEEL_AF":
+        from donkeycar.parts.actuator import TwoWheelSteeringThrottle, Adafrui\
t_DCMotor_Hat
+
+        left_motor = Adafruit_DCMotor_Hat(cfg.ADAFRUIT_MOTOR_NUM_LEFT)
+        right_motor = Adafruit_DCMotor_Hat(cfg.ADAFRUIT_MOTOR_NUM_RIGHT)
+        two_wheel_control = TwoWheelSteeringThrottle()
+
+        V.add(two_wheel_control,
+                inputs=['throttle', 'angle'],
+                outputs=['left_motor_speed', 'right_motor_speed'])
+
+        V.add(left_motor, inputs=['left_motor_speed'])
+        V.add(right_motor, inputs=['right_motor_speed'])
+
     elif cfg.DRIVE_TRAIN_TYPE == "SERVO_HBRIDGE_PWM":
         from donkeycar.parts.actuator import ServoBlaster, PWMSteering
         steering_controller = ServoBlaster(cfg.STEERING_CHANNEL) #really pin

後は、mycar/myconfig,py で設定するだけです。最低限必要な設定項目は以下です。

CAMERA_TYPE = "CSIC"
DRIVE_TRAIN_TYPE = "DC_TWO_WHEEL_AF"
ADAFRUIT_MOTOR_NUM_LEFT = 1
ADAFRUIT_MOTOR_NUM_RIGHT = 2

おわりに

以上で通常のDonkey Carと同様に利用できます。~/mycar/myconfig.py の BATCH_SIZE をデフォルトの半分程度にすれば Jetson Nano の GPU を使った学習もできます(遅いですが)。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
6
Help us understand the problem. What are the problem?