Advertisement
Guest User

Untitled

a guest
Oct 19th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.86 KB | None | 0 0
  1. import numpy as np              #biblioteka macierzy
  2. import math
  3. import RPi.GPIO as GPIO
  4. from time import *
  5.  
  6. def degtorad(stopnie):
  7.     return stopnie*math.pi/180
  8.  
  9. def radtodeg(stopnie):
  10.     return stopnie*180/math.pi
  11.    
  12. def degtopercent2(stopnie):
  13.     return stopnie/18+0.025
  14.  
  15. class NotacjaDH:
  16.  
  17.     def __init__(self,fi,d,a,alfa):
  18.         self.fi = degtorad(fi)
  19.         self.d = d
  20.         self.a = a
  21.         self.alfa = degtorad(alfa)
  22.        
  23.         self.rotZ()
  24.         self.tranZ()
  25.         self.tranX()
  26.         self.rotX()
  27.         self.A = (((self.rZ).dot(self.tZ)).dot(self.tX)).dot(self.rX)
  28.  
  29.     def rotZ(self):
  30.         self.rZ = np.array([[math.cos(self.fi),-math.sin(self.fi),0,0],[math.sin(self.fi), math.cos(self.fi),0,0],[0,0,1,0],[0,0,0,1]])
  31.  
  32.     def tranZ(self):
  33.         self.tZ = np.array([[1,0,0,0],[0,1,0,0],[0,0,1,self.d],[0,0,0,1]])
  34.  
  35.     def tranX(self):
  36.         self.tX = np.array([[1,0,0,self.a],[0,1,0,0],[0,0,1,0],[0,0,0,1]])
  37.  
  38.     def rotX(self):
  39.         self.rX = np.array([[1,0,0,0], [0,math.cos(self.alfa),-math.sin(self.alfa),0], [0,math.sin(self.alfa),math.cos(self.alfa),0], [0,0,0,1]])
  40.  
  41. class Kinematyka:
  42.  
  43.     def __init__(self, fi1, fi3, d3):
  44.         self.fi1 = fi1
  45.         self.fi2 = 120
  46.         self.fi3 = fi3
  47.         self.l1 = 40 #mm!
  48.         self.l2 = 80 #mm!
  49.         self.d3 = d3
  50.         self.l4 = 100 #mm!
  51.         self.kinematyka_prosta(self.fi1, self.fi3, self.d3)
  52.         self.kinematyka_odwrotna(self.X, self.Y, self.Z)
  53.         self.sterowanie(0)
  54.              
  55.     def kinematyka_prosta(self, fi1, fi3, d3):
  56.         self.fi1 = fi1
  57.         self.fi3 = fi3
  58.         self.d3 = d3
  59.        
  60.         czlon1 = NotacjaDH(self.fi1, self.l1, 0, 90)
  61.         czlon2 = NotacjaDH(self.fi2, 0, self.l2, 0)
  62.         czlon3 = NotacjaDH(-(self.fi2-self.fi3), 0, self.d3+self.l4, 0)
  63.         czlon4 = NotacjaDH(-90, 0, 0, -90)
  64.  
  65.         self.A = (((czlon1.A).dot(czlon2.A)).dot(czlon3.A)).dot(czlon4.A)
  66.         self.X = self.A[0][3]
  67.         self.Y = self.A[1][3]
  68.         self.Z = self.A[2][3]
  69.  
  70.         print("X: %.3f" %self.X )
  71.         print("Y: %.3f" %self.Y )
  72.         print("Z: %.3f" %self.Z )
  73.  
  74.     def kinematyka_odwrotna(self,X,Y,Z):
  75.         self.X = X
  76.         self.Y = Y
  77.         self.Z = Z
  78.        
  79.         self.fi1_mem = self.fi1     #kopia zapasowa wspolrzednych
  80.         self.fi3_mem = self.fi3
  81.         self.d3_mem = self.d3
  82.  
  83.         self.fi1 = math.atan(self.Y/self.X)
  84.         a = self.l2*math.cos(degtorad(self.fi2))
  85.         b = self.Z-self.l1-self.l2*math.sin(degtorad(self.fi2));
  86.         self.fi3 = math.atan(self.X/(b*math.cos(self.fi1))-a/b)
  87.         self.d3 = b/math.sin(self.fi3)-self.l4
  88.  
  89.         self.fi1 = radtodeg(self.fi1)
  90.         self.fi3 = radtodeg(self.fi3)
  91.  
  92.         print("fi1: %.3f" %self.fi1)
  93.         print("fi3: %.3f" %self.fi3)
  94.         print("d3: %.3f" %self.d3)
  95.        
  96.     def sterowanie(self, channel):
  97.         if channel != 0:    #przerwanie wywolane przyciskiem
  98.             print("X: %.3f" %self.X )
  99.             print("Y: %.3f" %self.Y )
  100.             print("Z: %.3f" %self.Z )
  101.             self.kinematyka_odwrotna(self.X, self.Y, self.Z)
  102.             print("XDDD")
  103.             self.kinematyka_prosta(self.fi1, self.fi3, self.d3)
  104.            
  105.        
  106.         if check_border(self.fi1, self.fi3, self.d3) == -1: #przekroczono wartosci katow
  107.             print("Przekroczono wartosci czlonow na przycisku nr ", channel)
  108.             print("Nie wyslano sygnalow sterujacych")
  109.             self.fi1 = self.fi1_mem         #rozwiazanie: sprawdzic z matlabem algorytm lub zapisywac w pamieci poprawne wspolrzedne XYZ zamiast katow xDD
  110.             self.fi3 = self.fi3_mem
  111.             self.d3 = self.d3_mem
  112.             print("fi1: %.3f" %self.fi1)        #debug
  113.             print("fi3: %.3f" %self.fi3)
  114.             print("d3: %.3f" %self.d3)
  115.             print("BLAD")
  116.             self.kinematyka_prosta(self.fi1, self.fi3, self.d3) #tu jest blad
  117.             self.kinematyka_odwrotna(self.X, self.Y, self.Z)
  118.        
  119.         print("Wyslano sygnaly sterujace")
  120.         serwo1.ChangeDutyCycle(0)
  121.         serwo2.ChangeDutyCycle(degtopercent2(self.fi3))
  122.         serwo3.ChangeDutyCycle(0)
  123.         #print("Wypelnienie dla fi3: %.4f" %degtopercent2(self.fi3))        #debug
  124.  
  125. #KONFIGURACJA WEJSC I WYJSC
  126. GPIO.setmode(GPIO.BCM)
  127. GPIO.setwarnings(False)
  128. GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)        #kierunek X up
  129. GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)       #kierunek X down
  130. GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)       #kierunek Y up
  131. GPIO.setup(10, GPIO.IN, pull_up_down=GPIO.PUD_UP)       #kierunek Y down
  132. GPIO.setup(9, GPIO.IN, pull_up_down=GPIO.PUD_UP)        #kierunek Z up
  133. GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_UP)       #kierunek Z down
  134. GPIO.setup(16, GPIO.OUT)    #serwo1: 360 podstawa
  135. GPIO.setup(20, GPIO.OUT)    #serwo2: ramie
  136. GPIO.setup(21, GPIO.OUT)    #serwo3: 360 teleskop
  137.  
  138. serwo1 = GPIO.PWM(16, 50)
  139. serwo2 = GPIO.PWM(20, 50)
  140. serwo3 = GPIO.PWM(21, 50)
  141.  
  142. #PARAMETRY STARTOWE
  143. fi1 = 30    #deg
  144. fi3 = 45    #deg
  145. d3 = 50     #mm
  146. serwo1.start(0)     #domontowac potencjometr jednak
  147. serwo2.start(degtopercent2(fi3))
  148. serwo3.start(0)     #przetwornik polozenia
  149.  
  150. #WARUNKI KRANCOWE
  151. fi1_min = 5     #deg
  152. fi1_max = 175   #deg
  153. fi3_min = 5     #deg
  154. fi3_max = 175   #deg
  155. d3_min = 40     #mm
  156. d3_max = 90     #mm
  157.  
  158. def check_border(kat1,kat3,dlugosc3):
  159.     if (kat1 < fi1_min) or (kat1 > fi1_max) or (kat3 < fi3_min) or (kat3 > fi3_max) or (dlugosc3 < d3_min) or (dlugosc3 > d3_max):
  160.         return -1       #przekroczenie wartosci
  161.     else: return 1      #wartosc poprawna
  162.  
  163.    
  164. #PARAMETRY NARASTANIA WSPOLRZEDNYCH
  165. dx = 10     #mm
  166. dy = 10     #mm
  167. dz = 5      #mm
  168. dt = 0.2    #s
  169. btime = 200 #bouncetime ms
  170.  
  171. #OBSLUGA PRZERWAN OD PRZYCISKOW
  172. def callback_upX(channel):
  173.     while GPIO.input(channel) == GPIO.LOW:
  174.         print("\nRuch X+")
  175.         chwytak.X += dx
  176.         chwytak.sterowanie(channel)
  177.         sleep(dt)
  178.  
  179. def callback_downX(channel):
  180.     while GPIO.input(channel) == GPIO.LOW:
  181.         print("\nRuch X-")
  182.         chwytak.X -= dx
  183.         chwytak.sterowanie(channel)
  184.         sleep(dt)
  185.    
  186. def callback_upY(channel):
  187.     while GPIO.input(channel) == GPIO.LOW:
  188.         print("\nRuch Y+")
  189.         chwytak.Y += dy
  190.         chwytak.sterowanie(channel)
  191.         sleep(dt)
  192.  
  193. def callback_downY(channel):
  194.     while GPIO.input(channel) == GPIO.LOW:
  195.         print("\nRuch Y-")
  196.         chwytak.Y -= dy
  197.         chwytak.sterowanie(channel)
  198.         sleep(dt)
  199.    
  200. def callback_upZ(channel):
  201.     while GPIO.input(channel) == GPIO.LOW:
  202.         print("\nRuch Z+")
  203.         chwytak.Z += dz
  204.         chwytak.sterowanie(channel)
  205.         sleep(dt)
  206.  
  207. def callback_downZ(channel):
  208.     while GPIO.input(channel) == GPIO.LOW:
  209.         print("\nRuch Z-")
  210.         chwytak.Z += dz
  211.         chwytak.sterowanie(channel)
  212.         sleep(dt)  
  213.  
  214. #KONFIGURACJA PRZERWAN
  215. GPIO.add_event_detect(4, GPIO.FALLING, callback=callback_upX, bouncetime=btime)
  216. GPIO.add_event_detect(17, GPIO.FALLING, callback=callback_downX, bouncetime=btime)
  217. GPIO.add_event_detect(27, GPIO.FALLING, callback=callback_upY, bouncetime=btime)
  218. GPIO.add_event_detect(10, GPIO.FALLING, callback=callback_downY, bouncetime=btime) 
  219. GPIO.add_event_detect(9, GPIO.FALLING, callback=callback_upZ, bouncetime=btime)
  220. GPIO.add_event_detect(11, GPIO.FALLING, callback=callback_downZ, bouncetime=btime)
  221.  
  222.    
  223. #POCZATEK WYKONYWANEGO PROGRAMU
  224. print("\nPozycja startowa. Na podstawie wymiarow geometrycznych obliczane jest polozenie efektora (kinematyka prosta) a nastepnie sprawdzana jest poprawnosc obliczen  (kinematyka odwrotna). \n")
  225. print("START:")
  226. chwytak = Kinematyka(fi1,fi3,d3)
  227. sleep(1)
  228. print("\nNacisnij przycisk aby poruszac manipulatorem.")   
  229.    
  230. #PETLA GLOWNA PROGRAMU
  231. while True:
  232.    
  233.     sleep(2)
  234.  
  235.  
  236.  
  237.  
  238. GPIO.cleanup()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement