From 0fc769421f66a6403f750781dc46534d84e7c424 Mon Sep 17 00:00:00 2001 From: Atsushi Sakai Date: Thu, 6 Jul 2023 23:12:43 +0900 Subject: [PATCH] Adding NDT mapping script and doc (#867) * Adding ndt mapping script and doc * Adding ndt mapping script and doc * Adding ndt mapping script and doc * Adding ndt mapping script and doc * Adding ndt mapping script and doc * Adding ndt mapping script and doc * Adding ndt mapping script and doc * Adding ndt mapping script and doc --- .../extended_kalman_filter.py | 28 +--- Mapping/grid_map_lib/grid_map_lib.py | 125 ++++++++++------ Mapping/ndt_map/ndt_map.py | 135 ++++++++++++++++++ .../grid_based_sweep_coverage_path_planner.py | 31 ++-- docs/modules/mapping/mapping_main.rst | 1 + .../mapping/ndt_map/grid_clustering.png | Bin 0 -> 33111 bytes docs/modules/mapping/ndt_map/ndt_map1.png | Bin 0 -> 23081 bytes docs/modules/mapping/ndt_map/ndt_map2.png | Bin 0 -> 21736 bytes docs/modules/mapping/ndt_map/ndt_map_main.rst | 53 +++++++ .../mapping/ndt_map/raw_observations.png | Bin 0 -> 18305 bytes tests/test_grid_map_lib.py | 11 ++ utils/plot.py | 71 ++++++++- 12 files changed, 372 insertions(+), 83 deletions(-) create mode 100644 Mapping/ndt_map/ndt_map.py create mode 100644 docs/modules/mapping/ndt_map/grid_clustering.png create mode 100644 docs/modules/mapping/ndt_map/ndt_map1.png create mode 100644 docs/modules/mapping/ndt_map/ndt_map2.png create mode 100644 docs/modules/mapping/ndt_map/ndt_map_main.rst create mode 100644 docs/modules/mapping/ndt_map/raw_observations.png diff --git a/Localization/extended_kalman_filter/extended_kalman_filter.py b/Localization/extended_kalman_filter/extended_kalman_filter.py index c2fe8e3a87..d9ece6c6f3 100644 --- a/Localization/extended_kalman_filter/extended_kalman_filter.py +++ b/Localization/extended_kalman_filter/extended_kalman_filter.py @@ -7,13 +7,14 @@ """ import sys import pathlib + sys.path.append(str(pathlib.Path(__file__).parent.parent.parent)) import math import matplotlib.pyplot as plt import numpy as np -from utils.angle import rot_mat_2d +from utils.plot import plot_covariance_ellipse # Covariance for EKF simulation Q = np.diag([ @@ -135,29 +136,6 @@ def ekf_estimation(xEst, PEst, z, u): return xEst, PEst -def plot_covariance_ellipse(xEst, PEst): # pragma: no cover - Pxy = PEst[0:2, 0:2] - eigval, eigvec = np.linalg.eig(Pxy) - - if eigval[0] >= eigval[1]: - bigind = 0 - smallind = 1 - else: - bigind = 1 - smallind = 0 - - t = np.arange(0, 2 * math.pi + 0.1, 0.1) - a = math.sqrt(eigval[bigind]) - b = math.sqrt(eigval[smallind]) - x = [a * math.cos(it) for it in t] - y = [b * math.sin(it) for it in t] - angle = math.atan2(eigvec[1, bigind], eigvec[0, bigind]) - fx = rot_mat_2d(angle) @ (np.array([x, y])) - px = np.array(fx[0, :] + xEst[0, 0]).flatten() - py = np.array(fx[1, :] + xEst[1, 0]).flatten() - plt.plot(px, py, "--r") - - def main(): print(__file__ + " start!!") @@ -202,7 +180,7 @@ def main(): hxDR[1, :].flatten(), "-k") plt.plot(hxEst[0, :].flatten(), hxEst[1, :].flatten(), "-r") - plot_covariance_ellipse(xEst, PEst) + plot_covariance_ellipse(xEst[0, 0], xEst[1, 0], PEst) plt.axis("equal") plt.grid(True) plt.pause(0.001) diff --git a/Mapping/grid_map_lib/grid_map_lib.py b/Mapping/grid_map_lib/grid_map_lib.py index 85dd76e71d..d08d8ec5ba 100644 --- a/Mapping/grid_map_lib/grid_map_lib.py +++ b/Mapping/grid_map_lib/grid_map_lib.py @@ -5,22 +5,42 @@ author: Atsushi Sakai """ - +from functools import total_ordering import matplotlib.pyplot as plt import numpy as np +@total_ordering +class FloatGrid: + + def __init__(self, init_val=0.0): + self.data = init_val + + def get_float_data(self): + return self.data + + def __eq__(self, other): + if not isinstance(other, FloatGrid): + return NotImplemented + return self.get_float_data() == other.get_float_data() + + def __lt__(self, other): + if not isinstance(other, FloatGrid): + return NotImplemented + return self.get_float_data() < other.get_float_data() + + class GridMap: """ GridMap class """ def __init__(self, width, height, resolution, - center_x, center_y, init_val=0.0): + center_x, center_y, init_val=FloatGrid(0.0)): """__init__ :param width: number of grid for width - :param height: number of grid for heigt + :param height: number of grid for height :param resolution: grid resolution [m] :param center_x: center x position [m] :param center_y: center y position [m] @@ -35,8 +55,9 @@ def __init__(self, width, height, resolution, self.left_lower_x = self.center_x - self.width / 2.0 * self.resolution self.left_lower_y = self.center_y - self.height / 2.0 * self.resolution - self.ndata = self.width * self.height - self.data = [init_val] * self.ndata + self.n_data = self.width * self.height + self.data = [init_val] * self.n_data + self.data_type = type(init_val) def get_value_from_xy_index(self, x_ind, y_ind): """get_value_from_xy_index @@ -49,7 +70,7 @@ def get_value_from_xy_index(self, x_ind, y_ind): grid_ind = self.calc_grid_index_from_xy_index(x_ind, y_ind) - if 0 <= grid_ind < self.ndata: + if 0 <= grid_ind < self.n_data: return self.data[grid_ind] else: return None @@ -101,7 +122,7 @@ def set_value_from_xy_index(self, x_ind, y_ind, val): grid_ind = int(y_ind * self.width + x_ind) - if 0 <= grid_ind < self.ndata: + if 0 <= grid_ind < self.n_data and isinstance(val, self.data_type): self.data[grid_ind] = val return True # OK else: @@ -138,6 +159,27 @@ def calc_grid_index_from_xy_index(self, x_ind, y_ind): grid_ind = int(y_ind * self.width + x_ind) return grid_ind + def calc_xy_index_from_grid_index(self, grid_ind): + y_ind, x_ind = divmod(grid_ind, self.width) + return x_ind, y_ind + + def calc_grid_index_from_xy_pos(self, x_pos, y_pos): + """get_xy_index_from_xy_pos + + :param x_pos: x position [m] + :param y_pos: y position [m] + """ + x_ind = self.calc_xy_index_from_position( + x_pos, self.left_lower_x, self.width) + y_ind = self.calc_xy_index_from_position( + y_pos, self.left_lower_y, self.height) + + return self.calc_grid_index_from_xy_index(x_ind, y_ind) + + def calc_grid_central_xy_position_from_grid_index(self, grid_ind): + x_ind, y_ind = self.calc_xy_index_from_grid_index(grid_ind) + return self.calc_grid_central_xy_position_from_xy_index(x_ind, y_ind) + def calc_grid_central_xy_position_from_xy_index(self, x_ind, y_ind): x_pos = self.calc_grid_central_xy_position_from_index( x_ind, self.left_lower_x) @@ -156,39 +198,40 @@ def calc_xy_index_from_position(self, pos, lower_pos, max_index): else: return None - def check_occupied_from_xy_index(self, xind, yind, occupied_val=1.0): + def check_occupied_from_xy_index(self, x_ind, y_ind, occupied_val): - val = self.get_value_from_xy_index(xind, yind) + val = self.get_value_from_xy_index(x_ind, y_ind) if val is None or val >= occupied_val: return True else: return False - def expand_grid(self): - xinds, yinds = [], [] + def expand_grid(self, occupied_val=FloatGrid(1.0)): + x_inds, y_inds, values = [], [], [] for ix in range(self.width): for iy in range(self.height): - if self.check_occupied_from_xy_index(ix, iy): - xinds.append(ix) - yinds.append(iy) - - for (ix, iy) in zip(xinds, yinds): - self.set_value_from_xy_index(ix + 1, iy, val=1.0) - self.set_value_from_xy_index(ix, iy + 1, val=1.0) - self.set_value_from_xy_index(ix + 1, iy + 1, val=1.0) - self.set_value_from_xy_index(ix - 1, iy, val=1.0) - self.set_value_from_xy_index(ix, iy - 1, val=1.0) - self.set_value_from_xy_index(ix - 1, iy - 1, val=1.0) + if self.check_occupied_from_xy_index(ix, iy, occupied_val): + x_inds.append(ix) + y_inds.append(iy) + values.append(self.get_value_from_xy_index(ix, iy)) + + for (ix, iy, value) in zip(x_inds, y_inds, values): + self.set_value_from_xy_index(ix + 1, iy, val=value) + self.set_value_from_xy_index(ix, iy + 1, val=value) + self.set_value_from_xy_index(ix + 1, iy + 1, val=value) + self.set_value_from_xy_index(ix - 1, iy, val=value) + self.set_value_from_xy_index(ix, iy - 1, val=value) + self.set_value_from_xy_index(ix - 1, iy - 1, val=value) @staticmethod def check_inside_polygon(iox, ioy, x, y): - npoint = len(x) - 1 + n_point = len(x) - 1 inside = False - for i1 in range(npoint): - i2 = (i1 + 1) % (npoint + 1) + for i1 in range(n_point): + i2 = (i1 + 1) % (n_point + 1) if x[i1] >= x[i2]: min_x, max_x = x[i2], x[i1] @@ -211,27 +254,26 @@ def print_grid_map_info(self): print("center_y:", self.center_y) print("left_lower_x:", self.left_lower_x) print("left_lower_y:", self.left_lower_y) - print("ndata:", self.ndata) + print("n_data:", self.n_data) def plot_grid_map(self, ax=None): - - grid_data = np.reshape(np.array(self.data), (self.height, self.width)) + float_data_array = np.array([d.get_float_data() for d in self.data]) + grid_data = np.reshape(float_data_array, (self.height, self.width)) if not ax: fig, ax = plt.subplots() heat_map = ax.pcolor(grid_data, cmap="Blues", vmin=0.0, vmax=1.0) plt.axis("equal") - # plt.show() return heat_map -def test_polygon_set(): +def polygon_set_demo(): ox = [0.0, 4.35, 20.0, 50.0, 100.0, 130.0, 40.0] oy = [0.0, -4.15, -20.0, 0.0, 30.0, 60.0, 80.0] grid_map = GridMap(600, 290, 0.7, 60.0, 30.5) - grid_map.set_value_from_polygon(ox, oy, 1.0, inside=False) + grid_map.set_value_from_polygon(ox, oy, FloatGrid(1.0), inside=False) grid_map.plot_grid_map() @@ -239,24 +281,27 @@ def test_polygon_set(): plt.grid(True) -def test_position_set(): +def position_set_demo(): grid_map = GridMap(100, 120, 0.5, 10.0, -0.5) - grid_map.set_value_from_xy_pos(10.1, -1.1, 1.0) - grid_map.set_value_from_xy_pos(10.1, -0.1, 1.0) - grid_map.set_value_from_xy_pos(10.1, 1.1, 1.0) - grid_map.set_value_from_xy_pos(11.1, 0.1, 1.0) - grid_map.set_value_from_xy_pos(10.1, 0.1, 1.0) - grid_map.set_value_from_xy_pos(9.1, 0.1, 1.0) + grid_map.set_value_from_xy_pos(10.1, -1.1, FloatGrid(1.0)) + grid_map.set_value_from_xy_pos(10.1, -0.1, FloatGrid(1.0)) + grid_map.set_value_from_xy_pos(10.1, 1.1, FloatGrid(1.0)) + grid_map.set_value_from_xy_pos(11.1, 0.1, FloatGrid(1.0)) + grid_map.set_value_from_xy_pos(10.1, 0.1, FloatGrid(1.0)) + grid_map.set_value_from_xy_pos(9.1, 0.1, FloatGrid(1.0)) grid_map.plot_grid_map() + plt.axis("equal") + plt.grid(True) + def main(): print("start!!") - test_position_set() - test_polygon_set() + position_set_demo() + polygon_set_demo() plt.show() diff --git a/Mapping/ndt_map/ndt_map.py b/Mapping/ndt_map/ndt_map.py new file mode 100644 index 0000000000..f4f3299662 --- /dev/null +++ b/Mapping/ndt_map/ndt_map.py @@ -0,0 +1,135 @@ +""" +Normal Distribution Transform (NDTGrid) mapping sample +""" +import matplotlib.pyplot as plt +import numpy as np +from collections import defaultdict + +from Mapping.grid_map_lib.grid_map_lib import GridMap +from utils.plot import plot_covariance_ellipse + + +class NDTMap: + """ + Normal Distribution Transform (NDT) map class + + :param ox: obstacle x position list + :param oy: obstacle y position list + :param resolution: grid resolution [m] + """ + + class NDTGrid: + """ + NDT grid + """ + + def __init__(self): + #: Number of points in the NDTGrid grid + self.n_points = 0 + #: Mean x position of points in the NDTGrid cell + self.mean_x = None + #: Mean y position of points in the NDTGrid cell + self.mean_y = None + #: Center x position of the NDT grid + self.center_grid_x = None + #: Center y position of the NDT grid + self.center_grid_y = None + #: Covariance matrix of the NDT grid + self.covariance = None + #: Eigen vectors of the NDT grid + self.eig_vec = None + #: Eigen values of the NDT grid + self.eig_values = None + + def __init__(self, ox, oy, resolution): + #: Minimum number of points in the NDT grid + self.min_n_points = 3 + #: Resolution of the NDT grid [m] + self.resolution = resolution + width = int((max(ox) - min(ox))/resolution) + 3 # rounding up + right and left margin + height = int((max(oy) - min(oy))/resolution) + 3 + center_x = np.mean(ox) + center_y = np.mean(oy) + self.ox = ox + self.oy = oy + #: NDT grid index map + self.grid_index_map = self._create_grid_index_map(ox, oy) + + #: NDT grid map. Each grid contains NDTGrid object + self._construct_grid_map(center_x, center_y, height, ox, oy, resolution, width) + + def _construct_grid_map(self, center_x, center_y, height, ox, oy, resolution, width): + self.grid_map = GridMap(width, height, resolution, center_x, center_y, self.NDTGrid()) + for grid_index, inds in self.grid_index_map.items(): + ndt = self.NDTGrid() + ndt.n_points = len(inds) + if ndt.n_points >= self.min_n_points: + ndt.mean_x = np.mean(ox[inds]) + ndt.mean_y = np.mean(oy[inds]) + ndt.center_grid_x, ndt.center_grid_y = \ + self.grid_map.calc_grid_central_xy_position_from_grid_index(grid_index) + ndt.covariance = np.cov(ox[inds], oy[inds]) + ndt.eig_values, ndt.eig_vec = np.linalg.eig(ndt.covariance) + self.grid_map.data[grid_index] = ndt + + def _create_grid_index_map(self, ox, oy): + grid_index_map = defaultdict(list) + for i in range(len(ox)): + grid_index = self.grid_map.calc_grid_index_from_xy_pos(ox[i], oy[i]) + grid_index_map[grid_index].append(i) + return grid_index_map + + +def create_dummy_observation_data(): + ox = [] + oy = [] + # left corridor + for y in range(-50, 50): + ox.append(-20.0) + oy.append(y) + # right corridor 1 + for y in range(-50, 0): + ox.append(20.0) + oy.append(y) + # right corridor 2 + for x in range(20, 50): + ox.append(x) + oy.append(0) + # right corridor 3 + for x in range(20, 50): + ox.append(x) + oy.append(x/2.0+10) + # right corridor 4 + for y in range(20, 50): + ox.append(20) + oy.append(y) + ox = np.array(ox) + oy = np.array(oy) + # Adding random noize + ox += np.random.rand(len(ox)) * 1.0 + oy += np.random.rand(len(ox)) * 1.0 + return ox, oy + + +def main(): + print(__file__ + " start!!") + + ox, oy = create_dummy_observation_data() + grid_resolution = 10.0 + ndt_map = NDTMap(ox, oy, grid_resolution) + + # plot raw observation + plt.plot(ox, oy, ".r") + + # plot grid clustering + [plt.plot(ox[inds], oy[inds], "x") for inds in ndt_map.grid_index_map.values()] + + # plot ndt grid map + [plot_covariance_ellipse(ndt.mean_x, ndt.mean_y, ndt.covariance, color="-k") for ndt in ndt_map.grid_map.data if ndt.n_points > 0] + + plt.axis("equal") + plt.show() + + +if __name__ == '__main__': + main() diff --git a/PathPlanning/GridBasedSweepCPP/grid_based_sweep_coverage_path_planner.py b/PathPlanning/GridBasedSweepCPP/grid_based_sweep_coverage_path_planner.py index 31dc917566..ee192e9200 100644 --- a/PathPlanning/GridBasedSweepCPP/grid_based_sweep_coverage_path_planner.py +++ b/PathPlanning/GridBasedSweepCPP/grid_based_sweep_coverage_path_planner.py @@ -13,7 +13,7 @@ sys.path.append(str(pathlib.Path(__file__).parent.parent.parent)) from utils.angle import rot_mat_2d -from Mapping.grid_map_lib.grid_map_lib import GridMap +from Mapping.grid_map_lib.grid_map_lib import GridMap, FloatGrid do_animation = True @@ -41,8 +41,7 @@ def move_target_grid(self, c_x_index, c_y_index, grid_map): n_y_index = c_y_index # found safe grid - if not grid_map.check_occupied_from_xy_index(n_x_index, n_y_index, - occupied_val=0.5): + if not self.check_occupied(n_x_index, n_y_index, grid_map): return n_x_index, n_y_index else: # occupied next_c_x_index, next_c_y_index = self.find_safe_turning_grid( @@ -51,19 +50,20 @@ def move_target_grid(self, c_x_index, c_y_index, grid_map): # moving backward next_c_x_index = -self.moving_direction + c_x_index next_c_y_index = c_y_index - if grid_map.check_occupied_from_xy_index(next_c_x_index, - next_c_y_index): + if self.check_occupied(next_c_x_index, next_c_y_index, grid_map): # moved backward, but the grid is occupied by obstacle return None, None else: # keep moving until end - while not grid_map.check_occupied_from_xy_index( - next_c_x_index + self.moving_direction, - next_c_y_index, occupied_val=0.5): + while not self.check_occupied(next_c_x_index + self.moving_direction, next_c_y_index, grid_map): next_c_x_index += self.moving_direction self.swap_moving_direction() return next_c_x_index, next_c_y_index + @staticmethod + def check_occupied(c_x_index, c_y_index, grid_map): + return grid_map.check_occupied_from_xy_index(c_x_index, c_y_index, FloatGrid(0.5)) + def find_safe_turning_grid(self, c_x_index, c_y_index, grid_map): for (d_x_ind, d_y_ind) in self.turing_window: @@ -72,17 +72,14 @@ def find_safe_turning_grid(self, c_x_index, c_y_index, grid_map): next_y_ind = d_y_ind + c_y_index # found safe grid - if not grid_map.check_occupied_from_xy_index(next_x_ind, - next_y_ind, - occupied_val=0.5): + if not self.check_occupied(next_x_ind, next_y_ind, grid_map): return next_x_ind, next_y_ind return None, None def is_search_done(self, grid_map): for ix in self.x_indexes_goal_y: - if not grid_map.check_occupied_from_xy_index(ix, self.goal_y, - occupied_val=0.5): + if not self.check_occupied(ix, self.goal_y, grid_map): return False # all lower grid is occupied @@ -168,7 +165,7 @@ def search_free_grid_index_at_edge_y(grid_map, from_upper=False): for iy in x_range: for ix in y_range: - if not grid_map.check_occupied_from_xy_index(ix, iy): + if not SweepSearcher.check_occupied(ix, iy, grid_map): y_index = iy x_indexes.append(ix) if y_index: @@ -185,7 +182,7 @@ def setup_grid_map(ox, oy, resolution, sweep_direction, offset_grid=10): grid_map = GridMap(width, height, resolution, center_x, center_y) grid_map.print_grid_map_info() - grid_map.set_value_from_polygon(ox, oy, 1.0, inside=False) + grid_map.set_value_from_polygon(ox, oy, FloatGrid(1.0), inside=False) grid_map.expand_grid() x_inds_goal_y = [] @@ -203,7 +200,7 @@ def setup_grid_map(ox, oy, resolution, sweep_direction, offset_grid=10): def sweep_path_search(sweep_searcher, grid_map, grid_search_animation=False): # search start grid c_x_index, c_y_index = sweep_searcher.search_start_grid(grid_map) - if not grid_map.set_value_from_xy_index(c_x_index, c_y_index, 0.5): + if not grid_map.set_value_from_xy_index(c_x_index, c_y_index, FloatGrid(0.5)): print("Cannot find start grid") return [], [] @@ -235,7 +232,7 @@ def sweep_path_search(sweep_searcher, grid_map, grid_search_animation=False): px.append(x) py.append(y) - grid_map.set_value_from_xy_index(c_x_index, c_y_index, 0.5) + grid_map.set_value_from_xy_index(c_x_index, c_y_index, FloatGrid(0.5)) if grid_search_animation: grid_map.plot_grid_map(ax=ax) diff --git a/docs/modules/mapping/mapping_main.rst b/docs/modules/mapping/mapping_main.rst index 1c02c75cb2..a98acaaf50 100644 --- a/docs/modules/mapping/mapping_main.rst +++ b/docs/modules/mapping/mapping_main.rst @@ -7,6 +7,7 @@ Mapping :caption: Contents gaussian_grid_map/gaussian_grid_map + ndt_map/ndt_map ray_casting_grid_map/ray_casting_grid_map lidar_to_grid_map_tutorial/lidar_to_grid_map_tutorial point_cloud_sampling/point_cloud_sampling diff --git a/docs/modules/mapping/ndt_map/grid_clustering.png b/docs/modules/mapping/ndt_map/grid_clustering.png new file mode 100644 index 0000000000000000000000000000000000000000..c53590287af100b42c31afdb7610a825c4e3b589 GIT binary patch literal 33111 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 Q*fyi~SrE;0cR61BH*yT!@&Et; literal 0 HcmV?d00001 diff --git a/docs/modules/mapping/ndt_map/ndt_map2.png b/docs/modules/mapping/ndt_map/ndt_map2.png new file mode 100644 index 0000000000000000000000000000000000000000..b99706297955c3b31d8bd33299311b45be14f9c1 GIT binary patch literal 21736 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 z z&_WgcKsWk?5IomuEvd~Kg|v;)zV##8Hfc_?Y2f-BB%WU&(7DPZvwIqW%cd!Eq=a;& zr9@+Mp||Uy-gK=Lu(4kRQb?aRYmhsv>FC_uy}RxGwf?dF5$-Ah+&=JA$)hlImn~+n z59fSfnxXw#sT$M)YX+SzpJ@+j*aKoE9&QN>zia!v?igOt< zYI!snikxQ^=~UdT!X7Q`b`k{RuuBf(MM^D@fatTgt~!d{-=pRHkD0_v`Lu;$Oc9Y= zw=vry&~VNlIeRZ7v0+JSDi5zI5dS|Oe{LSCvYi{|sRX2{1?I7H;X}?)l9zVYwrd|b=t}A)KSj?+m_%mMdYqw-aeiB%8>T~bEZ4qWD@8VH3 zg$1HDl`FS&9k75h0fOt{@lI{Nj=K1jNjIQx0|EET<-2dJy3^Gvfme8|p7mH$SXh{) zm@?5oD9gv8mRHcHx)>3E+BeeUL3$fhj|;3`ngs(ziPv#dKWTGN`tdocVh#M}EX9`+brHEF_wG4$GP{2Jk}7Xd zq{txnCQ>H#+|g!6v%;O8xAmnVjs;o+SHb+%GoLGMZs_Za^`O%;)O zK)Z&$l1L@cV-YCg5KVsz9skDt^}p`wFYQ%UkWhow?+@22kM|dapZp|7U`u%?g(Y47 zcECb%7@5^kqg!Jbv;L_81L*Ot7EGp9E{MK}f!^N!e$QcijV;dugmKSIo&B#T9?reo zN9_Zao;}>Yu){n{Ln|`GBJJbrg1eV_N!K=>ci`DF_U*@P>ZpuV}@bi|G!Q_&XUMoxwXMarl~ z$z9ebBjYBXBYG|N?|{5KUVe)69RT%((b|)XraMJRNB3nw0|I4u8R+F&Uw$re0vpKn(SHO>4PC}?2Y`b@Zrk2htdN>q7+p;o@^jGBxhR}ftIhdtC3ts$`YB_)K5!8(E@0yI_wRf8@ozAx&U|AHJo!$F zt`p89g&$bt&|cg6GuwWY93cNB>kQ-C=j&)lJxpIp{~Lu7pJmE5tsQwqlbn4Wz_uxF z4Q#Z1?QrIS%fZr!$oUa#W}H@He}LIm{n24S{C!vAY-1R?SWaaJW!OQnJN4MB(l;n za}B~7N*MCX@gLP_ZCxGBDC7h}2=3{(k^wB1P zTz3Xc@65v7kNzz5;(+$|+Bh4H`9G~&0BU&OdUk)G368tle5s-%X5fq|@Zj1jq%a&# z1jDh`Hv#K)hZgQuVnN=;frF=G5Z0@S8*755gg=0(uwd}Pn;JiyQ!V!uI0%3-7tH4V zKM#U$zp$>NQWm?BYt-Cy3o^ZS+KATY5lLa{>+Ml6Dr^gYI`9&=1B&J$EBRs}i`0V) z_y7>rM>LMtem?b82IC?dC1T&|Ykr!o9M3qZRzoyE z>cxaUR6$lPKZ9ZklC!hmjv*azb*P;)1mMnTvzQ+2>;)RmEu~BUbPM$2d`Puup&LI} zX_Qh=iIm4VC4l}B&OyUi9hFmsOVH!6Yo|H+=D_H_?hF&3qFV&Q=}%#*Wm1~*KWw*+ z?L)`4UxlepiJ!LcDaRWAP{G)&Ie5K#((w;Ahb{V4WqUW8D{A^X(8Ls+;)XwJs;#s< zuG77{gSUzUXWGzE%&*%Y|Ji-J+K-WfzrNtWncphEOWX1%A2sr%qXC#3EHDI9w{c*S z9yZiJ(BYsWSB=^bh0p$%*?~z5LTQdUp^~LEoe^=Tre&5=$9pEijoC z`=0oKteW{hG=;MJ42PLEzIqGI)s576UV$4#S;|2Bua^nX=pTYwx7z*<*A1$v-Nh&b zb`a%V6()1+rXM}+j9gDY3-|l0^%T8Tt`0zX6W`|uLV^A$(47PtPl1L+Y96w^Je&~2{r2r!(_;EA?op(?>Ddo~YdQDXPXN0P_b7uX^FI#cU>eYbfl!ur z1L%_usMzhH{{sc5#v$2Jion9bHu-MgLiuD^_k2cD9_!&4kp$4+1{Ys;&}PD&If)(% znV{FIN->lnt>476ZSksec>pP`%~VsQ#PRN=^LjJaB9Jh9K=VrpomYfpUC$etGhl_iprEs!#x>#5jdaQ7a*m}@jPF62uPXMvsPfVHb-d#G z9n_B02Cy;oDhv4T*0WMJ?))7vCp=GQc2zCz>4^I*^TyPBjX2;b!{iuMbX7ID_>CTK zmpucJ;~D5Co5}Y*$_9bnvaOjb$3~ncM?v{7}@KI)Vw%|(jMwmNzuQqBuqsN34EOydB#QkZTS9|QCV`O9ppp>PF z?~${h$EFo>Jb>2Y&%&YGQb~VnX2xe5IN1n-{;{8HY+H>d$15js04&B_*GZ4jGxhF0 zTypS*&+-FmMy>i;=U0VvjU?$Az1sbcdy}juR;c5x{CF^ZalSy3W+|;UzwzihI>D(+ z1@tWLg}SfQ?6d-SXbxt=0?wpvY7zVOs`#>A_U%$T3G^a%G4N{%;*Pze=4l0ei&ikZ z*a(CgbBx&Jc?yF#K*!wRzZ*!dcAMP5)X4D%!833&sIlNtYr>1)*Pnr=KbBJN6Y0Gv zDvsuA&@kCRXAXRo2;ll_1Hb#;tu5)~(2}EBNJz-7x0Srib;U%-z`zDDb!~d6^^fw< zc>`bIj8xb#86}&~NutIt~oR!C-%@Ywf{svH9rX zjA$D`KOy`-7Ag3ilhP%%U=k&T5raZf+keb~tgh6sK}JSaITfYalWSP^vj9LA#6Y2f z@5#aF#z0Rsw#YJke|st3jVTo+23##7psf!qvMXT$a+gCHMb*KzETuP2fI`io5`=sV z@G;<7RTkqP*T1n|9s6Ni=>U6l^SzgBtyc_5OneV#eUCE~L+FyT^D6IgC3zKMBv)=r z?T)<)njQ6Aky`pwz>zBhdm6P;6rG!o%UA1QPo%`rG@oxI=h0fYZ_kSFiKq8gw&}-9 z)yJzK(JHmkrGO))fB37RO0@drUlv*ne{7 z4$&WV(DTd>G{=_OqxPN|J9R2ZEant(il5|H{oA!!VqD>%`%g9RBiPc3S0dC06=|l zw|e(RyG;I@H*Z2}7?i-2!A-l7N-Uj#Y!=kr_{B=WB(@q;TE)SHF#U-bMHzoG@yNVc zy(-rW+DmKligtd@cIKPP1k{h`tdwQf^c&e%uPFjcNo^Z$g)HwP(6j3eVkGu1}~BE`Nhf55FEC zjh+~5uaCZjn@GW_pnkYS1F_tGWH6QwG=O?Oxuh9|kv_1i0WLFxa>wMns^v=b>F{d; zk4bN>?+FKL*;3{p)@L(?^$Lpvc!}xhX%NFRglu}Qsc7r#$Ii4T=`dqe02*N2D5%Rsdf;>%M%{@o564R4|k{n?rw?loW$(r5bt<1peh z8EAaAgOfp#$CgcZic=*?CGxp;4{ z-PitjGeag8R1(O#b6hcC|G5nplM90_(w(8fx-kJd77~eoV4zVw12(KEuvUw-%bZlZ zA8qxkfziIs!?W?dckg2*$)6artw!7Ynr9>=B&{zANbj4Qr|6g1e4GbPAos(yMyh=M zVyj4T;K^<+YL~Vh@mS>D2zBsEX^EBsrn$vdTGVQQJbeu4={>o1w7(??(!LRmVP z(V3T|H*YbD*sWHoFyHKV*VNMk%?2{ZYZS{^ueh*GlkG Okcxu3e4d=y%l`%7gFUVQ literal 0 HcmV?d00001 diff --git a/tests/test_grid_map_lib.py b/tests/test_grid_map_lib.py index 92ca67e297..670b357ad3 100644 --- a/tests/test_grid_map_lib.py +++ b/tests/test_grid_map_lib.py @@ -25,5 +25,16 @@ def test_polygon_set(): 1.0, inside=False) +def test_xy_and_grid_index_conversion(): + grid_map = GridMap(100, 120, 0.5, 10.0, -0.5) + + for x_ind in range(grid_map.width): + for y_ind in range(grid_map.height): + grid_ind = grid_map.calc_grid_index_from_xy_index(x_ind, y_ind) + x_ind_2, y_ind_2 = grid_map.calc_xy_index_from_grid_index(grid_ind) + assert x_ind == x_ind_2 + assert y_ind == y_ind_2 + + if __name__ == '__main__': conftest.run_this_test(__file__) diff --git a/utils/plot.py b/utils/plot.py index d4bbe29ffd..eb5aa7ad04 100644 --- a/utils/plot.py +++ b/utils/plot.py @@ -9,6 +9,69 @@ from mpl_toolkits.mplot3d.proj3d import proj_transform from mpl_toolkits.mplot3d import Axes3D +from utils.angle import rot_mat_2d + + +def plot_covariance_ellipse(x, y, cov, chi2=3.0, color="-r", ax=None): + """ + This function plots an ellipse that represents a covariance matrix. The ellipse is centered at (x, y) and its shape, size and rotation are determined by the covariance matrix. + + Parameters: + x : (float) The x-coordinate of the center of the ellipse. + y : (float) The y-coordinate of the center of the ellipse. + cov : (numpy.ndarray) A 2x2 covariance matrix that determines the shape, size, and rotation of the ellipse. + chi2 : (float, optional) A scalar value that scales the ellipse size. This value is typically set based on chi-squared distribution quantiles to achieve certain confidence levels (e.g., 3.0 corresponds to ~95% confidence for a 2D Gaussian). Defaults to 3.0. + color : (str, optional) The color and line style of the ellipse plot, following matplotlib conventions. Defaults to "-r" (a red solid line). + ax : (matplotlib.axes.Axes, optional) The Axes object to draw the ellipse on. If None (default), a new figure and axes are created. + + Returns: + None. This function plots the covariance ellipse on the specified axes. + """ + eig_val, eig_vec = np.linalg.eig(cov) + + if eig_val[0] >= eig_val[1]: + big_ind = 0 + small_ind = 1 + else: + big_ind = 1 + small_ind = 0 + a = math.sqrt(chi2 * eig_val[big_ind]) + b = math.sqrt(chi2 * eig_val[small_ind]) + angle = math.atan2(eig_vec[1, big_ind], eig_vec[0, big_ind]) + plot_ellipse(x, y, a, b, angle, color=color, ax=ax) + + +def plot_ellipse(x, y, a, b, angle, color="-r", ax=None, **kwargs): + """ + This function plots an ellipse based on the given parameters. + + Parameters + ---------- + x : (float) The x-coordinate of the center of the ellipse. + y : (float) The y-coordinate of the center of the ellipse. + a : (float) The length of the semi-major axis of the ellipse. + b : (float) The length of the semi-minor axis of the ellipse. + angle : (float) The rotation angle of the ellipse, in radians. + color : (str, optional) The color and line style of the ellipse plot, following matplotlib conventions. Defaults to "-r" (a red solid line). + ax : (matplotlib.axes.Axes, optional) The Axes object to draw the ellipse on. If None (default), a new figure and axes are created. + **kwargs: Additional keyword arguments to pass to plt.plot or ax.plot. + + Returns + --------- + None. This function plots the ellipse based on the specified parameters. + """ + + t = np.arange(0, 2 * math.pi + 0.1, 0.1) + px = [a * math.cos(it) for it in t] + py = [b * math.sin(it) for it in t] + fx = rot_mat_2d(angle) @ (np.array([px, py])) + px = np.array(fx[0, :] + x).flatten() + py = np.array(fx[1, :] + y).flatten() + if ax is None: + plt.plot(px, py, color, **kwargs) + else: + ax.plot(px, py, color, **kwargs) + def plot_arrow(x, y, yaw, arrow_length=1.0, origin_point_plot_style="xr", @@ -132,7 +195,6 @@ def plot_3d_vector_arrow(ax, p1, p2): ) - def plot_triangle(p1, p2, p3, ax): ax.add_collection3d(art3d.Poly3DCollection([[p1, p2, p3]], color='b')) @@ -163,3 +225,10 @@ def set_equal_3d_axis(ax, x_lims, y_lims, z_lims): ax.set_xlim(mid_x - max_range, mid_x + max_range) ax.set_ylim(mid_y - max_range, mid_y + max_range) ax.set_zlim(mid_z - max_range, mid_z + max_range) + + +if __name__ == '__main__': + plot_ellipse(0, 0, 1, 2, np.deg2rad(15)) + plt.axis('equal') + plt.show() +