Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What is going on with this article?
@inachi

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

More than 1 year has passed since last update.

この記事について

この記事は 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 を使った学習もできます(遅いですが)。

6
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
inachi

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
6
Help us understand the problem. What is going on with this article?