FPGAの部屋

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

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

カテゴリ: Zybot

Zybot でガボール・フィルタを使用して白線間走行する14(コースを新設)”の続き。

Zybot でガボール・フィルタを使用して白線間を走行させたいと思っているということで、前回は、コースを新設してやってみた。ロボットカーを走らせてみたところ、コース沿いに左に曲がったが、曲がりすぎてしまう。今回は、白線の幅を 19 cm から 21 cm に変更したが、ZYBO の USB コネクタが怪しくなり、QSPI フラッシュと SD カードからのブートに問題が出てしまった。

USB ケーブルを Zybot に接続して FPGA を JTAG からコンフィグレーションしてテストをしてきたが、いよいよコネクタの接触が怪しくなった。コンフィグレーションできなくなったし、USB コネクタを持ち上げないと電源が入らなくなってしまった。

更に QSPI フラッシュと SD カードからのブートの時のガボール・フィルタの画像がおかしい。どちらもノイズが乗りまくっている画像になってしまっている。
b1241724.jpg


何ででしょう?

ZYBO ボードの調子が悪いので、ペンディングとして、KR260 をやってみようと思う。

Zybot でガボール・フィルタを使用して白線間走行する13(白線判断のポイントを確認する)”の続き。

Zybot でガボール・フィルタを使用して白線間を走行させたいと思っているということで、前回は、白線の位置を判断するポイントがロボットカーからどの程度離れているのか?を確認する。確認の結果、ロボットカーの先端から約 27 cm の位置で判定しているようだった。今回は、コースを新設してやってみた。ロボットカーを走らせてみたところ、コース沿いに左に曲がったが、曲がりすぎてしまう。

前回は白線間のコース幅が 21 cm だったと思うが、今回は、19 cm 幅のコースを白い紙テープで作成してみた。
fffec101.jpg


ロボットカーを直進する位置に置いた。

ガボール・フィルタとラプラシアン・ファイルをスルーしたカメラ画像のディスプレイ表示を示す。
c8b8af1f.jpg


シリアル・インターフェース経由で取得したテキスト・ファイルを画像ファイルに変換した画像を示す。
2d8eef9a.jpg


左白線用パラメータのガボール・フィルタ画像を示す。
27a34e7f.jpg


シリアル・インターフェース経由で取得したテキスト・ファイルを画像ファイルに変換した画像を示す。
31bc160d.jpg


右白線用パラメータのガボール・フィルタ画像を示す。
写真がぶれてしまっている。
64b7f2f0.jpg


シリアル・インターフェース経由で取得したテキスト・ファイルを画像ファイルに変換した画像を示す。
790bf7b1.jpg


これで走らせてみたところ、左に曲がりすぎてしまう。
スピードが速いのと白線幅が狭いので、左に曲がった際に白線を認識できなくなってしまうのかもしれない?
白線幅を 21 cm にして、以前のモーターの PWM 値で試してみよう。

Zybot でガボール・フィルタを使用して白線間走行する12(ラプラシアン・フィルタを外してガボール・フィルタだけにする)”の続き。

Zybot でガボール・フィルタを使用して白線間を走行させたいと思っているということで、前回は、ラプラシアン・フィルタを外してガボール・フィルタだけにしてみたが、白線が認識されているようだ。やはり、キャッシュをインバリデートしていなかったのが痛かった。今回は、白線の位置を判断するポイントがロボットカーからどの程度離れているのか?を確認する。確認の結果、ロボットカーの先端から約 27 cm の位置で判定しているようだった。

今回は、白線判断のポイントを確認するために、ガボール・フィルタもラプラシアン・フィルタもキャンセルして、通常のカメラ画像で確認する。
wl_tracing_gabor_bm.c の 221 行目の

gabor_filter_lh_3_0[10] = (volatile uint32_t)1; // function_r, Gabor_Filter IP ON

をコメントアウトして、下の行に

gabor_filter_lh_3_0[10] = (volatile uint32_t)0; // function_r, Gabor_Filter IP OFF

を追加した。
a685caa0.png


最初にロボットカーをコース上に適当に置いてカメラ画像を確認する。
3113dcf2.jpg


ディスプレイに映った画像を示す。
1ae62bc1.jpg


カメラ画像を取得する。
シリアル・ターミナルでは、一部のデータしか見ることができないので、cu コマンドでファイルに保存する。
最初に /ttyUSB1 の権限を変更した。
sudo chmod o+wr /dev/ttyUSB1

カメラ画像データを
cu -s 115200 -l /dev/ttyUSB1 > line1_230111.txt
で取得した。
終了は ~. を入力した。

取得したテキスト・ファイルを bmp ファイルに変換する。(”テキスト・ファイルを画像ファイル(bmp ファイル)に変換するソフトウェアを作成する”を参照)
./txt2bmp line1_230111.txt line1_230111.bmp
94907138.png


line1_230111.bmp を示す。
1af964fe.jpg


