バージョン情報
windows 8.1 , Processing 3.0, Samp_Monitor_EndDevice_Input_JN5164_LITE2525A_X_Y_Z, Samp_Monitor_Parent_JN5164_1_5_1, Samp_Monitor_EndDevice_Input_JN5164_CNFMST_1_5_1
前回TWE-Lite-2525Aの設定変更に成功してから暫くたってしまったが、今回はprocessingとの連携にトライ。
2525Aの傾きとprocessing内の3Dオブジェクトの傾きを連動させてみた。
準備
2525Aの設定をOTAで以下の設定にする。(設定方法は前回の記事を参照)
送信間隔:50ms
動いていないときも常時送信(OptionBit)
1軸の傾き
まずはY軸周りの傾きを連動させてみる。
【ソースコード】
import processing.serial.*; Serial myPort; String str_get_data = null; String buf[]; float rx, ry, rz; PShape box1; PVector v_origin, v_center, v_camera; long cnt = 0; void setup(){ myPort = new Serial(this, "COM6", 115200); size(800,800,P3D); v_origin = new PVector(0.0,0.0,0.0); v_center = new PVector(0.0,0.0,0.0); v_camera = new PVector(0.0,500.0,150.0); box1 = createShape(BOX,80,50,100); box1.translate(0,0,0); } void draw(){ background(200); //地面を描画 strokeWeight(1); stroke(255); for (int i = -10; i<=10; i++){ line(-1000,i*100,0,1000,i*100,0); line(i*100,-1000,0,i*100,1000,0); } //XYZ軸・原点 strokeWeight(3); stroke(255,0,0); line(v_origin.x,v_origin.y,v_origin.z,v_origin.x+100,v_origin.y,v_origin.z); stroke(0,255,0); line(v_origin.x,v_origin.y,v_origin.z,v_origin.x,v_origin.y+100,v_origin.z); stroke(0,0,255); line(v_origin.x,v_origin.y,v_origin.z,v_origin.x,v_origin.y,v_origin.z+100); noStroke(); fill(0,255,255); sphere(10); //BOX回転 box1.rotateY(ry); println(ry); //BOX配置 shape(box1); //カメラ配置 camera(v_camera.x, v_camera.y, v_camera.z, v_center.x,v_center.y,v_center.z, 0.0, 0.0, -1.0); //姿勢をリセット box1.rotateY(-ry); cnt++; } //シリアル受信イベント void serialEvent(Serial myPort){ int ax = 0,ay = 0,az = 0; str_get_data = myPort.readStringUntil(10); //改行コード(10)まで読み込み try{ if (str_get_data != null){ str_get_data = trim(str_get_data); //改行コード取り除き if (str_get_data.substring(0,4).equals("::rc")){ buf = split(str_get_data,":"); ax = int(buf[10].substring(2)); ay = int(buf[11].substring(2)); az = int(buf[12].substring(2)); ry = atan2(ay,az); //println(ax + "," + ay + "," + az + "," + ry); } } } catch(Exception e) { e.printStackTrace(); } }
2軸の傾き
次はX軸周りの傾きにも連動させてみる。
同時にいくつか改良点
・時間経過とともに徐々にづれていくので、drawループの中で毎回Boxを生成するように変更。
・動きが飛ぶことがあるのでスムージング処理を追加。
【ソースコード】
import processing.serial.*; Serial myPort; float rx, ry, rz; float rx_buf[] = {0,0,0,0,0}; float ry_buf[] = {0,0,0,0,0}; int cnt_r = 0; PShape box1; PVector v_origin, v_center, v_camera; long cnt = 0; void setup(){ myPort = new Serial(this, "COM6", 115200); size(800,800,P3D); v_origin = new PVector(0.0,0.0,0.0); v_center = new PVector(0.0,0.0,0.0); v_camera = new PVector(0.0,500.0,150.0); } void draw(){ background(200); //地面を描画 strokeWeight(1); stroke(255); for (int i = -10; i<=10; i++){ line(-1000,i*100,0,1000,i*100,0); line(i*100,-1000,0,i*100,1000,0); } //XYZ軸・原点 strokeWeight(3); stroke(255,0,0); line(v_origin.x,v_origin.y,v_origin.z,v_origin.x+100,v_origin.y,v_origin.z); stroke(0,255,0); line(v_origin.x,v_origin.y,v_origin.z,v_origin.x,v_origin.y+100,v_origin.z); stroke(0,0,255); line(v_origin.x,v_origin.y,v_origin.z,v_origin.x,v_origin.y,v_origin.z+100); noStroke(); fill(0,255,255); sphere(10); //BOX回転 strokeWeight(1); stroke(0); fill(255); box1 = createShape(BOX,80,50,100); box1.rotateY(ry); box1.rotateX(-rx); println(ry); //BOX配置 shape(box1); //カメラ配置 camera(v_camera.x, v_camera.y, v_camera.z, v_center.x,v_center.y,v_center.z, 0.0, 0.0, -1.0); cnt++; } //シリアル受信イベント void serialEvent(Serial myPort){ String str_get_data = null; String buf[]; int ax = 0,ay = 0,az = 0; str_get_data = myPort.readStringUntil(10); //改行コード(10)まで読み込み try{ if (str_get_data != null){ str_get_data = trim(str_get_data); //改行コード取り除き if (str_get_data.substring(0,4).equals("::rc")){ buf = split(str_get_data,":"); ax = int(buf[10].substring(2)); ay = int(buf[11].substring(2)); az = int(buf[12].substring(2)); rx_buf[cnt_r] = atan2(ax,az); ry_buf[cnt_r] = atan2(ay,az); if(cnt_r == 4){ cnt_r = 0; }else{ cnt_r++; } rx = 0; ry = 0; for(int i = 0; i<5; i++){ rx = rx + rx_buf[i]; ry = ry + ry_buf[i]; } rx = rx/5; ry = ry/5; //println(ax + "," + ay + "," + az + "," + ry); } } } catch(Exception e) { e.printStackTrace(); } }
けっこういい感じのレスポンスで動いてくれる。
何かのものに仕込んだら面白いものがつくれるかも。
今回は重力しかみてないので、Z軸周りの姿勢はわからないけどね。