-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCollisionChecker2D.py
91 lines (57 loc) · 2.62 KB
/
CollisionChecker2D.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
import numpy as np
class Swathcomputation:
"""Class for computing swath footprint"""
def __init__(self):
self.initialLocation = np.array([0, 0])
def setdestination(self, destination):
"""Setting the location of our robot"""
self.initialLocation[:2] = destination[:]
def translation(self):
self.initialLocation[:] = np.array([collisionChecker.robotFootprint[0]+self.initialLocation[0], collisionChecker.robotFootprint[1]+self.initialLocation[1]])
class CollisionChecker2D:
"""Class for 2D Collision Checking"""
def __init__(self):
self.robotFootprint = 200 # x, y, radius
self.robotLocation = np.array([0, 0]).astype(np.int16)
self.voxelGrid = None
self.voxelSize = 100
self.distanceThreshold = int(self.robotFootprint + (self.voxelSize/np.sqrt(2)))
self.pathFree = True
def setLocation(self, location):
"""Set robot location"""
self.robotLocation[:2] = location[:]
def checkCollision(self, obstacleFootprint):
"""Check collison with obstacle"""
distance = np.linalg.norm(self.robotLocation[:2]-obstacleFootprint[:2])
if distance<(self.robotFootprint+obstacleFootprint[2]):
return True
else:
return False
def setVoxelGrid(self, voxelGrid):
"""Set obstacle grid for collision checking"""
self.voxelGrid = voxelGrid
def checkPathForCollision(self, path):
"""Checks given path for collision with voxels in voxelGrid"""
self.pathFree = True
for point in path:
distance = np.linalg.norm(self.voxelGrid[:,:2]-point, axis=1).astype(np.int16)
voxelsInCollision = self.voxelGrid[distance<=self.distanceThreshold]
if len(voxelsInCollision)>0:
self.pathFree = False
return False, point, voxelsInCollision
else:
continue
return True, None, None
if __name__=="__main__":
collisionChecker = CollisionChecker2D()
path = np.linspace(0, 50, 6).reshape((-1, 1))
path = np.hstack((path, np.zeros_like(path)))
print("\nPath waypoints: \n", path, "\n")
voxelGrid = (np.random.randint(100, size=(20, 2)))*10
print("Random Voxel Grid: \n", voxelGrid, "\n")
collisionChecker.setVoxelGrid(voxelGrid)
pathFree, collisionObstacle, voxelsInCollision = collisionChecker.checkPathForCollision(path)
if pathFree:
print("Path free")
else:
print("Path collision at", collisionObstacle, "with voxels\n", voxelsInCollision)