01-21-2014, 07:43 PM
snippet ini bertujuan untuk membaca sensor di android dan mengirimnya via UDP dengan multithreading yang sangat cepat.
snippet ini bukan untuk end user, melainkan di kembangkan ke keperluan lain seperti controller interface via network, atau mungkin drone controller with android gyroscope (memungkinkan, karena rentang waktu kecil sehingga latency juga kecil - karena multithreading)
dan juga algoritma untuk menyingkirkan noise (untuk stabilitas) yang dihasilkan oleh sensor ada di dalamnya.
android client :
untuk server :
snippet ini bukan untuk end user, melainkan di kembangkan ke keperluan lain seperti controller interface via network, atau mungkin drone controller with android gyroscope (memungkinkan, karena rentang waktu kecil sehingga latency juga kecil - karena multithreading)
dan juga algoritma untuk menyingkirkan noise (untuk stabilitas) yang dihasilkan oleh sensor ada di dalamnya.
android client :
Code:
import android
import time
import socket
import androidhelper
droid = androidhelper.Android()
UDP_IP = "192.168.1.100" #server IP
UDP_PORT = 5005
dt = 10 #100ms between sensings
endTime = 20000 #sample for 3000ms
timeSensed=0
droid.startSensingTimed(1,dt)
while timeSensed <= endTime:
sensor = droid.sensorsReadAccelerometer().result
orientation = droid.sensorsReadOrientation().result
#print sensor
time.sleep(dt/1000.0)
timeSensed+=dt
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
sock.sendto( str(sensor+orientation) , (UDP_IP, UDP_PORT))
droid.stopSensing()
untuk server :
Code:
# testing number: 5
# @gunslinger_
from sys import stdout, exit
from decimal import Decimal
from math import fabs
from datetime import datetime
import time
import SocketServer
class read_sensor_udp(SocketServer.BaseRequestHandler):
# Ctrl+C to kill every spawned threads
daemon_threads = True
# faster for rebinding
allow_reuse_address = True
def setup(self):
self.before = 0
self.noise = 1.5
self.noise_f = 0.5
self.invert = True # If you want invert control
self.mouse_debug = True
def handle(self):
global delta_z, delta_x, curr_x, curr_y
data = self.request[0].strip()
socket = self.request[1]
start = time.clock()
ndata = data.replace("[","")
ndata = data.replace("]","")
ndata = ndata.split(", ")
try:
# feedback x sensor
ndata[0] = ndata[0].replace("[","")
ndata[0] = ("%.4f" % float(ndata[0]))
# feedback z sensor
ndata[1] = ("%.4f" % float(ndata[1]))
z_sensor = ndata[1]
x_sensor = ndata[0]
range_z = fabs(float(z_sensor)-float(delta_z)) # used here
range_x = fabs(float(x_sensor)-float(delta_x)) # used here
if range_z > self.noise_f:
if delta_z < z_sensor:
goto_y = curr_y + 1
curr_y = goto_y
elif delta_z > z_sensor:
goto_y = curr_y - 1
curr_y = goto_y
print "Selisih_Z -> %.4f" % float(range_z)
print "Selisih_X -> %.4f" % float(range_x)
print "Sensor_Z -> %.4f" % float(z_sensor)
print "Sensor_X -> %.4f" % float(x_sensor)
delta_z = z_sensor # and updated here
delta_x = x_sensor
if self.invert:
value_move_y = ( int(int(float(z_sensor)*10)) )
value_move_x = ( int(int(float(x_sensor)*10)) )
end = time.clock()
print "Timing Latency -> %.2gs" % (end-start)
delta_z = z_sensor # or updated here
delta_x = x_sensor # or updated here
except KeyboardInterrupt:
exit(1)
if __name__ == "__main__":
UDP_IP = "192.168.1.100"
UDP_PORT = 5005
delta_z, delta_x = 0, 0
curr_y, curr_z = 100, 100
HOST, PORT = UDP_IP, UDP_PORT
server = SocketServer.UDPServer((HOST, PORT), read_sensor_udp)
server.serve_forever()