def plot_costmaps():
    workspace = sample_circle_workspaces(nb_circles=4)
    grid_sparse = workspace.box.stacked_meshgrid(24)
    grid_dense = workspace.box.stacked_meshgrid(100)
    extent = workspace.box.extent_data()
    sdf = SignedDistanceWorkspaceMap(workspace)

    viewer = WorkspaceDrawer(workspace,
                             wait_for_keyboard=True,
                             rows=1,
                             cols=2,
                             scale=1.)

    viewer.set_drawing_axis(0)
    viewer.set_workspace(workspace)
    viewer.draw_ws_img(sdf(grid_dense).T)
    viewer.draw_ws_obstacles()

    viewer.set_drawing_axis(1)
    viewer.set_workspace(workspace)
    viewer.draw_ws_img(sdf(grid_sparse).T)
    viewer.draw_ws_obstacles()

    viewer.show_once()
示例#2
0
diagonal = workspace.box.diag()
max_h = diagonal * boxes_height
min_h = diagonal * boxes_height * .5
max_w = diagonal * boxes_width
min_w = diagonal * boxes_width * .5
workspace.obstacles = []

while len(workspace.obstacles) < 5:
    origin = workspace.box.sample_uniform()
    h = (max_h - min_h) * np.random.rand() + min_h
    w = (max_w - min_w) * np.random.rand() + min_w
    if workspace.min_dist(origin)[0] < np.linalg.norm([h, w]):
        continue
    dimensions = np.array([w, h])
    theta = np.pi * np.random.rand() - np.pi
    orientation = rotation_matrix_2d_radian(theta)
    workspace.obstacles.append(OrientedBox(origin, dimensions, orientation))

# Compute Occupancy map
matrix = occupancy_map(150, workspace)

# Compute Signed distance field
# meshgrid = workspace.box.stacked_meshgrid(150)
# matrix = SignedDistanceWorkspaceMap(workspace)(meshgrid).T

# Setup viewer
viewer = WorkspaceDrawer(workspace, wait_for_keyboard=True)
viewer.draw_ws_img(matrix)
viewer.draw_ws_obstacles()
viewer.show_once()
示例#3
0
vx = RegressedPixelGridSpline(U.T, grid_sparse.resolution, grid_sparse.extent)
vy = RegressedPixelGridSpline(V.T, grid_sparse.resolution, grid_sparse.extent)
for i, j in itertools.product(range(X.shape[0]), range(X.shape[1])):
    p = np.array([X[i, j], Y[i, j]])
    vxx = vx.gradient(p)[0]
    vyy = vy.gradient(p)[1]
    div[i, j] = vxx + vyy

for i in range(iterations):
    if ROWS * COLS == 1 and i < iterations - 1:
        continue
    print("plot..")
    p_source = grid_sparse.world_to_grid(x_source)
    p = grid_sparse.grid_to_world(p_source)
    phi = phi.T
    phi = hd.distance(U, V, div, 1. / N).T
    renderer.set_drawing_axis(i)
    renderer.draw_ws_obstacles()
    renderer.draw_ws_point(p, color='r', shape='o')
    renderer.background_matrix_eval = False
    renderer.draw_ws_img(phi, interpolate="bicubic", color_style=plt.cm.hsv)
    f = RegressedPixelGridSpline(phi, grid_sparse.resolution,
                                 grid_sparse.extent)
    for i, j in itertools.product(range(X.shape[0]), range(X.shape[1])):
        g = f.gradient(np.array([X[i, j], Y[i, j]]))
        g /= np.linalg.norm(g)
        U[i, j] = g[0]
        V[i, j] = g[1]
    renderer._ax.quiver(X, Y, U, V, units='width')
renderer.show()
    k = 0
    for i, j in itertools.product(range(nb_points), range(nb_points)):
        X_data[k] = grid.grid_to_world(np.array([i, j]))
        Y_data[k] = value[i, j]
        k += 1
    f = LWR(1, 2)
    f.X = [X_data]
    f.Y = [Y_data]
    f.D = [8 * np.eye(2)]
    f.ridge_lambda = [.1, .1]
else:
    # Regress using cubic-splines
    f = RegressedPixelGridSpline(value, grid.resolution, grid.extent)

print("calculate gradient...")
X, Y = workspace.box.meshgrid(15)
U, V = np.zeros(X.shape), np.zeros(Y.shape)
for i, j in itertools.product(range(X.shape[0]), range(X.shape[1])):
    p = np.array([X[i, j], Y[i, j]])
    g = f.gradient(p)
    g /= np.linalg.norm(g)
    U[i, j] = g[0]
    V[i, j] = g[1]

renderer.set_drawing_axis(i)
renderer.draw_ws_obstacles()
renderer.draw_ws_point([0, 0], color='r', shape='o')
renderer.draw_ws_img(value, interpolate="none", color_style=plt.cm.Blues)
renderer._ax.quiver(X, Y, U, V, units='width', color='k')
renderer.show()
示例#5
0
env = EnvBox(dim=np.array([2., 2.]))
box = Box(origin=np.array([-.2, -.2]))
segment = Segment(origin=np.array([.4, -.1]), orientation=0.2)
circle = Circle(origin=np.array([.5, .5]), radius=0.2)
workspace = Workspace(env)
workspace.obstacles.append(box)
workspace.obstacles.append(segment)
workspace.obstacles.append(circle)

