Nature | Photography | Music | Art -23ページ目

Nature | Photography | Music | Art

日々好奇心の趣くまま

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

ちょっとばかり多忙などいろいろあって活動や更新を怠っていましたが、久しぶりにしばしの息抜きと運動不足解消に南伊豆某所の海に撮影へ。

最寄の海岸からエントリーして1kmほど遠泳。夏でもカヤッカーが時折通り過ぎるだけの静かな海域。幸いこの上ないベタ凪。



潮色は基本的に夏特有の透明な蒼い水なのだが、冷水塊由来なのか若干赤潮が混じる場所が所々という不思議な二枚潮。



あまり赤く写っていないが赤潮です。
この赤潮、実は肌に当たると結構チクチクと痛い。夜になると綺麗に光るんですが。

それはさておき、このあたりの地形は伊豆でも屈指の面白さ。
現実離れしたテクスチャが施された断崖には無数の海触洞が口を開けている。これを見に来たかった。







今回とりわけ圧巻だったのがこの狭い洞窟。上から見ても神秘的な蒼さ。奥は体が一つやっと入れるくらいの狭さ。



奥に入ると太陽高度の条件がピッタリ合ったために水中光芒を捉えることができた。ほんの10分ちょっとの出来事ですが。





気がつくと夢中で5時間ほど連続で泳いでいたようで、久しぶりの遠泳だった上にずっと変な体位で撮影していたこともあり全身が筋肉痛。
伊豆の海の探検はまだまだ終わりが見えません。


季節柄ずっと天気の冴えない今日この頃、体が鈍ってどうしようもないので群馬方面に野暮用のついでに避暑を兼ねて嬬恋村で午後のお気軽登山に行って来ました…とはいえ少々ひねくれたコース。

本来、浅間山(というかその外輪山)へのルートは小諸方面からアクセスするのが一般的なのだが、北側から攻めるバリエーションコースがいくつかあることを最近知る。

更にはgoogle mapの航空写真を見ても浅間山は北側の方が面白そうな地形をしていて興味があったので、手始めにその中の一つである「しゃくなげ園」からアクセスするルートを攻めてみました。 

園内の看板。本日の目的地は「かもしかコース」を超えて更に奥にある外輪山。
しかしながら上から消されているのでどうやら「かもしかコース」自体も存在しないことにされている模様。少々不安がよぎる。



園内の遊歩道は整備されていて快適だが、「かもしかコース」に入ったとたんに藪の嵐。 ただし人はそれなりに入っているようなのでルート自体はしっかりしている。



藪藪



藪藪藪。激しい時には胸あたりまで来る。



藪が終わり「かもしかコース」終点。ここから奥はバリエーションコースとなる。



急ぎの山行でもないので花など撮りつつ。





雰囲気のある苔の森に入る。ルートは予想外に明確。






ギョリンソウ。久しぶりに見た。深海生物っぽくて刺激的な佇まい。



正面から撮ると、こっち見んな状態。




また藪藪。



森林限界を超えるとガレた斜面。一歩が半歩。



見えてきた。



この方向からの浅間山はあまり見ないので新鮮。



風雪に耐えている。



このまま詰めると一般コース最奥のJバンドに至る。このまま外輪山の一般コースへ抜けられるが、本日は午後遅くからの入山だったのと天気も悪く雨が来そうなのでここで引き返す。



いろいろ実地調査をしてみると浅間山北側にはこのルートの他にも地図にない溶岩原を辿るルートなどいろいろあるようなのでおもしろそう。
そのあたりはまたの機会にでも探索してみようかと。






都会嫌いな自分が心底居心地がよいと思える数少ない都会で、これまで3回ほど旅行している。

エキゾティックでフォトジェニックで庶民は優しく穏やかでメシが抜群に旨い。

そんなお気に入りの街がいつしかドンパチの本拠地になってしまった…やりきれない。

2011年に撮影したものより。










前回TG3コントロールの基本の箇所を簡単なbashスクリプトを用いて実験しましたが、やはりOlympusのプロトコルはきちんとプログラムからコントロールしないとその実力は出せないようです。

とりわけライブビューで画像をモニターしながらコントロールするにはhttpプロトコルとは別にUDPをベースにしたRTPプロトコルに対応する部分を別途用意してライブビュー画像のストリームを行う必要があります。(OPC仕様書参照)

ということで、ちょっと頑張ってライブビューを含めた簡易プログラムを組んでみました。

https://github.com/delphinus1024/tg3_ctrl

RTPプロトコルの実装部分は結構苦労しました。まだ試していませんが、もしかしたらGStreamerとかを使うともっと簡単にこの部分をインプリメントできるのかも。

Win7&10で動作確認しています。MinGW+Winsock2を使っているので、MacやLinux移植するにはそのあたりを修正する必要があるかと思います。

動作は今のところかなり不安定で、環境によってはいろいろ調整しないと動作しないかもしれませんので弄れるのは自己対処ができる方限定になるかと思います。

