Nature | Photography | Music | Art

日々好奇心の趣くまま

サイト内の写真の使用ならびに無断転用を禁じます。


テーマ:
gphoto2:オープンソースのカメラ制御ソフト&ライブラリです。

主要な民生カメラの多くをサポートしており、いろいろ制約はあるもののカメラ内部の状態や設定を自由にUSBから制御できてしまいます。

使いこなせればアイデア次第でカメラの可能性の幅を何倍にも広げることができると考えてます。

しかしながらこのソフト、実際使ってみると難点がかなりあって、

・とにかくまとまった情報が少ない上に、バージョン毎に使用方法が変わったり、またカメラの種類によって挙動が異なるなど、Web情報そのままで動作することがほとんどない。本家Webサイトのドキュメントもほとんど役に立たない。付属するサンプルソースもほとんどそのままでは動作せず、細かい情報は本家フォーラムの過去ログを逐次見ていくしかない。

・Windowsでは動作せず(非正規版はあるが、OSのドライバをハッキングする必要などがあり現実的でない)Linux&Mac上でしか動作しない。

・カメラの深い所を弄れるため、変な使い方をするとカメラにダメージを与える可能性がなくもない。

・反応が遅い。時々ハングする。

・その他諸々…

このような状況ではありますが、少々本腰を入れてこのライブラリと対峙してみました。
まだ完全に理解できているわけではありませんが、それなりにカメラを制御することができるようになってきたので、個人の備忘録を兼ねてまとめてみます。誤りも多々あるかもしれません。

ちなみに先日紹介したArduino PTPライブラリとこのライブラリはほぼ同じ機能を持っているのですが、EOSのみに関して言えばArduinoライブラリの方がより多くのパラメータを弄ることができるようです。

ただ、Arduinoという非力でOSのないコンピュータをベースにしているのであまり複雑で重い処理はできません。

gphoto2はLinuxベースなのでそこそこ高度な処理もできる(はず)

個人的にはどちらを最終的に採用するのかが悩ましいところ。

下の環境で動作確認しています。

・gphoto2 2.5.6
・libgphoto2 2.5.7
・libgphoto2_port 0.12.0
・5D2 & 5D3

VMWare上のUbuntu+gcc及びBeagleBoneBlack+Debian+gcc(いずれもLinux)にて動作確認しています。
個人的には最終的にBeagleBoneに自作制御システムを載せてアウトドアで使用することが目的です。

以下参考にされる方は自己責任・No Question・No Supportでお願いします。

(1) コンパイル・インストール

本家サイトからgphoto2とlibgphoto2の最新版を落としてきて解凍、INSTALLファイルに書いてある必要ライブラリが入っているかどうかを確認、なければ事前にインストールする。
いずれの必要ライブラリもapt-getで取って来れると思う。

gphoto2そのものもapt-getで取得できるようだが、折角なのでソースからビルドしてみる。

あとはLinuxお決まり通りでlibgphoto2 -> gphoto2の順にそれぞれconfigure -> make -> sudo make installでビルド&インストール終了。

コマンドラインで

gphoto2 --version


など打ってみて正常にインストールされているかをチェック。

一点ハマったのがUbuntuなどはgvfsが勝手にカメラをドライブとして認識しに行ってgphoto2から制御できなくなるので、これをdisableする。

ubuntu gvfs mount disableなどのキーワードでググれば情報が得られる。

とにかく、勝手にマウントする系の動作はすべてOFFにしておいたほうが問題が少ない。
BeagleBoneの方はこのあたりあまり問題がなかった。

ここでlibgphoto2はライブラリでほとんどの仕事をする本体。gphoto2は単なるユーザインターフェースでlibgphoto2を裏で呼び出している。

(2) 使い方

使い方は2通りあって、

1. gphoto2を使ってコマンドラインから制御する。
2. gphoto2は使わず、自分でプログラムを組んでlibgphoto2を直接制御する。