ロボットカーから白線判断のポイントが結構離れているようなので、大体の距離を測定する。
ロボットカーのカメラから白線がカーブから直線になるポイントを映すようにロボットカーの位置を微調整した。
7df8e4f7.jpg


ロボットカーからのカメラ画像を示す。
655370b9.jpg


距離を測定すると、ロボットカーの先端から白線がカーブから直線になるポイントの距離は大体 27 cm 程度だった。

カメラ画像を取得する。
シリアル・ターミナルでは、一部のデータしか見ることができないので、cu コマンドでファイルに保存する。
最初に /ttyUSB1 の権限を変更した。
sudo chmod o+wr /dev/ttyUSB1

カメラ画像データを
cu -s 115200 -l /dev/ttyUSB1 > line2_230111.txt
で取得した。
終了は ~. を入力した。

取得したテキスト・ファイルを bmp ファイルに変換する。(”テキスト・ファイルを画像ファイル(bmp ファイル)に変換するソフトウェアを作成する”を参照)
./txt2bmp line2_230111.txt line2_230111.bmp
68c2f64d.png


line2_230111.bmp を示す。
7692535e.jpg

Zybot でガボール・フィルタを使用して白線間走行する11(アプリケーション・ソフトを更新してテスト)”の続き。

Zybot でガボール・フィルタを使用して白線間を走行させたいと思っているということで、前回は、ハードウェアをエクスポートして、Vitis を立ち上げアプリケーション・ソフトウェアをハードウェアの変更に合わせて更新し、Zybot でテストしたところうまく行っているようだった。今回は、ラプラシアン・フィルタを外してガボール・フィルタだけにしてみたが、白線が認識されているようだ。やはり、キャッシュをインバリデートしていなかったのが痛かった。

前回までは、ガボール・フィルタをかけてからラプラシアン・フィルタをかけていたが、今回は、ラプラシアン・フィルタをスルーにしてガボール・フィルタだけをかけてみよう。
wl_tracking_gabor_bm.c の 226行目の

lap_filter_axis_0[10] = (volatile uint32_t)1; // function_r, Lap_Filter IP ON

をコメントアウトして、下の行に

lap_filter_axis_0[10] = (volatile uint32_t)0; // function_r, Lap_Filter IP OFF

を追加した。
bf67b0cc.png


これでビルドして、ZYBO に書き込んだ。

ガボール・フィルタの左白線用パラメータの画像と右白線用パラメータの画像を取得する。
シリアル・ターミナルでは、一部のデータしか見ることができないので、cu コマンドでファイルに保存する。
最初に /ttyUSB1 の権限を変更した。
sudo chmod o+wr /dev/ttyUSB1

左白線パラメータでのガボール・フィルタのデータを
cu -s 115200 -l /dev/ttyUSB1 > gabor_left1_230110.txt
で取得した。
終了は ~. を入力した。

右白線パラメータでのガボール・フィルタのデータを
cu -s 115200 -l /dev/ttyUSB1 > gabor_right1_230110.txt
で取得した。
終了は ~. を入力した。

取得したテキスト・ファイルを bmp ファイルに変換する。(”テキスト・ファイルを画像ファイル(bmp ファイル)に変換するソフトウェアを作成する”を参照)
txt2bmp 実行ファイルを使用して、gabor_left2_230107.txt と gabor_right2_230107.txt を画像ファイル(bmp ファイル)に変換する。
./txt2bmp gabor_left1_230110.txt gabor_left1_230110.bmp
./txt2bmp gabor_right1_230110.txt gabor_right1_230110.bmp

bmp ファイルが生成された。
7598d0bf.png


ffc885a5.png


gabor_left1_230110.bmp と gabor_right1_230110.bmp を示す。
ラプラシアン・ファイルを更にかけるよりも、ガボール・フィルタだけのほうが綺麗な画像になっている。
bdff79f5.jpg

Zybot でガボール・フィルタを使用して白線間走行する11(アプリケーション・ソフトを更新してテスト)”で作成した gabor_left2_230107.txt と gabor_right2_230107.txt を画像ファイル(bmp ファイル)に変換するソフトウェアを作成し、変換した。

テキスト・ファイルを画像ファイル(bmp ファイル)に変換するソフトウェア txt2bmp.c を示す。

// txt2bmp.c
// 2023/01/08 by marsee

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <fcntl.h>
#include <stdint.h>
#include <string.h>

#include "bmp_header.h"

#define HORIZONTAL_PIXEL    800
#define VERTICAL_LINES      600

