-
Notifications
You must be signed in to change notification settings - Fork 338
Expand file tree
/
Copy pathAbsoluteMove.py
More file actions
270 lines (210 loc) · 8.11 KB
/
AbsoluteMove.py
File metadata and controls
270 lines (210 loc) · 8.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
import asyncio, sys, os
from onvif import ONVIFCamera
import time
IP="192.168.1.64" # Camera IP address
PORT=80 # Port
USER="admin" # Username
PASS="intflow3121" # Password
XMAX = 1
XMIN = -1
XNOW = 0.5
YMAX = 1
YMIN = -1
YNOW = 0.5
Move = 0.1
Velocity = 1
Zoom = 0
positionrequest = None
ptz = None
active = False
ptz_configuration_options = None
media_profile = None
def do_move(ptz, request):
global active
if active:
ptz.Stop({'ProfileToken': request.ProfileToken})
active = True
ptz.AbsoluteMove(request)
def move_up(ptz, request):
if YNOW - Move <= -1:
request.Position.PanTilt.y = YNOW
else:
request.Position.PanTilt.y = YNOW - Move
do_move(ptz, request)
def move_down(ptz, request):
if YNOW + Move >= 1:
request.Position.PanTilt.y = YNOW
else:
request.Position.PanTilt.y = YNOW + Move
do_move(ptz, request)
def move_right(ptz, request):
if XNOW - Move >= -0.99:
request.Position.PanTilt.x = XNOW - Move
elif abs(XNOW + Move) >= 0.0:
request.Position.PanTilt.x = abs(XNOW) - Move
elif abs(XNOW) <= 0.01:
request.Position.PanTilt.x = XNOW
request.Position.PanTilt.y = YNOW
do_move(ptz, request)
def move_left(ptz, request):
if XNOW + Move <= 1.0:
request.Position.PanTilt.x = XNOW + Move
elif XNOW <= 1.0 and XNOW > 0.99:
request.Position.PanTilt.x = -XNOW
elif XNOW < 0:
request.Position.PanTilt.x = XNOW + Move
elif XNOW <= -0.105556 and XNOW > -0.11:
request.Position.PanTilt.x = XNOW
request.Position.PanTilt.y = YNOW
do_move(ptz, request)
def move_upleft(ptz, request):
if YNOW == -1:
request.Position.PanTilt.y = YNOW
else:
request.Position.PanTilt.y = YNOW - Move
if XNOW + Move <= 1.0:
request.Position.PanTilt.x = XNOW + Move
elif XNOW <= 1.0 and XNOW > 0.99:
request.Position.PanTilt.x = -XNOW
elif XNOW < 0:
request.Position.PanTilt.x = XNOW + Move
elif XNOW <= -0.105556 and XNOW > -0.11:
request.Position.PanTilt.x = XNOW
do_move(ptz, request)
def move_upright(ptz, request):
if YNOW == -1:
request.Position.PanTilt.y = YNOW
else:
request.Position.PanTilt.y = YNOW - Move
if XNOW - Move >= -0.99:
request.Position.PanTilt.x = XNOW - Move
elif abs(XNOW + Move) >= 0.0:
request.Position.PanTilt.x = abs(XNOW) - Move
elif abs(XNOW) <= 0.01:
request.Position.PanTilt.x = XNOW
do_move(ptz, request)
def move_downleft(ptz, request):
if YNOW - Move == 1:
request.Position.PanTilt.y = YNOW
else:
request.Position.PanTilt.y = YNOW - Move
if XNOW + Move <= 1.0:
request.Position.PanTilt.x = XNOW + Move
elif XNOW <= 1.0 and XNOW > 0.99:
request.Position.PanTilt.x = -XNOW
elif XNOW < 0:
request.Position.PanTilt.x = XNOW + Move
elif XNOW <= -0.105556 and XNOW > -0.11:
request.Position.PanTilt.x = XNOW
do_move(ptz, request)
def move_downright(ptz, request):
if YNOW == -1:
request.Position.PanTilt.y = YNOW
else:
request.Position.PanTilt.y = YNOW - Move
if XNOW - Move >= -0.99:
request.Position.PanTilt.x = XNOW - Move
elif abs(XNOW + Move) >= 0.0:
request.Position.PanTilt.x = abs(XNOW) - Move
elif abs(XNOW) <= 0.01:
request.Position.PanTilt.x = XNOW
do_move(ptz, request)
def Zoom_in(ptz,request):
if Zoom + Move >= 1.0:
request.Position.Zoom = 1.0
else:
request.Position.Zoom = Zoom + Move
do_move(ptz, request)
def Zoom_out(ptz,request):
if Zoom - Move <= 0.0:
request.Position.Zoom = 0.0
else:
request.Position.Zoom = Zoom - Move
do_move(ptz,request)
def setup_move():
mycam = ONVIFCamera(IP, PORT, USER, PASS)
# Create media service object
media = mycam.create_media_service()
# Create ptz service object
global ptz , ptz_configuration_options, media_profile
ptz = mycam.create_ptz_service()
# Get target profile
media_profile = media.GetProfiles()[0]
request = ptz.create_type('GetConfigurationOptions')
request.ConfigurationToken = media_profile.PTZConfiguration.token
ptz_configuration_options = ptz.GetConfigurationOptions(request)
request_configuration = ptz.create_type('GetConfiguration')
request_configuration.PTZConfigurationToken = media_profile.PTZConfiguration.token
ptz_configuration = ptz.GetConfiguration(request_configuration)
request_setconfiguration = ptz.create_type('SetConfiguration')
request_setconfiguration.PTZConfiguration = ptz_configuration
global positionrequest
positionrequest = ptz.create_type('AbsoluteMove')
positionrequest.ProfileToken = media_profile.token
if positionrequest.Position is None :
positionrequest.Position = ptz.GetStatus({'ProfileToken': media_profile.token}).Position
positionrequest.Position.PanTilt.space = ptz_configuration_options.Spaces.AbsolutePanTiltPositionSpace[0].URI
positionrequest.Position.Zoom.space = ptz_configuration_options.Spaces.AbsoluteZoomPositionSpace[0].URI
if positionrequest.Speed is None :
positionrequest.Speed = ptz.GetStatus({'ProfileToken': media_profile.token}).Position
positionrequest.Speed.PanTilt.space = ptz_configuration_options.Spaces.PanTiltSpeedSpace[0].URI
def Get_Status():
# Get range of pan and tilt
global XMAX, XMIN, YMAX, YMIN, XNOW, YNOW, Velocity, Zoom
XMAX = ptz_configuration_options.Spaces.AbsolutePanTiltPositionSpace[0].XRange.Max
XMIN = ptz_configuration_options.Spaces.AbsolutePanTiltPositionSpace[0].XRange.Min
YMAX = ptz_configuration_options.Spaces.AbsolutePanTiltPositionSpace[0].YRange.Max
YMIN = ptz_configuration_options.Spaces.AbsolutePanTiltPositionSpace[0].YRange.Min
XNOW = ptz.GetStatus({'ProfileToken': media_profile.token}).Position.PanTilt.x
YNOW = ptz.GetStatus({'ProfileToken': media_profile.token}).Position.PanTilt.y
Velocity = ptz_configuration_options.Spaces.PanTiltSpeedSpace[0].XRange.Max
Zoom = ptz.GetStatus({'ProfileToken': media_profile.token}).Position.Zoom.x
def readin():
"""Reading from stdin and displaying menu"""
global positionrequest, ptz
selection = sys.stdin.readline().strip("\n")
lov=[ x for x in selection.split(" ") if x != ""]
if lov:
if lov[0].lower() in ["u","up"]:
move_up(ptz,positionrequest)
elif lov[0].lower() in ["d","do","dow","down"]:
move_down(ptz,positionrequest)
elif lov[0].lower() in ["l","le","lef","left"]:
move_left(ptz,positionrequest)
elif lov[0].lower() in ["l","le","lef","left"]:
move_left(ptz,positionrequest)
elif lov[0].lower() in ["r","ri","rig","righ","right"]:
move_right(ptz,positionrequest)
elif lov[0].lower() in ["ul"]:
move_upleft(ptz,positionrequest)
elif lov[0].lower() in ["ur"]:
move_upright(ptz,positionrequest)
elif lov[0].lower() in ["dl"]:
move_downleft(ptz,positionrequest)
elif lov[0].lower() in ["dr"]:
move_downright(ptz,positionrequest)
elif lov[0].lower() in ["s","st","sto","stop"]:
ptz.Stop({'ProfileToken': positionrequest.ProfileToken})
active = False
else:
print("What are you asking?\tI only know, 'up','down','left','right', 'ul' (up left), \n\t\t\t'ur' (up right), 'dl' (down left), 'dr' (down right) and 'stop'")
print("")
print("Your command: ", end='',flush=True)
# Test Define
# def move(ptz, request):
# request.Position.PanTilt.y = -1
# request.Position.PanTilt.x = 0
# do_move(ptz,request)
if __name__ == '__main__':
setup_move()
# Get_Status()
# Zoom_out(ptz,positionrequest)
# Get_Status()
# move(ptz,positionrequest)
while True:
if active == True:
time.sleep(1)
active = False
else:
Get_Status()
move_up(ptz, positionrequest)