また、firewallはOFFにしないとRTP部分の通信が阻害されてしまうようで、このあたりもWindows用のOI Shareが出ない理由なのかもしれません。

構築にはOpenCVとBoostC++(thread,filesystem)のライブラリが必要です。

構築方法や実行方法はreadmeをご覧頂くとして、

./tg3_ctrl.exe
を立ち上げると、成功すればAモードに切り替え後、ライブビュー画像のウインドウが表示されるはず。
フォーカスを合わせたい箇所をクリックすればそこにフォーカスが当たり、リターンキーで撮影、ESCで終了します。

とりあえずは最小限の動作をするテンプレートの位置づけで、まだ実験段階のためリファクタリングもしていないのでコードが汚いのはご了承ください。

コード中には現状使用していない部分もいろいろ入っていますが、それは将来の拡張用です。

この内容の利用によって生じた損害については一切の責任を負いません。
前回前振りを書いた続きで、ほぼ個人的な備忘録です。

TG-3をベースに書いてありますが、おそらく他のOLYMPUS Image Share対応のOlympusカメラでも最低限の修正で使えるのではと思います。

そもそものきっかけは、所有しているOlympus TG-3の機能を外部から自由にコントロールできれば便利じゃまいか…ということ。

公式にはOLYMPUS Image ShareというWi-fi経由でOlympusカメラを操れるスマホアプリがあってそれなりに使えるのだが、あまり使い勝手がよくない。 

コントローラを自作しようにもこれらのWi-fi経由のコントロール用プロトコルがどんなものかググってみたが、残念ながらWeb上には断片的な情報しか見つからない。

そこでエンジニアの特権と裏技を使って、動作中のOI ShareのWi-fiパケットを抜き出してみた。



見たところどうやらhttpプロトコルを用いて通信をしているらしい。
更にパケットの中身から得られたキーワードでググってみると(TG用ではないが)ヒントになるサイトが見つかった。

https://gist.github.com/mangelajo/6fa005ff3544fecdecfa


更にここの情報から、OPC(Open Platform Cameras)というものに辿りつく。

http://opc.olympus-imaging.com/en_sdkdocs/index.html

これは何かというと、去年発売されたOLYMPUS AIR A01というオープンプラットフォームカメラの制御プロトコルが公開されているもので、結局はImage Shareの使用しているプロトコルもこのOPCの亜種であることを突き止めた。

OPCの仕様は上のリンクからダウンロードできるので、これを参考にしながらある程度TG3のWi-fiコントロールができるようになりました。

その概要は以下のような感じ。より詳細はOPCの仕様書参照。

・カメラ側がWi-fiアクセスポイント、コントローラ側がステーションとなる。コントローラはカメラ側が示すSSIDとパスワードに従ってDHCPでログイン。

・Wi-fi接続が完了すれば、あとは決められたフォーマットに従ってhttpプロトコルで通信をしながらコントロールを行う。

・カメラのIPアドレスは192.168.0.10固定。

・各カメラには固有のコマンド群が存在する。それぞれのコマンドは

http://192.168.0.10/コマンド名.cgi

の形式で呼び出す。

・コマンドに引数(OPCではオプションと呼ばれる)がある場合は

http://192.168.0.10/コマンド名.cgi?オプション名1=オプション値1&オプション名2=オプション値2...

という風にURI上につなげていく。

・情報のやりとりが発生するコマンドではメッセージボディにxml形式の情報(エレメントと呼ばれるみたい)を埋め込むことで情報交換を行う。

・メッセージボディはその他にも画像や動画ファイルそのものを格納することもある。

・httpヘッダー部分に'Host: 192.168.0.10' 'Connection: Keep-Alive' 'User-Agent: OI.Share v2'などを指定しないと動作しないみたい。詳細は後述のサンプルにて。

・コマンドによってPOSTするかGETするかが決められている。

おそらく、ゴタクを並べるよりサンプルを示した方がわかりやすいと思うので、以下実習編です。

[準備]

・Wi-fi接続できるPC。Win10にて動作確認しましたが、おそらくMac&Linuxでもほぼ同様だと思います。

・コマンドウインドウ上にてcurlコマンドが動作すること。おそらくMSYS(2)やCygwinなどをインストールすれば使えるようになるはず。

・ちなみにcurlコマンドとは、httpプロトコルの細かいやりとりをコマンドライン上でできるプログラム。

・念のためFirewallはOFFにしておく。

[接続手順]

・TG側のWi-fi接続設定を"プライベート接続"に

・TGのWi-fiをOn。TG画面上に以下のようなSSIDとパスワードが表示されるので記録。



・PCからWi-fiアクセスポイント一覧を見ると上のSSIDが見えるはずなので接続。パスワード入力でTGにログインできる。

・コマンドウインドウからping 192.168.0.10を実行してみて通っているかどうかを確認。

[簡単な動作確認]

