processingヘッドレスをRaspberryPiで試してみる
processingで画像を生成させて保存したい場合
RaspberryPiだとGUIを使いたくない場合があるしそもそもprocessingが重くて使いづらい
そこで、ヘッドレス(GUI無し)で画像を保存する方法があったので備忘録がてら記述
(ただ、最後の画像保存のところが微妙なのでお詳しい方解決策をお願いしたい思いもあります)
1. Processingをインストールする
processingはLinux 32bit 2.2.1をインストールした
参考
PROCESSING 2.1 + ORACLE JAVA + RASPBERRY PI + SERIAL + ARDUINO = ☺
$ sudo apt-get update
$ sudo apt-get upgrade
oracle javaのインストール
$ sudo apt-get install oracle-java7-jdk
processingのインストール
$ wget http://download.processing.org/processing-2.2.1-linux32.tgz
$ tar xvzf processing-2.2.1-linux32.tgz
processingに入ってるjavaを削除する
$ rm -rf ~/processing-2.2.1/java
oracle javaを反映させる
$ ln -s /usr/lib/jvm/jdk-7-oracle-armhf ~/processing-2.2.1/java
jSSCのインストール
$ wget https://java-simple-serial-connector.googlecode.com/files/jSSC-2.6.0-Release.zip
$ unzip jSSC-2.6.0-Release.zip
processingにjSSCを反映
$ mv jSSC-2.6.0-Release/jssc.jar ~/processing-2.2.1/modes/java/libraries/serial/library/
使用するjavaを変更する
$ sudo update-alternatives --config java
おそらくRaspberryPiだと
There are 2 choices for the alternative java (providing /usr/bin/java).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt/jre/bin/java 318 auto mode
1 /usr/lib/jvm/jdk-7-oracle-armhf/jre/bin/java 317 manual mode
2 /usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt/jre/bin/java 318 manual mode
Press enter to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/lib/jvm/jdk-7-oracle-armhf/jre/bin/java to provide /usr/bin/java (java) in manual mode
というのが出てくると思うので、1のjdk-7-oracle-armhfを用いる
1をタイプしてEnterする
これで、processingおよびprocessing-javaがRaspberryPi上で動くようになった
次に、仮想的にxserverでprocessingを使うためにxvfbを導入する
2. xvfbの導入
参考
Running Headless Selenium on a Raspberry Pi
Xvfbのインストール
$ sudo apt-get install xvfb
フォントも念のためインストールする
$ install xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic
Xvfbを起動する
$ Xvfb :1 -screen 0 1024x768x24 &
_XSERVTransSocketOpenCOTSServer: Unable to open socket for inet6
_XSERVTransOpen: transport open failed for inet6/raspberrypi:1
_XSERVTransMakeAllCOTSServerListeners: failed to open listener for inet6
[dix] Could not init font path element /usr/share/fonts/X11/misc, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/cyrillic, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/100dpi/:unscaled, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/75dpi/:unscaled, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/100dpi, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/75dpi, removing from list!
[dix] Could not init font path element /var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType, removing from list!
みたいなのが出てくるけど無視して大丈夫(フォントをインストールしていた場合[dix]の行数が減るはずです)
仮想的にディスプレイに反映させる
$ export DISPLAY=:1
これで準備は整ったので、プロセシングファイルを作って実行する
3. processingファイルの作成
とりあえず画像を出すのが目的なので適当なプロセシングファイルを作る
$ mkdir sample
$ cd sample
$ vi sample.pde
単純な円を描くプログラム
void setup() {
size(200, 200);
}
void draw() {
background(0);
ellipse(100,100,100,100);
save("test.jpg");
}
うまく実行出来れば、test.jpgという名前のファイルが作成される
processing-javaを用いて実行してみる。実行はsample.pdeを実行するのではなくて、sampleフォルダを実行することに注意
プロセシングのフォルダやsampleフォルダはhomeディレクトリに保存しているが、これらは適宜移動させても大丈夫
$ ./processing-2.2.1/processing-java --sketch=/home/pi/sample --output=/home/pi/sample/output --force --run
ちょっと時間がかかるので待つ
画面に
Listening for transport dt_socket at address: 8752
と表示されたら成功
sampleディレクトリにtest.jpgというファイルが生成しているはず
これでヘッドレスでprocessingを用いて画像を生成することができます
ただし、プロセシングプログラムで画像を生成しても、上手く生成できたり出来なかったり
というのが現段階の状況
無限ループを使用しているのが悪いのかもしれないのでこのあたりなんとか解決しておきたい・・・