Zybot


Zybot の作製1(構想編)
Zybot を作製しようとしている。Zybot はZYBO を搭載した車といっても本物の車のサイズではなくミニカーの部類だ。
オリジナルのZybot はZYBO が1台でカメラも1台なのだが、作ろうと思っているのは、ステレオカメラを搭載したZybot になる予定だ。My Zybot はレーザー加工機でベースを作る予定なのだが、その前に1度オリジナルを作ってみようと思っている。
Zybot の作製2(組み立て1)
Zybot 組み立てマニュアルを参照して、Zybot を途中まで組み立ててみた。なお、これは、Zybot の仮組でとりあえずモーターを動かして、車を動かすのを目的とする。後で、独自のベースをレーザー加工機で作成する予定だ。
Vivado HLS で PWM モジュールIP を作ってみた
Zybot のモーターコントロール用Hブリッジ回路のPmodの Digilent PmodHB5 を制御するPWM モジュールIP をVivado HLS 2016.1 で作ってみた。
レジスタ設定用AXI4 Master IPを使用してVivado HLSで作ったPWM モジュールIPをシミュレーションした
”レジスタ設定用AXI4 Master IPをVivado HLS で作ってみた2”で作ったレジスタ設定用AXI4 Master IPを使用して、”Vivado HLS で PWM モジュールIP を作ってみた”で作ったPWM モジュールIPをシミュレーションしてみた。
レジスタ設定用AXI4 Master IPを使用してVivado HLSで作ったPWM モジュールIPをシミュレーションした2
前回は、PWMmodule の動作を確かめるために、レジスタ設定用AXI4 Master IPを使用して、PWM モジュールIPをシミュレーションしてみた。前回、auto-restart が動作するのを確認できたが、今回は、本命のauto-restart 動作中にPWM の幅の変更ができるのか?を確かめてみた。
PmodHB5 のセンサー・フィードバック処理IP を作ってみた
PmodHB5 のPWM 部分は”Vivado HLS で PWM モジュールIP を作ってみた”で完成したが、センサー・フィードバック・ピンの処理は作っていなかったので、作成する。
PmodHB5インター フェース回路 (PmodHB5_inf) の作成
PmodHB5: H-bridge Driver with Feedback Inputs のインターフェース回路を作成することにした。
今まで作ったPWM モジュールの”Vivado HLS で PWM モジュールIP を作ってみた”と”PmodHB5 のセンサー・フィードバック処理IP を作ってみた”を合わせたIP を作ろうということだ。
PmodHB5 用のIP として 2 つの関数を一緒にVivado HLS でIP 化するのは問題があると思う。
2つのモジュールが独立に動作するので、それぞれが終了するまで関数が終了しないため、連続に動作する必要があるPWMモジュールなどがあると動作がうまく行 かない。
Zybot の車輪が回転した
Zybot の車輪がVivado HLS で作ったPWMモジュールで回転した。
Vivado HLS で PWM モジュールIP を作ってみた2
”PmodHB5インターフェース回路 (PmodHB5_inf) の作成”でPWMモジュールのバグがわかったので、修正を行った。
PmodHB5 のセンサー・フィードバック処理IP を作ってみた2
PmodHB5 のセンサー・フィードバック処理IP motor_monitor.cpp などを修正した。
まずは、overflow 引数と return 値の両方で overflow を知らせているのは無駄なので、return 値で overflow を知らせることにして、overflow 引数は削除した。
PmodHB5 のセンサー・フィードバック処理IP を作ってみた3
どうもセンサー・フィードバックの値が安定しないと思ったら、アルゴリズムを間違っていた。 SA の値が最初に 0 の途中のときに値が少なくなってしまう。そこで修正を行った。今回は最初に値を保存してから、反転しているとスタートするようにした。
さらに、100MHz クロックでキャプチャすると速すぎるのではないか?と思った。1MHzくらいでサンプルしたい。
HDL だと 100MHz の 100 回に 1 回のイネーブルを出すことで、1MHz サンプルにできるが、C で書くとどうしたらよいか考えた。そこで、100 回足し算して、50 以上だった 1 と、50 未満だったら 0 と判定することにした。
Zybotの車輪のセン サー・フィードバックのデータを取得した
今回はPmodHB5 のセンサー・フィードバック・ピンのSA と SB から車輪の回転角速度を検出してみた。車輪の回転角速度を検出には、”PmodHB5 のセンサー・フィードバック処理IP を作ってみた3”で作ったPmodHB5 のセンサー・フィードバック処理IP を使っている。
ZybotのZYBOを Linuxで動作させる1(BOOT.bin, devicetree.dtb)
”Zybot の車輪が回転した”と”Zybotの車輪のセンサー・フィードバックのデータを取得した”で、PWMモジュールでモーターを制御して車輪を動かすのとそのモーターのホール 素子で回転数を取得することができた。今まではベアメタル・アプリケーションでやっていたので、これをLinuxに移行したい。それには、今までの ZYBO_0_2 の右目用のZYBO の方に制御システムを載せようと思っている。

