この記事は IoTLT Advent Calendar 2019 の2日目の記事です。
はじめに
リコーの @KA-2 です。
弊社ではRICOH THETAという全周囲360度撮れるカメラを出しています。
RICOH THETA VやRICOH THETA Z1は、OSにAndroidを採用しています。Androidアプリを作る感覚でTHETAをカスタマイズすることもでき、そのカスタマイズ機能を「プラグイン」と呼んでいます(詳細は本記事の末尾を参照)。
と、定型文をかきつつ、、、
今回の記事はプラグインの仕組みや知識を利用した新しいTHETAカスタマイズ方法についてまとめました。
タイトルをみて「adb shellの話?」と思った方、「遠からず」ですが、もっと自由度がある環境にする話です。
adb shellを上手に利用したAndroidアプリをTHETAにインストールします。そうすると、使い心地はLinux(ssh、apt、git、wgetなども使え、多言語開発可能)。root不要。これまでの使い方と完全共存。切り替え簡単。そんなTHETAコンピューティングが可能になります!
「THETAでこんなことを試してみたい」と思いついてから動くまでが圧倒的に速くなる。THETAがとてもハッカソン向きになる。そんな内容です。
THETAを #termux でお手軽Linux化。
— THETAプラグイン開発者コミュニティ (@thetaplugin) December 2, 2019
SSHログイン。CUIでLチカ、OLED表示、撮影、姿勢取得、コード編集可能。C、C++、Python、Ruby、Perl、etcな言語使えます。gitやwgetも動作。SFTPで外部からの読み書きも。プロトタイプ作成が高速に!#thetaplugin pic.twitter.com/FNgsYzRR1D
「ロボット着ぐるみの内側にいるペンギンさん」の力を自由に引き出せるようにするのですが、アブナイハナシではありません。安心して頂くため、先に説明します。
今回利用するのはTermuxというアプリです。このアプリをインストールすると、sandbox内(システムが安全に保たれるアプリ固有領域)にお手軽Linux環境が展開されます。あとはCUIでその環境を使いこなすだけです。
Termux開発コミュニティさんは、Google Play だけでなくF-Doroid(ある側面で一番セキュア)にも公式apkを公開しています。このおかげで「THETAを開発者モードにした方はその恩恵を受けられる」というわけです。
このアプリはTHETAにとって、(何ものにもなれるの意図で)万能THETAプラグインと見なせます。THETAを開発者モードにした人のワイルドカードです。
- もうわかった!という方、自力で始めちゃってください。この記事は困ったときに必要な箇所だけみればOK。
- ちょっと自信はないけどLinuxということならトライしたいという方、前半戦は丁寧めに書いておきます。各プラットフォーム用のSFTP対応ファイル管理アプリからファイルの読み書きする仕込みはできると思います。興味次第では「コマンドを打てば響くTHETA」を体感してから、コマンドの羅列でシェルスクリプトとか短いPythonあたりのスクリプト言語を体感するのも良さそうです。
- ラズパイなども含めたLinux系コンピューター経験ありだけど「Androidアプリ開発環境はわからないなぁ」とTHETAいじりを躊躇していた方、劇的に敷居が下がります!THETA自体がラズパイみたいになります。慣れた環境から少しづつAndroidの仕組みに触れ、THETAプラグインやAndroidアプリも作成できるようになれると思います。
- THETAプラグインきっかけでAndroidアプリ開発環境に触れはじめた方(ワタシはこれ)、THETA固有の仕組みやAndroidへの理解が深まります。なんとなく雛型にしてたTHETA Plug-in SDKの仕組みがわかり、THETA plug-inライブラリに頼らなくて諸々できるとことが体感できます。
レッツTHETAコンピューティング!
THETAまわりで事前に準備が必要なこと
THETAプラグイン開発をしていた方々は既にできています。
今回の記事は、そうでない方々の目にとまりそうなので改めて羅列しておきます。
-
開発者登録をしたあと、THETAを開発者モードにする
【THETAプラグイン開発】プラグインパートナープログラムに登録してみよう
【THETAプラグイン開発】THETAを開発者モードにする手順 -
Android Studioをインストールしておく
こちらからダウンロードしてインストールしておいてください。
幾つかのことにadbコマンドを利用したいためです。あとはお好みに応じて。
(adbだけではもったいない道具なので、これをきっかけに普通のTHETAプラグイン作りも始めて頂けるといいなぁ~) -
Vysorを使えるようにしておく
THETAプラグイン開発におけるVysorの使い方【THETAプラグイン開発】
時折ディスプレイ代わりにするためです。
あとはお好みに応じて。
THETAプラグインのしくみ
今読まなくてもOKです。
2018年10月20日に行われた「RICOH THETA プラグイン開発 ワークショップ #1」資料 の18~21ページです。
考え事ができたとき、仕組みを思い出すと自力で解決できると思うので掲載します。
今回に限らず、普通のTHETAプラグイン作りにも役立つ資料です。
ポイントは以下です。
- 撮影アプリ(com.theta360.receptor)がTHETA固有事項を担っている
- 本体ボタン操作なども撮影アプリが受け付けたあと、プラグインへIntentを投げている
- その他のデバイス固有事項(LEDやOLEDなど)も、プラグインから撮影アプリにIntentを投げると操れる
- THETA Plug-in ライブラリは撮影アプリ-プラグイン間の上記通信をラップしたもの。通信の詳細はこちらのドキュメント「Broadcast Intent」に掲載されています。
- プラグインからの撮影方法は2通り
(1) webAPIが全て使える(内部通信のため、IPアドレス127.0.0.1、ポート8080となる)
(2) 一般AndroidアプリのようなCameraAPIを使う方法で高速連写など特殊な撮影も可能ですが、細かなところまで自身でコードを書かなければなりません。
Termux について
「はじめに」の章にTermux公式Wikiへのリンクが貼ってありますが英語です。日本語で概要を掴みたい方は以下あたりをご参照ください。
いつでもLinuxコマンドが使える!Androidで動くLinux端末「Termux」【Root化不要】
他にも「Termux」で検索すると日本語の記事も沢山ヒットします。QiitaでTermuxタグがついた記事も豊富です。Google Playでは2019年11月時点で500万ダウンロードもされている人気ツールです。
活発な機能拡張が続いているので、GitHubのソースコードやその他のやり取りからも多くのことが読み取れますよ。
Linuxとの違いについては公式Wikiのこちら
余談ですが、今年の夏「Maker Faire Tokyo 2019」にて「Linuxで開発したいなぁ~」「Python動けばなぁ~」のような声を伺えました。そのおかげで今更ながらこのツールに気づけました。探してみるものですね。
Termuxインストール
事前説明ながくてすみません、やっと作業です。
「はじめに」の章に記載済みF-DoroidのTermuxページから最新のapkファイルをダウンロードしてください。クリックする場所が紛らわしいのでご注意を。
ファイル名は「com.termux_82.apk」(2019年11月中旬時点)のようになっていると思います。数字はリリースバージョン番号です。大きな数字ほど最新です。
ダウンロードできたら、Android StudioのTerminalまたは Windowsならばコマンドプロンプトから
adb install -r (ファイルまでのパス)\com.termux_82.apk
と入力するとインストールできます。
(以降「adb」ではじまるコマンドは、この方法で実行すると思ってください。その他についてはTermuxへの入力です。)
はい、これであなたのTHETAにLinux環境が入りました。簡単ですね。
これ以降は、動作を確認しながら使い勝手をよくしていきます。
Termux初期セットアップ
THETAとPCをケーブル接続するのではなく無線LAN経由でTHETAにログインして利用できると物事が捗ります。ラズパイはじめLinux系ボードコンピューターでは常套手段ですね。まずはその環境を整えるのがメインの作業です。それに加えて、最初に行ったほうがよさそうな事項を記載しておきます。
THETAプラグインを作れる方々には既知の事項が多数あります。
各人の理解度に併せ、読み飛ばしたり、作業順を適宜入れ替えたりのアレンジはお任せします。
THETAをPCとUSB接続中にwifi利用可能にしておく
THETAプラグインを作りなれている方は既にしてあると思います。
こちらのadbコマンドを打って、事前にTHETAをPCにUSBケーブルで接続している状態でもTHETAのwifiが使える状態にしておいてください。
この設定は、一度実施すると、パラメータをfalseにしたコマンドを打つか、工場出荷状態に戻すまで維持されます。
THETAの無線LANクライアントモード(CLモード)を設定しておく
Termux環境へのインストールが必要なので、THETAを外部ネットワークに接続できるアクセスポイントへ接続しておいてください。
これは通常の使い方で予め仕込んでおきます。このあたりの動画やこちらの動画が参考になります。
ご家庭のルーターに繋いでもよいですし、スマートフォンをテザリングの状態にしてTHETAからスマートフォンへ接続するでもよいです(通信料にはご注意を)。
複数の接続先を覚えておけます。
Vysor環境でキーボードが使える状態にする。
THETAをPCとUSBケーブル接続しVysorの画面にTHETA内部が見える状態にしてください。
この状態では、Vysorからはキーボード入力をうけつけないので、こちらのadbコマンドを打って、Vysor環境でキーボード入力ができる状態にします。
このコマンドで行っていることは、「THETAプラグインのしくみ」の章に記載がある「撮影アプリ(com.theta360.receptor)」の一時停止です。再開はシャッターボタン長押し、資料に記載のコマンド、完全電源OFF後の電源ONで行えます。
VysorからTermuxを起動する。
Termuxを起動すると以下画像右側のような画面が表示され、ソフトキーボード入力 や PCのキーボード入力ができる状態になっています。
apt(pkg)使えます
「外部から必要なパッケージをインストールできる」これがadb shellよりもTermux環境を使う大きな利点となります。そのパッケージ管理ソフトがaptです。aptの管理情報を最新の状態にする作業です。
apt update
apt upgrade
と2つのコマンドを実行してください。
[Y or N]を問われたらYを答えればOKです。
何かのインストールを行う前には、その都度実施する癖をつけておくとよいです。
(余談:pkgも使えます。Termux環境のpkgはaptのラッパーで中身は同じものとのことです。)
テキストエディタのインストール
プログラムを書かない人であっても、僅かながら設定ファイル(テキストファイル)の編集作業が必要となります。
Termuxをインストールしただけの状態でviエディタが使えますが、vimやEmacsやnanoもインストールして使えます。(viって何?vimって何?という方は無難にnanoをインストールしておくと良いです。)
例えば、nanoをインストールする場合は
apt install nano
と打てばOKです。
お好みに応じてインストールし、エディター自体の設定ファイルも編集しておくと便利です。(私はvimで~/.vimrcにset numberと記載しておき、行番号を表示させています。nanoの場合は/etc/nanorcにset linenumbersと記載しておけば同じ感じです。)
ストレージへのアクセス権を与える
この時点でTermuxに読み書き権限があるのは、自身のアプリケーション領域だけで窮屈です(THETAでは、他のアプリ領域も含め最大2GBに制限されています)。そこで、撮影画像が保存される領域(adb shellでは/storage/emulated/0/DCIM配下)への読み書き権限を与えます。
いつでもできますが、Vysorの画面が使えるときにやってしまいましょう。
まず、Vysor画面 Settings → Apps → Termux から、Termuxにストレージアクセスのパーミッションを与えます。
続いて、ターミナルから以下のコマンドを打ちます。
termux-setup-storage
すると、読み書き権限がつくだけでなく~/storage配下にシンボリックリンクができます。
「ls -al ./storage」などを打って確認するとよいでしょう。
「~/storage/dicm」が「/storage/emulated/0/DCIM」と等価です。
(余談となりますが、/sdcard/DCIM は /storage/emulated/0/DCIM のシンボリックリンクです)
もし、ストレージアクセスのパーミッションを与えずにこのコマンドを打った場合には、ダイアログが表示されるので「ALWAYS」に答えてから、もう一度同じコマンドを打てばOKです。
このブロックの作業は以上。
ファイルアクセスに関するちょっとした注意事項は本記事後半「SFTP関連Tips集」にまとめてあります。
今は次の作業へすすみましょう。
SSHサーバーまわりの整備
TermuxではOpenSSHが使えます。
以下手順でインストールとセットアップをしてください。
- OpenSSHのインストール(apt install opensshを打つだけ)
- 秘密鍵&公開鍵ペアの生成(THETA初期設定では、外部機器で生成を推奨)
- 公開鍵を ~/.ssh/authorized_keysに仕込む(直接コピペ推奨)
- ~/.bashrcを作成して1行「sshd」とだけ書いておく
(.bashrcはシバンなしでも大丈夫みたいです)
1~3については、以下ページなど(他も多数あります)を参考とすると良いです。
ただし、以下の点を補足しておきます(上の記事より先に見てね)。
-
2.について
Termux以外で行うほうが判りやすく操作がラクです。「SSHでのログインを試す」の項で紹介するようなSSH対応クライアントアプリで生成できます。
どうしてもこの時点で、THETA内Termuxで生成した鍵を使いたい方は、こちらの応用で生成したファイルをとりだせます。 -
3.について
この段階では、外部機器で作成した公開鍵のファイルをTermuxが参照できる領域にコピーすることが困難です。しかし、公開鍵は文字列が1行だけかかれているテキストファイルなので無理にコピーしようとは思わず、Termux上のエディタで直接~/.ssh/authorized_keysに文字列をコピペするのが最速作業手順かと思います。 -
4.について
この作業は、Termuxが起動したらSSHサーバーが自動で立ち上がるようにするための設定です。Termux環境はこれができるのがTHETAにとって最大の利点かもしれません。このシェルスクリプトの記述しだいで様々な振る舞いにできます。まさに「万能THETAプラグイン」です。
ここまででUSBケーブル接続した苦行環境はおしまいです。
TermuxへSSHでログインする
ここからは、THETAとPCを接続していたケーブルを抜いて作業します。
クライアントアプリの紹介
THETAにログインする端末毎に、SSHログインできるクライアントアプリを紹介しておきます。
(前述のとおり、これらのアプリでも秘密鍵と公開鍵のペアが作成できます。)
端末のプラットフォーム | クライアントアプリ参考情報 |
---|---|
Andoid | ConnectBotが無難なようです。他もあります。 |
iOS | 私の知識がありませんがこのあたりを参考に。多数あります。 |
Windows | TeraTermが知らない人居ないレベルでしょうか。他も多数あるかと。 |
Mac | terminalでOpenSSHが使えるはずです。他もあるようです。 |
クライアントアプリの設定
クライアントアプリの設定で注意することは以下です。
設定項目 | 設定内容や注意事項 |
---|---|
IPアドレス | APモードなら192.168.1.1 CLモードはルータによります。(表の下で補足します) |
ポート番号 | 8022になります。 (指定する場合、Termux都合で1024番より大きな数値にしてください) |
ユーザー名 | 空白以外なら何を入れてもOK。 Termuxが自動割り当てして変換してしまいます。 |
鍵 | 前の作業で作成した秘密鍵のファイルを与えてください。 |
CLモードで接続する場合の補足です。
THETAにケーブル接続してTermuxのターミナルから「ip -4 a」を打って調べる方法もありますが、毎回ケーブル接続するのは不便です。
ケーブル接続せずにTHETAに割り当てられたIPアドレスを知る方法をいくつか挙げておきます。
接続形態 | 方法の例 |
---|---|
個人用のルーターに接続する | ルーターの管理画面で確認することができます。(詳細は機種によるので割愛) |
テザリング可能なスマートフォンに接続する | スマートフォンのWiFi設定確認画面で確認できます。(詳細は機種によるので割愛) |
接続形態によらず、THETAにSSHログインする端末側でLinux系のネットワークコマンドが使える場合 (AndroidスマートフォンにTermuxをインストールするのもありです) |
さまざまなコマンドで調べる方法があります。たとえば「nmap -sT -p8022 192.168.*.* 」で8022のポートを開いているTCPプロトコルのIPアドレスを探索するなどです。他arpコマンド利用などもあると思います。 |
Termuxを起動プラグインにする
通常のTHETAプラグインと同じ操作でTermuxを起動できるようにします。
以下動画の「setup」の所とやり方は同じです。(実は、この動画のプラグイン一覧が表示されるところに「Termux」がみえてるんですよ!探してみてください。)
PC用基本アプリだけでなく、スマートフォンの基本アプリからも設定できます。
先日お知らせしたZ1用プラグインの使い方動画を作成しました。インストールとセットアップは、どのプラグインにも共通事項です。
— THETAプラグイン開発者コミュニティ (@thetaplugin) November 6, 2019
このプラグインをインストールしたあとは、他のプラグインのセットアップ手順が省略できます!便利ですので是非!https://t.co/ijFBmKphJF#thetaplugin pic.twitter.com/nuJa2Q0CtT
THETA Z1をお使いの方は、起動プラグインをTermuxにするのではなく、この動画の Plug-in Launcher for Z1を仕込んでおくほうが便利です。
SSH接続する
準備が整ったらSSH接続してみましょう。
Android機からConnectBotで接続する例を以下に示します。
丁寧に手順や仕込みを書いてきたので面倒そうにみえますが、簡単でしょ?
Termuxの終了
Termuxを起動したままSSHをログアウトする方法について説明は不要だと思います。(アプリにより異なります。ターミナルからexitを打つなり、GUIで切断の操作をするなり様々ですが、いずれも簡単です。)
しかし、TermuxはTHETA本体のボタン操作を受け取れません。
このため、Termuxを終了させるためにSSHログインした状態で以下コマンドを打つ必要があります。
am broadcast -a com.theta360.plugin.ACTION_FINISH_PLUGIN --es packageName com.termux
こちらのドキュメント末尾付近「Notifying Completion of Plug-in」に記載があります。
コマンド打つのが面倒という方の強制終了方法として、「電源ボタン短押し」でTHETAをスリープさせることでTermuxを終了させ、すぐスリープから復帰という荒業もあります。
工夫なしで、こんなにTHETAを操れる
外部機器(スマートフォンやPC)からTHETAにSSHログインしてTHETAを操れる環境が整いました。
コマンドラインでできることは必ずプログラムにできます。コマンドラインから少しづつTHETAを操って、振る舞いを確認してみましょう。
この章で紹介することは「プログラミングなし」です。
プログラミングなしでこんなに遊べます。
いきなりLチカ
THETA Vをお持ちの方限定、みんな大好きLチカが簡単にできます。
まずは以下のコマンドを打ってみましょう。
am broadcast -a com.theta360.plugin.ACTION_LED_BLINK -e target LED3 -e color yellow --ei period 500
はい、無線LANの状態を示すLEDが500ms間隔で黄色くチカチカしましたね。
消す場合は以下です。
am broadcast -a com.theta360.plugin.ACTION_LED_HIDE -e target LED3
黄色に点灯させたままは以下です。
am broadcast -a com.theta360.plugin.ACTION_LED_SHOW -e target LED3 -e color yellow
こちらのドキュメント「Control the LEDs」のブロック を参考にして他のLEDもチカチカさせてみましょう。
- LED3~8が操れます。
- LED4~LED8は、カラーLEDでないので色表示ができない(指定不要)
- 点滅時間の最小値は500[ms] 最大値は 2000[ms]
というくらいが注意点です。
いきなりOLED表示
THETA Z1をお持ちの方、自由に操れるLEDが無いからLチカできないと嘆かないでください。
もっとよい表示デバイスがついていますね。そうOLEDです。
これもコマンド1行で操れるのです。まずは以下を
am broadcast -a com.theta360.plugin.ACTION_OLED_TEXT_SHOW -e text-middle 'This is text-middle String'
am broadcast -a com.theta360.plugin.ACTION_OLED_TEXT_SHOW -e text-bottom 'This is text-bottom String'
消したい場合は以下です。
am broadcast -a com.theta360.plugin.ACTION_OLED_HIDE
こちらのドキュメント「Control the OLED」のブロック が参考になります。
現時点では画像表示に関する以下インテントについて探り中です。
“com.theta360.plugin.ACTION_OLED_IMAGE_SHOW”
“com.theta360.plugin.ACTION_OLED_IMAGE_BLINK”
amコマンドで画像データを渡す方法がまだみつかっていません。。。
OLED表示ちょっと応用
表示器があるTHETA Z1独自の小技となります。
THETA Z1をCLモードにしてTermuxを利用する際、Termuxを起動したらSSHログインするためのIPアドレスがOLEDに表示されていると便利です。
まずはコマンドラインから以下を打ってみてください。
ip -4 a
こんな表示がされると思います。(以下はAPモードの時の例)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group def ault
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
6: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 192.168.1.1/24 brd 192.168.1.255 scope global wlan0
valid_lft forever preferred_lft forever
この表示結果を grepコマンドを併用して必要部分のみ抜き出す例は以下となります。
(もっとスマートな方法があるかもしれませんが・・・取り急ぎ)
ip -4 a | grep inet | grep wlan0 | grep -oP '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(?=\/)'
THETAのWLAN状態 | 上記コマンドの実行結果 |
---|---|
APモード | 192.168.1.1 |
CLモードで接続中 | ルータに割り付けられたTHETA Z1のIPアドレス |
WLANオフ or CLモードで未接続 |
表示なし |
が表示されると思います。
このコマンドの結果をOLED表示するように .bashrc を記述しておきましましょう。
すでに記載済みの 「sshd」と併せると以下のような記述になります。
(Termuxの.bashrcは、シバンが無視されるようですが、念のためTermux環境用のシバンを書いておきます。通常のシバンを通す方法はこちらなどが参考になります)
#!/data/data/com.termux/files/usr/bin/sh
# launch sshd
sshd
# display self IP
array=$(ip -4 a | grep inet | grep wlan0 | grep -oP '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(?=\/)')
echo $array
am broadcast -a com.theta360.plugin.ACTION_OLED_TEXT_SHOW -e text-bottom $array
動作させるとこんな感じ。(CLモードの例)
CLモードでtermuxを利用するのがとても便利になったと思います。
THETAにプリセットされた効果音を鳴らす。
以下のコマンドを打ってみてください。
am broadcast -a com.theta360.plugin.ACTION_AUDIO_SHUTTER
撮影音が鳴りましたね。
こちらのドキュメント「Sound Effect」のブロック を参考にして他のプリセット音も鳴らしてみましょう。
「ACTION_AUDIO_ほにゃらら」の「ほにゃらら」を変えるだけで色々な音がなります。
いきなり撮影(curl)
Termuxはインストールするだけでcurlコマンドが使えます。
THETA S/SC/V/Z1にcurlコマンドが使えるPCやラズパイなどを接続して撮影していた方、その知識まるごと生かせます。
今回は、THETA内Termux → THETA内部処理(撮影アプリ) への指示となるので、IPアドレスとポート番号を「192.168.1.1:80」から「127.0.0.1:8080」に変えるだけです。以下コマンドを打ってみてください。
curl -v -H "Content-Type: application/json; charset=utf-8" -H "X-XSRF-Protected: 1" -X POST -d "{"name": "camera.takePicture" }" http://127.0.0.1:8080/osc/commands/execute
撮影の前後で「ls ~/storage/dcim」を打って画像ファイルが増えることを確認してみるとよいです。
その他の色々なこともできます。
webAPIの詳細はこちらをご参照ください。
これでTermuxから殆どのことが掌握できていることになります。
(ライブビューの処理もAndroidより作り易いです。MOTIONJPEGのストリームをffmpegにいれてあーたらこーたらを別プロセスで処理させつつ...とか作り易いです。)
Tips:Termuxのamコマンドは何者?
余談となります。
amコマンドは「Activity Manager」と呼ばれ、AndroidのADB Shell独自のコマンドです。普通のLinuxにはありません。これが何者なのか少し確認してみましょう。
Termuxで「which am」と打つと
/data/data/com.termux/files/usr/bin/am
と結果がでます。
ADB Shellでは
/system/bin/am
と表示されます。
それぞれの使い方で別のバイナリが実行されています。
ヘルプを表示させると、Termuxのamコマンドはアプリケーションの実行権でできる範囲に機能が絞られていることがわかります。「force-stop」などは使えないので、ある意味安全とも言えます。
SFTPクライアントからデータの読み書きをする。
curlコマンドで撮影したあと、lsコマンドで画像ファイルができていることを確認できますが、画像を見れない歯がゆさがあります。
SSHログインしている端末で画像データみたいですよね。これもできます。
iOSだけの困りごとになりますが、DNGファイルをスマートフォン用基本アプリでひきとれませんよね。これもできるようになります。
自身が作成したプログラムが扱うデータなどを、THETA内部に書き込みたかったりもしますよね。これもできます。
SFTPクライアントの紹介
各プラットフォームそれぞれ、SFTP対応アプリはたくさんあるので、いくつかだけ紹介しておきます。
端末のプラットフォーム | クライアントアプリ参考情報 |
---|---|
Andoid | AndFTPがおすすめなようです。普段お使いのファイル管理アプリが既に対応しているケースも。 |
iOS | FTPManagerがおすすめみたいです。iOSを使う人に試してもらったらjpg,DNG,mp4のサムネイルまで表示されました。すごい。 |
Windows | WinSCPを使ってみました。SSHログインも同時に行える特徴があります。他多数あるのでお好みで。 |
Mac | GUIでとなるとちょっと私の知識不足。割愛させてください。 |
Termux OpenSSHのSFTP設定
Termux Wiki 「Remote Access」ページの「Setting up password authentication」のブロックにしたがって作業します。
・設定ファイルの編集
sshdの設定ファイルを以下のように変更してください。
(SFTPについてはパスワード認証になります)
SendEng LANG
SendEng LANG
PrintMotd no
PasswordAuthentication yes
PubkeyAcceptedKeyTypes +ssh-dss
Subsystem sftp /data/data/com.termux/files/usr/libexec/sftp-server
・パスワードの設定
以下コマンドを打ってパスワードを設定します(指示に従い2回入力)
passwd
上記2つの設定をしたら、sshdを立ち上げなおします。「pkill sshd」などとすると、現在作業中のターミナルの通信が切断されますので、ログアウトしてログインするのが良いでしょう。
SFTPでファイルアクセスする。
あとは、接続するだけでGUIのファイル管理ソフトで読み書き自由にできてしまいます。
大抵の場合、アプリケーション内にパスワードを記憶できるのでクリックするだけです。
AndFTPからアクセスした例は以下
ログイン→ファイル取得→THETA基本アプリで表示までしています。
SFTP関連Tips集
みえすぎちゃって困るの
おおむね、Android Studioの「Device File Explorer」と同じディレクトリが見えます。ファイルについてはアプリケーションとして権限があるところまでなので、空のディレクトリが見える場合もあります。
見えすぎても使いませんので、クライアントソフト側で「接続したときに最初に表示するディレクトリ」を設定しておくと便利です。各人の用途によりけりですが、$HOMEや/sdcard/DCIM としておくのが無難です。
USBケーブル接続(PTP/MTPアクセス)との違い
USBケーブル接続時(UVCモード以外)のプロトコルはPTP/MTPで、外部機器からのアクセス制限は以下となっています。
- Androidのシステムからみた /sdcard/DCIM 配下が見えます。
- 拡張子が jpg, DNG, mp4 のファイルだけ見えます。
- 読み取りと削除ができます。書き込み禁止です。
上記に該当するファイルのデータベースは完全電源OFFから電源ONしたときと撮影アプリ(com.theta360.receptor)によってファイル操作されたときに更新されます。
撮影アプリを介さず作成/削除された対象ファイルを、完全電源OFFをせずに、PTP/MTPから最新の状態が見えるようにするには、こちらのドキュメント下方「Updating the Database」に記載されているインテントを使う必要があります。
/sdcard/DCIM/orgdir/newfile.jpg のようなファイルを作成した場合
am broadcast -a com.theta360.plugin.ACTION_DATABASE_UPDATE --esal targets DCIM/orgdir/newfile.jpg
/sdcard/DCIM/orgdir/delfile.jpg のようなファイルを削除した場合
am broadcast -a com.theta360.plugin.ACTION_DATABASE_UPDATE --esal targets DCIM/orgdir/delfile.jpg
「DCIM」始まりで対象ファイルまでのパスを指定します。
ファイルが空のディレクトリの追加や削除に対しては、完全電源OFF→電源ONでないと更新されないようです。
「PTP/MTP接続時、電源OFFせずにTermuxで処理したjpg, DNG, mp4ファイルをみたい」という場合だけの話なので、あまり気にしなくても問題ないかもしれません。
THETA内部のタイムゾーン
一般的なTHETAの使い方には、タイムゾーンの概念がありません(Exifなどの仕様にありません)。
Termuxを使うケースに限らず、開発者モードにして、タイムゾーンの概念があるAndroidシステムを介するプログラミングをするとタイムゾーンが気になることがあります。
今回、SFTPクライアントでTHETA内部のファイルタイムスタンプをみたり、「date」コマンド打ったりすると、THETA内部がタイムゾーンをどのように扱っているか簡単に見えるので、THETAの振る舞いに触れておきます。
THETAは、「AndroidのタイムゾーンをUTCに固定して、時刻部分は各国の時間(基本アプリから届いた時刻あわせコマンドの設定値に従う)」という状態で管理されています。
VysorなどからAndroidのタイムゾーンをUTC以外に変更しても、基本アプリをTHETAに接続すると元の状態に戻されます。
基本的にはこのあたりがシビアになることは行わないと思います。弄らずに使用したほうが無難です。
OpenSSHクライアントも使えます
ここまで、設定することが多めなOpenSSHサーバーについて詳しく書きましたが、クライアント動作もできます。
curlコマンドで撮影したら、別マシンで動作しているSFTPサーバーへファイルを書き込むようなプログラムも作れますのでご安心を。
(わかっているとは思いますが、念のため…)
THETA内部でプログラミング
可能性が無限大に広がってしまう話なので、最小限のポイントに絞ります。
以降では、「インストールが必要な事項はCLモードで外部ネットワーク接続」「そうでない場合はAPモードでもOK」ということについて、いちいち記載しませんので各自でその都度判断してください。
git,wgetも使えます
以下二つはインストールしておいたほうが良いです。
特にgitは、GitHubからベースとなるプロジェクト一式を持ってこれるだけでなく、自身の成果物を作業履歴つきでバックアップしたり、公開したりもできて便利です。
apt install git
apt install wget
マルチ言語開発と実行が可能
他にもいろいろつかえるのですが、取り急ぎC,C++コンパイラとpython3をいれましょう。
C,C++のコンパイラはclangです。apt,pkgなどでインストール作業を行うとビルドも自動でなされる場合があるので、Termux環境に必須といっても過言でないかと。以下コマンドでインストールしてください。
apt install clang
インストール後は gcc,cppを打ってもclangが動作するようclangの別名が設定され、外部から取得したmakefileが大抵動作するようになります。
Python3は以下コマンドでインストールしてください。インストール後はpipも使えます。
apt install python
インストールしたあと、バージョン表示をした結果は以下のとおり。
pythonでwebUIのサンプル
HTTPサーバーが簡単に立つのでPython事例として挙げておきます。
まず flaskというPythonのライブラリをインストールします。
pip install flask
つづいてお好みのディレクトリに以下のコードを書きます。
ブラウザでアクセスしたとき「Hello World!」と表示されるだけのサンプルです。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_cloud():
return 'Hello World!'
app.run(host='0.0.0.0')
保存したら以下でHTTPサーバーを起動します。(パスやファイル名はお好みで)
起動するとコマンドプロンプトが戻ってきません。「Ctrl+c」で終了させるとプロンプトが戻ります。
python hello.py
あとは同一ネットワークにいるマシンのブラウザから以下にアクセスします。
http://localhost:5000/
※localhostは、APモードなら「192.168.1.1」CLモードなら「クライアントアプリの設定」の項に出てきた方法で調べてください。
ポート番号を指定していないので5000番になります。8888番を指定すると、通常THETAプラグインのwebUI事例と同じになります。しかし、Termuxビルド時のassetフォルダに「このアプリにはwebUIがあるよ」を示す「settings.json」ファイルを置けていませんので、THETA基本アプリからブラウザを起動する振る舞いができない点はご注意ください(Termuxを使うような方は直接入力のほうが楽かと思いますが念のため)。
cat -nでコード表示 → サーバー起動 → 同一ネットワーク上別マシンから表示
をした動作例は以下です。
他のPython簡単事例を作るためのキーワード
サンプルを作る時間がなかったので、THETAで便利そうなキーワードを少々。
- PycURL(pycurl)を使うと、webAPIを使ったコードが楽にかけると思います。
- PyDriveをつかうとGoogle Driveアクセスをするコードが楽にかけると思います。
- NumPyなど当たり前に動くので、姿勢センサー出力を行列演算するコードも楽にかけると思います。
事例集
[2019/12/24] PycURLを利用したPythonのコードをGitHubに追加しました。
詳細は GitHubのREADMEをご参照ください。
動作している様子は以下動画をご参照ください。
以下記事で考えたコマンド応答体系を流用しています。Android(java)のコードとPythonコードの対応もとれると思います。 [音通信ライブラリChirpを利用してTHETAを操る](https://qiita.com/KA-2/items/3de2e5a590c7768c6325)Termux on THETAの記事にPython事例追加!pycurlを利用した簡単撮影スクリプトです。
— THETAプラグイン開発者コミュニティ (@thetaplugin) December 24, 2019
他言語からの呼び出しや他pythonスクリプトへのimport可能。IPアドレスとポートを変えるとRasPi等、外部機器でも使えます。https://t.co/P1vw5sRaSS#thetaplugin #termux #python #linux https://t.co/7BYlSIt1GF pic.twitter.com/7F0yhZtEyK
[2019/12/24] @codetricityさんによるNodeやGraphicsMagickの利用例追加
本記事のコメント欄に色々書いてくれた@codetricityさんが
NodeによるwebサーバーやGraphicsMagickによる画像処理をする例も試してくれています。
RICOH THETA image transformation inside the camera with GraphicsMagick running on Termux plug-in https://t.co/RGUGACC8Rm pic.twitter.com/0oMtbFHR7Q
— THETA360 .guide (@theta360dev) December 19, 2019
Termux:APIで機能拡張(CUIで姿勢センサーや音再生)
コマンドラインからAndroid固有の機能を使えるようにするTermux:APIの導入方法を紹介しておきます。
最新の情報はTermux:APIのWikiを参照してください。日本語ではこちらの記事が参考になると思います。
沢山のことが行えますが、現時点でTHETAと相性が良いのは以下と思われます。
コマンド名称 | できること |
---|---|
termux-sensor | 姿勢センサーの情報、主に加速度(3軸)、角速度(3軸)、地磁気(3軸)取得する |
termux-media-player | 任意の音楽ファイルを再生する |
追加機能apkインストール
AndroidのsharedUserIdという仕組みをつかってTermux本体に追加される機能です。
F-Doroidに公開されているTermux:APIの最新apkを取得してインストールしてください。
インストールの仕方はTermux本体のapkインストールと同じです。
Termux本体と同じ署名がされてなければインストールできません。
Termuxに独自の仕掛けを追加するわかりやすい事例にもなっているので、公開されているソースコードをベースに自身でビルドした場合は、Termux本体とTermux:APIの両方に同じ署名をする必要があります。(Google Playが使えるスマートフォンでTermuxを利用するときに、GooglePlayとF-Droidのapkを混在させることができないのと同じ理由です)
Termux内の追加機能インストール
Termuxのシェルから追加機能を呼び出すためのプログラムが必要となります。
Termuxにログインしたら、コマンドラインから以下を入力してインストールしてください。
apt install termux-api
コマンドラインから姿勢センサーを使う
ヘルプを表示すると、オプションが分かります。
$ termux-sensor -h
Usage: termux-sensor
Get information about types of sensors as well as live data
-h, help Show this help
-a, all Listen to all sensors (WARNING! may have battery impact)
-c, cleanup Perform cleanup (release sensor resources)
-l, list Show list of available sensors
-s, sensors [,,,] Sensors to listen to (can contain just partial name)
-d, delay [ms] Delay time in milliseconds before receiving new sensor update
-n, limit [num] Number of times to read sensor(s) (default: continuous) (min: 1)
$
-lオプションを使い、このハードウェアで出来ることを確認すると以下です。
1つのセンサーの生データだけでなく、扱いやすく加工したデータを取得できるようです。
結果はJSON形式で得られます。
$ termux-sensor -l
{
"sensors": [
"LSM6DSM Accelerometer",
"AK09915 Magnetometer",
"AK09915 Magnetometer Uncalibrated",
"LSM6DSM Gyroscope",
"LSM6DSM Gyroscope Uncalibrated",
"LSM6DSM Accelerometer -Wakeup Secondary",
"AK09915 Magnetometer -Wakeup Secondary",
"AK09915 Magnetometer Uncalibrated -Wakeup Secondary",
"LSM6DSM Gyroscope -Wakeup Secondary",
"LSM6DSM Gyroscope Uncalibrated -Wakeup Secondary",
"Gravity",
"Linear Acceleration",
"Rotation Vector",
"Step Detector",
"Step Counter",
"Significant Motion Detector",
"Game Rotation Vector",
"GeoMagnetic Rotation Vector",
"Orientation",
"Tilt Detector",
"Gravity -Wakeup Secondary",
"Linear Acceleration -Wakeup Secondary",
"Rotation Vector -Wakeup Secondary",
"Step Detector -Wakeup Secondary",
"Step Counter -Wakeup Secondary",
"Game Rotation Vector -Wakeup Secondary",
"GeoMagnetic Rotation Vector -Wakeup Secondary",
"Orientation -Wakeup Secondary",
"AMD",
"RMD",
"Basic Gestures",
"Facing",
"Pedometer",
"Motion Accel",
"Coarse Motion Classifier"
]
}
$
重力加速度を 10msec間隔で取得する場合は以下を打ち込みます。
termux-sensor -s "Gravity" -d 10
こちらもJSON形式で結果が得られます。
コマンドラインで実行した場合には、「Ctrl+c」で終了できます。
コマンドラインから任意の音楽ファイルを再生する
SFTPで外部からファイル書き込みができるようになっていると思いますので、再生したいmp3ファイルをどこかに置いて以下コマンドを実行してみてください。
termux-media-player play <mp3filename>
自然音の音量が小さいのはスピーカー特性によるもので「これまで通り」です。普通に再生できます。
以下記事の音楽ファイルも普通に再生できました。
その他のこのコマンドの使い方は以下でご確認ください。
termux-media-player help
これで、Termux環境で作成するプログラムにも音再生のバリエーションを加えられますね。
惜しくも使えなかったもの
電話をかける、スケジューラーや電話帳の操作をする、各種ポップアップ表示をするというような系統は、明らかにTHETAに不要なのはご理解いただけると思います。
以下については、THETAで使えると便利そうですが、提供されたままの状態では動きませんでした。
No | コマンド名称 | 普通のAndroid機ならできること |
---|---|---|
1 | termux-microphone-record | マイクから録音する ※要マイクのパーミッション |
2 | termux-camera-photo | カメラで撮影する ※要カメラのパーミッション |
3 | termux-usb | usb機器と通信できるようにする |
4 | termux-tts-speak | Text To Speechを動作させる |
動作しない理由は以下です。
1~3につてはTermux:APIの仕組みに皆さんが手を加えることで動きそうです。
- 「termux-microphone-record」について
こちらの記事にある「モノラル音声指定」をTermux環境で行う方法が今時点みつかっていません。
(2019/12/11 補正)「モノラル音声指定」は以下webUIでできました。が、「termux-microphone-record」の結果は変わらず・・・。
curl -v -H "Content-Type: application/json; charset=utf-8" -H "X-XSRF-Protected: 1" -X POST -d "{\"name\": \"camera.getOptions\", \"parameters\": { \"optionNames\": [\"_microphoneChannel\"] } }" http://127.0.0.1:8080/osc/commands/execute
- 「termux-camera-photo」について
こちらのドキュメント「Notifying Camera Device Control」に従い、CameraAPIの実行権をTermuxにしたのですが0 Byteのファイルができるだけでした。未調査ですがTermux:APIはCameraAPI2を利用しているのかもしれません。(webAPIが使えますので、このコマンドが使えなくても問題ないとは思います。) - 「termux-usb」について
termux-usbのWikiに記載されたサンプルプログラム動作まではできたのですが… libusbを使ってUSBシリアル通信などを組むには手間がかかりそうです。あと、パーミッションを毎回与えなければならない振る舞いになりました・・・。Linuxらしさは薄れますが、今は他の方法で実現するのが早そうです。 - 「termux-tts-speak」について
picoTTSがプリインストールされていることにお気づきの方がいるかもしれません。しかし、製品動作として利用していないため正常動作するものではありません。英語の発話だけですが、プラグイン作成に役立つと思われ、将来動作させたいと考えてはいますが。。。今はお許しを。
その他の拡張や将来性
「TermuxやTermux:APIに手を加えずに利用する」という範疇では、これまでの記事と比較して以下事項ができていません。
- 本体ボタン操作(=THETAに直接接続したキーボード含む)を受け取る
- OLEDに画像データを表示する
- マイクからの音データ利用
- CameraAPIを利用した高度な映像利用(例えば4K30fpsのライブストリーミングなど)
- USB OTGで外部機器とシリアル通信する(手間をかければできますが一応記載)
Termux:APIの章で少し触れましたが、こういったTHETA独自のハードウェア構成に依存する事項はTermuxAPIの仕組みを真似することで対応できます。
Androidアプリケーション側のコードとsocket通信で指示をしたりその結果を受け取ったりします。Linuxで対象のハードを使うときの作法を守れないこともあり、Linuxの世界での流用がしにくくなりますが、Termux環境でできないことはないという状況かと思います。
また、機能拡張も行われており
- まだまだ拡張中ですがUbuntu環境にする
- ROM容量をけっこう必要としますがXシステム(X11)のリモートデスクトップ環境構築ができる
なんてこともあったり、まだ機能追加リクエストレベルですが
なども進みそうです。
なんだか可能性が無限大すぎて怖いレベルです。
まとめ
Termux環境構築にトライすることで、普通のTHETAプラグインの作り方の知識を広くすばやく吸収できたのではないかと思います。
環境構築を終えると各種スクリプトが使えるのが強力です。
「THETAでこれちょっと試したい」ということに直ぐにとりかかれます。最終的に行いたいことの要素を別々に検証したあと、統合動作させることも簡単です。以前に作った要素の使いまわしもしやすいですし、自身が行ったことがないことでもLinux系(特にラズパイ)で実績があれば手数少なく(ネットワーク関係なら大抵はそのまま)移植できる可能性が高いです。
Linuxの心得があるかたなら、Android Studioを立ち上げ apkをビルドし、THETAにインストールするほどのことでもないことがサクサクと行えるようになります。
たとえば、「ブラケットインターバル撮影」「ちょっとした画像処理」「ファイル転送関連もろもろ」「姿勢検出の検証」etcができます。
雛型スクリプトを仕込んでおいて、撮影地でパラメーターだけ少しいじるなんて使い方もありだと思います。
今回の記事は「Termux導入編」といったところでしょうか。いくつか提示した課題解決ができたり、Termux環境のほうが便利と思われることがあったら、たまにはこの系統の続編も書いてみようとおもいます。
皆さんも是非Termux環境を試してみてください。
RICOH THETAプラグインパートナープログラムについて
THETAプラグインをご存じない方はこちらをご覧ください。
パートナープログラムへの登録方法はこちらにもまとめてあります。
興味を持たれた方はTwitterのフォローとTHETAプラグイン開発コミュニティ(Slack)への参加もよろしくおねがいします。