-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathcar.py
113 lines (89 loc) · 2.39 KB
/
car.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
import numpy as np
from parameters import *
class Car:
def __init__(self, x, y):
self.x = np.array([
[x],
[y],
[0]
])
self.x_dot = np.array([
[0],
[0],
[0]
])
self.wheel_speed = np.array([
[0],
[0]
])
self.b = 25
self.r = 5
self.car_dims = np.array([
[-self.b, -self.b, 1],
[0 , -self.b, 1],
[ self.b, 0, 1],
[ 0, self.b, 1],
[ -self.b, self.b, 1]
])
self.get_transformed_pts()
def set_wheel_velocity(self, lw_speed, rw_speed):
self.wheel_speed = np.array([
[rw_speed],
[lw_speed]
])
self.x_dot = self.forward_kinematics()
def set_robot_velocity(self, linear_velocity, angular_velocity):
self.x_dot = np.array([
[linear_velocity],
[0],
[angular_velocity]
])
self.wheel_speed = self.inverse_kinematics()
def update_state(self, dt):
A = np.array([
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]
])
B = np.array([
[np.sin(self.x[2, 0] + np.pi/2)*dt, 0],
[np.cos(self.x[2, 0] + np.pi/2)*dt, 0],
[0 , dt]
])
vel = np.array([
[self.x_dot[0, 0]],
[self.x_dot[2, 0]]
])
self.x = A@self.x + B@vel
def update(self, dt):
self.wheel_speed[self.wheel_speed>MAX_WHEEL_ROT_SPEED_RAD] = MAX_WHEEL_ROT_SPEED_RAD;
self.wheel_speed[self.wheel_speed<MIN_WHEEL_ROT_SPEED_RAD] = MIN_WHEEL_ROT_SPEED_RAD;
self.x_dot = self.forward_kinematics()
self.update_state(dt)
self.wheel_speed = self.inverse_kinematics()
def get_state(self):
return self.x, self.x_dot
def forward_kinematics(self):
kine_mat = np.array([
[self.r/2 , self.r/2],
[0 , 0],
[self.r/(2*self.b), -self.r/(2*self.b)]
])
return kine_mat@self.wheel_speed
def inverse_kinematics(self):
ikine_mat = np.array([
[1/self.r, 0, self.b/self.r],
[1/self.r, 0, -self.b/self.r]
])
return ikine_mat@self.x_dot
def get_transformed_pts(self):
rot_mat = np.array([
[ np.cos(self.x[2, 0]), np.sin(self.x[2, 0]), self.x[0, 0]],
[-np.sin(self.x[2, 0]), np.cos(self.x[2, 0]), self.x[1, 0]],
[0, 0, 1]
])
self.car_points = self.car_dims@rot_mat.T
self.car_points = self.car_points.astype("int")
def get_points(self):
self.get_transformed_pts()
return self.car_points