рдПрд░реЛрдиреЗрдЯ рдПрдкрд┐рд╕реЛрдб 3 рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдирд╛: рдЧреЗрдВрдж рдХреЛ рдЦреЛрдЬрдирд╛

рдЖрдЬ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкреАрдЖрдИ рдХреИрдорд░реЗ рдХреЗ рд╕рд╛рде рд▓рд╛рд▓ рдЧреЗрдВрдж рдХрд╛ рдкрддрд╛ рдХреИрд╕реЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдП, рдФрд░ рдЗрд╕ рдкрд░ рд╣рдорд╛рд░реЗ рдбреНрд░реЛрди рдХреЛ рдХреИрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдмрд╛рд▓реВрди рдХреА рдЦреЛрдЬ


рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рд╕реНрд╡рд╛рдпрддреНрдд рдЖрднрд╛рд╕реА рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреНрд░реЛрди рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рдХреА рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪ рдХреАред рдпрд╣ рд╣рдорд╛рд░реЗ рдбреНрд░реЛрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рдХреНрд╖реНрдп рдЦреЛрдЬрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рд▓рдХреНрд╖реНрдп, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдмрддрд╛рдпрд╛, рдПрдХ рд▓рд╛рд▓ рдЧреЗрдВрджред


рд░рд╛рд╕реНрдкрдмреЗрд░реА рддреИрдпрд╛рд░реА


рд╣рдо рд░рд╛рд╕реНрдкрдмрд┐рдпрди рдХреЗ рдбреЗрд╕реНрдХрдЯреЙрдк рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦреЗрдВрдЧреЗред рдЪреВрдВрдХрд┐ рд╣рдо рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рд╕рдордп рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдореЛрдбрд╝ рд╕рдХреЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдзреЛрдЦрд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВред
рдПрдХ рдЕрд▓рдЧ рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡ рдкрд░, рд╣рдо рд░рд╛рд╕реНрдкрд┐рдпрди рдбреЗрд╕реНрдХрдЯреЙрдк рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ ред
рд░рд╛рд╕реНрдкрдмрд┐рдпрди рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд░рд╛рд╕реНрдкрдмреЗрд░реА рд╕реЗ рдЬреБрдбрд╝реЗ рдПрдХ рдЕрд▓рдЧ рдореЙрдирд┐рдЯрд░ + рдХреАрдмреЛрд░реНрдб + рдорд╛рдЙрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рд╡реАрдПрдирд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЗрдбрд▓реЗрд╕-рд░рд╛рд╕реНрдкрдмреЗрд░реА рдбреЗрд╕реНрдХрдЯреЙрдк рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП:


  1. VNC рдХреЛ raspi-config рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ
  2. рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд░ рд╡рд╛рдИрдлрд╝рд╛рдИ рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред рдбреЗрд╕реНрдХрдЯреЙрдк рд╕рдВрд╕реНрдХрд░рдг рдкрд░ wpa_supplicant рдХреЗ рд╕рд╛рде рдлреЛрдХрд╕ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд░ рд╡рд╛рдИрдлрд╝рд╛рдИ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рдпрд╣рд╛рдВ рдирд┐рд╣рд┐рдд рд╣реИ ред
  3. рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк realvnc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд╛рдпрдерди рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - OpenCV рд▓рдЧрд╛рдПрдВ:


sudo apt-get install python-opencv 

рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдПрдЪрдПрд╕рд╡реА рдлрд╝рд┐рд▓реНрдЯрд░


рдПрдХ рддрд╕реНрд╡реАрд░ рдореЗрдВ рдПрдХ рд░рдВрдЧреАрди рд╡рд╕реНрддреБ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдФрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рддрд░реАрдХрд╛ рд╣реИ, рдЪрд┐рддреНрд░ рдХреЛ рдПрдЪрдПрд╕рд╡реА рд░рдВрдЧ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛, рдФрд░ рдлрд┐рд░ рд╣реНрдпреВ, рд╕рдВрддреГрдкреНрддрд┐ рдФрд░ cv2.inRange рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореВрд▓реНрдп рдХреА рд╡рд╛рдВрдЫрд┐рдд рд╕реАрдорд╛ рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ред


рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рдЧреЗрдВрдж рд▓рд╛рд▓ рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рдо рдзреНрдпрд╛рди рд╕реЗ рдЯреЛрди рд╕реНрдХреЗрд▓ (HUE) рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд▓рд╛рд▓ рд░рдВрдЧ рдЗрд╕рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рд╣реИ:
рдПрдЪрдПрд╕рд╡реА рд╕реНрдХреЗрд▓


рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд░реЗрдВрдЬ рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рдкреНрд░рдХрд╛рд╢ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЧреЗрдВрдж рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗ "рдЧрд╛рдпрдм" рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рдбреНрд░реЛрди рдХреА рдЙрджреНрджреЗрд╢реНрдпрдкреВрд░реНрдгрддрд╛ рдХреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧреАред рдЗрд╕рд▓рд┐рдП, рдПрдЪ, рдПрд╕ рдФрд░ рд╡реА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЕрдкрдиреЗ рдлрд┐рд▓реНрдЯрд░ рдореЗрдВ рдЗрдирд╡рд░реНрдЯ рдЗрдирд╡рд░реНрдЬрди рдлреНрд▓реИрдЧ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ - рддрд╛рдХрд┐ рдЧреЗрдВрдж рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╣рд░ рдЪреАрдЬ рдХреЛ рдлрд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ, рдФрд░ рдлрд┐рд░ рдмрд╕ рдлрд┐рд▓реНрдЯрд░ рдХреЛ рдЙрд▓реНрдЯрд╛ рдХрд░ рд╕рдХреЗрдВред


рдлрд╝рд┐рд▓реНрдЯрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рдХреЛрдб рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 #coding=utf-8 import cv2 import numpy as np def nothing(*arg): pass cv2.namedWindow( "result" ) #    cv2.namedWindow( "img" ) #   cv2.namedWindow( "settings" ) #    cap = cv2.VideoCapture(0)#video.create_capture(0) #  6         cv2.createTrackbar('invert', 'settings', 0, 1, nothing) cv2.createTrackbar('h1', 'settings', 0, 255, nothing) cv2.createTrackbar('s1', 'settings', 0, 255, nothing) cv2.createTrackbar('v1', 'settings', 0, 255, nothing) cv2.createTrackbar('h2', 'settings', 255, 255, nothing) cv2.createTrackbar('s2', 'settings', 255, 255, nothing) cv2.createTrackbar('v2', 'settings', 255, 255, nothing) while True: flag, img = cap.read() hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV ) #    invert = cv2.getTrackbarPos('invert', 'settings') h1 = cv2.getTrackbarPos('h1', 'settings') s1 = cv2.getTrackbarPos('s1', 'settings') v1 = cv2.getTrackbarPos('v1', 'settings') h2 = cv2.getTrackbarPos('h2', 'settings') s2 = cv2.getTrackbarPos('s2', 'settings') v2 = cv2.getTrackbarPos('v2', 'settings') #       h_min = np.array((h1, s1, v1), np.uint8) h_max = np.array((h2, s2, v2), np.uint8) #       HSV thresh = cv2.inRange(hsv, h_min, h_max) if invert>0: cv2.bitwise_not(thresh,thresh) cv2.imshow('result', thresh) cv2.imshow('img', img) ch = cv2.waitKey(5) if ch == 27: break cap.release() cv2.destroyAllWindows() 

рдЧреЗрдВрдж рдкрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдЧреЗрдВрдж рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛


рдлрд╝рд┐рд▓реНрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо cv2.findContours рд╕рдореЛрдЪреНрдЪ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдЫрд╡рд┐ рдореЗрдВ рдЧреЗрдВрдж рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред


рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рд╣рдо рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХрдВрдЯреНрд░реЛрд╡рд░реНрдЯреНрд╕ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрд┐ 10x10 рд╕реЗ рдЕрдзрд┐рдХ рдЕрдВрдХ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдЪреБрдиреЗрдВ - рдпрд╣ рд╡рд╛рдВрдЫрд┐рдд рдЧреЗрдВрдж рд╣реЛрдЧреАред рдпрджрд┐ рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреИрдорд░рд╛ рд╕реЗ рдЯрдХрд░рд╛рддреЗ рд╣реИрдВ - рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╣рдо рдирд┐рдХрдЯрддрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддред рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ред


