25
iTamabi 13  第6回:ARTSAT API 実践 2 衛星の情報で表現する 2013年10月28日 多摩美術大学 PBL科目 担当:田所 淳

iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現する

Embed Size (px)

Citation preview

iTamabi 13  第6回:ARTSAT API 実践 2 衛星の情報で表現する

2013年10月28日 多摩美術大学 PBL科目 担当:田所 淳

今日の内容

‣ ARTSAT API - WebAPIから送出されるデータの意味について

‣ APIから取得した数値で表現してみる ‣ ディスカッション:衛星の数値を、どう表現するか?

先週のプログラムの 復習APIの全ての内容を表示するサンプル

‣ testApp.mm

先週のプログラムの復習

#include "testApp.h" !void testApp::setup(){ ofBackground(224); ofSetFrameRate(30); // ARTSAT WebAPIにアクセスしてJSONデータを取得 bool result = response.open("http://api.artsat.jp/web/v2/invader/sensor_data.json"); // 取得結果をコンソールに出力 if (!result) { // もし取得できなかったら、エラーを出力 cout << "faild to get JSON data!" << endl; } else { // 取得に成功したら、JSONデータを出力 cout << response.getRawString() << endl; } } !void testApp::update(){ !}

‣ testApp.mm

先週のプログラムの復習

