initial commit
This commit is contained in:
commit
ef00cd438d
17 changed files with 551 additions and 0 deletions
16
Container.py
Normal file
16
Container.py
Normal file
|
@ -0,0 +1,16 @@
|
|||
class Container:
|
||||
instances = {}
|
||||
|
||||
def set(self, name, instance):
|
||||
self.instances[name] = instance
|
||||
|
||||
def get(self, name):
|
||||
if name not in self.instances:
|
||||
return None
|
||||
return self.instances[name]
|
||||
|
||||
def count(self):
|
||||
return len(self.instances)
|
||||
|
||||
def getInstances(self):
|
||||
return self.instances
|
38
PWMDriver.py
Normal file
38
PWMDriver.py
Normal file
|
@ -0,0 +1,38 @@
|
|||
from Adafruit_PCA9685 import PCA9685
|
||||
|
||||
class PWMDriver:
|
||||
def __init__(self):
|
||||
self.driver = PCA9685()
|
||||
self.driver.set_pwm_freq(50)
|
||||
self.servoProfiles = {
|
||||
'default': {'range': 180, 'min': 65, 'max': 530},
|
||||
'lidar': {'range': 180, 'min': 75, 'max': 510},
|
||||
'china': {'range': 180, 'min': 75, 'max': 510},
|
||||
'flag': {'range': 180, 'min': 100, 'max': 480},
|
||||
'rev': {'range': 270, 'min': 95, 'max': 600}, # 552
|
||||
}
|
||||
|
||||
def setAngle(self, slot, angle, profileName = 'default'):
|
||||
profile = None
|
||||
if type(profileName) is dict:
|
||||
profile = profileName
|
||||
if profile == None:
|
||||
if profileName not in self.servoProfiles:
|
||||
profileName = 'default'
|
||||
profile = self.servoProfiles[profileName]
|
||||
if 'range' not in profile:
|
||||
profile['range'] = 180
|
||||
if angle < 0 or angle > profile['range']:
|
||||
print('PWMDriver: Invalid range passed ' + angle + ' but range is ' + profile['range'])
|
||||
if slot > 15 or slot < 0:
|
||||
print('> ERR!!! Invalid slot passed to setAngle!')
|
||||
return
|
||||
pulse = int(self.mappyt(angle, 0, profile['range'], profile['min'], profile['max']))
|
||||
#print('setting slot', slot, 'to angle', angle, 'with profile', profileName, profile, pulse)
|
||||
self.driver.set_pwm(slot, 0, pulse)
|
||||
|
||||
def setPwm(self, slot, off, on):
|
||||
self.driver.set_pwm(slot, off, on)
|
||||
|
||||
def mappyt(self, x, inMin, inMax, outMin, outMax):
|
||||
return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin
|
48
Robot.py
Normal file
48
Robot.py
Normal file
|
@ -0,0 +1,48 @@
|
|||
import RobotCompletCode
|
||||
Controls = RobotCompletCode.MotorizedPlatform()
|
||||
class Robot:
|
||||
def init(self):
|
||||
Controls.init()
|
||||
def translation(self, direction, vitesse):
|
||||
if direction == 'N':
|
||||
Controls.northTranslation(vitesse)
|
||||
elif direction == 'E':
|
||||
Controls.eastTranslation(vitesse)
|
||||
elif direction == 'W':
|
||||
Controls.westTranslation(vitesse)
|
||||
elif direction == 'S':
|
||||
Controls.southTranslation(vitesse)
|
||||
elif direction =='SE':
|
||||
Controls.southEastTranslation(vitesse)
|
||||
elif direction == 'SW':
|
||||
Controls.southWestTranslation(vitesse)
|
||||
elif direction == 'NE':
|
||||
Controls.northEastTranslation(vitesse)
|
||||
elif direction =='NW':
|
||||
Controls.northWestTranslation(vitesse)
|
||||
else:
|
||||
print('error')
|
||||
return 'error'
|
||||
def rotation(self, direction, vitesse):
|
||||
if direction == 'CW':
|
||||
Controls.clockwiseRotation(vitesse)
|
||||
elif direction == 'ACW':
|
||||
Controls.antiClockwiseRotation(vitesse)
|
||||
else:
|
||||
print('error')
|
||||
return 'error'
|
||||
def stop(self):
|
||||
Controls.stop()
|
||||
def easy(self, mode, direction, vitesse):
|
||||
if mode=='R':
|
||||
self.rotation(direction, vitesse)
|
||||
elif mode=='T':
|
||||
self.translation(diretion, vitesse)
|
||||
else:
|
||||
print('error')
|
||||
return 'error'
|
||||
def easyjson(self, jsondata):
|
||||
# Easy but from JSON datas
|
||||
self.easy(jsondata["mode"], jsondata["direction"], jsondata["vitesse"])
|
||||
|
||||
|
130
RobotCompletCode.py
Normal file
130
RobotCompletCode.py
Normal file
|
@ -0,0 +1,130 @@
|
|||
from time import sleep
|
||||
|
||||
'''
|
||||
Abstration of motorized platform
|
||||
'''
|
||||
from PWMDriver import PWMDriver
|
||||
drive = PWMDriver()
|
||||
|
||||
class MotorizedPlatform:
|
||||
esc_speed_map = {
|
||||
'frontLeft': 50,
|
||||
'frontRight': 50,
|
||||
'backLeft': 50,
|
||||
'backRight': 50
|
||||
}
|
||||
escMapping = {
|
||||
'frontLeft': {
|
||||
'slot': 12, # 7
|
||||
'range': [307, 410]
|
||||
},
|
||||
'frontRight': {
|
||||
'slot': 13,
|
||||
'range': [307, 410]
|
||||
},
|
||||
'backLeft': {
|
||||
'slot': 8,
|
||||
'range': [307, 410]
|
||||
},
|
||||
'backRight': {
|
||||
'slot': 9,
|
||||
'range': [307, 410]
|
||||
}
|
||||
}
|
||||
escSlotsList= [12,13,8,9]
|
||||
|
||||
def init(self):
|
||||
if drive != None:
|
||||
for k,v in self.escMapping.items():
|
||||
# 307 est le signal neutre sous 50 Hz (1.5 / 20 x 4096 = 307)
|
||||
drive.setPwm(v['slot'], 0, 307)
|
||||
|
||||
#escSlots = [7, 6, 8, 9]
|
||||
def setSpeed(self, values):
|
||||
# print('values: '+str(values))
|
||||
for k,v in values.items():
|
||||
self.set_esc_speed(k, v)
|
||||
|
||||
def set_all(self, value):
|
||||
for k in self.escMapping.keys():
|
||||
self.set_esc_speed(k, value)
|
||||
|
||||
def set_esc_speed(self, esc_name, value):
|
||||
drive.setPwm(
|
||||
self.escMapping[esc_name]['slot'],
|
||||
0,
|
||||
self.convert_speed_to_esc(value, self.escMapping[esc_name]['range'])
|
||||
)
|
||||
|
||||
# équivalent de la fonction map() de arduino
|
||||
def mappyt(self, x, inMin, inMax, outMin, outMax):
|
||||
return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin
|
||||
|
||||
# fonction esc pour une vitesse de moteur de -100 à 100()
|
||||
def convert_speed_to_esc(self, speed, pwm_range=[307, 410]):
|
||||
return round(
|
||||
self.mappyt(speed, 0, 100, pwm_range[0], pwm_range[1])
|
||||
)
|
||||
|
||||
def eastTranslation(self, speed):
|
||||
self.setSpeed({
|
||||
'frontLeft': -speed, 'frontRight': -speed,
|
||||
'backLeft': speed, 'backRight': speed
|
||||
})
|
||||
|
||||
def southTranslation(self, speed):
|
||||
self.northTranslation(-speed)
|
||||
|
||||
def northTranslation(self, speed):
|
||||
self.setSpeed({
|
||||
'frontLeft': -speed, 'frontRight': speed,
|
||||
'backLeft': -speed, 'backRight': speed
|
||||
})
|
||||
|
||||
def westTranslation(self, speed):
|
||||
self.eastTranslation(- speed)
|
||||
|
||||
def clockwiseRotation(self, speed):
|
||||
a = self.convert_speed_to_esc(speed)
|
||||
r = self.convert_speed_to_esc(-speed)
|
||||
self.setSpeed({
|
||||
'frontLeft': a,
|
||||
'frontRight': a,
|
||||
'backLeft': r,
|
||||
'backRight': r
|
||||
})
|
||||
|
||||
def antiClockwiseRotation(self, speed):
|
||||
self.clockwiseRotation(-speed)
|
||||
|
||||
def northEastTranslation(self, speed):
|
||||
a = self.convert_speed_to_esc(speed)
|
||||
s = self.convert_speed_to_esc(0)
|
||||
self.setSpeed({
|
||||
'frontLeft': a,
|
||||
'frontRight': s,
|
||||
'backLeft': s,
|
||||
'backRight': a
|
||||
})
|
||||
|
||||
def southWestTranslation(self, speed):
|
||||
self.northEastTranslation(-speed)
|
||||
|
||||
def northWestTranslation(self, speed):
|
||||
self.setSpeed({
|
||||
'frontLeft': 0,
|
||||
'frontRight': speed,
|
||||
'backLeft': 0,
|
||||
'backRight': speed
|
||||
})
|
||||
|
||||
def southEastTranslation(self, speed):
|
||||
self.northWestTranslation(-speed)
|
||||
|
||||
def stop(self):
|
||||
self.setSpeed({
|
||||
'frontLeft': 0,
|
||||
'frontRight': 0,
|
||||
'backLeft': 0,
|
||||
'backRight': 0
|
||||
})
|
BIN
__pycache__/Container.cpython-35.pyc
Normal file
BIN
__pycache__/Container.cpython-35.pyc
Normal file
Binary file not shown.
BIN
__pycache__/Driver.cpython-35.pyc
Normal file
BIN
__pycache__/Driver.cpython-35.pyc
Normal file
Binary file not shown.
BIN
__pycache__/PWMDriver.cpython-35.pyc
Normal file
BIN
__pycache__/PWMDriver.cpython-35.pyc
Normal file
Binary file not shown.
BIN
__pycache__/Robot.cpython-35.pyc
Normal file
BIN
__pycache__/Robot.cpython-35.pyc
Normal file
Binary file not shown.
BIN
__pycache__/RobotCompletCode.cpython-35.pyc
Normal file
BIN
__pycache__/RobotCompletCode.cpython-35.pyc
Normal file
Binary file not shown.
28
beta/Driver.py
Normal file
28
beta/Driver.py
Normal file
|
@ -0,0 +1,28 @@
|
|||
from Adafruit_PCA9685 import PCA9685
|
||||
|
||||
class PWMDriver:
|
||||
def __init__(self):
|
||||
self.driver = PCA9685()
|
||||
self.driver.set_pwm_freq(50)
|
||||
|
||||
def set_pwm(self, slot, off, on):
|
||||
self.driver.set_pwm(slot, off, on)
|
||||
|
||||
# comme map() dans arduino
|
||||
def mappyt(self, x, inMin, inMax, outMin, outMax):
|
||||
return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin
|
||||
|
||||
def init_esc(self, slot):
|
||||
self.set_pwm(slot, 0, 307)
|
||||
|
||||
def set_esc(self, slot, speed):
|
||||
self.set_pwm(
|
||||
slot,
|
||||
0,
|
||||
self.convert_speed_to_esc(speed)
|
||||
)
|
||||
|
||||
def convert_speed_to_esc(self, speed):
|
||||
return round(self.mappyt(speed, 0, 100, 210, 410))
|
||||
|
||||
|
55
beta/oldRobot.py
Normal file
55
beta/oldRobot.py
Normal file
|
@ -0,0 +1,55 @@
|
|||
from Driver import PWMDriver as Driver
|
||||
class driver():
|
||||
def setvitesse(self,pin,vitesse):
|
||||
print("le moteur avec le pin ",pin," avance à la vitesse", vitesse,".")
|
||||
dri=Driver()
|
||||
dri.set_esc(pin,vitesse)
|
||||
class Robot():
|
||||
d = [1,2]
|
||||
g = [3,4]
|
||||
motors = [d[0],d[1],g[0],g[1]]
|
||||
class Translation():
|
||||
motors = []
|
||||
def init(self,v):
|
||||
self.motors = v
|
||||
def droit(self,v):
|
||||
rb = driver().setvitesse
|
||||
m = self.motors
|
||||
for i in range(len(m)):
|
||||
rb(m[i],v)
|
||||
def trv(self,v,d):
|
||||
rb = driver().setvitesse
|
||||
m = self.motors
|
||||
if d:
|
||||
rb(m[0],v)
|
||||
rb(m[3],v)
|
||||
else:
|
||||
rb(m[1],v)
|
||||
rb(m[2],v)
|
||||
def sd(self,v):
|
||||
rb = driver().setvitesse
|
||||
m = self.motors
|
||||
rb(m[0],v)
|
||||
rb(m[3],v)
|
||||
rb(m[1],v*-1)
|
||||
rb(m[2],v*-1)
|
||||
def Rotation(self,v):
|
||||
m = self.motors
|
||||
rb = driver().setvitesse
|
||||
rb(m[0],v)
|
||||
rb(m[1],v)
|
||||
rb(m[2],v*-1)
|
||||
rb(m[3],v*-1)
|
||||
Translation = Translation()
|
||||
Translation.init(motors)
|
||||
|
||||
|
||||
"""
|
||||
r = Robot()
|
||||
r.Translation.droit(1)
|
||||
r.Translation.trv(2,True)
|
||||
r.Translation.sd(5)
|
||||
r.Translation.sd(-5)
|
||||
r.Rotation(5)
|
||||
r.Rotation(-5)
|
||||
"""
|
17
beta/robottest.py
Normal file
17
beta/robottest.py
Normal file
|
@ -0,0 +1,17 @@
|
|||
import Robot
|
||||
x=""
|
||||
r=Robot.Robot()
|
||||
t = r.Translation
|
||||
rot = r.Rotation
|
||||
while x!="q":
|
||||
x=input('command: ')
|
||||
if x=="rotation":
|
||||
rot(10)
|
||||
elif x=="droit":
|
||||
t.droit(10)
|
||||
elif x=="diagonal":
|
||||
t.trv(10, True)
|
||||
elif x=="side":
|
||||
t.sd(10)
|
||||
else:
|
||||
print('available commands: rotation , droit , diagonal , side')
|
79
oldserver.py
Normal file
79
oldserver.py
Normal file
|
@ -0,0 +1,79 @@
|
|||
import Robot
|
||||
import asyncio;
|
||||
import json
|
||||
import websockets;
|
||||
import sys;
|
||||
import Container
|
||||
from PWMDriver import PWMDriver
|
||||
robot = Robot.Robot()
|
||||
#robot = Robot.Robot()
|
||||
#t = robot.Translation
|
||||
#r = robot.Rotation
|
||||
#sd = t.sd
|
||||
#v = t.droit
|
||||
#d = t.trv
|
||||
class commandHandler:
|
||||
def ping(self):
|
||||
return "Pong"
|
||||
"""def set_vector(self,vector_type:str,vector_args):
|
||||
print(f"{vector_type=}, {vector_args=}")
|
||||
for i in range(len(vector_args)):
|
||||
vector_args[i]= float(vector_args[i])
|
||||
if vector_type =='trans':
|
||||
if abs(vector_args[0])>=0.1 and abs(vector_args[1])<=0.1:
|
||||
v((vector_args[0]*10))
|
||||
if abs(vector_args[1])>=0.1 and abs(vector_args[0])<=0.1:
|
||||
sd((vector_args[1]*10))
|
||||
if abs(vector_args[1])>=0.1 and abs(vector_args[0])>=0.1:
|
||||
if vector_args[0]>0:
|
||||
d((vector_args[0]+vector_args[1]//2)*10,True)
|
||||
elif vector_args[0]<0:
|
||||
d((vector_args[0]+vector_args[1]//2)*10,False)
|
||||
if vector_type == 'rot':
|
||||
r(vector_args[1]*10)
|
||||
return f"{vector_type=},{vector_args=}"
|
||||
"""
|
||||
def set_direction(self,arg):
|
||||
try:
|
||||
return robot.translation(arg)
|
||||
except Exception as e:
|
||||
return 'error'
|
||||
|
||||
cmd_handler = commandHandler()
|
||||
async def handler(websocket, path):
|
||||
print('new handler created with '+websocket+' at path'+path)
|
||||
while True:
|
||||
try :
|
||||
data = await websocket.recv()
|
||||
except websockets.exceptions.ConnectionClosedOK:
|
||||
break
|
||||
print(data)
|
||||
if not data:
|
||||
data = {
|
||||
'cmd':'ping',
|
||||
'args':{}
|
||||
}
|
||||
else:
|
||||
data = json.loads(data)
|
||||
if data['cmd'] =='STOP':
|
||||
sys.exit()
|
||||
try:
|
||||
callable = getattr(cmd_handler, data['cmd'])
|
||||
except AttributeError:
|
||||
await websocket.send(json.dumps({"type":"err","message":"Invalid Command"}))
|
||||
continue
|
||||
|
||||
try:
|
||||
res = callable(**data['args'])
|
||||
except TypeError:
|
||||
await websocket.send(json.dumps({"type":"err","message":"Invalid Args"}))
|
||||
|
||||
continue
|
||||
await websocket.send(json.dumps({"type":"success","message":res}))
|
||||
print('server running at 0.0.0.0 with port 1567')
|
||||
start_server = websockets.serve(handler, "0.0.0.0", 1567)
|
||||
|
||||
|
||||
asyncio.get_event_loop().run_until_complete(start_server)
|
||||
|
||||
asyncio.get_event_loop().run_forever()
|
4
pwm_manual.py
Normal file
4
pwm_manual.py
Normal file
|
@ -0,0 +1,4 @@
|
|||
from RobotCompletCode import MotorizedPlatform
|
||||
|
||||
platform = MotorizedPlatform()
|
||||
|
109
server.py
Normal file
109
server.py
Normal file
|
@ -0,0 +1,109 @@
|
|||
import Robot
|
||||
import asyncio;
|
||||
import json
|
||||
import websockets;
|
||||
import sys;
|
||||
import Container
|
||||
from PWMDriver import PWMDriver
|
||||
robot = Robot.Robot()
|
||||
#robot = Robot.Robot()
|
||||
#t = robot.Translation
|
||||
#r = robot.Rotation
|
||||
#sd = t.sd
|
||||
#v = t.droit
|
||||
#d = t.trv
|
||||
class commandHandler:
|
||||
def ping(self):
|
||||
return "Pong"
|
||||
"""def set_vector(self,vector_type:str,vector_args):
|
||||
print(f"{vector_type=}, {vector_args=}")
|
||||
for i in range(len(vector_args)):
|
||||
vector_args[i]= float(vector_args[i])
|
||||
if vector_type =='trans':
|
||||
if abs(vector_args[0])>=0.1 and abs(vector_args[1])<=0.1:
|
||||
v((vector_args[0]*10))
|
||||
if abs(vector_args[1])>=0.1 and abs(vector_args[0])<=0.1:
|
||||
sd((vector_args[1]*10))
|
||||
if abs(vector_args[1])>=0.1 and abs(vector_args[0])>=0.1:
|
||||
if vector_args[0]>0:
|
||||
d((vector_args[0]+vector_args[1]//2)*10,True)
|
||||
elif vector_args[0]<0:
|
||||
d((vector_args[0]+vector_args[1]//2)*10,False)
|
||||
if vector_type == 'rot':
|
||||
r(vector_args[1]*10)
|
||||
return f"{vector_type=},{vector_args=}"
|
||||
"""
|
||||
speed=0
|
||||
def set_direction(self,arg):
|
||||
try:
|
||||
return robot.translation(arg,self.speed)
|
||||
except Exception as e:
|
||||
return 'error'
|
||||
def stop(self):
|
||||
robot.stop()
|
||||
return 'stopped'
|
||||
def init():
|
||||
robot.init()
|
||||
return 'initialised'
|
||||
def set_rotation(self, arg):
|
||||
try:
|
||||
robot.rotation(arg,self.speed)
|
||||
except Exception as e:
|
||||
return 'error'
|
||||
def set_speed(self,v):
|
||||
if v>=50:
|
||||
v = 50
|
||||
else:
|
||||
v=v
|
||||
self.speed=v
|
||||
return 'speed set to '+str(v)
|
||||
|
||||
|
||||
cmd_handler = commandHandler()
|
||||
def commands(data):
|
||||
print('commands:')
|
||||
print(data)
|
||||
if not data:
|
||||
data = {
|
||||
}
|
||||
else:
|
||||
data = json.loads(data)
|
||||
if 'STOP' in data:
|
||||
if data['STOP']:
|
||||
sys.exit()
|
||||
try:
|
||||
if(data['cmd']=='set_direction'):
|
||||
res= cmd_handler.set_direction(data["args"]['direction'])
|
||||
elif(data['cmd']=='set_rotation'):
|
||||
res= cmd_handler.set_rotation(data["args"]['rotation'])
|
||||
elif(data['cmd']=='stop_robot'):
|
||||
res=cmd_handler.stop()
|
||||
elif(data['cmd']=='init'):
|
||||
res=cmd_handler.init()
|
||||
elif(data['cmd']=='set_speed'):
|
||||
res=cmd_handler.set_speed(data["args"]["speed"])
|
||||
else:
|
||||
return 'NOPE!!!'
|
||||
except Exception as e:
|
||||
return e
|
||||
return res
|
||||
async def handler(websocket, path):
|
||||
print('new handler created at path'+path)
|
||||
while True:
|
||||
try :
|
||||
data = await websocket.recv()
|
||||
except websockets.exceptions.ConnectionClosedOK:
|
||||
break
|
||||
try:
|
||||
res= commands(data)
|
||||
except Exception as e:
|
||||
await websocket.send(json.dumps({"type":"error","message":e}))
|
||||
print(e)
|
||||
await websocket.send(json.dumps({"type":"success","message":res}))
|
||||
print('server running at 0.0.0.0 with port 1567')
|
||||
start_server = websockets.serve(handler, "0.0.0.0", 1567)
|
||||
|
||||
|
||||
asyncio.get_event_loop().run_until_complete(start_server)
|
||||
|
||||
asyncio.get_event_loop().run_forever()
|
8
test.py
Normal file
8
test.py
Normal file
|
@ -0,0 +1,8 @@
|
|||
import Robot
|
||||
import time
|
||||
import PWMDriver
|
||||
Robot.Robot().init()
|
||||
e = Robot.Robot().easy
|
||||
e('R','CW',30)
|
||||
time.sleep(5)
|
||||
Robot.Robot().stop()
|
19
testofrobot.py
Normal file
19
testofrobot.py
Normal file
|
@ -0,0 +1,19 @@
|
|||
import Robot
|
||||
import Container
|
||||
robot = Robot.MotorizedPlatform
|
||||
def translation(arg):
|
||||
try:
|
||||
callable = getattr(robot,arg)
|
||||
possible=True
|
||||
except AttributeError:
|
||||
print('ERROR')
|
||||
possible=False
|
||||
if possible:
|
||||
callable()
|
||||
x=""
|
||||
while x!="q":
|
||||
x=input('command : ')
|
||||
if x=="help":
|
||||
print(robot.__dict__)
|
||||
else:
|
||||
translation(x)
|
Loading…
Reference in a new issue