コンテンツにスキップ

レベル3:ロボットカー走行デモ TCP通信版


目標

映像をサーバに送り、level2,level3によるサーバからの走行指示でロボットカーを自走させる

動画

解析動画:解析動画

【実行環境】
* Fabo TYPE1 ロボットカー
* USB Webcam
* Fabo #605 Motor Shield Raspberry Pi Rev 1.0.1
* Fabo Robot Car #1202 Rev. 1.0.1
* Tower Pro SG90
* Raspberry Pi3
* Jessie Lite
* docker
* Ubuntu
* Python 2.7
* OpenCV 2.4
* Tensorflow r1.1.0
* FaBoPWM-PCA9685-Python
* FaBoGPIO-PCAL6408-Python
* Jetson TX2
* JetPack 3.1
* Ubuntu
* Python 3.6
* OpenCV 3.3
* Tensorflow r1.4.1

実行

目次

インストール方法

インストール済みのロボットカー/Jetson TX2を用意しているので省略します。
SSD300環境のために、Jetson TX2で一度level3_object_detectionをしておく必要があります。

<ページTOP> <目次>


コースの準備

コースはlevel2のコース横に道路標識を置きます。
走行はlevel2と同じくラインを検出して走行しますが、道路標識を認識することで速度が変化したり停止したりします。


<ページTOP> <目次>


[Jetson TX2/PC] サーバ起動

1. Jetson TX2にログインします

USER:ubuntu
PASSWORD:ubuntu

ssh ubuntu@192.168.xxx.xxx

用意してあるJetson TX2はDockerを使っていないので、Raspberry Pi3の時のようなdockerコンテナへのログインはありません。

2. ロボットカーのディレクトリに移動します

cd ~/notebooks/github/RobotCarAI/level3_demo_socket/pc_server
ls

total 28
1467862 4 ./ 1467848 4 ../ 1467864 4 lib/ 1467963 16 server.py

3. ソースコードのIPアドレスをサーバのIPアドレスに修正します

サーバ側が監視する自分のIPアドレスとTCPポート番号をサーバに合わせて修正してください。

vi server.py

HOST = '192.168.0.77' # Server IP Address
PORT = 6666 # Server Port

4. サーバコードを実行します

python server.py

Server start

ライブラリの読み込みや、TensorFlowのSSD300モデルを読み込むので、起動完了まで少し時間がかかります。

<ページTOP> <目次>


[Raspberry Pi3] ロボットカー起動

1. ロボットカーのRaspberry Pi3にログインします

USER:pi
PASSWORD:raspberry

ssh pi@192.168.xxx.xxx

2. rootになってdockerコンテナIDを調べます

sudo su
docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2133fa3ca362 naisy/fabo-jupyter-armhf "/bin/bash -c 'jup..." 3 weeks ago Up 2 minutes 0.0.0.0:6006->6006/tcp, 0.0.0.0:8091->8091/tcp, 0.0.0.0:8888->8888/tcp hardcore_torvalds

STATUSがUpになっているコンテナIDをメモします。

3. dockerコンテナにログインします

docker exec -it CONTAINER_ID /bin/bash

docker exec -it 2133fa3ca362 /bin/bash

CONTAINER_IDにはベースイメージがnaisy/fabo-jupyter-armhfの2133fa3ca362を使います。

4. ロボットカーのディレクトリに移動します

cd /notebooks/github/RobotCarAI/level3_demo_socket/car_client/
ls

total 56
7233453 4 ./ 7233433 4 ../ 7233455 4 analyzelib/ 7233454 24 analyze.py 7233460 4 lib/ 7233465 16 server.py

5. ソースコードのIPアドレスをサーバのIPアドレスに修正します

クライアント側も通信先のサーバのIPアドレスとTCPポート番号をサーバに合わせて修正してください。

vi run_car_client.py

HOST = '192.168.0.77' # Server IP Address
PORT = 6666 # Server Port

5. ロボットカーを起動します

python start_button.py

6. 走行開始するには、ロボットカーの青いボタンを押します

7. 走行停止するには、ロボットカーの赤いボタンを押します


Ctrl + c でstart_button.pyを終了します

<ページTOP> <目次>


5. 走行が終わったら、走行中の動画を解析します

ここはロボットカーの方で走行を行った後におこないます。
走行中にサーバが受け取ったフレームは動画に保存してあります。
ソースコード:./pc_server/server.py

1
2
3
4
5
6
7
8
    # 映像を保存するかどうか
    IS_SAVE = True
    OUTPUT_DIR ='./'
    OUTPUT_FILENAME = 'received.avi'
...
                            # avi動画に保存する
                            if IS_SAVE:
                                out.write(cv_bgr)

server.pyと同じディレクトリにreceived.aviが作成されるので、この動画を解析にかけます。

python analyze.py

frame 170 Done!

解析結果はpc_server/output/analyze.aviとして動画で保存されているので、ブラウザでサーバのjupyterにアクセスして確認します。

http://192.168.xxx.xxx:8888/tree/github/RobotCarAI/level3_demo_socket/pc_server/output/

<ページTOP> <目次>


トラブルシューティング

Webcamが起動しない

IOError: Couldn't open video file or webcam. If you're trying to open a webcam, make sure you video_path is an integer!

OpenCVの映像取得に失敗した場合にこのエラーが発生します。
他にカメラを使っているプロセスがなければ、数秒おいて再実行で解決することが多いです。
それでも解決しない場合は、カメラのUSBケーブルを抜き差ししてください。
これは再実行時によく発生します。


走行中にハンドルが固まった

VIDIOC_DQBUF: No such device

ロボットカーの赤いボタンを押して車両を停止してください。
カメラのUSBケーブルを抜き差ししてください。
走行中に突然一方方向に進み続けてしまう場合は、Raspberry Pi3からの電力供給が遮断されてカメラが認識不能になったために発生します。
Faboシールドの電源をRaspberry Pi3から取得している時に、サーボの消費電力量が増えた瞬間に発生します。電力供給はすぐに復旧するので走行は続くのですが、カメラが認識不能になるため、制御不能に陥ります。


Raspberry Pi3が起動しない

バッテリーの出力不足が原因として上げられます。
2A以上のモバイルバッテリーを使ってください。


サーバが起動しない

server.pyのHOST,PORTを確認してください。
Dockerを使っている場合は、HOSTはDockerコンテナIDになります。
ファイアーウォールは通常、内部IPに対して設定していないので通信可能ですが、設定している場合はサーバ側でTCPポート番号の通信を許可してください。


走行開始ボタンを押してもすぐ終了する

run_car.pyのHOST,PORTを確認してください。(サーバのIPアドレス、ポート番号を設定します)
サーバが起動していることを確認してください。

カメラエラーかもしれないので、USBカメラを抜き差ししてください。

<ページTOP> <目次>


ディレクトリとファイルについて

  • ディレクトリについて
    • car_client/ ロボットカー制御関連
    • car_client/fabolib/ Fabo製基板関連
    • car_client/lib/ SPI,カメラライブラリ
    • pc_server/ サーバ解析関連
    • pc_server/lib/ ライン検出関連
  • ファイルについて
    • README.md このファイル
    • car_client/run_car_client.py 自動走行コード
    • car_client/start_button.py 開始ボタンコード
    • pc_server/server.py サーバ起動コード

<ページTOP> <目次>