이유진

slave의 피드백

1 +#step 3 : [feedback] slave드론의 접촉에 의한 반응으로 master드론 움직이기
2 +import CoDrone
3 +import keyboard
4 +from CoDrone.system import Direction
5 +from CoDrone.system import Mode
6 +
7 +errorRange = 50 # 오차범위
8 +heightRange = 30 # 움직였다고 판단할 거리 height
9 +posiRange = 10 # position (x, y) 변화 인지 거리
10 +
11 +
12 +# 키보드로 콘솔창에 'q'를 누르면 드론이 착륙하게 만드는 코드
13 +def stop(_master, _slave):
14 + if keyboard.is_pressed('q'): # 키보드에서 'q'가 입력되면 while문 탈출
15 + print('[Keyboard input occur: Quit!]')
16 + # 착륙시작시 LED 효과
17 + _master.arm_default_pattern(0, 125, 155, Mode.DOUBLE_BLINK, 10)
18 + _slave.arm_default_pattern(0, 125, 155, Mode.DOUBLE_BLINK, 10)
19 + return True
20 + elif not _slave.isConnected(): # slave 연결이 끊기면 프로그램 종료
21 + print('[Slave Disconnected]')
22 + return True
23 +
24 +
25 +def heightFeedback(_slave, _sHeight, _master):
26 + while True:
27 + if stop(_master, _slave):
28 + return
29 +
30 + _mHeight = _master.get_height()
31 + if _sHeight - errorRange <= _mHeight <= _sHeight + errorRange:
32 + print('[hit]')
33 + return
34 + elif _mHeight < _sHeight - errorRange:
35 + _master.go(Direction.UP)
36 + print('[up]')
37 + elif _mHeight > _sHeight + errorRange:
38 + _master.go(Direction.DOWN)
39 + print('[down]')
40 +
41 +
42 +def main():
43 + master = CoDrone.CoDrone()
44 + master.connect("None", "COM7", False)
45 + slave = CoDrone.CoDrone()
46 + slave.connect("None", "COM5", False)
47 +
48 + master.takeoff()#master 드론 이륙
49 + slave.takeoff()#slave 드론 이륙
50 +
51 + # slave의 이전 좌표값(움직임 추적용) 초기화
52 + bHeight = 0
53 +
54 +
55 + while True:
56 + master.arm_off()
57 + slave.arm_off()
58 + # master
59 + mPosition = master.get_opt_flow_position() # 상대좌표 (시작 0,0)
60 + mHeight = master.get_height() # master고도
61 + # slave
62 + sPosition = slave.get_opt_flow_position()
63 + sHeight = slave.get_height() # slave고도
64 + print("master [x={} y={} z={}] slave [x={} y={} z={}]"
65 + .format(mPosition.X, mPosition.Y, mHeight, sPosition.X, sPosition.Y, sHeight))
66 +
67 + if stop(master, slave):
68 + print('드론을 착륙시킵니다.')
69 + break
70 +
71 + # slave의 전 높이 대비 heightRange 만큼의 차이가 있으면 master가 움직이도록
72 + if abs(sHeight - bHeight) > heightRange:
73 + print('[Get Feedback!]')
74 + # LED 효과
75 + master.arm_strobe()
76 + slave.arm_strobe()
77 + heightFeedback(sHeight, master)# master의 높이 이동
78 +
79 + # slave의 이전 좌표값 저장
80 + bHeight = sHeight
81 +
82 + master.arm_off()
83 + slave.arm_off()
84 + print('Land')
85 + slave.land() # 착륙
86 +
87 + # 연결해제 -> 여기까지 성공했다면 배터리 안 빼도 다시 연결 됩니다.
88 + slave.disconnect()
89 + master.disconnect()
90 +
91 +
92 +if __name__ == '__main__':
93 + main()