2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DonkeyCarのディープラーニングモデルをMATLAB/Simulinkを使ってRaspberry Piに実装する

Last updated at Posted at 2022-08-11

はじめに

「DonkeyCarのデータセットをMATLAB/Simulinkでリプレイしてみる」では、DonkeyCarのデータセットを使ってディープラーニングモデルのリプレイを行いました。今回、MATLAB/Simulinkで作成したDonkeyCarのディープラーニングモデルをRaspberry Piに実装してみます。

ソフトウエア

ハードウエア

  • Raspberry Pi 4B
  • Raspberry Piカメラモジュール

PythonベースのDonkeyCar環境とMATLAB/Simulinkの比較

DonkeyCarは、PythonとTenserFlow/KerasライブラリをベースにつくられたAIカーソフトウエアで、走行用プログラムやユーティリティがオープンソースとして公開されており、無償で利用できます。
Pythonのクラスで記述されたパーツライブラリーが用意されていて、センサー、コントローラ、アクチュエータのコードを組み合わせてコーディングができます。
しかしながら、ソースコードの規模が大きく、AIカーをシンプルに理解するには、難しいと感じるところもあります。
一方、Simulinkは、AIカーのコントローラをブロック図で記述でき、構造を理解しやすく、シミュレーションや計測、制御に向いています。

Raspbian上でのDonkeyCarとMATLAB/Simulink実行環境の共存

Simulink Support Package for Raspberry PiのRaspbian OSにDonkeyCarのソフトをインストールしたところ、両方の環境を共存させて使うことができました。:sunglasses:

image.png

Simulinkを使ったDonkeyCarのディープラーニングモデル

Raspberry Piのカメラ画像をDonkeyCarのCNNモデルに入力し、ステアリング角、スロットル値を出力します。
PWM値に変換し、I/Oブロックを接続することで、サーボモーターや駆動モータを動作させることができます。

image.png

SimulinkモデルのGitHubリンク

DonkeyCarのディープラーニングモデルは、以下の学習済み *.h5ファイル(Kerasモデル)をインポートして、matファイルに変換したものを使用しています。
https://github.com/autorope/donkey_datasets/tree/master/circuit_launch_20210716/models

MATLAB Functionを使った実行サイクル時間の表示

MATLAB Functionブロックに下記の関数を記述し、1サイクルの演算周期に要した時間を出力します。

function y = exec_time()
    persistent t0
    if isempty(t0)
        t0 = 0;
        tic;
    end
    t = toc;
    y = t - t0;
    t0 = t;
end

ターゲットハードウエア実行モード

下記のような実行モードがあります。
Simulinkのシミュレーションで確認してから、ターゲットハードウエアのExternalモードでビルドを行い、Raspberry Piへ実装してみます。

実行モード モデル演算 I/O 特徴
Simulink ホストPC なし シミュレーションをすぐに実行可能
Connected I/O (Input/Output mode) ホストPC ターゲットボード ビルド時間が短く、モデル演算は速いが、通信によるI/Oの遅延あり
Run on board (External mode) ターゲットボード ターゲットボード ボード上で実行するため、リアルタイム制御に適している
Deploy ターゲットボード ターゲットボード ホストPC接続なしでボード上の実行が可能

ARMターゲットでのディープラーニング高速化

試行錯誤の末、MATLAB Homeでは、以下のようなSimulinkモデルのHWオプションを設定すると、ARM ターゲットのコード生成を行うことができ、演算が高速化しました。:sweat_smile:

set_param(bdroot,'HardwareBoard','None');
set_param(bdroot,'HardwareBoard','Raspberry Pi');

set_param(bdroot,'TargetLang','C++');
set_param(bdroot,'SimTargetLang','C++');
set_param(bdroot,'CodeInterfacePackaging','Nonreusable function');

set_param(bdroot,'DLTargetLibrary','arm-compute');
set_param(bdroot,'ProdHWDeviceType', 'ARM Compatible->ARM Cortex');
set_param(bdroot,'DLArmComputeVersion','19.05');
set_param(bdroot,'DLArmComputeArch','armv8');
set_param(bdroot,'UseSimulinkCoderFeatures','off');

  • Simulinkモデルの新規作成より、Simulink Support Package for Raspberry Pi HardwareのBasic Modelのテンプレートを使ってベースモデルを作成し、コマンドでオプションを設定しています。
  • 最初の2行は、HardwareBoardをNoneから、Raspberry Piに切り替えて、Raspberry Pi向けのオプションを自動設定しています。

実行時間の確認

汎用C/C++コードでは、モデルサンプリング周期 0.05 secをオーバーし、0.2-0.5 sec程度かかっていましたが、ARMターゲットのオプション適用後、モデルサンプリング周期 0.05 sec前後で演算されています。

  • 汎用C/C++による実行サイクル時間
    image.png
  • ARMターゲットによる実行サイクル時間
    image.png

まとめ

Simulinkで作成したDonkeyCarのディープラーニングモデルをRaspberry Piに実装してみました。ARMターゲットのコード生成を行うことで、Raspberry Pi上でのディープラーニング演算が高速化しました。

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?