Zybot が走った
”ZybotのZYBOをLinuxで動作させる1(BOOT.bin, devicetree.dtb)”でPWMモジュールIP やモーター・モニタIP を追加したハードウェアにしたBOOT.bin とデバイス・ツリーをSDカードに追加して、Linux を立ち上げることができた。
今回は、Ubuntu 上でPWMモジュールIP とモーター・モニタIP を制御するアプリケーション・ソフトウェアを作成して、Zybot を走らせてみることにする。
Zybot の走行試験
Zybotの走行試験を繰り返していますが、静止状態からPWM出力を 80% にしてしまうと、ZYBO の反応が無くなってしまいます。
Zybot のモーター・コントロール・アプリケーションの開発目標の覚書
Zybot のモーター・コントロール・アプリケーションの開発目標の覚書

Gabor FilterをZYBO_0_162_2 へ実装してみた
ガ ボール・フィルタ (Gabor Filter) による白線検出11(その他の道路写真での検証)”でZybot にカメラを搭載して、実際に撮影した画像でGabor Filter のパラメータを取得する必要があることが分かった。今回は、試しに”ガボール・フィルタ (Gabor Filter) による白線検出10(hls::LineBuffer と hls::Window を使用7)”でIP 化を行ったGabor FilterをZYBO_0_162_2をコピーした ZYBO_0_162_3 へ実装してみることにした。
Gabor FilterをZYBO_0_162_2 へ実装してみた2
前回は、ZYBO_0_162_3 フォルダのZYBO_0_153 プロジェクトのZYBO_0 ブロックデザインに Gabor_filter_lh を追加して配線した。そして、論理合成、インプリメントを行ったら、ガボール・フィルタでタイミングエラーが出てしまった。
今回は、Vivado HLS のSolution Settings で Clock Period を変更し、Cコードから合成して再IP 化を行って、Vivado でインプリメントした時のタイミングエラー解消を目指す。
Zybot にカメラを搭載して、白線を写してみた
Zybot にカメラを搭載して、白線を写してみた
Gabor FilterをZYBO_0_162_2 へ実装してみた3(devicetree.dtb の作成)
前回は、Vivado HLS のSolution Settings で Clock Period を変更し、Cコードから合成して再IP 化を行って、Vivado でインプリメントした時のタイミングエラー解消を解消し、Boot.bin を作った。今回は、VirtualBox 上のUbuntu 14.04 LTS で、DTS にガボール・フィルタのエントリを追加し、DTC でコンパイルして devicetree.dtb を作成する。
Gabor FilterをZYBO_0_162_2 へ実装してみた4(ZYBOで確かめた)
devicetree.dtb を生成することができたので、Boot.bin と devicetree.dtb を MicroSDカードのファースト・パーティションに書き込んで、ZYBO に入れてブートして確かめてみた。
Gabor FilterをZYBO_0_162_2 へ実装してみた5(ソフトウェアのソースコード)
前回は、ガボール・フィルタのソフトウェアを作って、ガボール・フィルタをテストしてみた。
今回は、それ用のソフトウェアを貼っておく。

Zybot のカメラ画像をBMPファイルに変換するアプリケーションを作成した
Zybot の白線の画像や白線検出した結果の画像をBMPファイルに変換するアプリケーションを作成した。
これで、白線の画像をGabor Filter で検出するときのパラメータを最適化することができる。

Zybot のカメラ画像でGabor Filterのパラメータを取得した
”Zybot のカメラ画像をBMPファイルに変換するアプリケーションを作成した”で、Zybot のカメラ画像を取得してBMPファイルに変換するアプリケーション・ソフトウェアを作成した。今回は、このアプリケーションで取得したZybot のカメラ画像からGabor Filterのパラメータを取得する。

Zybotの最初の白線検 出、走行プログラムの覚書
Zybot の最初の白線検出、走行プログラムの覚書を書いておく。
Zybot が白線の間を走るアプリケーション・ソフトウェアを作るのだが、どのように作れば良いか?最初に具合を検証するために作る。とりあえず、モーターの回転センサは未使用とす る。このソフトウェアを作ってどのように走るか見てみよう。

Zybot のカメラ画像でGabor Filterのパラメータを取得した
”Zybot のカメラ画像をBMPファイルに変換するアプリケーションを作成した”で、Zybot のカメラ画像を取得してBMPファイルに変換するアプリケーション・ソフトウェアを作成した。今回は、このアプリケーションで取得したZybot のカメラ画像からGabor Filterのパラメータを取得する。
Zybot のカメラ画像でGabor Filterのパラメータを取得した2(gabor_filter_lh プロジェクト)
前回は左白線検出用、右白線検出用のGabor Filterのパラメータを取得し、加工した。今回はその加工したパラメータをVivado HLS のgabor_filter_lh プロジェクトに入れてみた。
Zybot のカメラ画像でGabor Filterのパラメータを取得した3(Zybotでテスト)
前回はパラメータを取り直したガボール・フィルタのIP 化を行った。今回は、ガボール・フィルタIP をZYBO_0_162_3 フォルダのVivado プロジェクトの既存のガボール・フィルタIP と交換して論理合成、インプリメント、ビットストリームの生成を行った。

