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

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

рдФрд░ рд╣реВрдк рд▓рд╛рдЗрдиреЗрдВ рдЗрд╕ рддрд░рд╣ рдереАрдВ:

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

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкрд░рд┐рдгрд╛рдо рдмреЗрд╣рдж рдЕрд╕реНрдерд┐рд░ рдереЗ, рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдЖред
рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВрдиреЗ рд╕рдореЛрдЪреНрдЪ рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХрд░ рджреАред рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╕рд░реНрдХрд┐рдЯ рд╡рд┐рджреНрдпреБрдд рдЯреЗрдк рд╣реИ, рд╣рдо рдХрдЪрд░реЗ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред (рдлрд┐рд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдмрдбрд╝реЗ рд╕рдлреЗрдж рдмреЗрд╕рдмреЛрд░реНрдб рдиреЗ рдмрд┐рдЬрд▓реА рдХреЗ рдЯреЗрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдлреНрд░реЗрдо рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЧрд╣ рдШреЗрд░ рд▓реА рд╣реИред рдореБрдЭреЗ рдЗрд╕реЗ рд╕реЛрдлреЗ рдХреЗ рдХреБрд╢рди рдХреЗ рд╕рд╛рде рдХрд╡рд░ рдХрд░рдирд╛ рдерд╛)ред
рдпрджрд┐ рд╣рдо рд╕рдореЛрдЪреНрдЪ рдХреЛ рдмрд╛рдВрдзрдиреЗ рд╡рд╛рд▓реА рдиреНрдпреВрдирддрдо рдЖрдпрдд рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдордзреНрдп рдЕрдиреБрджреИрд░реНрдзреНрдп рд░реЗрдЦрд╛ рдЧрддрд┐ рд╡реЗрдХреНрдЯрд░ рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИред

