|
12 | 12 | from avstack.geometry import GlobalOrigin3D, Polygon
|
13 | 13 | from avstack.modules import BaseModule
|
14 | 14 | from avstack.utils.decorators import apply_hooks
|
| 15 | +from collections import defaultdict |
| 16 | + |
15 | 17 |
|
16 | 18 |
|
17 | 19 | class _LidarFovEstimator(BaseModule):
|
@@ -97,6 +99,8 @@ def __call__(
|
97 | 99 | z_min=self.z_min,
|
98 | 100 | z_max=self.z_max,
|
99 | 101 | )
|
| 102 | + |
| 103 | + self._eliminate_isolated_pts(pc_bev, 10, 30) |
100 | 104 |
|
101 | 105 | # center the lidar data
|
102 | 106 | if centering:
|
@@ -152,6 +156,24 @@ def _estimate_fov_from_polar_lidar(
|
152 | 156 | ) -> "Polygon":
|
153 | 157 | """To be implemented in subclass"""
|
154 | 158 | raise NotImplementedError
|
| 159 | + |
| 160 | + def _eliminate_isolated_pts(self, pc_bev, m_away, num_pts): |
| 161 | + ptMap = defaultdict(int) |
| 162 | + usable_pts = [] |
| 163 | + for p1 in pc_bev.data.x: |
| 164 | + p1x, p1y = p1[0], p1[1] |
| 165 | + for p2 in pc_bev.data.x: |
| 166 | + p2x, p2y = p2[0], p2[1] |
| 167 | + if p1x == p2x and p1y == p2y: |
| 168 | + continue |
| 169 | + dis = np.linalg.norm([p1x - p2x, p1y - p2y]) |
| 170 | + if (dis < m_away): |
| 171 | + ptMap[(p1x, p1y)] += 1 |
| 172 | + if (ptMap[(p1x, p1y)] == num_pts): |
| 173 | + usable_pts.append([p1x, p1y]) |
| 174 | + break |
| 175 | + usable_pts = np.array(usable_pts) |
| 176 | + pc_bev.data.x = usable_pts |
155 | 177 |
|
156 | 178 |
|
157 | 179 | @MODELS.register_module()
|
|
0 commit comments