void testApp::draw(){ ofSetColor(63); int lineHeigt = 15; ! // 取得した時間を表示 string available_time = response["results"][0]["closest_available_time_iso_string"].asString(); ofDrawBitmapString(available_time, 10, lineHeigt*1); // センサーの全てのメンバー名を取得 ofxJSONElement::Members mem = response["results"][0]["sensors"].getMemberNames(); // メンバーごとにセンサーの値をとりだして、画面に表示 for (int i = 0; i < mem.size(); i++) { string lavel = mem[i]; float value = response["results"][0]["sensors"][mem[i]]["value"].asFloat(); ofDrawBitmapString(lavel + " = " + ofToString(value), 10, lineHeigt * (i + 3)); } }

取得された値について

取得された値について

‣ 表示される値 (ax, ay, az, mx, my, mz …etc.) ‣ これらは何を意味するのか? ‣ 衛星が取得したセンサーの値

取得された値について

‣ センサーの値の意味センサー名 センサーの意味lat latitude : 緯度

lon longitude : 経度

alt altitude : 高度

ax, ay, az 衛星の角速度 (x, y, z軸)

px, py, pz 衛星の姿勢角度 (x, y, z軸)

mx, my, mz 磁気センサー (x, y, z軸)

tpx, tmx 太陽電池の温度 (+x面、-x面)

tpy, tmy 太陽電池の温度 (+y面、-y面)

tpy, tmy 太陽電池の温度 (+z面、-z面)

tin 温度 (内部)

取得された値について

‣ センサーの値の意味センサー名 センサーの意味

epx, emx 太陽電池発電量 (+x面、-x面)

epy, emy 太陽電池発電量 (+y面、-y面)

epz, emz 太陽電池発電量 (+z面、-z面)

取得された値で表現する

取得された値で表現する

‣ これらの値を用いて、アプリで表現する ‣ どんな値を、何に用いれば良いのか?

取得された値で表現する

‣ サンプル 1 : 角速度で表現する ‣ 取得した角速度をもとに、3Dのオブジェクトを動かす ‣ 実際に宇宙にいる衛星の動きを実感できるかも(?)

‣ 角速度を取得 - testApp.h

取得された値で表現する

#pragma once !#include "ofMain.h" #include "ofxiOS.h" #include "ofxiOSExtras.h" #include "ofxJSONElement.h" !class testApp : public ofxiOSApp{ public: void setup(); void update(); void draw(); void exit(); void touchDown(ofTouchEventArgs & touch); void touchMoved(ofTouchEventArgs & touch); void touchUp(ofTouchEventArgs & touch); void touchDoubleTap(ofTouchEventArgs & touch); void touchCancelled(ofTouchEventArgs & touch); void lostFocus(); void gotFocus(); void gotMemoryWarning(); void deviceOrientationChanged(int newOrientation); ofxJSONElement response; ofVec3f angleSpeed; };

‣ 角速度を取得 - testApp.mm

取得された値で表現する

#include "testApp.h" !void testApp::setup(){ ofBackground(224); ofSetFrameRate(30); // ARTSAT WebAPIにアクセスしてJSONデータを取得 bool result = response.open("http://api.artsat.jp/web/v2/invader/sensor_data.json"); // 取得結果をコンソールに出力 if (!result) { // もし取得できなかったら、エラーを出力 cout << "faild to get JSON data!" << endl; } else { // 取得に成功したら、JSONデータを出力 cout << response.getRawString() << endl; angleSpeed.x = response["results"][0]["sensors"]["ax"]["value"].asFloat(); angleSpeed.y = response["results"][0]["sensors"]["ay"]["value"].asFloat(); angleSpeed.z = response["results"][0]["sensors"]["az"]["value"].asFloat(); } } !void testApp::update(){ !}

‣ 角速度を取得 - testApp.mm

取得された値で表現する

!void testApp::draw(){ // 取得した角速度を表示 ofSetColor(31); ofDrawBitmapString("angle speed x = " + ofToString(angleSpeed.x, 8), 10, 15); ofDrawBitmapString("angle speed y = " + ofToString(angleSpeed.y, 8), 10, 30); ofDrawBitmapString("angle speed z = " + ofToString(angleSpeed.z, 8), 10, 45); }

取得された値で表現する

‣ 角速度が取得できた

取得された値で表現する

‣ 次に、この角速度で3Dオブジェクトを実際の速度で回転させてみたい

‣ まずは立方体で

‣ openFrameworksで立方体を描く方法

取得された値で表現する

// 立方体のプリミティブ ofBoxPrimitive box; !// 位置を指定して、立方体を描く box.setPosition(x, y, z); box.draw();

取得された値で表現する

‣ 角速度の単位は、deg/sec つまり一秒間に変化する角度 ‣ アプリケーションを実行してからの時間に、角速度をかけ算すれば、角度(degree)が計算できる !

‣ アプリケーションを実行してからの時間を求める方法// プログラムが開始してからの時間を求める float sec = ofGetElapsedTimef();

‣ testApp.h

取得された値で表現する

#pragma once !#include "ofMain.h" #include "ofxiOS.h" #include "ofxiOSExtras.h" #include "ofxJSONElement.h" !class testApp : public ofxiOSApp{ public: void setup(); void update(); void draw(); void exit(); … (中略) … ofxJSONElement response; ofVec3f angleSpeed; ofLight light; ofEasyCam cam; };

‣ testApp.mm

取得された値で表現する

#include "testApp.h" !void testApp::setup(){ ofBackground(0); ofSetFrameRate(60); // ARTSAT WebAPIにアクセスしてJSONデータを取得 bool result = response.open("http://api.artsat.jp/web/v2/invader/sensor_data.json"); // 取得結果をコンソールに出力 if (!result) { // もし取得できなかったら、エラーを出力 cout << "faild to get JSON data!" << endl; } else { // 取得に成功したら、JSONデータを出力 cout << response.getRawString() << endl; // 角速度を取得 angleSpeed.x = response["results"][0]["sensors"]["ax"]["value"].asFloat(); angleSpeed.y = response["results"][0]["sensors"]["ay"]["value"].asFloat(); angleSpeed.z = response["results"][0]["sensors"]["az"]["value"].asFloat(); } // 3D表示設定 ofEnableDepthTest(); ofEnableLighting(); light.setPosition(200, 300, 50); light.enable(); }

‣ testApp.mm

取得された値で表現する

void testApp::update(){ !} !void testApp::draw(){ ofVec3f angle = angleSpeed * ofGetElapsedTimef(); // カメラ開始 cam.begin(); ! // 回転 ofPushMatrix(); ofRotateX(ofRadToDeg(angle.x)); ofRotateY(ofRadToDeg(angle.y)); ofRotateZ(ofRadToDeg(angle.z)); // 立方体を描く ofBoxPrimitive box; box.draw(); ofPopMatrix(); ! // カメラ終了 cam.end(); }

取得された値で表現する

‣ 宇宙空間で回転する衛星を再現

ディスカッション

ディスカッション

‣ INVADERのデータから、何が表現できるか ‣ パラメータと、それを表現する手法について話し合う ‣ 「衛星芸術」の可能性について