Zybot による白線間の自動走行1(Gabor fillter の修正、C ソースコード)
今回は、左白線検出、右白線検出を交互に行うので、どのような C ソースコードにしようか?と思ったが、一番確実なのは、左白線検出パラメータと右白線検出パラメータで 2 回ガボール・フィルタをかければよいだろうということになった。
入力引数の RorL のビット幅を 1 bit から 2 bit に増やして「L_R_WEIGHT」というモードを増やした。
Gabor_filter_lh_2() 関数は、2回ガボール・フィルタを行うように変更した。「L_R_WEIGHT」を RorL 引数にセットすると、1回目は左白線検出、2回目は右白線検出を行う。
今回はC ソースコードを貼っておこう。
Zybot による白線間の自動走行2(Gabor fillter の修正、Vivado HLS)
前回は左白線検出と右白線検出を交互にできるように修正したガボール・フィルタのソースコード を貼った。今回は、Vivado HLS 2016.2 での結果を書いておく。
Zybot による白線間の自動走行3(実機テスト)
前回は、左白線検出、右白線検出を画像フレームごとに交互に繰り返すガボール・フィルタをIP 化した。今回は、それをVivado 2016.2 のIP として、回路に加えた。問題が発生した。

Zybotのカメラによる白 線追従走行
Zybot の白線検出、追従走行のアプリケーション・ソフトウェアを作って、白線追従走行させてみました。

Zybot で Gabor filter を使う際のDMA Write IP
”Zybotのカメラによる白線追従走行”では、Gabor filter をソフトウェアで 250 ms ごとに切り替えていた。これは、500 ms に1回 Gabor filter の画像が取得できることを表している。この時間を短くしたいということで、AXI VDMA をVivado HLS 2016.2 で作成したDMA Write IP に差し替えようと思う。つまり、ハードウェアで自動的に左右のGabor filter を切り替えて、異なるアドレスのフレームバッファに書き込むことにしよう。
Zybot で Gabor filter を使うためのZYBO_0_5 プロジェクト1
”Zybot で Gabor filter を使う際のDMA Write IP”で作ったDMA Write IP とGabor_Filter_lh IP を使用することにする。ZYBO_0_3 プロジェクトをコピーしてZYBO_0_5 プロジェクトとした。ZYBO_0_5 プロジェクトのAXI VDMA をDMA Write IP と入れ替えた。さらに、Gabor_Filter_lh IP を更新した。
Zybot で Gabor filter を使うためのZYBO_0_5 プロジェクト2
前回は、論理合成、インプリメント、ビットストリームの生成を行った。今回は、ハードウェアを エクスポートして、SDKを立ち上げ、アプリケーションソフトを作成して、ZYBO でテストする。
Zybot で Gabor filter を使うためのZYBO_0_5 プロジェクト3
前回は、、ハードウェアをエクスポートして、SDKを立ち上げ、アプリケーションソフトを作成 して、ZYBO でテストしてうまく行った。これは、ベアメタル・アプリケーションだったので、今回は、BOOT.bin と devicetree.dtb を作成する。
Zybot で Gabor filter を使うためのZYBO_0_5 プロジェクト4(実機確認)
前回は、BOOT.bin と devicetree.dtb を作成した。今回は、アプリケーションを作成してZYBO 実機でテストしてみた。
Zybot で Gabor filter を使うためのZYBO_0_5 プロジェクト5(走行テスト)
今日はZybot で白線追従走行用ソフトウェアの wl_tracking_dmaw.c をコンパイルして、Zybot を走らせてみた。
前よりは追従性が上がったようだが、カーブ手前で曲がり始めてしまう気がした。反応が速くなっ たのは良いのだが、白線追従走行用ソフトウェアのチューニングは必要だ。

Zybot で隊列走行をさせたい(妄想編)
Zybot をもう1台作成して隊列走行をさせてみたい。
Zybot の後ろにマーカーを置いておいて、そのマーカーを見ながら画像の真ん中に来るように走行制御すればよいのだろうか?
距離はとりあえず超音波距離センサをつけることにした。

