FC2カウンター FPGAの部屋 2019年06月23日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

「AI RCカー勉強会@柏の葉「Donkey Carハンズオン」」に行ってきました

AI RCカー勉強会@柏の葉「Donkey Carハンズオン」」に行ってきました。

Donkey Car はRaspberry Pi 3+ + Pi Camera で動作するロボットカー・キットです。4 輪駆動車をベースにしていて前輪の向きを変えて曲がることができます。ジョイスティックで自分でコースを走らせて、学習データを取得します。Raspberry Pi 3+ のアプリケーションソフトで、学習データを作成して、それを Google のColab にアップロードして学習します。そのモデルをDonkey Car に入れてコースを走らせます。

最初にDonkey Car を組み立てましたが、さほど苦労せずに組み立てることができました。
DonkeyCar_1_190623.jpg

パソコンでマニュアルを見ながらやっています。後で、SSH でRaspberry Pi 3+ に入るときや、SFTP で学習データをRaspberry Pi 3+ から取り出すときや、学習済みモデルをRaspberry Pi 3+ にアップロードするときにもパソコンを使いました。
DonkeyCar_2_190623.jpg

Donkey Car を無線LAN に接続します。
DonkeyCar_3_190623.jpg

学習データを取得するアプリケーションソフトを起動して、Donkey Car を走らせます。学習データはJPG ファイルとステアのアングルとスロットルのデータが書かれたJSON ファイルの組でした。これを 5000 個程度取得しました。
DonkeyCar_4_190623.jpg
DonkeyCar_5_190623.jpg
DonkeyCar_6_190623.jpg

とにかく、私には走らせるのが難しいですね。。。練習が必要でした。ですので、学習データの質は推して知るべしです。。。

学習データをColab にアップロードして学習させます。
学習が終了したら、生成されたモデルをダウンロードしてRaspberry Pi 3+ にアップロードします。
そして、他の方ですが、学習済みモデルで走らせているところです。
DonkeyCar_7_190623.jpg

私のは、学習の時にスピードが出てなかったので、スロットルの値が低く、そのままでは走り出しませんでしたが、ズルしてスロットルに下駄をはかせて走るようにしました。でも学習データがよろしくなく、途中でコースアウトしちゃいました。
とっても面白かったです。それにツールが充実しているのがとっても良いですね。Zybot と違ってステアリング切れるし、欲しくなりました。4万円だそうです。買っちゃおうかな?でも、コースが取れないんですよね。特に今回のDonkey Car はスピード出るので、ある程度の広さの場所が必要です。

Donkey Car ではないですが、JetBot を持ってきていらっしゃる方がいらしゃいました。
DonkeyCar_8_190623.jpg
  1. 2019年06月23日 04:49 |
  2. Donkey Car
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS勉強会用のラプラシアンフィルタ実習用回路の製作3

Vivado HLS勉強会用のラプラシアンフィルタ実習用回路の製作2”の続き。

今年も筑波大学でやる予定のVivado HLS 勉強会の出し物として、 AXI4 Stream 版のラプラシアンフィルタの実習用回路を作成することにした。ということで、前回までは、Windows 10 の Vivado 2017.4 で lapfilter_axis_zybo プロジェクトを作成し、lap_filter_axis 、axis2DMA2st と DMA2axis2st IP をリポジトリに登録し、lapfilter_axis ブロック・デザインを新規作成して、IP をAdd IP して、回路を作り始めた。今回は、回路を完成させて、論理合成、インプリメンテーション、ビットストリームの生成を行った。今回は、ハードウェアをエクスポートして、SDK を起動し、アプリケーションソフトを作成して実機確認を行う。

ハードウェアをエクスポートして、SDK を起動した。
そして、lapfilter_axis.c という名前のアプリケーションソフトを作成した。
lapfilter_axis_zybo_14_190623.png

lapfilter_axis.c のソースコードを貼っておく。

/*
 * lapfilter_axis.c
 *
 *  Created on: 2019/06/21
 *      Author: marsee
 */

#include <stdio.h>
#include "xil_io.h"
#include "xparameters.h"

#include "xlap_filter_axis.h"
#include "xdma2axis.h"
#include "xaxis2dma2st.h"
#include "bmp_data.h"

#define FRAME_BUFFER_ADDRESS 0x10000000
#define DMA_DEST_ADDRESS 0x10200000

#define HORIZONTAL_PIXELS   800
#define VERTICAL_LINES      600

