37 matplotlib_found =
False
39 import matplotlib.pylab
as plt
41 matplotlib_found =
True
50 return mat.shape[int(elem) - 1]
54 visualize = matplotlib_found
and visualize
75 UNICYCLE_MPRIM_16DEGS = 1.0
76 if UNICYCLE_MPRIM_16DEGS == 1.0:
80 numberofprimsperangle = 7
83 backwardcostmult = 40.0
84 forwardandturncostmult = 2.0
86 turninplacecostmult = 20.0
89 basemprimendpts0_c = np.zeros((numberofprimsperangle, 4))
94 basemprimendpts0_c[0, :] = np.array(np.hstack((1.0, 0.0, 0.0, forwardcostmult)))
95 basemprimendpts0_c[1, :] = np.array(np.hstack((8.0, 0.0, 0.0, forwardcostmult)))
96 basemprimendpts0_c[2, :] = np.array(np.hstack((-1.0, 0.0, 0.0, backwardcostmult)))
98 basemprimendpts0_c[3, :] = np.array(np.hstack((8.0, 1.0, 1.0, forwardandturncostmult)))
99 basemprimendpts0_c[4, :] = np.array(np.hstack((8.0, -1.0, -1.0, forwardandturncostmult)))
101 basemprimendpts0_c[5, :] = np.array(np.hstack((0.0, 0.0, 1.0, turninplacecostmult)))
102 basemprimendpts0_c[6, :] = np.array(np.hstack((0.0, 0.0, -1.0, turninplacecostmult)))
104 basemprimendpts45_c = np.zeros((numberofprimsperangle, 4))
109 basemprimendpts45_c[0, :] = np.array(np.hstack((1.0, 1.0, 0.0, forwardcostmult)))
110 basemprimendpts45_c[1, :] = np.array(np.hstack((6.0, 6.0, 0.0, forwardcostmult)))
111 basemprimendpts45_c[2, :] = np.array(np.hstack((-1.0, -1.0, 0.0, backwardcostmult)))
113 basemprimendpts45_c[3, :] = np.array(np.hstack((5.0, 7.0, 1.0, forwardandturncostmult)))
114 basemprimendpts45_c[4, :] = np.array(np.hstack((7.0, 5.0, -1.0, forwardandturncostmult)))
116 basemprimendpts45_c[5, :] = np.array(np.hstack((0.0, 0.0, 1.0, turninplacecostmult)))
117 basemprimendpts45_c[6, :] = np.array(np.hstack((0.0, 0.0, -1.0, turninplacecostmult)))
119 basemprimendpts22p5_c = np.zeros((numberofprimsperangle, 4))
124 basemprimendpts22p5_c[0, :] = np.array(np.hstack((2.0, 1.0, 0.0, forwardcostmult)))
125 basemprimendpts22p5_c[1, :] = np.array(np.hstack((6.0, 3.0, 0.0, forwardcostmult)))
126 basemprimendpts22p5_c[2, :] = np.array(np.hstack((-2.0, -1.0, 0.0, backwardcostmult)))
128 basemprimendpts22p5_c[3, :] = np.array(np.hstack((5.0, 4.0, 1.0, forwardandturncostmult)))
129 basemprimendpts22p5_c[4, :] = np.array(np.hstack((7.0, 2.0, -1.0, forwardandturncostmult)))
131 basemprimendpts22p5_c[5, :] = np.array(np.hstack((0.0, 0.0, 1.0, turninplacecostmult)))
132 basemprimendpts22p5_c[6, :] = np.array(np.hstack((0.0, 0.0, -1.0, turninplacecostmult)))
134 print(
'ERROR: undefined mprims type\n')
137 fout = open(outfilename,
'w')
139 fout.write(
'resolution_m: %f\n' % (resolution))
140 fout.write(
'numberofangles: %d\n' % (numberofangles))
141 fout.write(
'totalnumberofprimitives: %d\n' % (numberofprimsperangle * numberofangles))
143 for angleind
in np.arange(1.0, (numberofangles) + 1):
144 currentangle = ((angleind - 1) * 2.0 * np.pi) / numberofangles
145 currentangle_36000int = np.round((angleind - 1) * 36000.0 / numberofangles)
148 fig = plt.figure(angleind)
149 plt.title(
'angle {:2.0f} (= {:3.1f} degrees)'.format(angleind - 1, currentangle_36000int / 100.0))
154 plt.axis([-10 * resolution, 10 * resolution, -10 * resolution, 10 * resolution])
155 ax = fig.add_subplot(1, 1, 1)
156 major_ticks = np.arange(-8 * resolution, 9 * resolution, 4 * resolution)
157 minor_ticks = np.arange(-8 * resolution, 9 * resolution, resolution)
158 ax.set_xticks(major_ticks)
159 ax.set_xticks(minor_ticks, minor=
True)
160 ax.set_yticks(major_ticks)
161 ax.set_yticks(minor_ticks, minor=
True)
162 ax.grid(which=
'minor', alpha=0.5)
163 ax.grid(which=
'major', alpha=0.9)
166 for primind
in np.arange(1.0, (numberofprimsperangle) + 1):
167 fout.write(
'primID: %d\n' % (primind - 1))
168 fout.write(
'startangle_c: %d\n' % (angleind - 1))
171 if (currentangle_36000int % 9000) == 0:
172 basemprimendpts_c = basemprimendpts0_c[int(primind) - 1, :]
174 elif (currentangle_36000int % 4500) == 0:
175 basemprimendpts_c = basemprimendpts45_c[int(primind) - 1, :]
176 angle = currentangle - 45.0 * np.pi / 180.0
191 elif ((currentangle_36000int - 6750) % 9000) == 0:
192 basemprimendpts_c = (
193 1 * basemprimendpts22p5_c[int(primind) - 1, :]
195 basemprimendpts_c[0] = basemprimendpts22p5_c[int(primind) - 1, 1]
197 basemprimendpts_c[1] = basemprimendpts22p5_c[int(primind) - 1, 0]
198 basemprimendpts_c[2] = -basemprimendpts22p5_c[int(primind) - 1, 2]
212 angle = currentangle - (67.5 * np.pi) / 180.0
234 elif ((currentangle_36000int - 2250) % 9000) == 0:
235 basemprimendpts_c = basemprimendpts22p5_c[int(primind) - 1, :]
236 angle = currentangle - (22.5 * np.pi) / 180.0
246 print(
'ERROR: invalid angular resolution. angle = %d\n' % currentangle_36000int)
250 baseendpose_c = basemprimendpts_c[0:3]
251 additionalactioncostmult = basemprimendpts_c[3]
252 endx_c = np.round((baseendpose_c[0] * np.cos(angle)) - (baseendpose_c[1] * np.sin(angle)))
253 endy_c = np.round((baseendpose_c[0] * np.sin(angle)) + (baseendpose_c[1] * np.cos(angle)))
254 endtheta_c = np.fmod(angleind - 1 + baseendpose_c[2], numberofangles)
255 endpose_c = np.array(np.hstack((endx_c, endy_c, endtheta_c)))
256 print(
"endpose_c=", endpose_c)
257 print((
'rotation angle=%f\n' % (angle * 180.0 / np.pi)))
264 intermcells_m = np.zeros((numofsamples, 3))
265 if UNICYCLE_MPRIM_16DEGS == 1.0:
266 startpt = np.array(np.hstack((0.0, 0.0, currentangle)))
270 (endpose_c[0] * resolution),
271 (endpose_c[1] * resolution),
273 ((np.fmod(angleind - 1 + baseendpose_c[2], numberofangles)) * 2.0 * np.pi)
280 print(
"startpt =", startpt)
281 print(
"endpt =", endpt)
282 intermcells_m = np.zeros((numofsamples, 3))
283 if np.logical_or(np.logical_and(endx_c == 0.0, endy_c == 0.0), baseendpose_c[2] == 0.0):
285 for iind
in np.arange(1.0, (numofsamples) + 1):
286 fraction = float(iind - 1) / (numofsamples - 1)
287 intermcells_m[int(iind) - 1, :] = np.array(
289 startpt[0] + (endpt[0] - startpt[0]) * fraction,
290 startpt[1] + (endpt[1] - startpt[1]) * fraction,
294 rotation_angle = baseendpose_c[2] * (2.0 * np.pi / numberofangles)
295 intermcells_m[int(iind) - 1, 2] = np.fmod(startpt[2] + rotation_angle * fraction, (2.0 * np.pi))
303 np.hstack((np.cos(startpt[2]), np.sin(endpt[2]) - np.sin(startpt[2]))),
304 np.hstack((np.sin(startpt[2]), -np.cos(endpt[2]) + np.cos(startpt[2]))),
309 S = np.dot(np.linalg.pinv(R), np.array(np.vstack((endpt[0] - startpt[0], endpt[1] - startpt[1]))))
312 rv = (baseendpose_c[2] * 2.0 * np.pi / numberofangles) + l / tvoverrv
324 print((
'WARNING: l = %f < 0 -> bad action start/end points\n' % (l)))
334 for iind
in np.arange(1, numofsamples + 1):
335 dt = (iind - 1) / (numofsamples - 1)
341 intermcells_m[int(iind) - 1, :] = np.array(
344 startpt[0] + dt * tv * np.cos(startpt[2]),
345 startpt[1] + dt * tv * np.sin(startpt[2]),
351 dtheta = rv * (dt - l / tv) + startpt[2]
352 intermcells_m[int(iind) - 1, :] = np.array(
356 + l * np.cos(startpt[2])
357 + tvoverrv * (np.sin(dtheta) - np.sin(startpt[2])),
359 + l * np.sin(startpt[2])
360 - tvoverrv * (np.cos(dtheta) - np.cos(startpt[2])),
370 endpt[0] - intermcells_m[int(numofsamples) - 1, 0],
371 endpt[1] - intermcells_m[int(numofsamples) - 1, 1],
376 interpfactor = np.array(
377 np.hstack((np.arange(0.0, 1.0 + (1.0 / (numofsamples)), 1.0 / (numofsamples - 1))))
383 intermcells_m[:, 0] = intermcells_m[:, 0] + errorxy[0] * interpfactor.conj().T
384 intermcells_m[:, 1] = intermcells_m[:, 1] + errorxy[1] * interpfactor.conj().T
387 fout.write(
'endpose_c: %d %d %d\n' % (endpose_c[0], endpose_c[1], endpose_c[2]))
388 fout.write(
'additionalactioncostmult: %d\n' % (additionalactioncostmult))
389 fout.write(
'intermediateposes: %d\n' % (
matrix_size(intermcells_m, 1.0)))
390 for interind
in np.arange(1.0, (
matrix_size(intermcells_m, 1.0)) + 1):
394 intermcells_m[int(interind) - 1, 0],
395 intermcells_m[int(interind) - 1, 1],
396 intermcells_m[int(interind) - 1, 2],
401 plt.plot(intermcells_m[:, 0], intermcells_m[:, 1], linestyle=
"-", marker=
"o")
402 plt.text(endpt[0], endpt[1],
'{:2.0f}'.format(endpose_c[2]))
413 if __name__ ==
"__main__":
414 rospack = rospkg.RosPack()
415 outfilename = rospack.get_path(
'mir_navigation') +
'/mprim/unicycle_highcost_5cm.mprim'