56 def __getCellIdx(self, v, v_min, cells):
58 if idx < 0
or idx >= cells:
76 if ix
is None or iy
is None or iz
is None:
81 def __getCellCenter(self, idx, v_min, cells):
82 if idx
is None or idx < 0
or idx >= cells:
100 samples_count = 2000000
102 result.__cell_size = 0.08
106 q_lim = [ [-2.96, 2.96],
107 [-2.09, -0.2, 0.2, 2.09],
109 [-2.095, -0.2, 0.2, 2.095],
111 [-2.09, -0.2, 0.2, 2.09],
121 for idx
in range(samples_count):
123 for q_idx
in range(7):
124 q.append( random.uniform(q_lim[q_idx][0]+lim_dist, q_lim[q_idx][-1]-lim_dist) )
125 T_AB_E = solv.calculateFk( q )
126 pt_list.append(T_AB_E.p)
127 x_min = min(x_min, T_AB_E.p.x())
128 x_max = max(x_max, T_AB_E.p.x())
129 y_min = min(y_min, T_AB_E.p.y())
130 y_max = max(y_max, T_AB_E.p.y())
131 z_min = min(z_min, T_AB_E.p.z())
132 z_max = max(z_max, T_AB_E.p.z())
134 print(
'generated samples: {} / {}'.format(idx, samples_count))
136 result.__x_min = x_min
137 result.__x_max = x_max
138 result.__y_min = y_min
139 result.__y_max = y_max
140 result.__z_min = z_min
141 result.__z_max = z_max
143 result.__x_cells = int(math.ceil((result.__x_max - result.__x_min) / result.__cell_size))
144 result.__y_cells = int(math.ceil((result.__y_max - result.__y_min) / result.__cell_size))
145 result.__z_cells = int(math.ceil((result.__z_max - result.__z_min) / result.__cell_size))
147 print(
'ranges: ({}, {}), ({}, {}), ({}, {})'.format(result.__x_min, result.__x_max,
148 result.__y_min, result.__y_max, result.__z_min, result.__z_max))
149 print(
'cells: {}, {}, {}, total: {}'.format(result.__x_cells, result.__y_cells,
150 result.__z_cells, result.__x_cells*result.__y_cells*result.__z_cells))
151 result.__ws_matrix = np.zeros( (result.__x_cells, result.__y_cells, result.__z_cells) )
154 x_idx = result.getCellIdxX(pt.x())
155 y_idx = result.getCellIdxY(pt.y())
156 z_idx = result.getCellIdxZ(pt.z())
157 if x_idx
is None or y_idx
is None or z_idx
is None:
158 print(
'could not calculate cell idx: {}'.format((x_idx, y_idx, z_idx)))
159 result.__ws_matrix[x_idx, y_idx, z_idx] += 1
161 max_hits = np.max(result.__ws_matrix)
162 print(
'max hits: {}'.format(max_hits))
163 result.__ws_matrix = result.__ws_matrix / max_hits
167 def save(self, parameters_filename, matrix_filename):
171 np.save(parameters_filename, ws_params)
174 def load(parameters_filename=None, matrix_filename=None):
175 if parameters_filename
is None or matrix_filename
is None:
176 rospack = rospkg.RosPack()
177 ws_data_path = rospack.get_path(
'velma_kinematics') +
'/data/workspace/' 178 parameters_filename = ws_data_path +
'lwr_ws_param.npy' 179 matrix_filename = ws_data_path +
'lwr_ws.npy' 182 ws_params = np.load(parameters_filename)
183 result.__ws_matrix = np.load(matrix_filename)
184 result.__x_min, result.__x_max, result.__y_min, result.__y_max,\
185 result.__z_min, result.__z_max, result.__cell_size = ws_params.tolist()
186 result.__x_cells = int(math.ceil((result.__x_max - result.__x_min) / result.__cell_size))
187 result.__y_cells = int(math.ceil((result.__y_max - result.__y_min) / result.__cell_size))
188 result.__z_cells = int(math.ceil((result.__z_max - result.__z_min) / result.__cell_size))
208 if ix
is None or ix < 0
or ix >= self.
__x_cells:
210 if iy
is None or iy < 0
or iy >= self.
__y_cells:
212 if iz
is None or iz < 0
or iz >= self.
__z_cells:
233 def __getCellIdx(self, v, v_min, cells):
235 if idx < 0
or idx >= cells:
253 if ix
is None or iy
is None or iz
is None:
258 def __getCellCenter(self, idx, v_min, cells):
259 if idx
is None or idx < 0
or idx >= cells:
277 samples_count = 20000000
279 result.__cell_size = 0.1
283 q_lim = [ [-2.96, 2.96],
284 [-2.09, -0.2, 0.2, 2.09],
286 [-2.095, -0.2, 0.2, 2.095],
288 [-2.09, -0.2, 0.2, 2.09],
298 for idx
in range(samples_count):
300 for q_idx
in range(7):
301 q.append( random.uniform(q_lim[q_idx][0]+lim_dist, q_lim[q_idx][-1]-lim_dist) )
302 torso_angle = random.uniform( -1.56, 1.56)
303 T_B_E = solv.getArmFk(
'right', torso_angle, q )
304 pt_list.append(T_B_E.p)
305 x_min = min(x_min, T_B_E.p.x())
306 x_max = max(x_max, T_B_E.p.x())
307 y_min = min(y_min, T_B_E.p.y())
308 y_max = max(y_max, T_B_E.p.y())
309 z_min = min(z_min, T_B_E.p.z())
310 z_max = max(z_max, T_B_E.p.z())
312 print(
'generated samples: {} / {}'.format(idx, samples_count))
314 result.__x_min = x_min
315 result.__x_max = x_max
316 result.__y_min = y_min
317 result.__y_max = y_max
318 result.__z_min = z_min
319 result.__z_max = z_max
321 result.__x_cells = int(math.ceil((result.__x_max - result.__x_min) / result.__cell_size))
322 result.__y_cells = int(math.ceil((result.__y_max - result.__y_min) / result.__cell_size))
323 result.__z_cells = int(math.ceil((result.__z_max - result.__z_min) / result.__cell_size))
325 print(
'ranges: ({}, {}), ({}, {}), ({}, {})'.format(result.__x_min, result.__x_max,
326 result.__y_min, result.__y_max, result.__z_min, result.__z_max))
327 print(
'cells: {}, {}, {}, total: {}'.format(result.__x_cells, result.__y_cells,
328 result.__z_cells, result.__x_cells*result.__y_cells*result.__z_cells))
329 result.__ws_matrix = np.zeros( (result.__x_cells, result.__y_cells, result.__z_cells) )
332 x_idx = result.getCellIdxX(pt.x())
333 y_idx = result.getCellIdxY(pt.y())
334 z_idx = result.getCellIdxZ(pt.z())
335 if x_idx
is None or y_idx
is None or z_idx
is None:
336 print(
'could not calculate cell idx: {}'.format((x_idx, y_idx, z_idx)))
337 result.__ws_matrix[x_idx, y_idx, z_idx] += 1
339 max_hits = np.max(result.__ws_matrix)
340 print(
'max hits: {}'.format(max_hits))
341 result.__ws_matrix = result.__ws_matrix / max_hits
345 def save(self, parameters_filename, matrix_filename):
349 np.save(parameters_filename, ws_params)
352 def load(parameters_filename=None, matrix_filename=None):
353 if parameters_filename
is None or matrix_filename
is None:
354 rospack = rospkg.RosPack()
355 ws_data_path = rospack.get_path(
'velma_kinematics') +
'/data/workspace/' 356 parameters_filename = ws_data_path +
'velma_ws_param.npy' 357 matrix_filename = ws_data_path +
'velma_ws.npy' 360 ws_params = np.load(parameters_filename)
361 result.__ws_matrix = np.load(matrix_filename)
362 result.__x_min, result.__x_max, result.__y_min, result.__y_max,\
363 result.__z_min, result.__z_max, result.__cell_size = ws_params.tolist()
364 result.__x_cells = int(math.ceil((result.__x_max - result.__x_min) / result.__cell_size))
365 result.__y_cells = int(math.ceil((result.__y_max - result.__y_min) / result.__cell_size))
366 result.__z_cells = int(math.ceil((result.__z_max - result.__z_min) / result.__cell_size))
379 def __interpretCellIdx(self, ix, iy, iz):
386 if ix
is None or ix < 0
or ix >= self.
__x_cells:
387 return None,
None,
None 388 if iy
is None or iy < 0
or iy >= self.
__y_cells:
389 return None,
None,
None 390 if iz
is None or iz < 0
or iz >= self.
__z_cells:
391 return None,
None,
None 416 if side_str ==
'left':
418 elif side_str ==
'right':
420 elif side_str ==
'any' or side_str ==
'both':
423 raise Exception(
'Wrong value for "side": "{}"'.format(side_str))
def __getCellCenter(self, idx, v_min, cells)
def getCellValue(self, ix, iy=None, iz=None)
def save(self, parameters_filename, matrix_filename)
def getCellValue(self, ix, iy=None, iz=None)
def getCellCenterX(self, idx)
def getCellCenterY(self, idx)
def load(parameters_filename=None, matrix_filename=None)
def getCellValueRight(self, ix, iy=None, iz=None)
Kinematics solver (FK, IK) for WUT Velma robot.
Kinematics solver (FK, IK) for Kuka LWR 4+.
def getCellCenterY(self, idx)
def load(parameters_filename=None, matrix_filename=None)
def __getCellIdx(self, v, v_min, cells)
def save(self, parameters_filename, matrix_filename)
def __interpretCellIdx(self, ix, iy, iz)
def getCellCenterZ(self, idx)
def __getCellIdx(self, v, v_min, cells)
def getCellValueLeft(self, ix, iy=None, iz=None)
def getCellValueSide(self, side_str, ix, iy=None, iz=None)
def getCellCenterZ(self, idx)
def getCellCenterX(self, idx)
def __getCellCenter(self, idx, v_min, cells)