今回はまず簡単な1の方法を紹介します。この範囲で用が済むのであればあえて辛い2に足を突っ込むことはないかと思います。

ただ、gphoto2を介することで実行スピードがやたら遅くなります。(フォーラムでも文句が沢山出ている)

すべては

gphoto2 [オプション]

という形で操作できるので、bashやperlやpythonでスクリプトを組めばカメラ自動操縦が可能になります。

なにはともあれ、まずはUSBでカメラとPCを接続してカメラ電源をON。(時間がかかる場合、カメラのオートパワーオフに注意)
うまく行けば、コマンドプロンプトで

lsusb

と打てば




Bus 001 Device 002: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
.
.
.
Bus 001 Device 004: ID 1a2c:0c21
Bus 001 Device 005: ID 04a9:3199 Canon, Inc.




という感じでどこかの行に接続しているカメラらしいIDが見えるはず。見えない場合、大抵はLinuxがカメラをドライブとしてマウントしてしまっていることが原因だと思われる。(本来はMTP/PTPデバイスでなければならない。)

その状態で

gphoto2 --capture-image

と打てばシャッターが一回切られるはず。

また

gphoto2 --capture-image-and-download

と打てば撮影後にLinux側にUSB経由で画像データ(RAW or JPG)が送られる。

いずれを使うかは用途次第で、Linux側で画像を確認する必要がなければ前者の方法でカメラ側だけに格納した方が転送時間がかからない分早く処理が終わる。

一点注意するのは、EOSはデフォルトで画像の格納先が内部RAMになっているようなので、電源を消したら画像も消去される。
格納先をメモリカードに切り替えてデータを残す場合には

gphoto2 --set-config-index capturetarget=1

と事前に打っておく。

ただシャッターを切るだけであれば、以上で終わりです。

しかしながら、gphoto2を使おうという人ならおそらくそんな場合は少なくて、一歩踏み込んでシャッタースピードやら絞りやらISOなど諸々の設定を弄りたい場合がほとんどかと思います。

その時に知っておかなければならないのがconfig valueというもの。

試しに

gphoto2 --list-config

と打ってみれば以下のような情報がズラズラと出てくる。




/main/actions/syncdatetime
/main/actions/bulb
/main/actions/uilock
/main/actions/autofocusdrive
/main/actions/manualfocusdrive
/main/actions/cancelautofocus
/main/actions/eoszoom
/main/actions/eoszoomposition
/main/actions/viewfinder
/main/actions/eosremoterelease
/main/settings/datetime
/main/settings/reviewtime
/main/settings/output
/main/settings/movierecordtarget
/main/settings/evfmode
/main/settings/ownername
/main/settings/artist
/main/settings/copyright
/main/settings/customfuncex
/main/settings/focusinfo
/main/settings/autopoweroff
/main/settings/depthoffield
/main/settings/capturetarget
/main/settings/capture
/main/status/serialnumber
/main/status/manufacturer
/main/status/cameramodel
/main/status/deviceversion
/main/status/vendorextension
/main/status/model
/main/status/ptpversion
/main/status/batterylevel
/main/status/lensname
/main/status/eosserialnumber
/main/status/shuttercounter
/main/status/availableshots
/main/imgsettings/imageformat
/main/imgsettings/imageformatcf
/main/imgsettings/imageformatexthd
/main/imgsettings/iso
/main/imgsettings/whitebalance
/main/imgsettings/colortemperature
/main/imgsettings/whitebalanceadjusta
/main/imgsettings/whitebalanceadjustb
/main/imgsettings/whitebalancexa
/main/imgsettings/whitebalancexb
/main/imgsettings/colorspace
/main/capturesettings/focusmode
/main/capturesettings/autoexposuremode
/main/capturesettings/drivemode
/main/capturesettings/picturestyle
/main/capturesettings/aperture
/main/capturesettings/shutterspeed
/main/capturesettings/meteringmode
/main/capturesettings/bracketmode
/main/capturesettings/aeb
/main/other/d402
/main/other/d407
/main/other/d406




