Compare commits
10 Commits
c642f2b3e7
...
bc74df9448
Author | SHA1 | Date |
---|---|---|
matssteinweg | bc74df9448 | |
matssteinweg | 3e6f27827d | |
matssteinweg | 0aeb0e557f | |
Mats Steinweg | b99cc18bb5 | |
matssteinweg | 57adfabd05 | |
Mats Steinweg | 74122b068a | |
Mats Steinweg | 1491fe6344 | |
Mats Steinweg | dbd6ce6021 | |
Mats Steinweg | 87494e8f8b | |
matssteinweg | e4dfa7defd |
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 1024 KiB |
|
@ -31,7 +31,7 @@ The rest of this readme is structured as follows. In [Section 2](#implementation
|
||||||
The multi-purpose control framework presented in this repository consists of four main components. These components are intended to make the implementation as modular as possible, facilitating extensions to certain components without having to alter the overall structure of the framework. An illustration of the components and their interaction is displayed below.
|
The multi-purpose control framework presented in this repository consists of four main components. These components are intended to make the implementation as modular as possible, facilitating extensions to certain components without having to alter the overall structure of the framework. An illustration of the components and their interaction is displayed below.
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="Images/MPC_Framework.png">
|
<img src="Images/MPC_Framework.svg" width="100%">
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
### Map
|
### Map
|
||||||
|
|
|
@ -156,7 +156,7 @@ class Map:
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
map = Map('real_map.png')
|
map = Map('maps/real_map.png')
|
||||||
# map = Map('sim_map.png')
|
# map = Map('maps/sim_map.png')
|
||||||
plt.imshow(np.flipud(map.data), cmap='gray')
|
plt.imshow(np.flipud(map.data), cmap='gray')
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 24 KiB |
Binary file not shown.
After Width: | Height: | Size: 19 KiB |
|
@ -118,7 +118,7 @@ class ReferencePath:
|
||||||
# Number of waypoints
|
# Number of waypoints
|
||||||
n_wp = [int(np.sqrt((wp_x[i + 1] - wp_x[i]) ** 2 +
|
n_wp = [int(np.sqrt((wp_x[i + 1] - wp_x[i]) ** 2 +
|
||||||
(wp_y[i + 1] - wp_y[i]) ** 2) /
|
(wp_y[i + 1] - wp_y[i]) ** 2) /
|
||||||
self.resolution) for i in range(len(wp_x) - 1)]
|
self.resolution) for i in range(len(wp_x) - 1)]
|
||||||
|
|
||||||
# Construct waypoints with specified resolution
|
# Construct waypoints with specified resolution
|
||||||
gp_x, gp_y = wp_x[-1], wp_y[-1]
|
gp_x, gp_y = wp_x[-1], wp_y[-1]
|
||||||
|
@ -656,7 +656,7 @@ if __name__ == '__main__':
|
||||||
if path == 'Sim_Track':
|
if path == 'Sim_Track':
|
||||||
|
|
||||||
# Load map file
|
# Load map file
|
||||||
map = Map(file_path='sim_map.png', origin=[-1, -2], resolution=0.005)
|
map = Map(file_path='maps/sim_map.png', origin=[-1, -2], resolution=0.005)
|
||||||
|
|
||||||
# Specify waypoints
|
# Specify waypoints
|
||||||
wp_x = [-0.75, -0.25, -0.25, 0.25, 0.25, 1.25, 1.25, 0.75, 0.75, 1.25,
|
wp_x = [-0.75, -0.25, -0.25, 0.25, 0.25, 1.25, 1.25, 0.75, 0.75, 1.25,
|
||||||
|
@ -687,7 +687,7 @@ if __name__ == '__main__':
|
||||||
elif path == 'Real_Track':
|
elif path == 'Real_Track':
|
||||||
|
|
||||||
# Load map file
|
# Load map file
|
||||||
map = Map(file_path='real_map.png', origin=(-30.0, -24.0),
|
map = Map(file_path='maps/real_map.png', origin=(-30.0, -24.0),
|
||||||
resolution=0.06)
|
resolution=0.06)
|
||||||
|
|
||||||
# Specify waypoints
|
# Specify waypoints
|
||||||
|
@ -727,8 +727,9 @@ if __name__ == '__main__':
|
||||||
print('Invalid path!')
|
print('Invalid path!')
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
ub, lb, border_cells = reference_path.update_path_constraints(0,
|
ub, lb, border_cells = \
|
||||||
reference_path.n_waypoints, 0.1, 0.01)
|
reference_path.update_path_constraints(0, reference_path.n_waypoints,
|
||||||
|
0.1, 0.01)
|
||||||
SpeedProfileConstraints = {'a_min': -0.1, 'a_max': 0.5,
|
SpeedProfileConstraints = {'a_min': -0.1, 'a_max': 0.5,
|
||||||
'v_min': 0, 'v_max': 1.0, 'ay_max': 4.0}
|
'v_min': 0, 'v_max': 1.0, 'ay_max': 4.0}
|
||||||
reference_path.compute_speed_profile(SpeedProfileConstraints)
|
reference_path.compute_speed_profile(SpeedProfileConstraints)
|
||||||
|
|
|
@ -17,7 +17,8 @@ if __name__ == '__main__':
|
||||||
if sim_mode == 'Sim_Track':
|
if sim_mode == 'Sim_Track':
|
||||||
|
|
||||||
# Load map file
|
# Load map file
|
||||||
map = Map(file_path='sim_map.png', origin=[-1, -2], resolution=0.005)
|
map = Map(file_path='maps/sim_map.png', origin=[-1, -2],
|
||||||
|
resolution=0.005)
|
||||||
|
|
||||||
# Specify waypoints
|
# Specify waypoints
|
||||||
wp_x = [-0.75, -0.25, -0.25, 0.25, 0.25, 1.25, 1.25, 0.75, 0.75, 1.25,
|
wp_x = [-0.75, -0.25, -0.25, 0.25, 0.25, 1.25, 1.25, 0.75, 0.75, 1.25,
|
||||||
|
@ -34,7 +35,7 @@ if __name__ == '__main__':
|
||||||
circular=True)
|
circular=True)
|
||||||
|
|
||||||
# Add obstacles
|
# Add obstacles
|
||||||
use_obstacles = False
|
use_obstacles = True
|
||||||
if use_obstacles:
|
if use_obstacles:
|
||||||
obs1 = Obstacle(cx=0.0, cy=0.0, radius=0.05)
|
obs1 = Obstacle(cx=0.0, cy=0.0, radius=0.05)
|
||||||
obs2 = Obstacle(cx=-0.8, cy=-0.5, radius=0.08)
|
obs2 = Obstacle(cx=-0.8, cy=-0.5, radius=0.08)
|
||||||
|
@ -50,14 +51,14 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
# Instantiate motion model
|
# Instantiate motion model
|
||||||
car = BicycleModel(length=0.12, width=0.06,
|
car = BicycleModel(length=0.12, width=0.06,
|
||||||
reference_path=reference_path, Ts=0.05)
|
reference_path=reference_path, Ts=0.05)
|
||||||
|
|
||||||
# Real-World Environment. Track used for testing the algorithm on a 1:12
|
# Real-World Environment. Track used for testing the algorithm on a 1:12
|
||||||
# RC car.
|
# RC car.
|
||||||
elif sim_mode == 'Real_Track':
|
elif sim_mode == 'Real_Track':
|
||||||
|
|
||||||
# Load map file
|
# Load map file
|
||||||
map = Map(file_path='real_map.png', origin=(-30.0, -24.0),
|
map = Map(file_path='maps/real_map.png', origin=(-30.0, -24.0),
|
||||||
resolution=0.06)
|
resolution=0.06)
|
||||||
|
|
||||||
# Specify waypoints
|
# Specify waypoints
|
||||||
|
@ -132,18 +133,18 @@ if __name__ == '__main__':
|
||||||
# Until arrival at end of path
|
# Until arrival at end of path
|
||||||
while car.s < reference_path.length:
|
while car.s < reference_path.length:
|
||||||
|
|
||||||
# get control signals
|
# Get control signals
|
||||||
u = mpc.get_control()
|
u = mpc.get_control()
|
||||||
|
|
||||||
# drive car
|
# Simulate car
|
||||||
car.drive(u)
|
car.drive(u)
|
||||||
|
|
||||||
# log
|
# Log car state
|
||||||
x_log.append(car.temporal_state.x)
|
x_log.append(car.temporal_state.x)
|
||||||
y_log.append(car.temporal_state.y)
|
y_log.append(car.temporal_state.y)
|
||||||
v_log.append(u[0])
|
v_log.append(u[0])
|
||||||
|
|
||||||
# Increase simulation time
|
# Increment simulation time
|
||||||
t += car.Ts
|
t += car.Ts
|
||||||
|
|
||||||
# Plot path and drivable area
|
# Plot path and drivable area
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from abc import abstractmethod
|
from abc import abstractmethod
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from abc import ABC
|
from abc import ABC
|
||||||
except:
|
except:
|
||||||
# for Python 2.7
|
# for Python 2.7
|
||||||
from abc import ABCMeta
|
from abc import ABCMeta
|
||||||
|
|
||||||
|
|
||||||
class ABC(object):
|
class ABC(object):
|
||||||
__metaclass__ = ABCMeta
|
__metaclass__ = ABCMeta
|
||||||
pass
|
pass
|
||||||
|
|
Loading…
Reference in New Issue