-
Notifications
You must be signed in to change notification settings - Fork 1
/
control_final.py
301 lines (245 loc) · 9.2 KB
/
control_final.py
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
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
import socket
import sys
import atexit
import RPi.GPIO as GPIO
import time
import threading
from Raspi_MotorHAT import Raspi_MotorHAT, Raspi_DCMotor
from Raspi_PWM_Servo_Driver import PWM
from ar_markers import detect_markers
try:
import cv2
except ImportError:
raise Exception('Error: OpenCv is not installed')
udp_serial_no_temp = 0
message_ok = False
UDP_IP = "192.168.0.16"
# UDP_IP = "10.0.0.5"
UDP_PORT = 5555
data_rx = ""
data_tx = ""
data_rx_temp = ""
header_temp = ""
header = ""
udp_serial_no = 0
cmd_mode = 0
control_mode = 0
set_speed = 0
car_fwd_back = 0
car_left_right = 0
cam_up_down = 0
cam_left_right = 0
servo_min = 150
servo_mid = 345
servo_max = 550
marker_id = 0
def get_rx_message():
global data_rx_temp
data_rx_temp_lock = threading.Lock()
global UDP_IP, UDP_PORT
# Create a UDP socket
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print('Socket created')
except socket.error as msg:
print('Failed to create socket. Error Code : ' + str(msg[0]) + ' Message ' + msg[1])
sys.exit()
# Bind the socket to the port
server_address = (UDP_IP, UDP_PORT)
print >> sys.stderr, 'starting up on %s port %s' % server_address
try:
sock.bind(server_address)
except socket.error as msg:
print('Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1])
sys.exit()
print('Socket bind complete')
atexit.register(sock.close)
while True:
print >> sys.stderr, '\nwaiting to receive message'
with data_rx_temp_lock:
data_rx_temp, address = sock.recvfrom(4096)
do_data_rx_decode()
def do_data_rx_decode():
global data_rx, data_rx_temp, header_temp
global header, udp_serial_no, cmd_mode, control_mode
global set_speed, car_fwd_back, car_left_right, cam_up_down, cam_left_right
messages_rx = data_rx_temp.split(",")
header_temp = messages_rx[0]
print("Header:" + header_temp)
udp_serial_no_temp2 = int(messages_rx[1])
print("UDP No: " + str(udp_serial_no_temp2))
cmd_mode_temp = int(messages_rx[2])
control_mode_temp = int(messages_rx[3])
set_speed_temp = int(messages_rx[4])
car_fwd_back_temp = int(messages_rx[5])
car_left_right_temp = int(messages_rx[6])
cam_up_down_temp = int(messages_rx[7])
cam_left_right_temp = int(messages_rx[8])
print("Data Decoded")
check_header()
if message_ok:
# Discarding packets with header mismatch
print("Header checked : OK")
data_rx_lock = threading.Lock()
with data_rx_lock:
data_rx = data_rx_temp
header = header_temp
udp_serial_no = udp_serial_no_temp2
cmd_mode = cmd_mode_temp
control_mode = control_mode_temp
set_speed = set_speed_temp
car_fwd_back = car_fwd_back_temp
car_left_right = car_left_right_temp
cam_up_down = cam_up_down_temp
cam_left_right = cam_left_right_temp
print("Message: " + data_rx)
else:
print("Header checked : Fail")
pass
def check_header():
global header_temp, message_ok, data_rx, data_rx_temp
if header_temp == "ARORA":
message_ok = True
else:
message_ok = False
def do_control():
global car_fwd_back, car_left_right, set_speed
atexit.register(turnOffMotors)
atexit.register(reset_all_servos)
while True:
global cmd_mode, control_mode
if cmd_mode == 0 and control_mode == 0: # Manual Cam
do_cam_control()
elif cmd_mode == 0 and control_mode == 1: # Manual Car
do_car_control(car_fwd_back, car_left_right, set_speed)
elif cmd_mode == 1 and control_mode == 0: # Manual Cam + Auto OFF
do_cam_control()
elif cmd_mode == 1 and control_mode == 1: # Manual Cam + Auto ON
pass
def do_car_control(car_fwd_back_cntrl, car_left_right_cntrl, set_speed_cntrl):
global set_speed, motor_fwd_back, motor_fwd_back_2, motor_left_right
motor_fwd_back.setSpeed(set_speed_cntrl)
motor_fwd_back_2.setSpeed(set_speed_cntrl)
motor_left_right.setSpeed(set_speed_cntrl)
if car_fwd_back_cntrl == 0:
motor_fwd_back.run(Raspi_MotorHAT.RELEASE)
motor_fwd_back_2.run(Raspi_MotorHAT.RELEASE)
motor_left_right.run(Raspi_MotorHAT.RELEASE)
print("\nCar Stopped")
if car_left_right_cntrl == -1:
motor_left_right.run(Raspi_MotorHAT.BACKWARD)
print("\nCar Look Left")
elif car_left_right_cntrl == 0:
motor_left_right.run(Raspi_MotorHAT.RELEASE)
elif car_left_right_cntrl == 1:
motor_left_right.run(Raspi_MotorHAT.FORWARD)
print("\nCar Look Right")
elif car_fwd_back_cntrl == -1:
if car_left_right_cntrl == -1:
motor_fwd_back.run(Raspi_MotorHAT.BACKWARD)
motor_fwd_back_2.run(Raspi_MotorHAT.BACKWARD)
motor_left_right.run(Raspi_MotorHAT.BACKWARD)
print("\nCar Back Left")
elif car_left_right_cntrl == 0:
motor_fwd_back.run(Raspi_MotorHAT.BACKWARD)
motor_fwd_back_2.run(Raspi_MotorHAT.BACKWARD)
motor_left_right.run(Raspi_MotorHAT.RELEASE)
print("\nCar Back")
elif car_left_right_cntrl == 1:
motor_fwd_back.run(Raspi_MotorHAT.BACKWARD)
motor_fwd_back_2.run(Raspi_MotorHAT.BACKWARD)
motor_left_right.run(Raspi_MotorHAT.FORWARD)
print("\nCar Back Right")
elif car_fwd_back_cntrl == 1:
if car_left_right_cntrl == -1:
motor_fwd_back.run(Raspi_MotorHAT.FORWARD)
motor_fwd_back_2.run(Raspi_MotorHAT.FORWARD)
motor_left_right.run(Raspi_MotorHAT.BACKWARD)
print("\nCar Forward Left")
elif car_left_right_cntrl == 0:
motor_fwd_back.run(Raspi_MotorHAT.FORWARD)
motor_fwd_back_2.run(Raspi_MotorHAT.FORWARD)
motor_left_right.run(Raspi_MotorHAT.RELEASE)
print("\nCar Forward")
elif car_left_right_cntrl == 1:
motor_fwd_back.run(Raspi_MotorHAT.FORWARD)
motor_fwd_back_2.run(Raspi_MotorHAT.FORWARD)
motor_left_right.run(Raspi_MotorHAT.FORWARD)
print("\nCar Forward Right")
def do_cam_control():
global cam_up_down, cam_left_right, pwm, set_speed
control_lock = threading.Lock()
with control_lock:
cam_up_down_temp = cam_up_down
cam_left_right_temp = cam_left_right
set_speed_temp = set_speed
if cam_up_down_temp == -1 and set_speed_temp > 90:
pwm.setPWM(14, 0, servo_min)
print("\nCam Turning down")
# time.sleep(0.5)
elif cam_up_down_temp == 1 and set_speed_temp > 90:
pwm.setPWM(14, 0, servo_max)
print("\nCam Turning up")
# time.sleep(0.5)
elif cam_left_right_temp == -1 and set_speed_temp > 90:
pwm.setPWM(15, 0, servo_min)
print("\nCam Turning left")
# time.sleep(0.5)
elif cam_left_right_temp == 1 and set_speed_temp > 90:
pwm.setPWM(15, 0, servo_max)
print("\nCam Turning right")
# time.sleep(0.5)
else:
pwm.setPWM(14, 0, servo_mid)
pwm.setPWM(15, 0, servo_mid)
# print("\nCam Turning neutral")
# time.sleep(0.5)
# recommended for auto-disabling motors on shutdown!
def turnOffMotors():
global mh
mh.getMotor(1).run(Raspi_MotorHAT.RELEASE)
mh.getMotor(2).run(Raspi_MotorHAT.RELEASE)
mh.getMotor(3).run(Raspi_MotorHAT.RELEASE)
mh.getMotor(4).run(Raspi_MotorHAT.RELEASE)
print("All Motors Turning down")
def reset_all_servos():
global pwm
pwm.setPWM(0, 0, servo_mid)
pwm.setPWM(1, 0, servo_mid)
pwm.setPWM(14, 0, servo_mid)
pwm.setPWM(15, 0, servo_mid)
print("Servo resetted")
# ###########################################################################################
# ################################### MAIN PROGRAM ##########################################
# ###########################################################################################
# create a default object, no changes to I2C address or frequency
mh = Raspi_MotorHAT(addr=0x6F)
# Initialise the PWM device using the default address
pwm = PWM(0x6F)
# Front motor
motor_fwd_back = mh.getMotor(1)
# Back motor
motor_fwd_back_2 = mh.getMotor(2)
# Turn motor Front to left right
motor_left_right = mh.getMotor(3)
# Speed in range of 0 - 255
motor_fwd_back.setSpeed(50)
motor_fwd_back_2.setSpeed(50)
motor_left_right.setSpeed(50)
# Set pwm frequency to 60 Hz
pwm.setPWMFreq(60)
reset_all_servos()
turnOffMotors()
# Calling UDP as thread
thread_rx = threading.Thread(target=get_rx_message)
# Calling Control as thread
thread_control = threading.Thread(target=do_control)
# Making the process run in background
thread_rx.setDaemon(True)
thread_control.setDaemon(True)
# Start thread processing
thread_rx.start()
thread_control.start()
# Wait for threads
thread_rx.join()
thread_control.join()