int bmp_write(unsigned int addr);

int main(){
    XLap_filter_axis xlf_axis_ap;
    XDma2axis xdma2axis_ap;
    XAxis2dma2st xaxis2dma_ap;
    int inbyte_in;

    XLap_filter_axis_Initialize(&xlf_axis_ap, 0);
    XDma2axis_Initialize(&xdma2axis_ap, 0);
    XAxis2dma2st_Initialize(&xaxis2dma_ap, 0);

    XDma2axis_Set_y_size(&xdma2axis_ap, (u32)VERTICAL_LINES);
    XDma2axis_Set_x_size(&xdma2axis_ap, (u32)HORIZONTAL_PIXELS);
    XDma2axis_Set_sel(&xdma2axis_ap, (u32)0);
    XDma2axis_Set_in_V(&xdma2axis_ap, (u32)FRAME_BUFFER_ADDRESS);

    XAxis2dma2st_Set_y_size(&xaxis2dma_ap, (u32)VERTICAL_LINES);
    XAxis2dma2st_Set_x_size(&xaxis2dma_ap, (u32)HORIZONTAL_PIXELS);
    XAxis2dma2st_Set_sel(&xaxis2dma_ap, (u32)0);
    XAxis2dma2st_Set_out_V(&xaxis2dma_ap, (u32)DMA_DEST_ADDRESS);

    bmp_write(FRAME_BUFFER_ADDRESS);
    bmp_write(FRAME_BUFFER_ADDRESS);

    XAxis2dma2st_Start(&xaxis2dma_ap);
    XLap_filter_axis_Start(&xlf_axis_ap);
    XDma2axis_Start(&xdma2axis_ap);

    Xil_Out32(XPAR_BITMAP_DISP_CNTRLER_AXI_MASTER_0_BASEADDR, DMA_DEST_ADDRESS);

    while(1){
        printf("\nPlease input <0> or <1> (<q> : exit) = ");
        fflush(stdout);
        inbyte_in = inbyte();
        printf("%c", inbyte_in);
        fflush(stdout);
        switch(inbyte_in) {
            case '0': //bmp image
                XDma2axis_Set_sel(&xdma2axis_ap, (u32)0);
                XAxis2dma2st_Set_sel(&xaxis2dma_ap, (u32)0);

                XAxis2dma2st_Start(&xaxis2dma_ap);
                XLap_filter_axis_Start(&xlf_axis_ap);
                XDma2axis_Start(&xdma2axis_ap);
                break;
            case '1': // Laplacian filter
                XDma2axis_Set_sel(&xdma2axis_ap, (u32)1);
                XAxis2dma2st_Set_sel(&xaxis2dma_ap, (u32)1);

                XAxis2dma2st_Start(&xaxis2dma_ap);
                XLap_filter_axis_Start(&xlf_axis_ap);
                XDma2axis_Start(&xdma2axis_ap);
                break;
            case 'q': // exit
                return(0);
        }
    }
}

int bmp_write(unsigned int addr){
    for(int y=0; y<VERTICAL_LINES; y++){
        for(int x=0; x<HORIZONTAL_PIXELS; x++){
            Xil_Out32(addr+(y*HORIZONTAL_PIXELS+x)*sizeof(int),
                ((int)bmp_file_array[y][x][2]<<16)+((int)bmp_file_array[y][x][1]<<8)+(int)bmp_file_array[y][x][0]);
        }
    }
    return(0);
}


なお、bmp_write(FRAME_BUFFER_ADDRESS); を 2 回書いているのは、そうしないと画像にゴミが入ってしまうからだ。もしかしてキャッシュの関係で実は 1 回では書けていないのかもしれない?

SDK からビットストリームをZYBO にダウンロードして、アプリケーションソフトを起動するとTeraTerm に表示が出て、ディスプレイにも画像が出た。
lapfilter_axis_zybo_15_190623.png

lapfilter_axis_zybo_16_190623.jpg

TeraTerm 上で、 1 を入力すると、回路上で、AXI4 Stream が切り替わって、ラプラシアンフィルタの画像が表示された。
lapfilter_axis_zybo_17_190623.jpg

TeraTerm 上で 0 を入力すると、元の画像に戻った。
lapfilter_axis_zybo_16_190623.jpg

これでZYBO 版は完成だが、PYNQ 版とZYBO Z7-20 版も開発する予定だ。
  1. 2019年06月23日 04:11 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0