рдкреНрд░рдХрд╛рд╢
рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдкреНрд░рдХрд╛рд╢ рдХреА рдереАред рдореИрдВрдиреЗ рд╕реЛрдлреЗ рдХреЗ рд╕рд╛рдП рдореЗрдВ рдЯреНрд░реИрдХ рдХреЗ рдПрдХ рддрд░рдл рдмрд╣реБрдд рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд░рдЦрд╛ рдерд╛ рдФрд░ рдПрдХ рд╣реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдкреВрд░реЗ рдЯреНрд░реИрдХ рдХреА рддрд╕реНрд╡реАрд░реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрднрд╡ рдерд╛ред рдирддреАрдЬрддрди, рдореБрдЭреЗ рдПрдХ рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж рдлрд┐рд▓реНрдЯрд░ рдкрд░ рдЧрддрд┐рд╢реАрд▓ рдХрдЯрдСрдл рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдпрд╣ рд╣реИ: рдпрджрд┐ рдЪрд┐рддреНрд░ рдореЗрдВ рдлрд┐рд▓реНрдЯрд░ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдлреЗрдж (10% рд╕реЗ рдЕрдзрд┐рдХ) рд╣реИ, рддреЛ рдереНрд░реЗрд╢реЛрд▓реНрдб рдХреЛ рдЙрдард╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдмрд╣реБрдд рдХрдо (3% рд╕реЗ рдХрдо) - рдЫреЛрдбрд╝ рджреЗрдВред рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ 3-4 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд╕рддрди рдЗрд╖реНрдЯрддрдо рдХрдЯрдСрдл рдХреЛ рдЦреЛрдЬрдирд╛ рд╕рдВрднрд╡ рд╣реИред
рдореИрдЬрд┐рдХ рдирдВрдмрд░реЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ), рдЖрдк рдЗрд╖реНрдЯрддрдо рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВред
def balance_pic(image): global T ret = None direction = 0 for i in range(0, tconf.th_iterations): rc, gray = cv.threshold(image, T, 255, 0) crop = Roi.crop_roi(gray) nwh = cv.countNonZero(crop) perc = int(100 * nwh / Roi.get_area()) logging.debug(("balance attempt", i, T, perc)) if perc > tconf.white_max: if T > tconf.threshold_max: break if direction == -1: ret = crop break T += 10 direction = 1 elif perc < tconf.white_min: if T < tconf.threshold_min: break if direction == 1: ret = crop break T -= 10 direction = -1 else: ret = crop break return ret
рд╕рдорд╛рдпреЛрдЬрд┐рдд рдорд╢реАрди рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдВрджреЛрд▓рди рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╕рдВрднрд╡ рдерд╛ред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдерд╛:
- 0.5 рд╕реЗрдХрдВрдб рд╕реАрдзреЗ рдбреНрд░рд╛рдЗрд╡ рдХрд░рддреЗ рд╣реИрдВ
- рдПрдХ рддрд╕реНрд╡реАрд░ рд▓реЗ рд▓реЛ
- рд╡реЗрдХреНрдЯрд░ рдЦреЛрдЬреЗрдВ
- рдпрджрд┐ рд╡реЗрдХреНрдЯрд░ рдХреА рд╢реБрд░реБрдЖрдд рддрд╕реНрд╡реАрд░ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдо рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЯреИрдХреНрд╕реА рдХрд░рддреЗ рд╣реИрдВ
- рдпрджрд┐ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдЭреБрдХрд╛рд╡ рдХрд╛ рдХреЛрдг рдЖрд╡рд╢реНрдпрдХ рд╕реЗ рдЕрдзрд┐рдХ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реЗ рд╡рд┐рдЪрд▓рди рдХрд░рддрд╛ рд╣реИ - рд╣рдо рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ
- рдпрджрд┐ рдпрд╣ рдЕрдЪрд╛рдирдХ рд╣реБрдЖ рдХрд┐ рдкрдЯреНрдЯреА рдлреНрд░реЗрдо рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЧрдИ рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдПрдХ рдореЛрдбрд╝ рджрд┐рдпрд╛ рдФрд░ рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдЕрдВрддрд┐рдо рд╕реНрдЯреАрдпрд░рд┐рдВрдЧ рдпрд╛ рдЭреБрдХрд╛рд╡ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдореБрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред
рдХреЛрдб рдХрд╛
рдЫреЛрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг (рдкреВрд░реНрдг -
рдЬреАрдердм рдкрд░):
def check_shift_turn(angle, shift): turn_state = 0 if angle < tconf.turn_angle or angle > 180 - tconf.turn_angle: turn_state = np.sign(90 - angle) shift_state = 0 if abs(shift) > tconf.shift_max: shift_state = np.sign(shift) return turn_state, shift_state def get_turn(turn_state, shift_state): turn_dir = 0 turn_val = 0 if shift_state != 0: turn_dir = shift_state turn_val = tconf.shift_step if shift_state != turn_state else tconf.turn_step elif turn_state != 0: turn_dir = turn_state turn_val = tconf.turn_step return turn_dir, turn_val def follow(iterations): tanq.set_motors("ff") try: last_turn = 0 last_angle = 0 for i in range(0, iterations): a, shift = get_vector() if a is None: if last_turn != 0: a, shift = find_line(last_turn) if a is None: break elif last_angle != 0: logging.debug(("Looking for line by angle", last_angle)) turn(np.sign(90 - last_angle), tconf.turn_step) continue else: break turn_state, shift_state = check_shift_turn(a, shift) turn_dir, turn_val = get_turn(turn_state, shift_state) if turn_dir != 0: turn(turn_dir, turn_val) last_turn = turn_dir else: time.sleep(tconf.straight_run) last_turn = 0 last_angle = a finally: tanq.set_motors("ss")
рдкрд░рд┐рдгрд╛рдо
рдЕрд╕рдорд╛рди рд░реВрдк рд╕реЗ, рд▓реЗрдХрд┐рди рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рд╕реЗ, рдЯреИрдВрдХ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдХреЗ рд╕рд╛рде рд░реЗрдВрдЧ рд░рд╣рд╛ рд╣реИ:

рдФрд░ рдпрд╣рд╛рдБ рдбреАрдмрдЧрд┐рдВрдЧ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕реЗ рдПрдХ GIF рд╣реИ:

рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╕реЗрдЯрд┐рдВрдЧреНрд╕
рдЧрд┐рдердм рдХреЛрдбред