カメラの種類やそのモードによって内容は異なりますが、例えば先ほど弄ったcapturetargetなども見つかるかと思います。
(名前は階層になっていますが、とりあえずは最後の名前だけで操作できるみたい。)

要はこれら一つ一つがカメラ内部のパラメータになっているわけで、例えばisoやshutterspeedやapertureなどというおなじみの文字も見つかるかと思います。
重要そうなものを以下に列挙してみます。

・iso …そのままISO感度
・aperture …絞り
・shutterspeed …そのまま
・capturetarget …前述。0の場合が内部RAM、1でメモリカードが保存先
・autofocusdrive,manualfocusdrive …フォーカス操作。オートか数値を指定して明示的に操作するかの違い。
・eosremoterelease …シャッターボタンの操作。全押し・半押し・離すなどの操作。
・viewfinder …ライブビューOn/Off。EOSの場合、これをONにしないとマニュアルフォーカス操作ができない。
・autoexposuremode …露出モード Av,Tv,M,Bulbとかおなじみのやつ
・exposurecompensation …露出補正 -2EVとかそういうやつ もちろんMモードの時は出てこない。

もし興味があればその他にもいろいろ弄れますので調べてみてください。

これらのパラメータの値を操作するのが、先ほども使った

gphoto2 --set-config [config名]=[config名]
gphoto2 --set-config_index [config名]=[config index番号]

というもの。またそれらの値を取得するには

gphoto2 --get-config [config名]

setが2種類あるのはconfigの「名前」で操作するか「値」で操作するかの違い。

例えば、Tv以外のモードにして

gphoto2 --get-config aperture

と入れると以下のように出てくる。




Label: Aperture
Type: RADIO
Current: 4
Choice: 0 2.8
Choice: 1 3.2
Choice: 2 3.5
Choice: 3 4
Choice: 4 4.5
Choice: 5 5
Choice: 6 5.6
Choice: 7 6.3
Choice: 8 7.1
Choice: 9 8
Choice: 10 9
Choice: 11 10
Choice: 12 11
Choice: 13 13
Choice: 14 14
Choice: 15 16
Choice: 16 18
Choice: 17 20
Choice: 18 22
Choice: 19 25
Choice: 20 29
Choice: 21 32




ここでCurrentとなっているのが現在値、Choiceと列挙されているのが設定可能な絞り値の一覧となり、2カラム目がconfig index値で、3カラム目がconfig名になるわけです。

ここで絞りを3.2にしたければ

gphoto2 --set-config aperture="3.2"

もしくは
gphoto2 --set-config-index aperture=1


のいずれでもOKです。
個人的な趣向で文字列より値で操作したいので、以降は後者で統一します。

(3) スクリプトでコマンドを組み合わせる。

基本が終わったので、実践に移ります。
ここでは例として、マニュアル露出モードに切り替え後、露出の異なるブラケット3ショット(4,1/4,1/60)を20秒毎に3回実行するスクリプトを作ってみました。
内容が理解できれば、そのままいろいろ応用ができるかと思います。

スクリプト言語はなんでもよかったのですが、最近流行のPythonを使ってみました。bashでもperlでもrubyでもお好みのスクリプトで同様のことが出来ると思います。
実行するにはPythonがインストールされている必要があります。




#!/usr/bin/env python
import subprocess
import time

interval = 20
repeat = 3

