Armadilloフォーラム

Armadillo-810でUSBモニタ(Displaylink)に表示

sugar_hagi

2014年12月10日 16時47分

お世話になります。佐藤と申します。
OpenCVの画像処理結果を mjpg_streamerではなく、USBモニタに表示させたいと考えております。

ユーザーズサイトの at_kazutaka.bitoさんのブログ(https://users.atmark-techno.com/blog/615/818) に掲載されています 「Armadillo-810でUSBモニタに表示」 を参考に、USBモニタをフレームバッファとして使用しようとしているのですが、書かれているように /dev/fb* として認識されません。
アドバイスいただけませんでしょうか。

状況としては、Displaylink USB Framebuffer support を有効にしたカーネルにてArmadillo-810を起動し、USBモニタ(I-O DATA製 LCD-USB10XB-T)を接続しますとCUIには下記のように表示されます。
----------------------------------------
[root@armadillo810-0 (ttySC2) ~]# usb 1-1.2: new high-speed USB device number 4 using rmobile-ehci-driver
hub 1-1.2:1.0: USB hub found
hub 1-1.2:1.0: 4 ports detected
usb 1-1.2.3: new high-speed USB device number 5 using rmobile-ehci-driver
scsi0 : usb-storage 1-1.2.3:2.0
usb 1-1.2.4: new full-speed USB device number 6 using rmobile-ehci-driver
input: eGalax Inc. USB TouchController as /devices/platform/rmobile-ehci-driver/usb1/1-1/1-1.2/1-1.2.4/1-1.2.4:1.0/input/input0
input: eGalax Inc. USB TouchController as /devices/platform/rmobile-ehci-driver/usb1/1-1/1-1.2/1-1.2.4/1-1.2.4:1.0/input/input1
generic-usb 0003:0EEF:0001.0001: input: USB HID v2.10 Pointer [eGalax Inc. USB TouchController] on usb-rmobile_ehci-1.2.4/input0
scsi scan: INQUIRY result too short (5), using 36
scsi 0:0:0:0: CD-ROM PQ: 0 ANSI: 0
----------------------------------------

dev の中を見ると、fb0 はありますがfb1がありません。(fb0はUSBモニタを接続しなくても見つかりますので、USBモニタはfb1なのだろうという認識でおります。)
カーネルコンフィグレーションの変更以外に必要とされることがあるのでしょうか?

コメント

at_kojiro.yamada

2014年12月11日 18時51分

LCD-USB10XB-TがDisplayLinkモニタとして認識されていないのかもしれません。

添付の usb_modeswitch を用いて、以下のコマンドを実行すると
モニタとして認識されないでしょうか?

[root@armadillo810-0 (ttySC2) ~]# unzip usb_modeswitch.zip
Archive:  usb_modeswitch.zip
   creating: usb_modeswitch/
  inflating: usb_modeswitch/usb_modeswitch
  inflating: usb_modeswitch/libusb-1.0.so.0
[root@armadillo810-0 (ttySC2) ~]# ls
usb_modeswitch/     usb_modeswitch.zip
[root@armadillo810-0 (ttySC2) ~]# cd usb_modeswitch/
[root@armadillo810-0 (ttySC2) ~/usb_modeswitch]# cp libusb-1.0.so.0 /usr/lib/
[root@armadillo810-0 (ttySC2) ~/usb_modeswitch]# lsusb
  # LCD-USB10XB-T の VID, PIDを確認
[root@armadillo810-0 (ttySC2) ~/usb_modeswitch]# ./usb_modeswitch -v "VIDを指定" -p "PIDを指定" -u 1

■usb_modeswitch のビルド方法

添付ファイルに含まれる usb_modeswitch は、
以下の手順でビルドしています。
ビルドは、atde5-amd64-20140131上で行なっています。

USB_ModeSwitch - Handling Mode-Switching USB Devices on Linux
http://www.draisberghof.de/usb_modeswitch/

[ATDE5 ~]$ wget http://www.draisberghof.de/usb_modeswitch/usb-modeswitch-2.2.0.tar.bz2
[ATDE5 ~]$ tar xvf usb-modeswitch-2.2.0.tar.bz2
[ATDE5 ~]$ cd usb-modeswitch-2.2.0
[ATDE5 ~/usb-modeswitch-2.2.0]$ vi Makefile
Makefile を編集
---------------------------------------------------------------------------
-CC          ?= gcc
+CC          = arm-linux-gnueabihf-gcc
-LIBS        = `pkg-config --libs --cflags libusb-1.0`
+LIBS        = `arm-linux-gnueabihf-pkg-config --libs --cflags libusb-1.0`
---------------------------------------------------------------------------
 
[ATDE5 usb-modeswitch-2.2.0]$ make

■usb_modeswitch の実行方法

usb_modeswitch の実行には libusb-1.0.so が必要ですので、
以下のファイルをATDE5からArmadilloにコピーしておきます。

/usr/arm-linux-gnueabihf/lib/libusb-1.0.so.0

■参考情報

Atelier Orchard
Raspberry Pi でDisplayLinkのudlfbドライバを使う
http://atelier-orchard.blogspot.jp/2013/11/raspberry-pi-displaylinkudlf…

ファイル ファイルの説明
usb_modeswitch.zip usb-modeswitch-2.2.0 (Armadillo-8x0用)

ご返信ありがとうございます。

添付いただいた usb_modeswitch.zip を使い、USBモニタの画面が緑色表示になるところまで確認できました。
PIDとVIDについては、参考情報のwebページに書かれている値と同じでしたが、デバイスファイルについては fb1 ではなく fb0 として認識されている(下記にログ添付)ようです。
引き続き、画面にOpenCVの処理結果を表示させられるよう進めたいと思います。

ちなみに、Armadilloの電源投入後、自動的に usb_modeswitch を実行させる方法として、参考情報の別のページに「2. udevルールでストレージ認識を回避」がありました。
http://atelier-orchard.blogspot.jp/2013/11/displaylinkraspberry-pi.html

Armadillo-810で上記と同様なことをしたい場合、/etc/config/ にデータを保存しておく必要があると思うのですが、どのようにすれば実現できるでしょうか?

[root@armadillo810-0 (ttySC2) ~/usb_modeswitch]# ./usb_modeswitch -v 17e9 -p 0156 -u 1
Look for default devices ...
   product ID matched
Get the current device configuration ...
 Found devices in default modeusb 1-1.2.3: usbfs: interface 0 claimed by usb-storage while 'usb_modeswitch' sets config #1
 (1)
Access device 011 on bus 001
Current configuration number is 2
Use interface number 0
 
USB description data (for identification)
-------------------------
Manufacturer: DisplayLink
     Product: I-O DATA LCD-USB10XT
  Serial No.: 15008536
-------------------------
Change configuration to 1 ...
 Device is busy, try to detach kernel driver
Looking for active driver ...
 OK, driver detached
udlfb: DisplayLink I-O DATA LCD-USB10XT - serial #15008536
udlfb: vid_17e9&pid_0156&rev_0133 driver's dlfb_data struct at da46f000
udlfb: console enable=1
udlfb: fb_defio enable=1
udlfb: shadow enable=1
udlfb: vendor descriptor length:17 data:17 5f 01 0015 05 00 01 03 00 04
udlfb: DL chip limited to 700000 pixel modes
udlfb: allocated 4 65024 byte urbs
 OK, configuration set
Get the current device configuration ...
Segmentation fault
[root@armadillo810-0 (ttySC2) ~/usb_modeswitch]# udlfb: 1024x600 @ 59 Hz valid mode
udlfb: Reallocating framebuffer. Addresses will change!
udlfb: 1024x600 @ 59 Hz valid mode
udlfb: set_par mode 1024x600
udlfb: DisplayLink USB device /dev/fb0 attached. 1024x600 resolution. Using 2400K framebuffer memory

下記ページの「ソースコード2 ~フレームバッファを扱う 」を参考に、無事、USBモニタに処理結果を出力することができました。
http://armadillo.atmark-techno.com/articles/my-gadget-part2

フレームバッファの設定は特に変更しておりませんが、使用したUSBモニタ(I-O DATA LCD-USB10XT)ですと、1024x600 16bit/pixel となっているようです。ここに RGB565 形式で画像データを格納すると表示されました。

ここから、さらに質問となるのですが。。

表示遅延が1秒程度発生しております。OpenCVの画像処理(線形補間)には0.2秒程度かかっておりますが、他にも起因するところがあるのでしょうか?
(もともと、mjpg_streamer でのブラウザ表示に1秒程度遅延があったため、代替表示案としてUSBモニタを選択した経緯があります。)

Armadillo-810 のカメラを Armadillo-840 と組み合わせ、LCDモニタに表示すればこの遅延は発生しなくなるのでしょうか?

よろしくお願いいたします。

at_kojiro.yamada

2014年12月18日 20時36分

> 表示遅延が1秒程度発生しております。OpenCVの画像処理(線形補間)には0.2秒程度かかっておりますが、他にも起因するところがあるのでしょうか?

様々な要因が考えられます。
- 使用しているカメラ
- ソフトウェアの処理内容
- 画像取得処理
- 画像出力処理
- その他の画像処理、など

例えば、Armadillo-810のカメラモジュール01を使用し、OpenCVのcvQueryFrame()で画像取得する場合、画像取得時にYUYV->BGR24へフォーマットを変換する処理が入ります。

まずはソフトウェアに絞って、
入力、出力、その他処理のように分けて、それぞれの時間を測ってみてはいかがででしょうか?

> Armadillo-810 のカメラを Armadillo-840 と組み合わせ、LCDモニタに表示すればこの遅延は発生しなくなるのでしょうか?
上述のとおり、ソフトウェアにも遅延する要因が考えられるので、遅延が発生しなくなるかどうかはわかりません。

コメントありがとうございます。確認させてください。

Armadillo-810のカメラ画像スルー出力に限ったお話で結構です。
表示方法として情報入手可能であった mjpg-streamer、USBモニタ、これらを利用した場合どの程度の表示遅延が想定される設計となっていますか?

また、カメラ画像取得方法としてOpenCVの関数を使用しない方が高速、表示方法として他に高速なI/Fが用意されているということであれば、ぜひご教授いただけませんでしょうか。
とりあえずの目標として、カメラ画像スルー出力を表示遅延1ms以下で表示(形式は問いません)できる環境を構築したく。

at_kojiro.yamada

2014年12月24日 18時23分

> Armadillo-810のカメラ画像スルー出力に限ったお話で結構です。
以下は、実機で確認した結果になります。

Armadillo-810のカメラモジュール01から取り込んだ画像を、
Armadillo-840 拡張ボードのLCDへ、
GStreamer を用いて出力した場合、
遅延は 10 msec程度でした。

■測定方法
1. ストップウォッチをカメラモジュール01で撮影しLCDに表示※
2. ストップウォッチと、LCDが入るように、他のカメラで撮影
3. 撮影した画像の、ストップウォッチとLCDに表示されているストップウォッチのタイムの差分を算出

※GStreamerを使用してカメラから取得した画像をLCDへ出力するコマンド

[Armadillo-840 ~]# gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw,width=640,height=480" ! videoconvert ! fbdevsink device=/dev/fb1

> 表示方法として他に高速なI/Fが用意されているあれば、ぜひご教授いただけませんでしょうか。
V4L2 API を利用してはいかがでしょうか?
Armadillo-810のカメラモジュール01から、RGB565の画像を、直接取得すれば無駄なフォーマット変換をせずに済みます。

プログラムを添付しましたので試してみてください。
以下のURLで公開されているコードをベースにしました。
http://linuxtv.org/downloads/v4l-dvb-apis/capture-example.html

■v4l2_captureの実行方法
--input-deviceで指定したVideoデバイスから画像を取得して
--output-deviceで指定したFramebufferデバイスに画像を出力します。
表示するディスプレイの解像度に合わせて--display-width, --display-heightを設定すると、
画面左上に画像が表示されます。

uvc-gadget が起動している場合は、killallコマンドで終了してください。

[Armadillo-810 ~]# killall uvc-gadget
[Armadillo-810 ~]# ./v4l2_capture --input-device /dev/video1 --output-device /dev/fb0 --display-width 1024 --display-height 600
ファイル ファイルの説明
v4l2_capture.tar.gz カメラモジュール01用画像出力アプリ

at_kojiro.yamada

2015年1月5日 11時02分

申し訳ありません。
ストップウォッチを使って測定した、
遅延の値が誤っていましたので訂正します。


> 遅延は 10 msec程度


遅延は 0.10 sec程度

at_kojiro.yamada

2014年12月16日 13時56分

> Armadillo-810で上記と同様なことをしたい場合、/etc/config/ にデータを
> 保存しておく必要があると思うのですが、どのようにすれば実現できるでしょ
> うか?

Armadilloにディスプレイが接続された時に自動でusb_modeswitchを実行するには、
以下の3つをユーザーランドイメージに組み込む必要があります。
- udevのルールファイル
- usb_modeswitch
- libusb-1.0.so.0

ユーザーランドイメージに組み込むには、上記のファイルを
atmark-dist/vendors/AtmarkTechno/[my-product]/
usr/
etc/
ディレクトリ以下に追加します。
※これらのディレクトリ以下のファイルは、make実行時にユーザーランドイメージに組み込まれます。

[ATDE5 ~]# mkdir atmark-dist/vendors/AtmarkTechno/[my-product]/usr/lib/
[ATDE5 ~]# cp /usr/arm-linux-gnueabihf/lib/libusb-1.0.so.0 atmark-dist/vendors/AtmarkTechno/[my-product]/usr/lib/
[ATDE5 ~]# mkdir atmark-dist/vendors/AtmarkTechno/[my-product]/usr/bin/
[ATDE5 ~]# cp ./usb_modeswitch atmark-dist/vendors/AtmarkTechno/[my-product]/usr/bin/
[ATDE5 ~]# vi atmark-dist/vendors/AtmarkTechno/[my-product]/etc/udev/rules.d/z70-displaylink.rules
 udev ruleを作成
 ※RUN+="/usr/bin/usb_modeswitch ...となっていることに注意
------------------------
ATTRS{idVendor}=="17e9", ATTRS{idProduct}=="0156", ATTRS{bConfigurationValue}=="2", ACTION=="add", RUN+="/usr/bin/usb_modeswitch -v 17e9 -p 0156 -u 1"
------------------------
[ATDE5 ~]# cd atmark-dist/
[ATDE5 ~]# make menuconfig
 : (省略)
[ATDE5 ~]# make

■参考情報

Atmark Dist 開発者ガイド
第7章 イメージファイルの作成
http://manual.atmark-techno.com/dist/atmark-dist_developers_guide_ja-1…