Vivadoを使用して ZYBO_0_163_6フォルダのプロジェクトにRGB2HSV IPを追加1
前回は、RGB2HSVの合成結果について考察した。今回は、Vivado HLS 2016.3 で 800 x 600 ピクセルの解像度に切り替えて、RGB2HSV をC コードから合成してから、IP 化を行う。そのRGB2HSV IP をZYBO_0_163_6 フォルダのVivado 2016.3 プロジェクトに追加する。
Vivadoを使用して ZYBO_0_163_6フォルダのプロジェクトにRGB2HSV IPを追加2(SDK)
前回はVivado 2016.3 のバグに悩みながらもRGB2HSV IP をZYBO_0_163_6 フォルダのプロジェクトに追加して、論理合成、インプリメント、ビットストリームの生成を行うことができた。
今回は、SDKを起動してアプリケーション・ソフトウェアを作成して、RGB2HSV IP を使ってみよう。
Vivadoを使用して ZYBO_0_163_6フォルダのプロジェクトにRGB2HSV IPを追加3(SDK2)
前回はRGB2HSV IP のドライバがSDKのハードウエア プラットフォームに入っていなかった。今回はRGB2HSV IP のドライバをSDKのハードウエア プラットフォームに入れてみることにした。
Vivadoを使用して ZYBO_0_163_6フォルダのプロジェクトにRGB2HSV IPを追加4(RGB2HSV)
”Vivado 2016.2 からVivado 2016.3 へアップグレード”でVivado 2016.3 にアップグレードできた。
今回は、HSV2RGB変換をARMプロセッサで動作するソフトウェアとして実装して結果を確 認し、次にHSV2RGB変換時にS = V = 255 としてH を変換して結果を確認した。
Vivadoを使用してZYBO_0_163_6フォルダのプロジェクトにRGB2HSV IPを追加5(Ubuntuでの動作)
前回はSDK でHSV からRGB に変換するソフトウェアや、H はそのままで、S と V を最高値としたときにRGB に変換するソフトウェアを作成した。今回はUbuntu 上でRGB2HSV 変換IP を入れたBOOT.bin やdevicetree.dtb で動作を確かめた。
Vivadoを使用して ZYBO_0_163_6フォルダのプロジェクトにRGB2HSV IPを追加6(UbuntuでRGB2HSVを試す)
前回は、BOOT.bin や devicetree.dtb を作成して、SDカードに書き込み、ZYBOに挿入して電源ONした。Ubuntu が起動して、それ上でカメラの動作を確認できた。今回は、RGB2HSV IP を使うアプリケーション・ソフトウェアを作成して、RGB2HSV変換を行った。


MT9D111をコードを伸 ばしてステレオ・カメラにする1(I2Cのプルアップ抵抗)
Zybot にMT9D111 カメラ・モジュールを搭載しているが、インターフェース基板をZYBO に直付けしている。ステレオ・カメラにするためには、延長コードをつけてカメラ・モジュールを 15 cm 程度延ばす必要がある。
MT9D111をコードを伸 ばしてステレオ・カメラにする2(SCL, SDAの波形計測)
今回は、SCL, SDAの波形をオシロスコープで計測した。測定ポイントはコードを延ばした先のカメラ・インターフェース基板のコネクタ部分だ。
MT9D111をコードを伸 ばしてステレオ・カメラにする3(I2CリピータIO付きカメラ・インターフェース基板)
秋月電子のI2C リピーターIC の PCA9515AD を使ったカメラ・モジュールのインターフェース基板をKiCad で作成した。
I2CリピータIC を実装しない場合は、R1, R2 に 0 Ω抵抗を実装してZYBO とMT9D111 のカメラ・モジュールのSCL とSDA を直結する。つまり、R1, R2 と U1, R3, R4 は排他的に実装する。
MT9D111をコードを伸 ばしてステレオ・カメラにする3(SCL, SDAの波形計測2)
前回はZYBOから 15 cm 程度の延長コードを使用して、MT9D111のカメラ・インターフェース基板に接続し、カメラの表示を試みたが、I2Cが通らずにうまく表示することができなかった。使用 している延長コードはDigilent 社の2x6 Pin to Dual 6-pin Cable なのだが、そこにノイズが乗っているようなのだ。そこで、2つの方法を試した。
MT9D111をコードを伸 ばしてステレオ・カメラにする4(AXI IICの設定)
MT9D111に延長コードを接続すると、I2C が通らないという問題におるさんやくりさんから、延長コードをつけたことによってSCL が 1 の間に SDA の値を確定させておくというI2C の規格に違反してしまっているのでは?というアドバイスを頂いた。(おるさんのコメント、くりさんのコメント)コメントありがとうございました。
MT9D111をコードを伸 ばしてステレオ・カメラにする5(AXI IICの出力を遅延する)
前回はAXI IIC IP のSDA Inertial delay 設定を入れて、出力が遅延すると思ったのだが、それは勘違いだった。今回は、Synchronizerを入れてAXI IIC の出力を遅延してみた。
MT9D111をコードを伸ばしてステレオ・カメラにする6(I2CリピータIO付きカメラ・インターフェース基板が届いた)
今日、部品を実装して試してみたところ、ZYBOの電源が入りません。カメラを除いてカメラ・ インターフェース基板だけで、ZYBOの電源を入れたらI2Cリピーターから煙が出てきました。慌てて、電源をOFFして、基板のパターンを見たら、電源と GNDのパターンが入れ替わっていました。つまり電源とGNDが逆でした。orz
今日、カメラ・インターフェース基板の修正版をFusionPCBに注文しました。

