[Share] Sensor reading on android and send to UDP network
#1
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 :
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()






Users browsing this thread: 1 Guest(s)