Monthly Archives: November 2019

Elecom Wireress GamePad (3)

Published by:

今回は、下記 腹腹開発 のサイトを参考にELECOM Wireress GamePadを使ってみる。
https://github.com/coolerking/donkeypart_game_controller

結果的に失敗なので、記録として残す。

インストール

  1. Raspberry Pi にターミナル接続します。
  2. 以下のコマンドを実行して、前提パッケージdonkeypart_bluetooth_game_controllerをインストールします。
    cd
    git clone https://github.com/autorope/donkeypart_bluetooth_game_controller.git
    cd donkeypart_bluetooth_game_controller
    pip install -e .
  3. 以下のコマンドを実行して、本リポジトリをcloneします。
    cd
    git clone https://github.com/coolerking/donkeypart_game_controller.git
  4. 以下のコマンドを実行して、必要なファイルを~/mycar/elecom (ELECOM JC-U3912Tの場合)へコピーします。
    mkdir ~/mycar/elecom
    cp ~/donkeypart_game_controller/elecom/* ~/mycar/elecom/
  1. ~/mycar/manage.py を、以下のように編集します(ELECOM JC-U3912Tの場合)。
  2. Raspberry Piをシャットダウンします。
  3. コントローラ同梱のUSBドングルをRaspberry Piに刺します。
  4. Raspberry Piを再起動します。

 

#ctr = get_js_controller(cfg)
from elecom import JoystickController
ctr = JoystickController()

 

キー割り当ての変更

Logicool製品の場合は logicool/part.py、Elecom製品の場合は elecom/part.py上の各 JoystickController クラス上のインスタンス変数 self.func_map を編集することで、ジョイスティックのキーの割当機能を変更できます。

とりあえず試したいので、キー割り当ての変更が後回しする。

 

 

実行(手動/自動運転)

  • 以下のコマンドを実行して、ジョイスティックを使った手動運転を開始します。
    cd ~/mycar
    # JC-U3912Tのデフォルト設定の場合"4"ボタンで運転モードを切り替え
    python manage.py drive --js

 

(env) pi@donkeypi3chen02:~/mycar $ python manage.py drive --js
using donkey v3.1.0 ...
loading config file: /home/pi/mycar/config.py
loading personal config over-rides

config loaded
cfg.CAMERA_TYPE PICAM
cfg.CAMERA_TYPE PICAM
PiCamera loaded.. .warming camera
Adding part PiCamera.
/home/pi/donkeypart_bluetooth_game_controller/donkeypart_bluetooth_game_controller/part.py:101: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
  config = yaml.load(f)
Device matching 'nintendo' couldn't be found. Trying again in 3 seconds.
Device matching 'nintendo' couldn't be found. Trying again in 3 seconds.
Device matching 'nintendo' couldn't be found. Trying again in 3 seconds.
Device matching 'nintendo' couldn't be found. Trying again in 3 seconds.
Device matching 'nintendo' couldn't be found. Trying again in 3 seconds.
Device matching 'nintendo' couldn't be found. Trying again in 3 seconds.
Device matching 'nintendo' couldn't be found. Trying again in 3 seconds.
Device matching 'nintendo' couldn't be found. Trying again in 3 seconds.
Device matching 'nintendo' couldn't be found. Trying again in 3 seconds.
Device matching 'nintendo' couldn't be found. Trying again in 3 seconds.

 

結果は、上記の文字が繰り返し、なんてnintendoだね!!!

Elecom Wireress GamePad (2)

Published by:

FaboのDonkeyPiパッケージのまま、操縦できないので、

Faboのサイトからの Elecom Joystick(Wireless Joystick) 情報を参考にやってみる。

結果的に失敗なので、記録として残す。

インストール方法

pip install git+https://github.com/FaBoPlatform/donkeypart_ps3_controller

ソースの修正

cd ~/mycar
vi manage.py

ELECOM Wireress GamePadに対応する

ElecomJoystickController を import します。

次のようにElecomJoystickController関連する文を追加する

import donkeycar as dk
from donkeypart_ps3_controller import ElecomJoystickController
#import parts
from donkeycar.parts.transform import Lambda, TriggeredCallback, DelayedTrigger
from donkeycar.parts.datastore import TubHandler
from donkeycar.parts.controller import LocalWebController, JoystickController
from donkeycar.parts.throttle_filter import ThrottleFilter
from donkeycar.parts.behavior import BehaviorPart
from donkeycar.parts.file_watcher import FileWatcher
from donkeycar.parts.launch import AiLaunch
from donkeycar.utils import *


---

        #ctr = get_js_controller(cfg)
        ctr = ElecomJoystickController(throttle_scale=cfg.JOYSTICK_MAX_THROTTLE,steering_scale=cfg.JOYSTICK_STEERING_SCALE,auto_record_on_throttle=cfg.AUTO_RECORD_ON_THROTTLE)
        V.add(ctr,
          inputs=['cam/image_array'],
          outputs=['user/angle', 'user/throttle', 'user/mode', 'recording'],
          threaded=True)

再度クルマを起動する。

(env) pi@donkeypi3chen02:~/mycar $ python manage.py drive --js
using donkey v3.1.0 ...
loading config file: /home/pi/mycar/config.py
loading personal config over-rides

config loaded
cfg.CAMERA_TYPE PICAM
cfg.CAMERA_TYPE PICAM
PiCamera loaded.. .warming camera
Adding part PiCamera.
Adding part ElecomJoystickController.
Adding part ThrottleFilter.
Adding part PilotCondition.
Adding part RecordTracker.
Adding part ImgPreProcess.
Adding part DriveMode.
Adding part AiLaunch.
Adding part AiRunCondition.
Init ESC
Adding part PWMSteering.
Adding part PWMThrottle.
Tub does NOT exist. Creating new tub...
New tub created at: /home/pi/mycar/data/tub_11_19-11-18
Adding part TubWriter.
Opening /dev/input/js0...
Starting vehicle...
Device name: Smart JC-U3912T
/usr/lib/python3/dist-packages/picamera/encoders.py:544: PiCameraResolutionRounded: frame size rounded up from 160x120 to 160x128
  width, height, fwidth, fheight)))
recorded 10 records
recorded 20 records

今度は表示が変わり、Joystick Controls:キーのcontrol と action の概要表示がなくなり、一部のキーで操縦はできた。

しかしキーの割り当てはおかしいね。左右のスディックの機能は逆、しかも変!

左のスディックはThrottleで前後移動になり、右のスディックはSteeringで左右の移動はスディック前後の操縦するとなる。

ボタン操作の対応数値

なぜ操作は逆になるなど調べるための調査

$ hexdump /dev/input/js0

ボタン類を操作して16進の数値が表示されればOK

ctrl+cで終了

しかし表示する意味の推測は大変で一旦棚上げする。

Elecom Wireress GamePad (1)

Published by:

DonkeyCar3の構築

FaBoのDOcsを参考して RaspPi3のインストール  をした。

いよいよ走行テストです。

結果的にWeb操縦はOKだが、ELECOM Wireress GamePadからの操作は失敗なので、記録として残す。

Webから操縦

コマンドラインからpython manage.py driveで起動する。

(env) pi@donkeypi3chen02:~/mycar $ python manage.py drive
using donkey v3.1.0 ...
loading config file: /home/pi/mycar/config.py
loading personal config over-rides

config loaded
cfg.CAMERA_TYPE PICAM
cfg.CAMERA_TYPE PICAM
PiCamera loaded.. .warming camera
Adding part PiCamera.
Starting Donkey Server...
Adding part LocalWebController.
Adding part ThrottleFilter.
Adding part PilotCondition.
Adding part RecordTracker.
Adding part ImgPreProcess.
Adding part DriveMode.
Adding part AiLaunch.
Adding part AiRunCondition.
Init ESC
Adding part PWMSteering.
Adding part PWMThrottle.
Tub does NOT exist. Creating new tub...
New tub created at: /home/pi/mycar/data/tub_5_19-11-17
Adding part TubWriter.
You can now go to <your pi ip address>:8887 to drive your car.
Starting vehicle...
8887
/usr/lib/python3/dist-packages/picamera/encoders.py:544: PiCameraResolutionRounded: frame size rounded up from 160x120 to 160x128
  width, height, fwidth, fheight)))
WARNING:tornado.access:404 GET /favicon.ico (192.168.0.137) 21.21ms
recorded 10 records
recorded 20 records
recorded 30 records
recorded 40 records

ブラウザから<your pi ip address>:8887 を開き、Webから操縦できた。

ELECOM Wireress GamePadから操縦

Wireless Joystickを使って操縦する方がスムーズなので、ELECOM Wireress GamePadを繋いで、再度起動

(env) pi@donkeypi3chen02:~/mycar $ python manage.py drive --js
using donkey v3.1.0 ...
loading config file: /home/pi/mycar/config.py
loading personal config over-rides

config loaded
cfg.CAMERA_TYPE PICAM
cfg.CAMERA_TYPE PICAM
PiCamera loaded.. .warming camera
Adding part PiCamera.
Adding part PS3JoystickController.
Adding part ThrottleFilter.
Adding part PilotCondition.
Adding part RecordTracker.
Adding part ImgPreProcess.
Adding part DriveMode.
Adding part AiLaunch.
Adding part AiRunCondition.
Init ESC
Adding part PWMSteering.
Adding part PWMThrottle.
Tub does NOT exist. Creating new tub...
New tub created at: /home/pi/mycar/data/tub_7_19-11-18
Adding part TubWriter.
You can now move your joystick to drive your car.
Joystick Controls:
+------------------+---------------------------+
|     control      |           action          |
+------------------+---------------------------+
|      select      |        toggle_mode        |
|      circle      | show_record_acount_status |
|     triangle     |    erase_last_N_records   |
|      cross       |       emergency_stop      |
|     dpad_up      |   increase_max_throttle   |
|    dpad_down     |   decrease_max_throttle   |
|      start       |  toggle_constant_throttle |
|        R1        |   chaos_monkey_on_right   |
|        L1        |    chaos_monkey_on_left   |
|        R2        |      enable_ai_launch     |
| left_stick_horz  |        set_steering       |
| right_stick_vert |        set_throttle       |
+------------------+---------------------------+
Opening /dev/input/js0...
Starting vehicle...
Device name: Smart JC-U3912T
/usr/lib/python3/dist-packages/picamera/encoders.py:544: PiCameraResolutionRounded: frame size rounded up from 160x120 to 160x128
  width, height, fwidth, fheight)))
E-Stop!!!
constant_throttle: True
recorded 10 records
new mode: local_angle
Shutting down vehicle and its parts...
Stopping PiCamera
Part Profile Summary: (times in ms)
+-----------------------+------+------+------+--------+
|          part         | max  | min  | avg  | median |
+-----------------------+------+------+------+--------+
|        PiCamera       | 0.31 | 0.03 | 0.06 |  0.06  |
| PS3JoystickController | 0.20 | 0.06 | 0.09 |  0.09  |
|     ThrottleFilter    | 0.12 | 0.02 | 0.04 |  0.04  |
|     PilotCondition    | 0.13 | 0.02 | 0.03 |  0.03  |
|     RecordTracker     | 0.16 | 0.03 | 0.03 |  0.03  |
|       DriveMode       | 0.15 | 0.02 | 0.05 |  0.05  |
|        AiLaunch       | 0.13 | 0.02 | 0.04 |  0.04  |
|     AiRunCondition    | 0.12 | 0.01 | 0.03 |  0.03  |
|      PWMSteering      | 3.49 | 1.52 | 1.88 |  1.82  |
|      PWMThrottle      | 4.45 | 1.40 | 1.75 |  1.68  |
|       TubWriter       | 6.65 | 2.79 | 3.10 |  2.84  |
+-----------------------+------+------+------+--------+
Traceback (most recent call last):
  File "manage.py", line 572, in <module>
    meta=args['--meta'])
  File "manage.py", line 561, in drive
    max_loop_count=cfg.MAX_LOOPS)
  File "/home/pi/donkeycar/donkeycar/vehicle.py", line 144, in start
    self.update_parts()
  File "/home/pi/donkeycar/donkeycar/vehicle.py", line 194, in update_parts
    outputs = p.run(*inputs)
  File "/home/pi/donkeycar/donkeycar/parts/actuator.py", line 185, in run
    self.left_pulse, self.right_pulse)
  File "/home/pi/donkeycar/donkeycar/utils.py", line 245, in map_range
    y = ((x-X_min) / XY_ratio + Y_min) // 1
TypeError: unsupported operand type(s) for -: 'NoneType' and 'int'

Device name: Smart JC-U3912Tとして認識されたが、一部の操縦しかできない。set_throttleできないは一番の問題だ!

できるキー:

  1. キー12だけconstant_throttle: として、True/Falseでき
  2. キー11は、プログラムの終了はできる
  3. 左のスディックは、set_steeringできる

DonkeyPiのOLEDで状態表示

Published by:

DonkeyPiのIPと生死は気になるので、OLEDで状態表示を試みた。

OLEDはI2Cを利用するので、同じI2Cを利用するPCA9685と共有する。

目的

小型のOLED (128×64)や(128×32)を接続して、status などを表示する。

接続

Raspberry Pi では、下記のPin 1, 3, 5, 6とOLEDと4本それぞれ接続する。
– Pin1 3.3V
– Pin3 SDA
– Pin5 SCL
– Pin6 GND

正常に接続されていると、i2cdetectコマンドを使うとアドレスが表示される。

Software

Adafruitのlibraryを利用する。

installation

$ git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git
$ cd Adafruit_Python_SSD1306
$ sudo python setup.py install

動作確認

exampleのstats.pyで動作を確認した。

$ python stats.py


ただし、SSD 1306 OLED 用のライブラリを作るのにAdafruitが時間を費やしたのでAdafruitから対応hardware を購入しろということが readme に記載されていた。

実装

stats.pyを改造して、ボタンを押すだけ表示、またはCronでPi起動から繰り返し表示する工夫が必要。

参考サイト

https://qiita.com/KZ2/items/ebfcb90406d1a4ba539f