int main(int argc, char * argv[])
{
    BITMAPFILEHEADER bmpfh; // BMPファイルのファイルヘッダ
    BITMAPINFOHEADER bmpih; // BMPファイルのINFOヘッダ
    FILE *fbmpr, *fbmpw;
    uint8_t linet[200];
    uint8_t num_buf[10], c;
    uint32_t *bmp_data;
    uint8_t blue, green, red;

    // 引数の処理
    if (argc != 3) {
        fprintf(stderr, "txt2bmp <txt file name> <BMP file name>\n");
        exit(1);
    }

    // ピクセルを入れるメモリをアロケートする
    if ((bmp_data =(uint32_t *)malloc(sizeof(uint32_t) * (HORIZONTAL_PIXEL*VERTICAL_LINES))) == NULL){
        fprintf(stderr, "Can't allocate rd_bmp memory\n");
        exit(1);
    }

    // text ファイルをオープン
    if ((fbmpr = fopen(argv[1], "rt")) == NULL){
        fprintf(stderr, "Can't open %s by text read mode\n", argv[1]);
        exit(1);
    }

    // 書き込み bmp ファイルをオープン
    if ((fbmpw=fopen(argv[2], "wb")) == NULL){
        fprintf(stderr, "Can't open %s binary write mode\n", argv[2]);
        exit(1);
    }

    fscanf(fbmpr, "%s\n", linet);
    uint32_t line_num = (uint32_t)strlen(linet)/2;
    uint32_t limit_line = (HORIZONTAL_PIXEL*VERTICAL_LINES+(line_num-1))/line_num;
    fseek(fbmpr, 0, SEEK_SET); // ポインタ位置をファイルのはじめに戻す
    for (int i=0; i<limit_line; i++){
        fscanf(fbmpr, "%s\n", linet);
        uint32_t cline_char = (uint32_t)strlen(linet);
        for (int j=0; j<cline_char; j+=2){
            strncpy(num_buf, &linet[j], 2);
            num_buf[2] = '\0';
            sscanf(num_buf, "%x", (const char *)&c);
            bmp_data[i*line_num+j/2] = (c<<16)+(c<<8)+c;
        }
    }

    // BMPファイルのファイルヘッダに値を代入
    bmpfh.bfType = 0x4d42;
    bmpfh.bfSize = HORIZONTAL_PIXEL*VERTICAL_LINES*3+54;
    bmpfh.bfReserved1 = 0;
    bmpfh.bfReserved2 = 0;
    bmpfh.bfOffBits = 0x36;
    // BMPファイルのINFOヘッダに値を代入
    bmpih.biSize = 0x28;
    bmpih.biWidth = HORIZONTAL_PIXEL;
    bmpih.biHeight = VERTICAL_LINES;
    bmpih.biPlanes = 0x1;
    bmpih.biBitCount = 24;
    bmpih.biCompression = 0;
    bmpih.biSizeImage = 0;
    bmpih.biXPixPerMeter = 3779;
    bmpih.biYPixPerMeter = 3779;
    bmpih.biClrUsed = 0;
    bmpih.biClrImporant = 0;

    // BMPファイルヘッダの書き込み
    fwrite(&bmpfh.bfType, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfh.bfSize, sizeof(uint32_t), 1, fbmpw);
    fwrite(&bmpfh.bfReserved1, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfh.bfReserved2, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfh.bfOffBits, sizeof(uint32_t), 1, fbmpw);
    // BMPファイルのINFOヘッダの書き込み
    fwrite(&bmpih, sizeof(BITMAPINFOHEADER), 1, fbmpw);
    // bmp_dataの書き込み
    for (int y=0; y<bmpih.biHeight; y++) {
        for (int x=0; x<bmpih.biWidth; x++) {
            blue = bmp_data[((bmpih.biHeight-1)-y)*bmpih.biWidth+x] & 0xff;
            green = (bmp_data[((bmpih.biHeight-1)-y)*bmpih.biWidth+x] >> 8) & 0xff;
            red = (bmp_data[((bmpih.biHeight-1)-y)*bmpih.biWidth+x]>>16) & 0xff;

            fputc(blue, fbmpw);
            fputc(green, fbmpw);
            fputc(red, fbmpw);
        }
    }
    fclose(fbmpw);
    free(bmp_data);

    return 0;
}


~/ドキュメント/temp ディレクトリに gabor_left2_230107.txt と gabor_right2_230107.txt があるので、そこに txt2bmp.c と bmp_header.h をコピーした。
fe53ca5b.png


gcc を使ってコンパイルした。
gcc -o txt2bmp txt2bmp.c
ワーニングは出たが、txt2bmp 実行ファイルが生成された。
5676cdd4.png


txt2bmp 実行ファイルを使用して、gabor_left2_230107.txt と gabor_right2_230107.txt を画像ファイル(bmp ファイル)に変換する。
./txt2bmp gabor_left2_230107.txt gabor_left2_230107.bmp
./txt2bmp gabor_right2_230107.txt gabor_right2_230107.bmp

bmp ファイルが生成された。
cc17efed.png


生成された gabor_left2_230107.bmp と gabor_right2_230107.bmp を示す。
bmp ファイルの生成に成功した。
1934022c.jpg

↑このページのトップヘ