cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

IoT最強プラットフォームを目指して、RaspberryPi3にopenFrameworksをインストールして、ofxZmqをWindow(openGL)無しでも動くようにする(その1)

(編集中)
raspberry Piは安くて早くて、arduinoと違ってネットワークに簡単に繋がる利点があります。
また、ネットワークはzeroMQを使えば、高速・安定・簡単に書けることも覚えてしまいました。
さらに、openFrameworksは様々な用途のライブラリaddonをいろいろな人が開発していて、様々な用途に便利に使えます。

そこで、raspberry Piの上のopenFrameworksでzeroMQが使える環境を整えておきたいと思います。
バイス制御などの用途では、GUI Windowがあることが却ってネックになってしまうことがあるので、
サーバー向けにGUI無しでも動かせるようにしておきます。

1. 最新のRaspbian(jessie)を普通にインストールする.

2. openFrameworksのソースをダウンロードしてインストールする.

このページを参考にします。
raspberry pi | openFrameworks
ARMv6版とARMv7版が選択肢にありますが、Raspbianではv6、Armlinuxではv7を選ぶとよいようです。

3. zeromqのcpp bindingsをダウンロードして/usr/includeにコピー

http://zeromq.org/bindings:cpp

> cd /usr/include/
> sudo wget https://raw.githubusercontent.com/zeromq/cppzmq/master/zmq.hpp

4. 作者に感謝しながら、ofxZmqをダウンロード

cd /home/pi/openFrameworks/addons
wget --no-check-certificate https://github.com/satoruhiga/ofxZmq/archive/master.tar.gz
tar xvzf master.tar.gz
mv ofxZmq-master ofxZmq
rm master.tar.gz

5. sodiumをインストール

[1]を参考に。

sudo apt-get install libsodium-dev

6. 空の新規プロジェクトを作る

RaspberryPiでは、残念ながらプロジェクトジェネレータを使えないそうなので、ファイルコピーで空のプロジェクトを用意します。

cp -R /home/pi/openFrameworks/examples/empty/emptyExample /home/pi/openFrameworks/apps/myApps/myRpiApp
cd /home/pi/openFrameworks/apps/myApps/myRpiApp
make
make run

7. ofxZmqをプロジェクトに追加するためaddons.makeを編集。

> cd ~/openFrameworks/apps/myApps/myRpiApp
> nano addons.make

ofxZmq

8. sodiumをリンクするようにconfig.makeを編集

PROJECT_LDFLAGSの行を探して、コメントアウトを解除。

PROJECT_LDFLAGS=-Wl,-rpath=./libs -lsodium

9. ofxZmqのexampleのソースコードをコピーして持ってくる

cd ~/openFrameworks/apps/myApps/myRpiApp/src
cp /home/pi/openFrameworks/addons/ofxZmq/example/src/testApp.cpp ./
cp /home/pi/openFrameworks/addons/ofxZmq/example/src/testApp.h ./

main.cppを次のように編集します。

#include "ofMain.h"

//define _NO_WINDOW
#ifdef _NO_WINDOW
#include "ofAppNoWindow.h"
#endif // _NO_WINDOW

#include "testApp.h"

int main(int argc, char* argv[])
{
#ifndef _NO_WINDOW
    ofSetupOpenGL(1024, 768, OF_WINDOW);
#else
    ofAppNoWindow window;
    ofSetupOpenGL(window, 0, 0, OF_WINDOW);
#endif

    ofRunApp(new testApp());

    ruturn 0;
}

もしくは、

ofSetFramerate(0);

をしておく。

10. platform.hppにZMQ_USE_EPOLLの定義を追加

nano ~/openFrameworks/addons/ofxZmq/libs/zmq/src/platform.hpp

#define ZMQ_USE_EPOLL
#define ZMQ_HAVE_UIO 1

ZMQ_HAVE_UIOはstruct iovecが多重定義になるのを防ぐのに必要だとのこと。

コンパイルを通すために適当に立てたフラグなので、環境に合わせてちゃんといろいろ設定しないとダメかもしれない。[2]を参考に。要確認。

11. makeして実行

> make
> make run

GUIなしにすると、キー入力も拾ってもらえませんので、testApp.cppを適当に書き換える必要があります。


これで、IoT最強に成れるのではないだろうか!

[1] osdevlab.blogspot.jp
[2] github.com
[3] qiita.com