まず、コマンドウインドウ上でget_commandlistコマンドを実行してみる。get_commandlistは接続しているカメラで使用できるコマンドとオプション名・値一覧をxmlで返してくれる。
get_commandlistコマンドはどのカメラでもサポートされている(と思う)。以降実行はbash shell使用を前提。




curl -v --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI.Share v2' "http://192.168.0.10/get_commandlist.cgi" >commandlist.xml




ちなみに-vオプションは無くてもよく、入れると情報表示が多くなるがエラーが発生したときに原因追求がしやすくなるのでお好みで。
ヘッダーはこれを指定しないと受け付けてくれないようなのでオマジナイ。

成功するとcommandlist.xmlが作られるのでこれをxmlビューアで開いてみると。



使用できる(get_commandlist以外の)すべてのコマンドとそのオプションが羅列されているので、後述のdesclistと合わせて深く見ていくといろいろ発見がある。残念ながらまだ全部理解できていないし、実際は使えないオプションもあるようなので結構手ごわい。

更に、desclistはcommandlistを補完するというもののようで以下のようにして取得する。これはrecモード(仕様書参照)でなければ取得できないみたいなので、2ステップになっています。




curl --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI.Share v2' "http://192.168.0.10/switch_cammode.cgi?mode=rec&lvqty=0320x0240"

curl --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI.Share v2' "http://192.168.0.10/get_camprop.cgi?com=desc&propname=desclist" >desclist.xml




これで作成されるdesclist.xmlはこんな感じで、上述のエレメントに相当する情報がここに格納されている模様。もうすこしすっきりした構造にして欲しいところだが仕方がない。



さてでは実際に1枚撮影してその画像をPCに転送するまでをやってみます。




curl -v --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI.Share v2' "http://192.168.0.10/switch_cammode.cgi?mode=rec&lvqty=0320x0240"

curl -v -X POST --header 'Content-Length: 49' --header 'Content-Type: text/plain; charset=ISO-8859-1' --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI.Share v2' -d 'A' "http://192.168.0.10/set_camprop.cgi?com=set&propname=takemode"

curl -v --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI.Share v2' "http://192.168.0.10/exec_takemisc.cgi?com=startliveview&port=37789"

curl -v -X POST --header 'Content-Length: 52' --header 'Content-Type: text/plain; charset=ISO-8859-1' --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI.Share v2' -d '6400' "http://192.168.0.10/set_camprop.cgi?com=set&propname=isospeedvalue"

curl -v --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI.Share v2' "http://192.168.0.10/exec_takemotion.cgi?com=assignafframe&point=0160x0240"

sleep 1

curl -v --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI.Share v2' "http://192.168.0.10/exec_takemotion.cgi?com=starttake"

sleep 1

curl -v --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI.Share v2' "http://192.168.0.10/exec_takemisc.cgi?com=getlastjpg" >last.jpg





実行すると撮影された画像がlast.jpgとして保存される。
詳細は先ほどのcommandlist.xmlとOPC仕様書を突き合せれば追っていけるかと思うので省略して、主要なところのみ。

・おおまかには 動作モード指定->撮影モード指定->ライブビュー開始->ISO指定(POSTの例として)->フォーカス位置指定->撮影->画像取得 の流れ。

・GETとPOSTの使い分けに注意。POSTのときにはヘッダー指定が増える点も注意。

・xmlをPOSTする場合、xml長をContent-Lengthで指定する必要があって面倒。これを間違えるとハングアップする。

・フォーカス位置を調整するにはpoint=で指定される座標を変更する。座標系は冒頭で指定したlvqty=0320x0240に準拠する模様。

・最終行を省略すると画像は転送されずカメラ本体にのみ格納される。

おまけですが、応用編でTimelapseを。

TG3は本体でもTimelapseモードを持っているのですがなぜか99枚までしか撮れず(30fpsだと3秒ちょっと)、レリーズもつけられないので事実上きちんとしたTimelapse撮影は不可能なのですが、このスクリプトを使うと連続インターバル撮影が可能になりあとはバッテリーの持ちとの勝負になります。

撮影間隔は5秒にしてあるが、数字を変えると調整できます。




curl -v --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI.Share v2' "http://192.168.0.10/switch_cammode.cgi?mode=rec&lvqty=0320x0240"

curl -v -X POST --header 'Content-Length: 49' --header 'Content-Type: text/plain; charset=ISO-8859-1' --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI.Share v2' -d 'A' "http://192.168.0.10/set_camprop.cgi?com=set&propname=takemode"

curl -v --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI.Share v2' "http://192.168.0.10/exec_takemisc.cgi?com=startliveview&port=37789"

curl -v --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI.Share v2' "http://192.168.0.10/exec_takemotion.cgi?com=assignafframe&point=0160x0120"

sleep 1

while :
do
curl -v --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI.Share v2' "http://192.168.0.10/exec_takemotion.cgi?com=starttake"
sleep 5
done





Web上を見た限りこのあたりの情報は皆無なので(ニーズもあるかどうか不明だが)どなたかの役に立てば幸いです。

この内容の利用によって生じた損害については一切の責任を負いません。