はじめに
前回はaravisで使用するコマンド,エラー対策等を紹介しました。
今回からプログラムを解析していきます。
まず,aravisののプログラム構成は大まかに以下に分類できると思われます。
1.src: 本体プログラムとテストツール,設定ツール,フェイクカメラプログラム
2.viewer: viewerのプログラム
3.gst: gstremerとつなぐためのプログラム
4.tests: 単体テストプログラム
今回は一番取っ掛かりやすそうな4.test
のプログラムを解析していきます.
解析
ビルド設定ファイル
まず,今回の対象となるプログラムの場所ですが以下のディレクトリ内にあります。
- ソースコートディレクトリ:
aravis-0.8.19/tests
- コンパイル済みバイナリディレクトリ:
aravis-0.8.19/build/tests
そして,aravisではmesonというビルドシステムを採用しており
その設定ファイルは以下のようになっています。
これを見ることで,以下一部抜き出したコードとなりますが,生成バイナリー名とソースコードの対応が取れると思われます。
...
examples = [
['arv-network-test', 'arvnetworktest.c'],
['arv-device-test', 'arvdevicetest.c'],
['arv-genicam-test', 'arvgenicamtest.c'],
['arv-evaluator-test', 'arvevaluatortest.c'],
['arv-zip-test', 'arvziptest.c'],
['arv-chunk-parser-test', 'arvchunkparsertest.c'],
['arv-heartbeat-test', 'arvheartbeattest.c'],
['arv-acquisition-test', 'arvacquisitiontest.c'],
['arv-example', 'arvexample.c'],
['arv-auto-packet-size-test', 'arvautopacketsizetest.c'],
['arv-device-scan-test', 'arvdevicescantest.c'],
['arv-roi-test', 'arvroitest.c'],
['time-test', 'timetest.c'],
['load-http-test', 'loadhttptest.c'],
['cpp-test', 'cpp.cc']
]
...
この設定ファイルの上にあるものから順番に見ていきましょう。
1.arvnetworktest.c
- 実行ファイル
./aravis-0.8.19/build/tests/arv-network-test
- 実行してみる
まず,genIcamを接続しないで実行してみました。
その結果は以下のようになり,ローカルループバックとwifiのネットワーク情報が取得できました。
$ ./arv-network-test
proto address mask broadcast interface
IPv4 127.0.0.1 255.0.0.0 127.0.0.1 lo
IPv4 10.0.169.212 255.254.0.0 10.1.255.255 wlp0s20f3
次にfakecameraを実行してから実行してみましたが,特に変化無しでした。genIcamに対してなにかするものではないようです.
interfafeの情報を取得する関数は,16行目
のifaces = arv_enumerate_network_interfaces ()
のようです。そしてこの関数はsrc/arvnetwork.c
の106行目
に定義されています。
この関数内部は,cでインタフェース情報を取得する内容となっていて以下の記事など参考になりそうです。
2.arvdevicetest.c
- 実行バイナリ
./aravis-0.8.19/build/tests/arv-device-test
- 実行してみる
単体実行した時の結果です
Looking for the first available camera
No device found
次にフェイクカメラ実行後に実行した結果です
Looking for the first available camera
vendor = Aravis
model = Fake
device id = GV01
sensor width = 2048
sensor height = 2048
image width = 512 (max:2048)
image height = 512 (max:2048)
horizontal binning = 1 (min:1 - max:16)
vertical binning = 1 (min:1 - max:16)
exposure = 10000 (min:10 - max:1e+07)
gain = 0 (min:0 - max:10)
gain auto mode = Off
trigger selector = FrameStart
payload size = 262144 (0x40000)
stream port = 60676 (60676)
Frame rate = 0 Hz
Frame rate = 0 Hz
Frame rate = 0 Hz
デバイスの情報を取得することができました。
が,フレームの取得には失敗したようです。
3.arvgenicamtest.c
このプログラムは引数にxml形式のファイル名を入れるようなので以下のようにfakeカメラのxmlを入れてみましたが,
./arv-genicam-test ../../src/arv-fake-camera.xml
loadingと言われただけで,プログラム内部で55行目
のarv_gc_get_node
に失敗したようで,今の所,デバイス情報の表示はされませんでした。使い方が不明です。
Loading '../../src/arv-fake-camera.xml'.
4.arvevaluatortest.c
これも使い方不明.引数に何らかを与えて使うのかな?
$ ./arv-evaluator-test
Missing expression.
5.arvziptest.c
これもzipファイルを引数に入れるみたいだが,どういったzipを入れて使うのかよくわからない.
6.arvchunkparsertest.c
フェイクカメラがある場合は以下のように値を出力したけど何をしているかよくわからない.
$ ./arv-chunk-parser-test
ChunkWidth = 0
ChunkHeight = 0
7.arvheartbeattest.c
fakeカメラを起動しておいて実行すると動作した.
最終的に以下のような値を出力,内部プログラムを見ると最後にstream情報の統計を取得しておりその結果が出力されるみたい.
Completed buffers = 985
Failures = 1
Underruns = 0
8.arvacquisitiontest.c
これもフェイクカメラ実行してテスト.
一つのイメージのbufferだけ取得するプログラム,特にファイルにそれを出力してくれるわけではないけど自分で変換すればできそう.
成功すると以下のように出力される.
Image successfully acquired
9.arvexample.c
これは映像取得のプログラムを作る際に結構参考になりそう.
これもフェイクカメラ実行してテスト.
以下のようにカメラのフレームレートを1秒毎に表示してくれる.
104行目
のg_timeout_add_secondsでタイマー割り込み関数を設定している. streamに映像が来たときの割り込み関数も設定しており,それは
95行目の
g_signal_connect`この2つの関数はbuffer数を共有している.GMainLoopという型の変数も共有しているがこれの意味は不明.
$ ./arv-example
Frame rate = 12 Hz
Frame rate = 10 Hz
Frame rate = 10 Hz
Frame rate = 10 Hz
Frame rate = 10 Hz
10.arvautopacketsizetest.c
aravisには自動でパケットサイズを設定する関数が用意されていて,その関数をテストしている.
11.arvdevicescantest.c
10秒毎に割り込みでデバイス検索を行っている.
12.arvroitest.c
映像を取得と平行して,あらゆるパターンのroi領域を設定している.
13.timetest.c
よくわかりません.
14.loadhttptest.c
http URLを引数に取る.genicamデバイスもURLから設定する方法があるのか?
15.cpp.cc
arv.hの読み込みがc++でできるかのテスト