рд╣рдо рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдЦреАрдВрдЪрддреЗ рд╣реИрдВ: рдкрд╛рдП рдЧрдП рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╡реГрддреНрдд рдмрдирд╛рддреЗ рд╣реИрдВ, рд░реЗрдЦрд╛ рдХреЗ рдХреЗрдВрджреНрд░ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ (рдЬрд╣рд╛рдВ рдЙрдбрд╝рд╛рди рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде, рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЧреЗрдВрдж рдХреЗ рд╡реНрдпрд╛рд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЙрд╕рд╕реЗ рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ, рдпрд╡ рдХреЛрдгред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдХреНрд░реАрди рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ, рд╣рдордиреЗ рдПрдХ "рд╕реНрдХреЛрдк" рдЬреЛрдбрд╝рд╛ рдФрд░ рдлреНрд░реЗрдо рд░реЗрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ - рд╣рдорд╛рд░реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рдЧрддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред


рдлрд┐рд▓реНрдЯрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 #coding=utf-8 import cv2 import numpy as np import math if __name__ == '__main__': def nothing(*arg): pass cv2.namedWindow( "result" ) #    cv2.namedWindow( "source" ) # source video cv2.namedWindow( "settings" ) #    cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) cap.set(cv2.CAP_PROP_FPS,40) #  6         cv2.createTrackbar('invert', 'settings', 0, 1, nothing) cv2.createTrackbar('h1', 'settings', 0, 255, nothing) cv2.createTrackbar('s1', 'settings', 0, 255, nothing) cv2.createTrackbar('v1', 'settings', 0, 255, nothing) cv2.createTrackbar('h2', 'settings', 255, 255, nothing) cv2.createTrackbar('s2', 'settings', 255, 255, nothing) cv2.createTrackbar('v2', 'settings', 255, 255, nothing) crange = [0,0,0, 0,0,0] #set up initial values cv2.setTrackbarPos('invert','settings',1) cv2.setTrackbarPos('h1','settings',7) cv2.setTrackbarPos('h2','settings',158) cv2.setTrackbarPos('s1','settings',0) cv2.setTrackbarPos('s2','settings',255) cv2.setTrackbarPos('v1','settings',0) cv2.setTrackbarPos('v2','settings',255) color_blue = (255,255,0) color_red = (0,0,255) color_green = (0,255,0) color_white = (255,255,255) color_yellow = (0,255,255) color_black = (0,0,0) real_ballon_r = 0.145 #baloon real radius in meters while True: flag, img = cap.read() hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV ) #    invert = cv2.getTrackbarPos('invert', 'settings') h1 = cv2.getTrackbarPos('h1', 'settings') s1 = cv2.getTrackbarPos('s1', 'settings') v1 = cv2.getTrackbarPos('v1', 'settings') h2 = cv2.getTrackbarPos('h2', 'settings') s2 = cv2.getTrackbarPos('s2', 'settings') v2 = cv2.getTrackbarPos('v2', 'settings') #       h_min = np.array((h1, s1, v1), np.uint8) h_max = np.array((h2, s2, v2), np.uint8) #       HSV thresh = cv2.inRange(hsv, h_min, h_max) if invert>0: cv2.bitwise_not(thresh,thresh) #find contours _, contours0, hierarchy = cv2.findContours( thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) max_area = 0 max_center_x=None max_center_y=None max_baloon_r=None max_yaw_shift=None for cnt in contours0: rect = cv2.minAreaRect(cnt) box = cv2.boxPoints(rect) box = np.int0(box) center = (int(rect[0][0]),int(rect[0][1])) area = int(rect[1][0]*rect[1][1]) if area > 100: baloon_r = int(math.sqrt(area)/2) yaw_shift = int( (center[0] - 320/2) * 130 / 320) # 130 degree camera for 320 pics image cv2.circle(img, center, baloon_r , color_red, 1) if area>max_area: max_area=area max_center_x = center[0] max_center_y = center[1] max_baloon_r = baloon_r max_yaw_shift = yaw_shift #draw main baloon if max_area>0: cv2.circle(img, (max_center_x,max_center_y), max_baloon_r+2 , color_blue, 2) cv2.putText(img, "D=%d" % int(max_baloon_r*2), (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color_red, 1) cv2.putText(img, "angle=%d '" % max_yaw_shift, (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color_green, 1) max_distance = real_ballon_r/math.tan(max_baloon_r/320.0*(math.pi*160.0/360.0)) #distance to baloon #print max_distance cv2.putText(img, "%fm" % max_distance, (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color_blue, 1) cv2.line(img, (max_center_x, 1), (max_center_x, 239) , color_white, 1) cv2.line(img, (1,max_center_y), (319, max_center_y) , color_white, 1) #draw target cv2.line(img, (320/2-10, 240/2-10), (320/2+10, 240/2+10) , color_yellow, 1) cv2.line(img, (320/2+10, 240/2-10), (320/2-10, 240/2+10) , color_yellow, 1) # show results cv2.imshow('source', img) cv2.imshow('result', thresh) ch = cv2.waitKey(5) if ch == 27: break cap.release() cv2.destroyAllWindows() 

рдХреИрдорд░рд╛ рдЫрд╡рд┐ рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЧреЗрдВрдж рдХреА рджреВрд░реА рдФрд░ рдЬрдмрдбрд╝реЗ рдФрд░ рдкрд┐рдЪ рдХреЛрдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдЧреЗрдВрдж рдХреИрдорд░рд╛ рдЫрд╡рд┐ рдХреЗ рдХреЗрдВрджреНрд░ рд╕реЗ рднрдЯрдХрддреА рд╣реИред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЧреЗрдВрдж рдкрд░ рдбреНрд░реЛрди рдХреЛ рдирд┐рд╢рд╛рдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЖрдЧреЗ рд╣рдо рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд▓рдЧреЗ рд░рд╣реЗрдВрдЧреЗред


рдмреЙрд▓ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рд╡рд╛рд▓реЗ рд░реЙ рдкреИрдХреЗрдЯ


рд╡рд┐рдХрд╕рд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЖрд░рдУрдПрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХреЗ рд╕рд╛рде рд╣реЗрдбрд▓реЗрд╕-рд░рд╛рд╕реНрдкрдмреЗрд░реА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдПрдХ рдмреИрд▓реВрди рдЖрд░рдУрдПрд╕ рдкреИрдХреЗрдЬ рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛:


  1. рдПрдХ рдЙрдбрд╝рд╛рди рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реБрдП рдорд╛рд╡рд░реЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ
  2. рд╣рдорд╛рд░реЗ рдмреЙрд▓ рдбрд┐рдЯреЗрдХреНрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЪрд▓рд╛рдПрдВред рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдЖрд░рдУрдПрд╕ рд╡рд┐рд╖рдпреЛрдВ рдореЗрдВ рдЧреЗрдВрдж рдФрд░ рдбрд┐рдмрдЧ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЛ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ
  3. рдЪрд▓рд╛рдПрдБ web_video_server - рдПрдХ ROS рдШрдЯрдХ рдЬреЛ рд╣рдореЗрдВ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рд╣рдорд╛рд░реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛

ROS рдкреИрдХреЗрдЬ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, ROS рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ ROS рдлрд╝рд┐рд▓реНрдЯрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдирд┐рдореНрди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реЗрдВ:


  1. рдХреИрдорд░рд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрдврд╝рдирд╛ред рдЖрд░рдУрдПрд╕ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рдпрдорд▓ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдХреИрдорд░реЗ рдХреЗ рдЕрдВрд╢рд╛рдВрдХрди рдХреЗ рджреМрд░рд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рдЫрд╡рд┐ рдЖрдХрд╛рд░реЛрдВ (рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ) рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрд░рдУрдПрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдпрдорд▓ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред
  2. рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред рд╣рдо рдЕрдкрдиреЗ ROS рдкреИрдХреЗрдЬ рдХреА рд▓реЙрдиреНрдЪ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╣рд▓реЗ рдЪреБрдиреЗ рдЧрдП рдлрд╝рд┐рд▓реНрдЯрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗред
  3. рдкреНрд░рд╛рдкреНрдд рдЧреЗрдВрдж рдХрд╛ рдкреНрд░рдХрд╛рд╢рди рдЖрд░рдУрдПрд╕ рд╡рд┐рд╖рдп /baloon_detector/twist рдореЗрдВ рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИ
  4. ROS рд╡рд┐рд╖рдпреЛрдВ /baloon_detector/image_filter рдФрд░ /baloon_detector/image_result рдбреАрдмрдЧрд┐рдВрдЧ рдЪрд┐рддреНрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ

рдЖрдк рд╕рд╛рдорд╛рдиреНрдп python baloon_pose_cv.py рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ - рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рднреА рд╣реИ - рдЖрд░рдУрдПрд╕ рдкреИрдХреЗрдЬ рдореЗрдВ рд╣рдореЗрдВ рдЬрд┐рд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЙрд╕реЗ рдкреИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рд┐рд╕реНрдЯрдо рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдЗрд╕рдХреЗ рдСрдЯреЛрд░рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред


рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЖрд░рдУрдПрд╕ рдкреИрдХреЗрдЬ рдмрдирд╛рдиреЗ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдмрдХ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЦреБрдж рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдЪрд░рдгреЛрдВ рдХреА рд╕реВрдЪреА рддрдХ рд╕реАрдорд┐рдд рдХрд░реВрдВрдЧрд╛ред


рдЖрдЗрдП рдЕрдкрдиреЗ рдкреИрдХреЗрдЬ рдФрд░ ROS рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП ROS рд╡рд░реНрдХрд╕реНрдкреЗрд╕ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдмрдирд╛рдПрдВ:


 mkdir -p ~/baloon_ws/src cd ~/baloon_ws/ catkin_make source devel/setup.bash cd src catkin_create_pkg baloon std_msgs rospy 

рд╣рдо ~ / baloon_ws / src / baloon / src рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкреИрдХреЗрдЬ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлрд╛рдЗрд▓реЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ:


  1. baloon_pose_cv.py - рдмреЙрд▓ рдбрд┐рдЯреЗрдХреНрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдо
  2. baloon_cv.launch - рд╣рдорд╛рд░реЗ ROS рдкреИрдХреЗрдЬ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдиреНрдЪ рдлрд╝рд╛рдЗрд▓
  3. fe130_320_01.yaml - рдХреИрдорд░рд╛ рдЕрдВрд╢рд╛рдВрдХрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд░рд╛рдкреНрдд рдлрд╝рд╛рдЗрд▓ред рд╣рдо рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдЪрд┐рддреНрд░ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рдЧрд╣рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдПрдХ рдЪрд┐рддреНрд░ рд╕реЗ 3 рдбреА рджреГрд╢реНрдпреЛрдВ рдХреА рдмрд╣рд╛рд▓реА, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  4. baloon.service, roscore.env - рдпреЗ рдлрд╛рдЗрд▓реЗрдВ рдЖрд░рдУрдПрд╕ рдкреИрдХреЗрдЬ рдХреЗ рдСрдЯреЛрд░рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВ

рдиреАрдЪреЗ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдкрд╛рда рд╣реИрдВ:


baloon_pose_cv.py - рдореБрдЦреНрдп рдмреЙрд▓ рдбрд┐рдЯреЗрдХреНрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдо
 #!/usr/bin/env python # coding=UTF-8 # zuza baloon seeker import rospy from sensor_msgs.msg import CameraInfo, Image import time import cv2 from cv_bridge import CvBridge, CvBridgeError import numpy as np #import tf.transformations as t from geometry_msgs.msg import TwistStamped, Quaternion, Point, PoseStamped, TransformStamped import copy from std_msgs.msg import ColorRGBA import tf2_ros import math import yaml my_cam_info=None my_fps=0 my_last_fps=0 my_time_fps=time.time() bridge = CvBridge() mtx=None dist=None def raspicam_loop_cv(): global my_fps, my_last_fps, my_time_fps, mtx, dist # initialize the camera and grab a reference to the raw camera capture camera = cv2.VideoCapture(0) camera.set(cv2.CAP_PROP_FRAME_WIDTH, my_cam_info.width) camera.set(cv2.CAP_PROP_FRAME_HEIGHT, my_cam_info.height) camera.set(cv2.CAP_PROP_FPS, rospy.get_param('/baloon_detector/framerate')) # allow the camera to warmup time.sleep(0.1) color_blue = (255,255,0) color_red = (0,0,255) color_green = (0,255,0) color_white = (255,255,255) color_yellow = (0,255,255) color_black = (0,0,0) #    invert = rospy.get_param('/baloon_detector/invert') h1 = rospy.get_param('/baloon_detector/h1') s1 = rospy.get_param('/baloon_detector/s1') v1 = rospy.get_param('/baloon_detector/v1') h2 = rospy.get_param('/baloon_detector/h2') s2 = rospy.get_param('/baloon_detector/s2') v2 = rospy.get_param('/baloon_detector/v2') real_ballon_r = rospy.get_param('/baloon_detector/real_ballon_r') #       h_min = np.array((h1, s1, v1), np.uint8) h_max = np.array((h2, s2, v2), np.uint8) while not rospy.is_shutdown(): ret, image_raw = camera.read() # calculate FPS cur_time2 = time.time() if cur_time2-my_time_fps>5: my_last_fps=my_fps my_fps=1 my_time_fps=cur_time2 else: my_fps+=1 image_hsv = cv2.cvtColor(image_raw, cv2.COLOR_BGR2HSV ) #       HSV thresh = cv2.inRange(image_hsv, h_min, h_max) if invert>0: cv2.bitwise_not(thresh,thresh) #find contours _, contours0, hierarchy = cv2.findContours( thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) max_area = 0 max_center_x=None max_center_y=None max_baloon_r=None max_yaw_shift=None for cnt in contours0: rect = cv2.minAreaRect(cnt) box = cv2.boxPoints(rect) box = np.int0(box) center = (int(rect[0][0]),int(rect[0][1])) area = int(rect[1][0]*rect[1][1]) if area > 100: baloon_r = int(math.sqrt(area)/2) yaw_shift = int( (center[0] - my_cam_info.width/2) * 130 / my_cam_info.width) # 130 degree camera for my_cam_info.width pics image cv2.circle(image_raw, center, baloon_r , color_red, 1) if area>max_area: max_area=area max_center_x = center[0] max_center_y = center[1] max_baloon_r = baloon_r max_yaw_shift = yaw_shift #draw main baloon if max_area>0: cv2.circle(image_raw, (max_center_x,max_center_y), max_baloon_r+2 , color_blue, 2) cv2.putText(image_raw, "D=%d" % int(max_baloon_r*2), (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color_red, 1) cv2.putText(image_raw, "angle=%d '" % max_yaw_shift, (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color_green, 1) max_distance = real_ballon_r/math.tan(max_baloon_r/float(my_cam_info.width)*(math.pi*160.0/360.0)) #distance to baloon #print max_distance cv2.putText(image_raw, "%fm" % max_distance, (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color_blue, 1) cv2.line(image_raw, (max_center_x, 1), (max_center_x, my_cam_info.height-1) , color_white, 1) cv2.line(image_raw, (1,max_center_y), (my_cam_info.width-1, max_center_y) , color_white, 1) # post baloon Twist tws = TwistStamped() tws.header.stamp = rospy.Time.now() tws.header.frame_id = 'fcu' tws.twist.linear.x = max_distance tws.twist.angular.z = float(-max_yaw_shift)/360.0*math.pi#yaw tws.twist.angular.y = float( (max_center_y - my_cam_info.height/2) * 130.0 / my_cam_info.height) /360.0*math.pi #pitch publisher_baloontwist.publish(tws) #draw target cv2.line(image_raw, (my_cam_info.width/2-10, my_cam_info.height/2-10), (my_cam_info.width/2+10, my_cam_info.height/2+10) , color_yellow, 1) cv2.line(image_raw, (my_cam_info.width/2+10, my_cam_info.height/2-10), (my_cam_info.width/2-10, my_cam_info.height/2+10) , color_yellow, 1) #Draw FPS on image cv2.putText(image_raw,"fps: "+str(my_last_fps/5),(120,20), cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0,255,0),1,cv2.LINE_AA) #  1   5,      if my_fps%5==0: try: publisher_image_raw_result.publish(bridge.cv2_to_imgmsg(image_raw,"bgr8")) publisher_image_raw_filter.publish(bridge.cv2_to_imgmsg(thresh, "mono8")) except CvBridgeError as e: print(e) def publish_dummy_vp(event): ps = PoseStamped() ps.header.stamp = rospy.Time.now() ps.header.frame_id = 'local_origin' ps.pose.orientation.w = 1; publisher_vp.publish(ps); def callback_handle_pose(mavros_pose): rospy.loginfo("Got mavros pose, stop publishing zeroes.") dummy_timer.shutdown() handle_pose_sub.unregister() def process_camera_info_yaml(): global mtx, dist, my_cam_info my_cam_info = CameraInfo() filename = rospy.get_param('/baloon_detector/camera_info_url') with open(filename, 'r') as ymlfile: cfg = yaml.load(ymlfile) my_cam_info.width = cfg['image_width'] my_cam_info.height= cfg['image_height'] my_cam_info.K = cfg['camera_matrix']['data'] my_cam_info.D = cfg['distortion_coefficients']['data'] mtx=np.zeros((3,3)) dist=np.zeros((1,5)) for i in range(3): for j in range(3): mtx[i,j]=my_cam_info.K[i*3+j] for i in range(5): dist[0,i]=my_cam_info.D[i] print mtx, dist if __name__ == '__main__': rospy.init_node('baloon_detector') ## init pose publishing from FCU publisher_vp = rospy.Publisher('/mavros/vision_pose/pose', PoseStamped, queue_size=1) dummy_timer=rospy.Timer(rospy.Duration(0.5), publish_dummy_vp) handle_pose_sub = rospy.Subscriber('mavros/local_position/pose', PoseStamped, callback_handle_pose) ## init camera process_camera_info_yaml() print my_cam_info rospy.loginfo("image translation starting.........") publisher_image_raw_filter = rospy.Publisher('baloon_detector/image_filter', Image, queue_size=1) publisher_image_raw_result = rospy.Publisher('baloon_detector/image_result', Image, queue_size=1) publisher_baloontwist= rospy.Publisher('baloon_detector/twist', TwistStamped ,queue_size=1) raspicam_loop_cv() try: rospy.spin() except KeyboardInterrupt: print("Shutting down") 

baloon_cv.launch - рд╣рдорд╛рд░реЗ ROS рдкреИрдХреЗрдЬ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдиреНрдЪ рдлрд╝рд╛рдЗрд▓
 <launch> <!-- mavros --> <include file="$(find mavros)/launch/px4.launch"> <arg name="fcu_url" value="/dev/ttyAMA0:921600"/> <arg name="gcs_url" value="tcp-l://0.0.0.0:5760"/> </include> <!-- baloon pose estimator --> <node name="baloon_detector" pkg="baloon" type="baloon_pose_cv.py" output="screen"> <param name="invert" value="1"/> <param name="h1" value="7"/> <param name="h2" value="158"/> <param name="s1" value="0"/> <param name="s2" value="255"/> <param name="v1" value="0"/> <param name="v2" value="255"/> <param name="real_ballon_r" value="0.145"/> <param name="camera_info_url" value="$(find baloon)/src/fe130_320_01.yaml"/> <param name="framerate" value="40"/> </node> <!-- web video server --> <node name="web_video_server" pkg="web_video_server" type="web_video_server" required="false" respawn="true" respawn_delay="5"/> </launch> 

fe130_320_01.yaml - рдХреИрдорд░рд╛ рдХреИрд▓рд┐рдмреНрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓
 image_width: 320 image_height: 240 camera_name: main_camera_optical camera_matrix: rows: 3 cols: 3 data: [251.8636348237197, 0, 161.853506252244, 0, 252.36606604425, 102.0038140308112, 0, 0, 1] distortion_model: plumb_bob distortion_coefficients: rows: 1 cols: 5 data: [-0.4424451138703088, 0.1594038086314775, 0.006694781700363117, 0.00174908936506397, 0] rectification_matrix: rows: 3 cols: 3 data: [1, 0, 0, 0, 1, 0, 0, 0, 1] projection_matrix: rows: 3 cols: 4 data: [174.0442047119141, 0, 163.822732720786, 0, 0, 175.2916412353516, 105.5565883832869, 0, 0, 0, 1, 0] 

рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдлрд╛рдЗрд▓ рд░рдЦрдиреЗ рдХреЗ рдмрд╛рдж baloon_ws / src / baloon / src, рдЖрдкрдХреЛ рдлрд╛рдЗрд▓ baloon_pose_cv.py рдФрд░ baloon.service рдкрд░ "рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓" (cmod + x) рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд░, рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдЕрдкрдирд╛ ROS рдиреЛрдб рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ:


 roslaunch baloon baloon_cv.launch 

рдиреЛрдб рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рдлрд┐рд▓реНрдЯрд░ рдФрд░ рдмреЙрд▓ рдХреА рддрд╕реНрд╡реАрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:


рдФрд░ рд╡рд┐рд╖рдп /baloon_detector/twist рдореЗрдВ рдЦреЛрдЬреА рдЧрдИ рдЧреЗрдВрдж рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:


 pi@raspberry:~ $ rostopic list |grep baloon /baloon_detector/image_filter /baloon_detector/image_result /baloon_detector/twist pi@raspberry:~ $ rostopic echo /baloon_detector/twist header: seq: 1 stamp: secs: 1554730508 nsecs: 603406906 frame_id: "fcu" twist: linear: x: 6.6452559203 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.137081068334 z: -0.165806278939 --- 

рдпрд╣ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣рдорд╛рд░реЗ рдиреЛрдб рдХреЗ рдСрдЯреЛрд╕реНрдЯрд╛рд░реНрдЯ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде systemd рд╕реЗрд╡рд╛ рд╡рд┐рд╡рд░рдг рдлрд╝рд╛рдЗрд▓ baloon.service рдмрдирд╛рдПрдВ:


 [Unit] Description=BALOON ROS package Requires=roscore.service After=roscore.service [Service] EnvironmentFile=/home/pi/baloon_ws/src/baloon/src/roscore.env ExecStart=/opt/ros/kinetic/bin/roslaunch baloon baloon_cv.launch --wait Restart=on-abort [Install] WantedBy=multi-user.target 

рдлрд╝рд╛рдЗрд▓ roscore.env рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреА рд╣реИ:


 ROS_ROOT=/opt/ros/kinetic/share/ros ROS_DISTRO=kinetic ROS_PACKAGE_PATH=/home/pi/baloon_ws/src:/opt/ros/kinetic/share ROS_PORT=11311 ROS_MASTER_URI=http://localhost:11311 CMAKE_PREFIX_PATH=/home/pi/baloon_ws/devel:/opt/ros/kinetic PATH=/opt/ros/kinetic/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin LD_LIBRARY_PATH=/opt/ros/kinetic/lib PYTHONPATH=/home/pi/catkin_ws/devel/lib/python2.7/dist-packages:/opt/ros/kinetic/lib/python2.7/dist-packages ROS_IP=192.168.11.1 

рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдФрд░ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдХрдорд╛рдВрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 sudo systemctl enable ~/baloon_ws/src/baloon/src/baloon.service sudo systemctl start baloon 

рдЕрдм рд░рд╛рд╕реНрдкрдмреЗрд░реА рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдиреЛрдб рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрдк sudo systemctl stop baloon рд╕рд╛рде рдиреЛрдб рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ, autostart - sudo systemctl disable balloon рд░рджреНрдж sudo systemctl disable balloon ред


рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдПрдХ "рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧреЗрдВрдж рдбрд┐рдЯреЗрдХреНрдЯрд░" рдорд┐рд▓рд╛, рдЬреЛ рдХрд┐ рдСрди-рдмреЛрд░реНрдб рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕рд┐рд╕реНрдЯрдо рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рд╣реЛрдорд┐рдВрдЧ рдбреНрд░реЛрди рдХреЗ рдЕрдВрддрд┐рдо рд▓реЙрдиреНрдЪ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред


рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдЧрд┐рдердм рдХреЛ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

Source: https://habr.com/ru/post/hi462923/


All Articles