# Shutter Speed List
SS_30 = 0
SS_25 = 1
SS_20 = 2
SS_15 = 3
SS_13 = 4
SS_10 = 5
SS_8 = 6
SS_6 = 7
SS_5 = 8
SS_4 = 9
SS_3_2 = 10
SS_2_5 = 11
SS_2 = 12
SS_1_6 = 13
SS_1_3 = 14
SS_1 = 15
SS_0_8 = 16
SS_0_6 = 17
SS_0_5 = 18
SS_0_4 = 19
SS_0_3 = 20
SS_1p4 = 21
SS_1p5 = 22
SS_1p6 = 23
SS_1p8 = 24
SS_1p10 = 25
SS_1p13 = 26
SS_1p15 = 27
SS_1p20 = 28
SS_1p25 = 29
SS_1p30 = 30
SS_1p40 = 31
SS_1p50 = 32
SS_1p60 = 33
SS_1p80 = 34
SS_1p100 = 35
SS_1p125 = 36
SS_1p160 = 37
SS_1p200 = 38
SS_1p250 = 39
SS_1p320 = 40
SS_1p400 = 41
SS_1p500 = 42
SS_1p640 = 43
SS_1p800 = 44
SS_1p1000 = 45
SS_1p1250 = 46
SS_1p1600 = 47
SS_1p2000 = 48
SS_1p2500 = 49
SS_1p3200 = 50
SS_1p4000 = 51
SS_1p5000 = 52
SS_1p6400 = 53
SS_1p8000 = 54

# Mode List
EXP_MODE_TV = 1
EXP_MODE_AV = 2
EXP_MODE_MANUAL = 3
EXP_MODE_BULB = 4

def call_gphoto2(arg):
cmd = "gphoto2 " + arg
subprocess.call(cmd,shell=True)


def do_bracket():
#arg = "--set-config-index shutterspeed=%d" % SS_4
arg = "--set-config shutterspeed=%s" % "4"
call_gphoto2(arg)
#call_gphoto2("--capture-image-and-download")
call_gphoto2("--capture-image")

#arg = "--set-config-index shutterspeed=%d" % SS_1p4
arg = "--set-config shutterspeed=%s" % "1/4"
call_gphoto2(arg)
#call_gphoto2("--capture-image-and-download")
call_gphoto2("--capture-image")

#arg = "--set-config-index shutterspeed=%d" % SS_1p60
arg = "--set-config shutterspeed=%s" % "1/60"
call_gphoto2(arg)
#call_gphoto2("--capture-image-and-download")
call_gphoto2("--capture-image")

if __name__ == "__main__":

# Init
call_gphoto2("--auto-detect")

call_gphoto2("--set-config capture=on")

arg = "--set-config-index autoexposuremode=%d" % (EXP_MODE_MANUAL)
call_gphoto2(arg)

arg = "--set-config-index capturetarget=%d" % (1)
call_gphoto2(arg)

# Show Aperture & ISO
call_gphoto2("--get-config aperture")
call_gphoto2("--get-config iso")

for i in range(repeat):
f1 = time.time()
print "repeat:", i

do_bracket()

f2 = time.time()
while (f2-f1) < interval:
f2 = time.time()

print "Bye"




補足するとmainの頭で設定している--auto-detectと--set-config capture=onはなにやら入れないといけないらしいので入れてますが、なくても動作しています。とりあえずオマジナイ。

実際gphoto2を起動しているのはsubprocess.call(要はPython流の外部コマンド実行)の箇所です。

しかしながら以上を実行してみると、実は大変反応が遅いのです。中でも--set-config処理がなぜか非常に時間がかかるのです。

そこでもっとサクサクと動作させるには、結局自分でプログラムを組んで直接libgphoto2を呼び出すことになってしまうのですが、それについてはGW明けにでも。

補足. 続編は以下をご覧ください。

http://ameblo.jp/delphinus1024/entry-12028456726.html
AD
いいね!した人  |  コメント(0)  |  リブログ(0)

delphinus1024さんの読者になろう

ブログの更新情報が受け取れて、アクセスが簡単になります

AD

ブログをはじめる

たくさんの芸能人・有名人が
書いているAmebaブログを
無料で簡単にはじめることができます。

公式トップブロガーへ応募

多くの方にご紹介したいブログを
執筆する方を「公式トップブロガー」
として認定しております。

芸能人・有名人ブログを開設

Amebaブログでは、芸能人・有名人ブログを
ご希望される著名人の方/事務所様を
随時募集しております。