-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwall_follower.py
115 lines (88 loc) · 5.41 KB
/
wall_follower.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
import sys
import remoteAPI.sim as sim
from objectWrappers import Sensor
# simRemoteApi.start(19999)
sim.simxFinish(-1)
clientID = sim.simxStart('127.0.0.1', 19999, True, True, 5000, 5)
if clientID != -1:
print("Connected to remote API server")
else:
sys.exit("Connection unsuccessful")
sim.simxStartSimulation(clientID=clientID, operationMode=sim.simx_opmode_oneshot_wait)
# Get handles
returnCode, robot = sim.simxGetObjectHandle(
clientID=clientID,
objectName='Pioneer_p3dx',
operationMode=sim.simx_opmode_oneshot_wait
)
# Motors
returnCode, leftMotor = sim.simxGetObjectHandle(
clientID=clientID,
objectName='Pioneer_p3dx_leftMotor',
operationMode=sim.simx_opmode_oneshot_wait
)
returnCode, rightMotor = sim.simxGetObjectHandle(
clientID=clientID,
objectName='Pioneer_p3dx_rightMotor',
operationMode=sim.simx_opmode_oneshot_wait
)
# Sonar Array
sensorArray = []
for i in range(1, 17):
returnCode, sensorHandle = sim.simxGetObjectHandle(
clientID=clientID,
objectName=f"Pioneer_p3dx_ultrasonicSensor{i}",
operationMode=sim.simx_opmode_oneshot_wait
)
returnCode, detectionState, detectedPoint, detectedObjectHandle, detectedSurfaceNormalVector=sim.simxReadProximitySensor(
clientID=clientID,
sensorHandle=sensorHandle,
operationMode=sim.simx_opmode_streaming
)
sensor = Sensor(sensorHandle=sensorHandle, detectionState=detectionState, detectedPoint=detectedPoint, detectedObjectHandle=detectedObjectHandle, detectedSurfaceNormalVector=detectedSurfaceNormalVector, sensorNumber=i)
sensorArray.append(sensor)
returnCode, finishLine = sim.simxGetObjectHandle(
clientID=clientID,
objectName='finish_line',
operationMode=sim.simx_opmode_oneshot_wait
)
returnCode, collisionState = sim.simxCheckCollision(clientID, entity1=robot, entity2=finishLine, operationMode=sim.simx_opmode_streaming)
# Key Robot Parameters
NODETECTIONDIST = 0.13
V0 = 1
try:
while collisionState == False:
#Update Sonar Array
for i in range(16):
returnCode, detectionState, detectedPoint, detectedObjectHandle, detectedSurfaceNormalVector=sim.simxReadProximitySensor(
clientID=clientID,
sensorHandle=sensorArray[i].sensorHandle,
operationMode=sim.simx_opmode_buffer
)
sensorArray[i].updateValues(detectionState, detectedPoint, detectedObjectHandle, detectedSurfaceNormalVector)
right = sensorArray[7].distance <= NODETECTIONDIST
front = ((sensorArray[1].distance <= NODETECTIONDIST*0.2) or (sensorArray[2].distance <= NODETECTIONDIST*0.7)
or (sensorArray[3].distance <= NODETECTIONDIST) or (sensorArray[4].distance <= NODETECTIONDIST)
or (sensorArray[5].distance <= NODETECTIONDIST*0.7) or (sensorArray[6].distance <= NODETECTIONDIST*0.2)
)
if front == False and right == False:
sim.simxSetJointTargetVelocity(clientID, jointHandle=leftMotor, targetVelocity=V0, operationMode=sim.simx_opmode_oneshot_wait)
sim.simxSetJointTargetVelocity(clientID, jointHandle=rightMotor, targetVelocity=V0/4, operationMode=sim.simx_opmode_oneshot_wait)
sim.simxAddStatusbarMessage(clientID, message="1", operationMode=sim.simx_opmode_oneshot_wait)
elif front == True and right == False:
sim.simxSetJointTargetVelocity(clientID, jointHandle=leftMotor, targetVelocity=0, operationMode=sim.simx_opmode_oneshot_wait)
sim.simxSetJointTargetVelocity(clientID, jointHandle=rightMotor, targetVelocity=V0, operationMode=sim.simx_opmode_oneshot_wait)
sim.simxAddStatusbarMessage(clientID, message="2", operationMode=sim.simx_opmode_oneshot_wait)
elif front == False and right == True:
sim.simxSetJointTargetVelocity(clientID, jointHandle=leftMotor, targetVelocity=V0, operationMode=sim.simx_opmode_oneshot_wait)
sim.simxSetJointTargetVelocity(clientID, jointHandle=rightMotor, targetVelocity=V0, operationMode=sim.simx_opmode_oneshot_wait)
sim.simxAddStatusbarMessage(clientID, message="3", operationMode=sim.simx_opmode_oneshot_wait)
elif front == True and right == True:
sim.simxSetJointTargetVelocity(clientID, jointHandle=leftMotor, targetVelocity=-V0/2, operationMode=sim.simx_opmode_oneshot_wait)
sim.simxSetJointTargetVelocity(clientID, jointHandle=rightMotor, targetVelocity=V0/2, operationMode=sim.simx_opmode_oneshot_wait)
sim.simxAddStatusbarMessage(clientID, message="4", operationMode=sim.simx_opmode_oneshot_wait)
else:
sim.simxAddStatusbarMessage(clientID, message="No Case", operationMode=sim.simx_opmode_oneshot_wait)
returnCode, collisionState = sim.simxCheckCollision(clientID, entity1=robot, entity2=finishLine, operationMode=sim.simx_opmode_buffer)
except KeyboardInterrupt:
sim.simxStopSimulation(clientID, operationMode=sim.simx_opmode_oneshot_wait)