forked from Telos4/RoboRally
added option to compute angle for marker based grid
This commit is contained in:
parent
149e9b3536
commit
32892e5dcf
|
@ -161,8 +161,15 @@ class ArucoEstimator:
|
||||||
# checks if all corner markers have been detected at least once
|
# checks if all corner markers have been detected at least once
|
||||||
return not any([estimate[0] is None for estimate in self.corner_estimates.values()])
|
return not any([estimate[0] is None for estimate in self.corner_estimates.values()])
|
||||||
|
|
||||||
def get_pos_from_grid_point(self, x, y):
|
def get_pos_from_grid_point(self, x, y, orientation=None):
|
||||||
# returns the position for the given grid point based on the current corner estimates
|
"""
|
||||||
|
returns the position for the given grid point based on the current corner estimates
|
||||||
|
:param x: x position on the grid ( 0 &le x < number of grid columns)
|
||||||
|
:param y: y position on the grid ( 0 &le x < number of grid rows)
|
||||||
|
:param orientation: (optional) orientation in the given grid cell (one of ^, >, v, < )
|
||||||
|
:return: numpy array with corresponding real world x- and y-position
|
||||||
|
if orientation was specified the array also contains the matching angle for the orientation
|
||||||
|
"""
|
||||||
assert x >= 0 and x < self.grid_columns
|
assert x >= 0 and x < self.grid_columns
|
||||||
assert y >= 0 and y < self.grid_rows
|
assert y >= 0 and y < self.grid_rows
|
||||||
assert self.all_corners_detected()
|
assert self.all_corners_detected()
|
||||||
|
@ -172,15 +179,18 @@ class ArucoEstimator:
|
||||||
b = self.corner_estimates['b'][0]
|
b = self.corner_estimates['b'][0]
|
||||||
c = self.corner_estimates['c'][0]
|
c = self.corner_estimates['c'][0]
|
||||||
d = self.corner_estimates['d'][0]
|
d = self.corner_estimates['d'][0]
|
||||||
|
x_frac = (x + 0.5) / self.grid_columns
|
||||||
|
y_frac = (y + 0.5) / self.grid_rows
|
||||||
|
|
||||||
vab = b - a
|
vab = b - a
|
||||||
vdc = c - d
|
vdc = c - d
|
||||||
column_line_top = a + (x + 0.5)/self.grid_columns * vab
|
column_line_top = a + x_frac * vab
|
||||||
column_line_bottom = d + (x + 0.5) / self.grid_columns * vdc
|
column_line_bottom = d + x_frac * vdc
|
||||||
|
|
||||||
vad = d - a
|
vad = d - a
|
||||||
vbc = c - b
|
vbc = c - b
|
||||||
row_line_top = a + (y + 0.5)/self.grid_rows * vad
|
row_line_top = a + y_frac * vad
|
||||||
row_line_bottom = b + (y + 0.5) / self.grid_rows * vbc
|
row_line_bottom = b + y_frac * vbc
|
||||||
|
|
||||||
column_line = LineString([column_line_top, column_line_bottom])
|
column_line = LineString([column_line_top, column_line_bottom])
|
||||||
row_line = LineString([row_line_top, row_line_bottom])
|
row_line = LineString([row_line_top, row_line_bottom])
|
||||||
|
@ -188,7 +198,28 @@ class ArucoEstimator:
|
||||||
int_pt = column_line.intersection(row_line)
|
int_pt = column_line.intersection(row_line)
|
||||||
point_of_intersection = np.array([int_pt.x, int_pt.y])
|
point_of_intersection = np.array([int_pt.x, int_pt.y])
|
||||||
|
|
||||||
return point_of_intersection
|
if orientation is not None:
|
||||||
|
# compute angle corresponding to the orientation w.r.t. the grid
|
||||||
|
# TODO: test this code
|
||||||
|
angle_ab = np.arctan2(vab[1], vab[0])
|
||||||
|
angle_dc = np.arctan2(vdc[1], vdc[0])
|
||||||
|
|
||||||
|
angle_ad = np.arctan2(vad[1], vad[0])
|
||||||
|
angle_bc = np.arctan2(vbc[1], vbc[0])
|
||||||
|
|
||||||
|
angle = 0.0
|
||||||
|
if orientation == '>':
|
||||||
|
angle = y_frac * angle_ab + (1 - y_frac) * angle_dc
|
||||||
|
elif orientation == '<':
|
||||||
|
angle = - (y_frac * angle_ab + (1 - y_frac) * angle_dc)
|
||||||
|
elif orientation == 'v':
|
||||||
|
angle = x_frac * angle_ad + (1 - x_frac) * angle_bc
|
||||||
|
elif orientation == '^':
|
||||||
|
angle = - (x_frac * angle_ad + (1 - x_frac) * angle_bc)
|
||||||
|
|
||||||
|
return np.array((point_of_intersection[0], point_of_intersection[1], angle))
|
||||||
|
else:
|
||||||
|
return point_of_intersection
|
||||||
|
|
||||||
def get_grid_point_from_pos(self):
|
def get_grid_point_from_pos(self):
|
||||||
# return the nearest grid point for the given position estimate
|
# return the nearest grid point for the given position estimate
|
||||||
|
|
Loading…
Reference in New Issue
Block a user