2台の Zybot での隊列走行1(構想編)
今まで作ってきたRGB2HSV変換IP を使って、2台のZybot で隊列走行をさせたいと思う。それではどのようにやるか?を検討していこう。
2台の Zybot での隊列走行2(先頭のZybotのアプリケーション)
”Vivadoを使用してZYBO_0_163_6フォルダのプロジェクトにRGB2HSV IPを追加6(UbuntuでRGB2HSVを試す)”でRGB2HSV変換 IP をZYBO のPL に入れたプラットフォームを使用してUbuntu 14.04 を起動してRGB2HSV変換を試すことができた。それで、隊列走行をやってみたい。
まずは、自律走行する先頭Zybot のアプリケーションを作ることにした。
2台の Zybot での隊列走行3(追従用Zybotの戦略)
前回、隊列走行の前走車のアプリケーションはできた。今回は追従用Zybot の戦略を考えた。
2台の Zybot での隊列走行4(追従走行用アプリケーションの作成1)
前回は、追従用Zybot の戦略を考えたが、今回はそれに基づいて追従走行用アプリケーション・ソフトウェアを作成し、認識テストを行った。写真多数。
2台の Zybot での隊列走行5(追従走行を試してみた)
前回は、追従走行用アプリケーション・ソフトウェアを作成し、認識テストを行った。今回は、実 際に2台の Zybot を使用して追従走行を試してみた。動画あり。

Zybot に超音波距離センサを搭載する1(概要)
「2台の Zybot での隊列走行5(追従走行を試してみた)」で曲がりなりにも 2 台の Zybot で隊列走行ができるようになった。その際に前走車の走り方によっては隊列走行が崩れる時がよくある。そこで、カメラの画角から外れてしまっても、追従車は予測で走れるよう にしたいのだが、何か物体があったらぶつかってしまう。そこで、ぶつからないように超音波距離センサをつけたいと思う。
Zybot に超音波距離センサを搭載する2(Arduino でセンサをテストする)
「パララックス社超音波距離センサモジュールで距離を計る(2)」のArduino を使ったテストをやってみた。
Zybot に超音波距離センサを搭載する3(Vivado HLSでインターフェースIPを作製)
前回はArduino を使用して秋月電子の「パララックス社超音波距離センサーモジュール」を使ってみた。今回は、「パララックス社超音波距離センサーモジュール」を使うためのインターフェー スIP をVivado HLS で作製した。
超音波距離センサ・インター フェースIP の番外編
”Zybot に超音波距離センサを搭載する3(Vivado HLSでインターフェースIPを作製)”で作製した超音波距離センサ・インターフェースIP を使うことにしたが、もっと違った方法試してみようと思う。
具体的には、トリガパルスもsensor_in から読み込んで、2つ目の距離パルスをカウントする方法を試してみたい。そのためには最初からsensor_in をモニタする必要がある。方法としては、トリガパルスを出す回路とsensor_in からパルス長を計測する回路を並列に動作させたい。そのためにその2つを関数として実装して、トップにDETAFLOW 指示子を付加することにした。
sensor_out と sensor_out_en の for 文が終わったところで「x」になってしまっているようだ。
距離パルスが不定なので、sensor_out と sensor_out_en の for 文の長さを合わせることはできない。よってこの実装を使用することは無理そうだと思う。
Zybot に超音波距離センサを搭載する4(ussensor_iobuf IP の作製)
前回はVivado HLS で超音波距離センサのIP を作った。Vivado HLS では入出力ポートは作れないので、IOBUF をIP に追加する必要がある。今回は、IOBUF をIP(ussensor_iobuf) として作成した。
Zybot に超音波距離センサを搭載する5(usonic_sensor_inf IP の作製)
”Zybot に超音波距離センサを搭載する4(ussensor_iobuf IP の作製)”で作ったussensor_iobuf IP とVivado HLS で作ったultrasonic_sensor_inf IP を IP として統合したが、IP の名前がおかしくなって、論理合成できなくなり、うまく行かなかった。そこで、Vivado HLS で作ったultrasonic_sensor_inf IP のVerilog HDL コードにトップのVerilog HDL コードを追加して、IOBUF をインスタンスしてIP 化した。
Zybot に超音波距離センサを搭載する6(ZYBO_0_162_7 に usonic_sensor_inf IP を追加)
前回は usonic_sensor_inf IP を作製した。今回は、usonic_sensor_inf IP をZYBO_0_162_7 のブロックデザインに追加して、論理合成、インプリメント、ビットストリームの生成を行った。
Zybot に超音波距離センサを搭載する7(ZYBO_0_162_7 に 2 つのIP を追加)
前回はうまく行ったと思ったのだが、SDKで Vivado HLS 2016.3 の Ultrasorinc_sensor_inf IP のドライバがどうしても使えなかった。それで今回は順当にVivado HLS 2016.3 の Ultrasorinc_sensor_inf IP とussensor_iobuf IP をZYBO_0_162_7 フォルダのプロジェクトのブロックデザインに追加して、論理合成、インプリメント、ビットストリームの生成を行った。
(2016/12/16 : 追記)この回路で距離の測定をすることができたのですが、たまに動作を停止してしまいました。原因はsensor_in にシンクロナイザが入っていないことでした。詳しくは、”Zybot に超音波距離センサを搭載する8(ZYBO_0_162_7 に 2 つのIP を追加2)”をご覧ください。
Zybot に超音波距離センサを搭載する8(ZYBO_0_162_7 に 2 つのIP を追加2)
前回はVivado HLS 2016.3 の Ultrasorinc_sensor_inf IP とussensor_iobuf IP をZYBO_0_162_7 フォルダのプロジェクトのブロックデザインに追加して、論理合成、インプリメント、ビットストリームの生成を行った。
今回は、SDKでアプリケーション・ソフトウェアを作成して、ZYBO でテストを行った。
Zybot に超音波距離センサを搭載する9(IP のUIO番号を確認)
前回は、超音波距離センサ・インターフェースIP が完成して、SDKからベアメタル・アプリケーションで動作を確認した。今回は、BOOT.bin と devicetree.dtb を作成して、SDカードに書き込み、ZYBO で UIO としての動作を確認した。
Zybot に超音波距離センサを搭載する10(Zybot に取り付けた)
前回までで、超音波距離センサ・インターフェースIP の動作が確認できて、Linux のUIO ドライバを使えるように設定した。今回は、Zybot に超音波距離センサを搭載して、Linux 上で動作を確認した。

