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
65 UNICYCLE_MPRIM_16DEGS = 1.0
66 if UNICYCLE_MPRIM_16DEGS == 1.0:
70 numberofprimsperangle = 7
73 backwardcostmult = 40.0
74 forwardandturncostmult = 2.0
75 sidestepcostmult = 10.0
76 turninplacecostmult = 20.0
79 basemprimendpts0_c = np.zeros((numberofprimsperangle, 4))
84 basemprimendpts0_c[0, :] = np.array(np.hstack((1.0, 0.0, 0.0, forwardcostmult)))
85 basemprimendpts0_c[1, :] = np.array(np.hstack((8.0, 0.0, 0.0, forwardcostmult)))
86 basemprimendpts0_c[2, :] = np.array(np.hstack((-1.0, 0.0, 0.0, backwardcostmult)))
88 basemprimendpts0_c[3, :] = np.array(np.hstack((8.0, 1.0, 1.0, forwardandturncostmult)))
89 basemprimendpts0_c[4, :] = np.array(np.hstack((8.0, -1.0, -1.0, forwardandturncostmult)))
91 basemprimendpts0_c[5, :] = np.array(np.hstack((0.0, 0.0, 1.0, turninplacecostmult)))
92 basemprimendpts0_c[6, :] = np.array(np.hstack((0.0, 0.0, -1.0, turninplacecostmult)))
94 basemprimendpts45_c = np.zeros((numberofprimsperangle, 4))
99 basemprimendpts45_c[0, :] = np.array(np.hstack((1.0, 1.0, 0.0, forwardcostmult)))
100 basemprimendpts45_c[1, :] = np.array(np.hstack((6.0, 6.0, 0.0, forwardcostmult)))
101 basemprimendpts45_c[2, :] = np.array(np.hstack((-1.0, -1.0, 0.0, backwardcostmult)))
103 basemprimendpts45_c[3, :] = np.array(np.hstack((5.0, 7.0, 1.0, forwardandturncostmult)))
104 basemprimendpts45_c[4, :] = np.array(np.hstack((7.0, 5.0, -1.0, forwardandturncostmult)))
106 basemprimendpts45_c[5, :] = np.array(np.hstack((0.0, 0.0, 1.0, turninplacecostmult)))
107 basemprimendpts45_c[6, :] = np.array(np.hstack((0.0, 0.0, -1.0, turninplacecostmult)))
109 basemprimendpts22p5_c = np.zeros((numberofprimsperangle, 4))
114 basemprimendpts22p5_c[0, :] = np.array(np.hstack((2.0, 1.0, 0.0, forwardcostmult)))
115 basemprimendpts22p5_c[1, :] = np.array(np.hstack((6.0, 3.0, 0.0, forwardcostmult)))
116 basemprimendpts22p5_c[2, :] = np.array(np.hstack((-2.0, -1.0, 0.0, backwardcostmult)))
118 basemprimendpts22p5_c[3, :] = np.array(np.hstack((5.0, 4.0, 1.0, forwardandturncostmult)))
119 basemprimendpts22p5_c[4, :] = np.array(np.hstack((7.0, 2.0, -1.0, forwardandturncostmult)))
121 basemprimendpts22p5_c[5, :] = np.array(np.hstack((0.0, 0.0, 1.0, turninplacecostmult)))
122 basemprimendpts22p5_c[6, :] = np.array(np.hstack((0.0, 0.0, -1.0, turninplacecostmult)))
124 print (
'ERROR: undefined mprims type\n')
127 fout = open(outfilename,
'w')
129 fout.write(
'resolution_m: %f\n' % (resolution))
130 fout.write(
'numberofangles: %d\n' % (numberofangles))
131 fout.write(
'totalnumberofprimitives: %d\n' % (numberofprimsperangle * numberofangles))
133 for angleind
in np.arange(1.0, (numberofangles) + 1):
134 currentangle = ((angleind - 1) * 2.0 * np.pi) / numberofangles
135 currentangle_36000int = np.round((angleind - 1) * 36000.0 / numberofangles)
138 fig = plt.figure(angleind)
139 plt.title(
'angle {:2.0f} (= {:3.1f} degrees)'.format(angleind - 1, currentangle_36000int / 100.0))
144 plt.axis([-10 * resolution, 10 * resolution, -10 * resolution, 10 * resolution])
145 ax = fig.add_subplot(1, 1, 1)
146 major_ticks = np.arange(-8 * resolution, 9 * resolution, 4 * resolution)
147 minor_ticks = np.arange(-8 * resolution, 9 * resolution, resolution)
148 ax.set_xticks(major_ticks)
149 ax.set_xticks(minor_ticks, minor=
True)
150 ax.set_yticks(major_ticks)
151 ax.set_yticks(minor_ticks, minor=
True)
152 ax.grid(which=
'minor', alpha=0.5)
153 ax.grid(which=
'major', alpha=0.9)
156 for primind
in np.arange(1.0, (numberofprimsperangle) + 1):
157 fout.write(
'primID: %d\n' % (primind - 1))
158 fout.write(
'startangle_c: %d\n' % (angleind - 1))
161 if (currentangle_36000int % 9000) == 0:
162 basemprimendpts_c = basemprimendpts0_c[int(primind) - 1, :]
164 elif (currentangle_36000int % 4500) == 0:
165 basemprimendpts_c = basemprimendpts45_c[int(primind) - 1, :]
166 angle = currentangle - 45.0 * np.pi / 180.0
168 elif ((currentangle_36000int - 7875) % 9000) == 0:
169 basemprimendpts_c = (
170 1 * basemprimendpts33p75_c[primind, :]
172 basemprimendpts_c[0] = basemprimendpts33p75_c[primind, 1]
174 basemprimendpts_c[1] = basemprimendpts33p75_c[primind, 0]
175 basemprimendpts_c[2] = -basemprimendpts33p75_c[primind, 2]
177 angle = currentangle - (78.75 * np.pi) / 180.0
180 elif ((currentangle_36000int - 6750) % 9000) == 0:
181 basemprimendpts_c = (
182 1 * basemprimendpts22p5_c[int(primind) - 1, :]
184 basemprimendpts_c[0] = basemprimendpts22p5_c[int(primind) - 1, 1]
186 basemprimendpts_c[1] = basemprimendpts22p5_c[int(primind) - 1, 0]
187 basemprimendpts_c[2] = -basemprimendpts22p5_c[int(primind) - 1, 2]
190 angle = currentangle - (67.5 * np.pi) / 180.0
193 elif ((currentangle_36000int - 5625) % 9000) == 0:
194 basemprimendpts_c = (
195 1 * basemprimendpts11p25_c[primind, :]
197 basemprimendpts_c[0] = basemprimendpts11p25_c[primind, 1]
199 basemprimendpts_c[1] = basemprimendpts11p25_c[primind, 0]
200 basemprimendpts_c[2] = -basemprimendpts11p25_c[primind, 2]
202 angle = currentangle - (56.25 * np.pi) / 180.0
205 elif ((currentangle_36000int - 3375) % 9000) == 0:
206 basemprimendpts_c = basemprimendpts33p75_c[int(primind), :]
207 angle = currentangle - (33.75 * np.pi) / 180.0
210 elif ((currentangle_36000int - 2250) % 9000) == 0:
211 basemprimendpts_c = basemprimendpts22p5_c[int(primind) - 1, :]
212 angle = currentangle - (22.5 * np.pi) / 180.0
215 elif ((currentangle_36000int - 1125) % 9000) == 0:
216 basemprimendpts_c = basemprimendpts11p25_c[int(primind), :]
217 angle = currentangle - (11.25 * np.pi) / 180.0
221 print (
'ERROR: invalid angular resolution. angle = %d\n', currentangle_36000int)
225 baseendpose_c = basemprimendpts_c[0:3]
226 additionalactioncostmult = basemprimendpts_c[3]
227 endx_c = np.round((baseendpose_c[0] * np.cos(angle)) - (baseendpose_c[1] * np.sin(angle)))
228 endy_c = np.round((baseendpose_c[0] * np.sin(angle)) + (baseendpose_c[1] * np.cos(angle)))
229 endtheta_c = np.fmod(angleind - 1 + baseendpose_c[2], numberofangles)
230 endpose_c = np.array(np.hstack((endx_c, endy_c, endtheta_c)))
231 print "endpose_c=", endpose_c
232 print (
'rotation angle=%f\n' % (angle * 180.0 / np.pi))
239 intermcells_m = np.zeros((numofsamples, 3))
240 if UNICYCLE_MPRIM_16DEGS == 1.0:
241 startpt = np.array(np.hstack((0.0, 0.0, currentangle)))
245 (endpose_c[0] * resolution),
246 (endpose_c[1] * resolution),
248 ((np.fmod(angleind - 1 + baseendpose_c[2], numberofangles)) * 2.0 * np.pi)
255 print "startpt =", startpt
256 print "endpt =", endpt
257 intermcells_m = np.zeros((numofsamples, 3))
258 if np.logical_or(np.logical_and(endx_c == 0.0, endy_c == 0.0), baseendpose_c[2] == 0.0):
260 for iind
in np.arange(1.0, (numofsamples) + 1):
261 fraction = float(iind - 1) / (numofsamples - 1)
262 intermcells_m[int(iind) - 1, :] = np.array(
264 startpt[0] + (endpt[0] - startpt[0]) * fraction,
265 startpt[1] + (endpt[1] - startpt[1]) * fraction,
269 rotation_angle = baseendpose_c[2] * (2.0 * np.pi / numberofangles)
270 intermcells_m[int(iind) - 1, 2] = np.fmod(startpt[2] + rotation_angle * fraction, (2.0 * np.pi))
278 np.hstack((np.cos(startpt[2]), np.sin(endpt[2]) - np.sin(startpt[2]))),
279 np.hstack((np.sin(startpt[2]), -np.cos(endpt[2]) + np.cos(startpt[2]))),
284 S = np.dot(np.linalg.pinv(R), np.array(np.vstack((endpt[0] - startpt[0], endpt[1] - startpt[1]))))
287 rv = (baseendpose_c[2] * 2.0 * np.pi / numberofangles) + l / tvoverrv
299 print (
'WARNING: l = %f < 0 -> bad action start/end points\n' % (l))
309 for iind
in np.arange(1, numofsamples + 1):
310 dt = (iind - 1) / (numofsamples - 1)
316 intermcells_m[int(iind) - 1, :] = np.array(
319 startpt[0] + dt * tv * np.cos(startpt[2]),
320 startpt[1] + dt * tv * np.sin(startpt[2]),
326 dtheta = rv * (dt - l / tv) + startpt[2]
327 intermcells_m[int(iind) - 1, :] = np.array(
331 + l * np.cos(startpt[2])
332 + tvoverrv * (np.sin(dtheta) - np.sin(startpt[2])),
334 + l * np.sin(startpt[2])
335 - tvoverrv * (np.cos(dtheta) - np.cos(startpt[2])),
345 endpt[0] - intermcells_m[int(numofsamples) - 1, 0],
346 endpt[1] - intermcells_m[int(numofsamples) - 1, 1],
351 interpfactor = np.array(
352 np.hstack((np.arange(0.0, 1.0 + (1.0 / (numofsamples)), 1.0 / (numofsamples - 1))))
358 intermcells_m[:, 0] = intermcells_m[:, 0] + errorxy[0] * interpfactor.conj().T
359 intermcells_m[:, 1] = intermcells_m[:, 1] + errorxy[1] * interpfactor.conj().T
362 fout.write(
'endpose_c: %d %d %d\n' % (endpose_c[0], endpose_c[1], endpose_c[2]))
363 fout.write(
'additionalactioncostmult: %d\n' % (additionalactioncostmult))
364 fout.write(
'intermediateposes: %d\n' % (
matrix_size(intermcells_m, 1.0)))
365 for interind
in np.arange(1.0, (
matrix_size(intermcells_m, 1.0)) + 1):
369 intermcells_m[int(interind) - 1, 0],
370 intermcells_m[int(interind) - 1, 1],
371 intermcells_m[int(interind) - 1, 2],
376 plt.plot(intermcells_m[:, 0], intermcells_m[:, 1], linestyle=
"-", marker=
"o")
377 plt.text(endpt[0], endpt[1],
'{:2.0f}'.format(endpose_c[2]))
389 if __name__ ==
"__main__":
390 rospack = rospkg.RosPack()
391 outfilename = rospack.get_path(
'mir_navigation') +
'/mprim/unicycle_highcost_5cm.mprim' def matrix_size(mat, elem=None)
def genmprim_unicycle(outfilename, visualize=False, separate_plots=False)