Advertisement
Guest User

gavno

a guest
Dec 13th, 2019
815
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.50 KB | None | 0 0
  1. import socket # работа с сокетами
  2. import argparse # работа с командной строкой
  3. import time # работа с временем
  4. import os # работа с ОС
  5. import cv2
  6.  
  7. """Эта программа запускается на Rspberry
  8.   Она принмает управляющие сигналы с компьютера
  9.   Сигнал передаётся в виде : 11/1500/120
  10.   Первое число незначащее
  11.   Второе число - сигнал обозначающий скорость 1500 - стой на месте
  12.                                               1550 - медленно вперёд
  13.                                               1450 - медлено назад
  14. """
  15.  
  16. def setup_gpio():
  17.     os.system("sudo pigpiod")  # Launching GPIO library
  18.     time.sleep(1)  # As i said it is too impatient and so if this delay is removed you will get an error
  19.     import pigpio # работа с пинами на плате Распберри
  20.     ESC = 17
  21.     STEER = 18
  22.     pi = pigpio.pi()
  23.     pi.set_servo_pulsewidth(ESC, 0)
  24.     pi.set_servo_pulsewidth(STEER, 0)
  25.     time.sleep(1)
  26.     pi.set_servo_pulsewidth(ESC, 1500)
  27.     time.sleep(2)
  28.  
  29.     return pi,ESC,STEER
  30.  
  31. def setup_socket(port):
  32.     # Create a TCP/IP socket
  33.     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  34.     server_address = ('', port)
  35.     sock.bind(server_address)
  36.     sock.listen(1)
  37.  
  38.     return sock
  39.  
  40.  
  41. def get_parameters(sock):
  42.     # Wait for a connection
  43.     print('waiting for a connection')
  44.     connection, client_address = sock.accept()
  45.     try:
  46.         data = connection.recv(32)
  47.         speed, angle = convert_to_signals(data)
  48.         return speed, angle
  49.     except ConnectionError:
  50.         print("connection is empty")
  51.     finally:
  52.         # Clean up the connection
  53.         connection.close()
  54.  
  55.  
  56. def convert_to_signals(data):
  57.     data_arr = data.decode().split("/")
  58.     # conn.send(data.upper())
  59.     data_arr = list(map(int, data_arr))
  60.     speed = data_arr[1]
  61.     angle = data_arr[2]
  62.     return speed, angle
  63.  
  64.  
  65. def set_to_units(speed,angle):
  66.  
  67.     pass
  68.  
  69. def calibrate(pi,ESC):   # Стандартная процедура автокалибровки для esc регулятора
  70.     max_value = 2000  # Максимальное значение шим
  71.     min_value = 700  # Минимальное значение шим
  72.     pi.set_servo_pulsewidth(ESC, 0)
  73.     print("Отключите питание (батарею) и нажмите Enter")
  74.     inp = input()
  75.     if inp == '':
  76.         pi.set_servo_pulsewidth(ESC, max_value)
  77.         print("Подключите батарею прямо сейчас. Вы должны услышать 2 звуквых сигнала. Затем дождитесь окончания сигнала и нажмите Enter")
  78.         inp = input()
  79.         if inp == '':
  80.             pi.set_servo_pulsewidth(ESC, min_value)
  81.             print ("Специальный сигнал скоро будет")
  82.             time.sleep(7)
  83.             print ("Ждите ....")
  84.             time.sleep (5)
  85.             print ("Не беспокойтесь, просто ждите.....")
  86.             pi.set_servo_pulsewidth(ESC, 0)
  87.             time.sleep(2)
  88.             print ("Остановите ESC сейчас...")
  89.             pi.set_servo_pulsewidth(ESC, min_value)
  90.             time.sleep(1)
  91.             print ("Калибровка завершена")
  92.             # control() # You can change this to any other function you want
  93.             pi.set_servo_pulsewidth(ESC, 1500)
  94.  
  95. def control(pi,ESC,speed,STEER,angle):
  96.     pi.set_servo_pulsewidth(ESC, speed)
  97.     pi.set_servo_pulsewidth(STEER,int(16.6666666*angle))
  98.  
  99. def stop(pi,ESC): #This will stop every action your Pi is performing for ESC ofcourse.
  100.     pi.set_servo_pulsewidth(ESC, 0)
  101.     pi.stop()
  102.  
  103. def main():
  104.     # Ввод порта для передачи данных и флага калибровка. По умполчанию порт 1080, калибровка отключена
  105.  
  106.     # изменить порт можно командой:
  107.     # -p <номер порта> пример: -p 1081
  108.  
  109.     # включить калибровку можно командой:
  110.     # -с 1
  111.  
  112.     ap = argparse.ArgumentParser()
  113.     ap.add_argument("-p", "--port", required=False,
  114.                     help="choose port: 1080 as default")
  115.     ap.add_argument("-c", "--calibrate", required=False,
  116.                     help="car motor calibration")
  117.     args = vars(ap.parse_args())
  118.  
  119.     port = 1080
  120.     if args["port"] is not None:
  121.         if int(args["port"]):
  122.             port = (int(args["port"]))
  123.     sock = setup_socket(port)
  124.  
  125.     pi, ESC, STEER = setup_gpio()
  126.     if args["calibrate"] is not None:
  127.         if int(args["calibrate"])==1:
  128.             calibrate(pi,ESC)
  129.         if int(args["calibrate"])==0:
  130.             pass
  131.     capture = cv2.CaptureFromCAM(-1)
  132.     w = cv2.GetCaptureProperty(capture, cv2.CV_CAP_PROP_FRAME_WIDTH)
  133.     h = cv2.GetCaptureProperty(capture, cv2.CV_CAP_PROP_FRAME_HEIGHT)
  134.     fourcc = cv2.CV_FOURCC('M', 'J', 'P', 'G')
  135.     fps = 60
  136.     stream = cv2.CreateVideoWriter("test.avi", fourcc, fps, (w, h))
  137.     while True:
  138.         frame = cv2.QueryFrame(capture)
  139.         cv2.WriteFrame(stream, frame)
  140.         speed, angle = get_parameters(sock)
  141.         set_to_units(speed,angle)
  142.         print(speed, angle)
  143.  
  144.         control(pi, ESC, speed,STEER, angle)
  145.         pass
  146.  
  147.  
  148. if __name__ == '__main__':
  149.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement