이유진

움직임 추적 확인 및 LED 효과추가

1 +# 움직임 감지 (드론 1대)
2 +import CoDrone
3 +import keyboard
4 +from CoDrone.system import Direction
5 +from CoDrone.system import Mode
6 +from time import sleep
7 +
8 +
9 +errorRange = 50 # 오차범위
10 +heightRange = 50 # 움직였다고 판단할 거리 height
11 +posiRange = 50 # position (x, y) 변화 인지 거리
12 +
13 +
14 +def setHeight(_mHeight, _slave):
15 + while True:
16 + _sHeight = _slave.get_height()
17 + if _mHeight - errorRange <= _sHeight <= _mHeight + errorRange:
18 + print('[hit]')
19 + return
20 + elif _sHeight < _mHeight - errorRange:
21 + _slave.go(Direction.UP)
22 + sleep(0.2)
23 + print('[up]')
24 + elif _sHeight > _mHeight + errorRange:
25 + _slave.go(Direction.DOWN)
26 + sleep(0.2)
27 + print('[down]')
28 +
29 +
30 +def main():
31 + master = CoDrone.CoDrone()
32 + master.connect("None", "COM5", False)
33 +
34 + bHeight = 0
35 + bX = 0
36 + bY = 0
37 +
38 + while True:
39 + master.arm_off()
40 + # master
41 + mPosition = master.get_opt_flow_position() # 상대좌표 (시작 0,0)
42 + mHeight = master.get_height() # 고도
43 + print("master x={} y={} z={}"
44 + .format(mPosition.X, mPosition.Y, mHeight)) # 좌표출력/단위(mm)
45 + print("before x={} y={} z={}"
46 + .format(bX, bY, bHeight)) # 좌표출력/단위(mm)
47 +
48 + # 성공 : q를 계속 누르고 계세요! ex) qqqqqqqqqqqqqq
49 + if keyboard.is_pressed('q'): # 키보드에서 'q'가 입력되면 while문 탈출
50 + print('[Keyboard input occur: Quit!]')
51 + master.arm_default_pattern(0, 125, 155, Mode.DOUBLE_BLINK, 10)
52 + break
53 + elif not master.isConnected(): # slave 연결이 끊기면 프로그램 종료
54 + print('[Slave Disconnected]')
55 + return
56 +
57 + # master의 전 높이 대비 heightRange 만큼의 차이가 있으면 slave가 움직이도록
58 + if abs(mHeight-bHeight) > heightRange:
59 + # setHeight(mHeight, slave)
60 + print('[height change!]')
61 + master.arm_strobe()
62 +
63 + # master의 좌표가 posiRange만큼 차이가 생기면 움직이도록
64 + if abs(bX - mPosition.X) + abs(bY - mPosition.Y) > posiRange:
65 + # slave.move(mPosition.Y - bY, bX - mPosition.X, 0, 0) # move(roll 좌우, pitch 전후, yaw = 0, throttle = 0)
66 + print('[position change!]')
67 + master.arm_strobe()
68 +
69 + # master의 이전 좌표값 저장
70 + bHeight = mHeight
71 + bX = mPosition.X
72 + bY = mPosition.Y
73 +
74 + print('드론을 착륙시킵니다.')
75 + master.arm_pattern() # LED 효과
76 + print('Land')
77 + master.land() # 착륙
78 + master.arm_off()
79 + # 연결해제 -> 여기까지 성공했다면 배터리 안 빼도 다시 연결 됩니다.
80 + master.disconnect()
81 +
82 +
83 +if __name__ == '__main__':
84 + main()
...@@ -2,11 +2,13 @@ ...@@ -2,11 +2,13 @@
2 import CoDrone 2 import CoDrone
3 import keyboard 3 import keyboard
4 from CoDrone.system import Direction 4 from CoDrone.system import Direction
5 +from CoDrone.system import Mode
5 from time import sleep 6 from time import sleep
6 7
7 8
8 errorRange = 50 # 오차범위 9 errorRange = 50 # 오차범위
9 -moveRange = 150 # 움직였다고 판단할 거리 10 +heightRange = 30 # 움직였다고 판단할 거리 height
11 +posiRange = 5 # position (x, y) 변화 인지 거리
10 12
11 13
12 def setHeight(_mHeight, _slave): 14 def setHeight(_mHeight, _slave):
...@@ -35,7 +37,14 @@ def main(): ...@@ -35,7 +37,14 @@ def main():
35 if bHeight > 20: # 마스터의 높이가 20이상이면 slave 날기 시작 37 if bHeight > 20: # 마스터의 높이가 20이상이면 slave 날기 시작
36 slave.takeoff() 38 slave.takeoff()
37 39
40 + # master의 이전 좌표값(움직임 추적용) 초기화
41 + bHeight = 0
42 + bX = 0
43 + bY = 0
44 +
38 while True: 45 while True:
46 + master.arm_off()
47 + slave.arm_off()
39 # master 48 # master
40 mPosition = master.get_opt_flow_position() # 상대좌표 (시작 0,0) 49 mPosition = master.get_opt_flow_position() # 상대좌표 (시작 0,0)
41 mHeight = master.get_height() # 고도 50 mHeight = master.get_height() # 고도
...@@ -45,24 +54,34 @@ def main(): ...@@ -45,24 +54,34 @@ def main():
45 print("master [x={} y={} z={}] slave [x={} y={} z={}]" 54 print("master [x={} y={} z={}] slave [x={} y={} z={}]"
46 .format(mPosition.X, mPosition.Y, mHeight, sPosition.X, sPosition.Y, sHeight)) # 좌표출력/단위(mm) 55 .format(mPosition.X, mPosition.Y, mHeight, sPosition.X, sPosition.Y, sHeight)) # 좌표출력/단위(mm)
47 56
48 - # 키보드로 콘솔창에 'q'를 누르면 드론이 착륙하게 만드는 코드인데 57 + # 키보드로 콘솔창에 'q'를 누르면 드론이 착륙하게 만드는 코드
49 - # 한 번 성공하고 그 이후로 안 되네요
50 # $pip3 install keyboard 58 # $pip3 install keyboard
51 # 로 keyboard를 설치한 다음 실행해야 합니다. 59 # 로 keyboard를 설치한 다음 실행해야 합니다.
52 # 성공 : q를 계속 누르고 계세요! ex) qqqqqqqqqqqqqq 60 # 성공 : q를 계속 누르고 계세요! ex) qqqqqqqqqqqqqq
53 if keyboard.is_pressed('q'): # 키보드에서 'q'가 입력되면 while문 탈출 61 if keyboard.is_pressed('q'): # 키보드에서 'q'가 입력되면 while문 탈출
54 print('[Keyboard input occur: Quit!]') 62 print('[Keyboard input occur: Quit!]')
63 + # 착륙에 성공할 때까지 LED 효과
64 + master.arm_default_pattern(0, 125, 155, Mode.DOUBLE_BLINK, 10)
65 + slave.arm_default_pattern(0, 125, 155, Mode.DOUBLE_BLINK, 10)
55 break 66 break
56 elif not slave.isConnected(): # slave 연결이 끊기면 프로그램 종료 67 elif not slave.isConnected(): # slave 연결이 끊기면 프로그램 종료
57 print('[Slave Disconnected]') 68 print('[Slave Disconnected]')
58 return 69 return
59 70
60 - # master의 전 높이 대비 moveRange 만큼의 차이가 있으면 slave가 움직이도록 71 + # master의 전 높이 대비 heightRange 만큼의 차이가 있으면 slave가 움직이도록
61 - if abs(mHeight-bHeight) > moveRange: 72 + if abs(mHeight - bHeight) > heightRange:
73 + print('[height change!]')
74 + # LED 효과
75 + master.arm_strobe()
76 + slave.arm_strobe()
62 setHeight(mHeight, slave) 77 setHeight(mHeight, slave)
63 78
64 - # master의 좌표가 moveRange만큼 차이가 생기면 움직이도록 79 + # master의 좌표가 posiRange만큼 차이가 생기면 움직이도록
65 - if abs(bX - mPosition.X) > moveRange or abs(bY - mPosition.Y) > moveRange: 80 + if abs(bX - mPosition.X) + abs(bY - mPosition.Y) > posiRange:
81 + print('[position change!]')
82 + # LED 효과
83 + master.arm_strobe()
84 + slave.arm_strobe()
66 slave.move(mPosition.Y - bY, bX - mPosition.X, 0, 0) # move(roll 좌우, pitch 전후, yaw = 0, throttle = 0) 85 slave.move(mPosition.Y - bY, bX - mPosition.X, 0, 0) # move(roll 좌우, pitch 전후, yaw = 0, throttle = 0)
67 86
68 # master의 이전 좌표값 저장 87 # master의 이전 좌표값 저장
...@@ -72,8 +91,12 @@ def main(): ...@@ -72,8 +91,12 @@ def main():
72 91
73 print('드론을 착륙시킵니다.') 92 print('드론을 착륙시킵니다.')
74 slave.arm_pattern() # LED 효과 93 slave.arm_pattern() # LED 효과
94 +
75 print('Land') 95 print('Land')
76 slave.land() # 착륙 96 slave.land() # 착륙
97 + master.arm_off()
98 + slave.arm_off()
99 +
77 # 연결해제 -> 여기까지 성공했다면 배터리 안 빼도 다시 연결 됩니다. 100 # 연결해제 -> 여기까지 성공했다면 배터리 안 빼도 다시 연결 됩니다.
78 slave.disconnect() 101 slave.disconnect()
79 master.disconnect() 102 master.disconnect()
......