Tuesday, September 15, 2009

Sensor Gerak di MacBook Pro menggunakan Python dan AMSTracker

Sebuah diary dari album foto Facebook saya:

Software ini dibuat pada jumat pon malam sabtu wage 28-8-'09 dengan menggunakan bahasa Python setelah menyadari bahwa Macbook ku ternyata memiliki accelerometer, sebuah sensor gerak.

Software ini mensimulasikan bola-bola yang berserakan di lantai (bisa memantul) yang pergerakannya ditentukan oleh kemiringan bidang lantai. Kemiringan lantai ini diatur dengan memiringkan laptop. Detilnya agak mengerikan, tapi toh hasilnya lumayan.


Pertama menjalankan software ini kupikir ada yang salah, kok bolanya menggelinding ke kanan terus, ternyata mejaku yang miring, hei... software ini bisa buat waterpass lho.


From Aravir (am I Physicist?)

Salah satu sensor di laptop Apple merupakan sensor arah gravitasi atau sensor gerakan laptop atau sensor kemiringan. Semacam mendeteksi bidang horizontal. Aku belum menemukan cara langsung mengaksesnya tetapi ada AMSTracker yang bisa menampilkan output yang akan dipakai python untuk menentukan gerakan laptop.

Perintah untuk mengakses output sensor adalah sebagai berikut:
From Aravir (am I Physicist?)

Aku masih bingung, outputnya 3, kuanggap x, y, z. Mungkin masih ada output yang lain , tapi belum tahu cara mengetahuinya
-kalo laptop kumiringkan kiri-kanan, yang berubah x
-kalo laptop kumiringkan depan-belakang, yang berubah z
-yang y konstan menunjuk angka -1, gak tahu kenapa
Kayaknya aslinya memang sensor gravitasi, tujuan utamanya mendeteksi gerakan laptop; jika jatuh (gravitasi 0), maka harddisk otomatis berhenti.
Untuk memudahkan menjalankan software, AMSTracker dan file script python sebaiknya diletakkan di folder yang sama.



Cara menjalankannya adalah melalui perintah di console:
From Aravir (am I Physicist?)



atau buat sebuah file text berekstensi .sh yang berisi:
cd "`dirname "$0"`"
./AMSTracker -u 0.001 -s | python sensorGravitasi.py
Simpan di folder yang sama, dobelklik file tersebut untuk menjalankan software
hasilnya:


From Aravir (am I Physicist?)


From Aravir (am I Physicist?)


From Aravir (am I Physicist?)


From Aravir (am I Physicist?)



From Aravir (am I Physicist?)


From Aravir (am I Physicist?)

list perintah seluruhnya sebagai berikut:

#awal list program, simpan dengan nama sensorGravitasi.py#
###############
#sensor gerak
#oleh Nugroho Adi P
#bahasa: python
#
#########
import sys, os
from visual import *
from random import uniform
from visual.controls import *
scene.x=125
jumlah=19
a=vector(0,-10,0)
e=0.75
dt=0.01
s=17
b=-11
def change():
for bola in lbola:
bola.v=vector(0,uniform(0,23),0)
################
c = controls(title='Tombol-tombol', x=0,
y=0, width=100, height=300, range=200) # Create controls window
# Create a button in the controls window:
bt = toggle( pos=(0,0), width=77, height=30, text1='Jalan',
text0='Stop' )
br = button( pos=(0,100), width=77, height=30, text='Acak',
action=lambda: change())
################
box(pos=(0,b-0.5,0), height=1,length=37, width=37)
lbola=[]
for i in arange(jumlah):
bola=sphere(color=color.green)
bola.pos=vector(uniform(-s,s),uniform(-7,19),uniform(-s,s))
bola.v=vector(0,0,0)
bola.radius=uniform(1,2)
lbola.append(bola)
while 1:
c.interact()
#rate(97)
try:
line = sys.stdin.readline()
x = int(line.split()[0])
y = int(line.split()[1])
z = int(line.split()[2])
#print x, ' ',y,' ',z
except KeyboardInterrupt:
sys.exit(0)
except:
pass
if (bt.value==1):
for bola in lbola:
if bola.y-bola.radius>b:
a=vector(-x/5,-10,z/5)
bola.v=bola.v+a*dt
bola.pos=bola.pos+bola.v*dt
#tumbukan dengan lantai
if bola.y-bola.radius<=b:
bola.v.y=-bola.v.y*e
bola.pos.y=b+bola.radius+0.1
#tumbukan dengan dinding
if bola.x+bola.radius>=s:
bola.v.x=-bola.v.x*e
bola.pos.x=s-bola.radius-0.1
if bola.x-bola.radius<=-s:
bola.v.x=-bola.v.x*e
bola.pos.x=-s+bola.radius+0.1
if bola.z+bola.radius>=s:
bola.v.z=-bola.v.z*e
bola.pos.z=s-bola.radius-0.1
if bola.z-bola.radius<=-s:
bola.v.z=-bola.v.z*e
bola.pos.z=-s+bola.radius+0.1
###deteksi tumbukan antar bola
for i in arange(jumlah):
for j in arange(i+1,jumlah):
jarak=mag(lbola[i].pos-lbola[j].pos)
if jarak<(lbola[i].radius+lbola[j].radius):
arah=norm(lbola[j].pos-lbola[i].pos)
vi=dot(lbola[i].v,arah)
vj=dot(lbola[j].v,arah)
tukar=vj-vi
lbola[i].v=lbola[i].v+tukar*arah
lbola[j].v=lbola[j].v-tukar*arah
pantul=lbola[i].radius+lbola[j].radius-jarak
lbola[i].pos=lbola[i].pos-pantul*arah
lbola[j].pos=lbola[j].pos+pantul*arah
#####akhir list program###