I2Cリピーター付きカメ ラ・インターフェース基板2が来ました
新しいI2Cリピーター付きカメラ・インターフェース基板2を11月18日に頼んで、今日届き ました。レジストの色は同じ値段で選べるようになったので、黄色にしました。
Zybot をステレオカメラにする1(カメラ・インターフェース基板の実装とテスト)
”I2Cリピーター付きカメラ・インターフェース基板2が来ました”で届いた基板に部品を実装 してZYBO に延長ケーブルを付けてテストしてみた。
うまく表示出来て、ステレオカメラにすることができるようになった。
Zybot をステレオカメラにする2(カメラ・マウントの作製)
ずいぶんと間が空いてしまったが、前回新しくI2Cリピーター付きのカメラ・インターフェース 基板を作って、延長ケーブルを付けてカメラが正常に写った。今回は、カメラを付けたカメラ・インターフェース基板を搭載できるカメラ・マウントのモデルを3D CADで作成し、3Dプリンタで作製した。
Zybot をステレオカメラにする3(Zybot 改造中)
Zybot をステレオカメラに改造中です。
ZYBO を2枚搭載して、それぞれにカメラを付けてZYBO 同士のHDMI コネクタをケーブルで接続しました。片方ZYBO のカメラの画像をもう一方のZYBO に転送して、以前、やっていたステレオカメラにします。

Zybotの障害物検知と回 避1(超音波距離センサの性能)
Zybotの障害物検知と回避で使用するために、超音波距離センサの指向性を計ってみた。
Zybot による障害物回避
Zybot による障害物回避が曲がりなりにもできた。動画あり。


白線追従走行用畳み込みニューラルネットワーク・システムの製作1
”dmar4resize_gray, resize_gray, straight_conv_nn2_axis2 をVivado HLS 2017.2 で IP化”でIP が揃ったので、白線追従走行用畳み込みニューラルネットワーク・システムの製作を行うことにした。
これは、白線追従走行用畳み込みニューラルネットワークを搭載して、カメラ画像から進む方向 (左旋回、直進、右旋回)を決定し、モーターを駆動して、ミニ・ロボットカーに白線間を走行させるシステムである。
白線追従走行用畳み込み ニューラルネットワーク・システムの製作2
前回は、”dmar4resize_gray, resize_gray, straight_conv_nn2_axis2 をVivado HLS 2017.2 で IP化”でIP が揃ったので、白線追従走行用畳み込みニューラルネットワーク・システムの製作を行ったが、straight_conv_nn2_axis2 でタイミングエラーが発生してしまった。今回は、straight_conv_nn2_axis2 のタイミング制約を厳しくして、Vivado HLS 2017.2 で再合成する。
白線追従走行用畳み込み ニューラルネットワーク・システムの製作3(SDK)
前回は白線追従走行用畳み込みニューラルネットワーク・システムのハードウェアが完成した。今 回は、SDKを使用して、カメラ画像をディスプレイに表示するアプリケーションソフトを起動して、ハードウェアがとりあえず正しく動作するか?を確かめてみよ う。
白線追従走行用畳み込み ニューラルネットワーク・システムの製作4(BOOT.binとデバイスツリー)
前回は、SDKでアプリケーションソフトを作成してカメラ画像が表示できることが確認できた。 今回は、SDK でFSBL を作成してから、BOOT.bin を作成した。そして、デバイスツリーのソースをUbuntu 上でコンパイルして devicetree.dtb を作成し、ZYBO のMicro SD カードに書き込んで、/sys/devices/amba.0 以下のディレクトリを確認した。
白線追従走行用畳み込み ニューラルネットワーク・システムの製作5(実機で確認)
前回は、BOOT.bin と devicetree.dtb を作成して、ZYBO でUbuntu を立ち上げ、デバイスが見えるかどうか?を確かめた。今回は、SDKを使用したベアメタル・アプリケーションで、実際に白線追従走行用畳み込みニューラルネットワークが動 作するかどうか?を確かめる。
白線追従走行用畳み込み ニューラルネットワーク・システムの製作6(実機で確認2)
前回は、白線追従走行用畳み込みニューラルネットワークが動作しているかどうか確認するために 各出力の値を出力するように、Vivado HLS プロジェクトの straight_conv_nn2_axis3 を変更した。今回は、Vivado HLS プロジェクトの straight_conv_nn2_axis3 を変更したのだが、関数名は straight_conv_nn2_axis2 にしてあるので、今までのstraight_conv_nn2_axis2 IP と入れ替えることができるので、入れ替えて、ZYBO_0_172_8 フォルダのVivado プロジェクトでビットストリームの生成を行って、実機で試してみよう。
白線追従走行用畳み込み ニューラルネットワーク・システムの製作7(白線間を走行)
前回は、SDKで進む方向を表示するアプリケーションソフトを製作して、問題がないことを確か めた。今回は、ZYBO のUbuntu 14.04 上でアプリケーションソフトを作り、白線間を走行させる。