# Compute Occupancy map and SDF
nb_points = 20
occupancy_map = occupancy_map(nb_points, workspace)
signed_distance_field = sdf(occupancy_map)

# Setup viewer
viewer = WorkspaceDrawer(workspace, wait_for_keyboard=True)
viewer.draw_ws_img(signed_distance_field)
# viewer.draw_ws_img(occupancy_map)

# import cv2
# Draw blured image
# viewer.draw_ws_img(
#     ndimage.gaussian_filter(
#         cv2.resize(src=signed_distance_field,
#                    dsize=(300, 300),
#                    interpolation=cv2.INTER_NEAREST), sigma=3))

viewer.draw_ws_obstacles()
viewer.show_once()
hd.TIME_STEP = 1e-5
# hd.ALGORITHM = "crank-nicholson"
hd.ALGORITHM = "euler"

matplotlib.rcParams['pdf.fonttype'] = 42
matplotlib.rcParams['ps.fonttype'] = 42

style = plt.cm.tab20c

circles = []
circles.append(Circle(origin=[.1, .0], radius=0.1))
circles.append(Circle(origin=[.1, .25], radius=0.05))
circles.append(Circle(origin=[.2, .25], radius=0.05))
circles.append(Circle(origin=[.0, .25], radius=0.05))

workspace = Workspace()
workspace.obstacles = circles
renderer = WorkspaceDrawer(workspace, rows=ROWS, cols=COLS)
x_source = np.array([0.2, 0.15])

# ------------------------------------------------------------------------------
iterations = ROWS * COLS
U = hd.heat_diffusion(workspace, x_source, iterations)
for i in range(iterations):
    renderer.set_drawing_axis(i)
    renderer.draw_ws_obstacles()
    renderer.draw_ws_point([x_source[0], x_source[1]], color='r', shape='o')
    renderer.background_matrix_eval = False
    renderer.draw_ws_img(U[i], interpolate="bicubic", color_style=style)
renderer.show()
circles.append(Circle(origin=[.1, .25], radius=0.05))
circles.append(Circle(origin=[.2, .25], radius=0.05))
circles.append(Circle(origin=[.0, .25], radius=0.05))
circles.append(Circle(origin=[-.2, 0], radius=0.1))
workspace = Workspace()
workspace.obstacles = circles
X, Y = workspace.box.meshgrid(N)
occ = occupancy_map(N, workspace)
f = sdf(occ).T
U = -1 * np.gradient(f.T, axis=0).T
V = -1 * np.gradient(f.T, axis=1).T
phi = hd.distance_from_gradient(U, V, 1. / N, f)
phi -= phi.min()  # set min to 0 for comparison
f -= f.min()
# d = np.linalg.norm(phi - f)
# print(d)
renderer = WorkspaceDrawer(workspace, rows=1, cols=2)
renderer.set_drawing_axis(0)
renderer.draw_ws_obstacles()
renderer.draw_ws_img(sdf(occupancy_map(100, workspace)),
                     interpolate="none",
                     color_style=plt.cm.hsv)
renderer._ax.quiver(X, Y, U, V, units='width')
renderer._ax.set_title("original")
renderer.set_drawing_axis(1)
renderer.draw_ws_obstacles()
renderer.draw_ws_img(phi.T, interpolate="none", color_style=plt.cm.hsv)
renderer._ax.quiver(X, Y, U, V, units='width')
renderer._ax.set_title("recovered from vector field")
renderer.show()
示例#8
0
# PERFORMANCE OF THIS SOFTWARE.
#
#                                         Jim Mainprice on Wed January 22 2019

from demos_common_imports import *
from pyrieef.geometry.workspace import *
from pyrieef.geometry import heat_diffusion
from pyrieef.rendering.workspace_planar import WorkspaceDrawer
import matplotlib.pyplot as plt

ROWS = 1
COLS = 2
heat_diffusion.NB_POINTS = 101
heat_diffusion.TIME_FACTOR = 50
heat_diffusion.ALGORITHM = "forward"
iterations = 10
workspace = Workspace()
source = [0, 0]
renderer = WorkspaceDrawer(workspace, rows=ROWS, cols=COLS)
U = heat_diffusion.heat_diffusion(workspace, source, iterations)
U_e = heat_diffusion.compare_with_kernel(U[-1], 9.020E-03, workspace)
for i in range(2):
    renderer.set_drawing_axis(i)
    renderer.draw_ws_obstacles()
    renderer.draw_ws_point(source, color='k', shape='o')
    renderer.background_matrix_eval = False
    renderer.draw_ws_img(
        U[-1] if i == 0 else U_e,
        interpolate="none", color_style=plt.cm.gray)
renderer.show()