狠狠撸

狠狠撸Share a Scribd company logo
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
#include
#include
#include

!

"ofMain.h"
"ofxiOS.h"
"ofxiOSExtras.h"
"ofxJSONElement.h"

class testApp : public ofxiOSApp{
public:
void
void
void
void

setup();
update();
draw();
exit();

void
void
void
void
void

touchDown(ofTouchEventArgs & touch);
touchMoved(ofTouchEventArgs & touch);
touchUp(ofTouchEventArgs & touch);
touchDoubleTap(ofTouchEventArgs & touch);
touchCancelled(ofTouchEventArgs & touch);

void
void
void
void

lostFocus();
gotFocus();
gotMemoryWarning();
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
#include
#include
#include

!

"ofMain.h"
"ofxiOS.h"
"ofxiOSExtras.h"
"ofxJSONElement.h"

class testApp : public ofxiOSApp{
public:
void
void
void
void

setup();
update();
draw();
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のデータから、何が表現できるか

?

パラメータと、それを表現する手法について話し合う

?

「衛星芸術」の可能性について

More Related Content

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