ZYBOtを製作した
昨日、家用ZYBOtを製作した。
まだ、「SODIAL(R)5ペア EC5バナナプラグ ブレットコネクタメス+オスRC ESC LIPOバッテリー/モータ」が来ていないので、モーターをドライブする+12V 用のコネクタが来ていないので、+12V 系は接続できていない。
ZYBOt のコースを作った
昨日はZYBOt のコースを作った。
「サイドパーツ付きジョイントマット 32枚セット」に「ヤマト ビニールテープ 38mm幅 5巻 NO200-38-5-5PR 白」で白線を引いた。白線の中心同士の間隔は 28 cm とした。
ZYBOt用のMicro SDカードを作成
ZYBOt 用のMicro SDカードを作成している。
今までは、古いLinux Kernel 3.xx を使っていたが、ikwzm さんの”FPGA+SoC+Linux+Device Tree Overlay+FPGA Region(ブートイメージの提供)”に移行することにした。
白線追従用CNNを使用した ZYBOtの白線追従走行1(準備編)
”ZYBOt用のMicro SDカードを作成”でZYBOt 用のDebian を起動するMicro SD カードを作成することができた。今回は、デバイスツリーやビットストリーム、ZYBOt を走らせるためのアプリケーションソフトの用意をして、デバイスドライバをロードしてみよう。
ikwzm さんの fclkcfg による Zynq のPS の fclk の設定
前回は、デバイスツリー・ソース・ファイルを書いて、ビットストリームのFPGAへのロードや UIO の設定、udmabuf のロード、fclk の設定を行ったが、fclk の設定値が想定していた値と違ってしまった。
これは、ikwzm さんにお聞きしたところ、fclk1 などのClock Source が違っていたからということだった。Clock Source には、ARMPLL、DDRPLL、IOPLL の3種類あるが、どれを選ぶかで、周波数の設定値に対して、実際の値の偏差が発生するかどうか?が決まる。
このfclkcfg のバージョンでは、デバイスツリーのロード時にClock Source を変更することはできないので、u-boot 時にClock Source を変更するということだ。なお、現在のfclkcfg (fclkcfg-4.14.34-armv7-fpga_1.1.0-1_armhf.deb)では、デバイスツリーにClock Source を書くことができるので、後でやってみよう。
ikwzm さんの fclkcfg による Zynq のPS の fclk の設定2
前回は、ZYBO_BOOT つまり、ブート用のFAT32 フォーマットのMicro SD カードのパーティションで、uEnv.txt (u-boot の設定ファイル)を編集して、各 fclk の Clock Source を設定した。そのため、デバイスツリーで fclk を設定したときに正しい値を設定することができた。
今回は、新しく ikwzm さんにバージョンアップして頂いた新しい fclkcfg (fclkcfg-4.14.34-armv7-fpga_1.1.0-1_armhf.deb)を使用して、デバイスツリーから Clock Source を変更することができるかどうか?を確かめる。
白線追従用CNNを使用したZYBOtの白線追従走行2(準備編2)
”ikwzm さんの fclkcfg による Zynq のPS の fclk の設定2”でデバイスツリーからPS の fclk のClock Source を変更できるようになって、クロック周波数の設定がうまく行くようになった。
そこで、wl_tracing_cnn を起動して動作するかどうか?を確認してみよう。
白線追従用CNNを使用した ZYBOtの白線追従走行3(走行テスト)
昨日、テスターが来て、配線チェックをしたのだが、PMOD HB5の配線ミスが見つかった。修正してwl_tracing_cnn を走らせたところ、ZYBOt は走った。しかし、カーブが曲がれない。良い感じに曲がるところもあるのだが、特に鋭角には曲がれない。
ZYBOt のコースの写真撮影用アプリケーションソフトの開発
ZYBOt の白線間走行テストを”白線追従用CNNを使用したZYBOtの白線追従走行3(走行テスト)”でやってみたが、あまりうまくコースを走ることができなかった。そこで、 コースの写真を撮って再度学習を行うことにした。そのためには、写真をBMP ファイルにするアプリケーションソフトが必要だ。
ZYBOt の学習用写真を取った(左回りコース)
日曜日にZYBOt の学習用写真を取った。
”ZYBOt のコースを作った”で作ったコースをとりあえず左回りで 1 周分の写真を取った。写真を取るために、”ZYBOt のコースの写真撮影用アプリケーションソフトの開発”で開発した cam_capture_bmp を使用した。当然ながら、ZYBOt のカメラで撮影したわけだ。この写真は右に行くか、左に行くか、直進するか?を決めるCNNの学習に使用する。
ZYBOt の学習用写真を取った(右回りコース)
前回は左回りコースの写真を撮影したが、今回は、右回りコースの写真を撮影した。
ZYBOt の学習用画像を増やす
前回、ZYBOt の学習用画像が取れたが、それでは枚数が足りないため、 imagemagic を使ってバッチ・ファイルを起動して、画像を増やしていて、18倍に増やす。
コントラストを強めたり、弱めたり、ぼかしたり、画像のガンマ値を変更したり、ノイズを加えたりして増やしている。
ZYBOt の学習用画像ファイルの作成(トレーニング・ファイルとラベル・ファイル)
”ZYBOt の学習用画像を増やす”で学習用画像ファイルとテスト用画像ファイルを増やした。今回は、その学習用画像ファイルを使用して、MNISTデータセットと同じフォーマットで トレーニング・ファイルとラベル・ファイルを生成しよう。
ZYBOt の学習用画像のトレーニング・ファイルのチェック
前回は、学習用画像ファイルを使用して、MNISTデータセットと同じフォーマットでトレーニ ング・ファイルとラベル・ファイルを生成した。今回は、その内のトレーニング・ファイルが正しいかどうか?を確かめてみよう。
ZYBOt のテスト用画像ファイルの作成(テスト・ファイルとラベル・ファイル)
前回までで学習用画像ファイルの用意が出来たので、今回は、テスト用画像ファイルのテスト・ ファイルとラベル・ファイルを作成する。
ZYBOt のコースをKeras で学習した
今まで作ってきたトレーニング・ファイルやラベル・ファイル、テスト・ファイルやラベル・ファ イルを使用して、Keras で学習させた。
ZYBOt の白線間走行用CNNをVivado HLS 2018.2 で試しに実装した
前回は、今まで作ってきたトレーニング・ファイルやラベル・ファイル、テスト・ファイルやラベ ル・ファイルを使用して、Keras で学習させ、重みやバイアスをC ヘッダ・ファイルに出力した。今回は、その重みやバイアスのC ヘッダ・ファイルを使用してVivado HLS 2018.2 でプロジェクトを作成して、量子化ビット長を設定し、C シミュレーションとC コードの合成を行う。
ZYBOt の白線間走行用CNNをVivado HLS 2018.2 でIP化1
まずは、”Kerasで学習した重みとバイアスを使用した白線間走行用CNNをIPにする1” と”Kerasで学習した重みとバイアスを使用した白線間走行用CNNをIPにする2”を参照して、Vivado HLS 2018.2 の course_conv_nn2_axis3_k プロジェクトを作成した。
ZYBOt の白線間走行用CNNをVivado HLS 2018.2 でIP化2
前回は、DMA 付きのZYBOt の白線間走行用CNNのC シミュレーションとC コードの合成を行った。今回は、C/RTL 協調シミュレーションとExport RTL を行って、IP 化する。
ZYBOt の白線間走行用CNNを含んだVivado 2018.2 プロジェクト1
”ZYBOt の白線間走行用CNNをVivado HLS 2018.2 でIP化2”で作製した白線間走行用CNN IP を”Kerasで学習した重みとバイアスを使用した白線間走行用CNNのVivado プロジェクト1”の curve_conv_nn2_axis3 _0 を消去して、今回作成した course_conv_nn2_axi3 を Add IP した。
ZYBOt の白線間走行用CNNを含んだVivado 2018.2 プロジェクト2
前回は、白線間走行用CNNを course_conv_nn2_axi3 に変更してVivado プロジェクトを論理合成、インプリメンテーションしたが、タイミングエラーになってしまった。今回は、Vivado HLS に戻ってIP を再合成して、タイミングエラーを解消しよう。
ZYBOtを家のコースで走 らせてみた
”ZYBOt の白線間走行用CNNを含んだVivado 2018.2 プロジェクト2”でビットファイルが生成できた。
生成されたビットファイルを”白線追従用CNNを使用したZYBOtの白線追従走行1(準備編)”を参考にして、fpga-bit-to-bin.py を使用して、ZYBO_0_wrapper.bit を ZYBO_0_wrapper.bin に変換した。
それなりにコースを走れてはいるが、コースを外れてしまう。学習が良くなかったかもしれない?手前から曲がるように学習させてしまったかもしれない?
1回カーブを曲がるようなときはごまかしが効くが、複雑なコースを走るときにはごまかしが効かない。ごまかしというのは
私が操縦してラジコンのように走れせて、それをZYBOt に学習させたほうが良いのではないか?と思う。

Zybot のモーターの回転数と回転方向を取得する1
今回、Zybot のFPGA ボードをUltra96 に変更するにあって、ギアボックス付きモーター回転数と回転方向を取得したい。
以前、Vivado HLS で作ったのだが、いまいち精度が出ていない気がするので、HDL で作り直すことにした。


inserted by FC2 system