37 matplotlib_found =
False 39 import matplotlib.pylab
as plt
40 matplotlib_found =
True 49 return mat.shape[int(elem)-1]
53 visualize = matplotlib_found
and visualize
64 UNICYCLE_MPRIM_16DEGS = 1.
65 if UNICYCLE_MPRIM_16DEGS == 1.:
69 numberofprimsperangle = 7
72 backwardcostmult = 40.
73 forwardandturncostmult = 2.
74 sidestepcostmult = 10.
75 turninplacecostmult = 20.
78 basemprimendpts0_c = np.zeros((numberofprimsperangle, 4))
83 basemprimendpts0_c[0,:] = np.array(np.hstack(( 1., 0., 0., forwardcostmult)))
84 basemprimendpts0_c[1,:] = np.array(np.hstack(( 8., 0., 0., forwardcostmult)))
85 basemprimendpts0_c[2,:] = np.array(np.hstack((-1., 0., 0., backwardcostmult)))
87 basemprimendpts0_c[3,:] = np.array(np.hstack(( 8., 1., 1., forwardandturncostmult)))
88 basemprimendpts0_c[4,:] = np.array(np.hstack(( 8., -1., -1., forwardandturncostmult)))
90 basemprimendpts0_c[5,:] = np.array(np.hstack(( 0., 0., 1., turninplacecostmult)))
91 basemprimendpts0_c[6,:] = np.array(np.hstack(( 0., 0., -1., turninplacecostmult)))
93 basemprimendpts45_c = np.zeros((numberofprimsperangle, 4))
98 basemprimendpts45_c[0,:] = np.array(np.hstack(( 1., 1., 0., forwardcostmult)))
99 basemprimendpts45_c[1,:] = np.array(np.hstack(( 6., 6., 0., forwardcostmult)))
100 basemprimendpts45_c[2,:] = np.array(np.hstack((-1., -1., 0., backwardcostmult)))
102 basemprimendpts45_c[3,:] = np.array(np.hstack(( 5., 7., 1., forwardandturncostmult)))
103 basemprimendpts45_c[4,:] = np.array(np.hstack(( 7., 5., -1., forwardandturncostmult)))
105 basemprimendpts45_c[5,:] = np.array(np.hstack(( 0., 0., 1., turninplacecostmult)))
106 basemprimendpts45_c[6,:] = np.array(np.hstack(( 0., 0., -1., turninplacecostmult)))
108 basemprimendpts22p5_c = np.zeros((numberofprimsperangle, 4))
113 basemprimendpts22p5_c[0,:] = np.array(np.hstack(( 2., 1., 0., forwardcostmult)))
114 basemprimendpts22p5_c[1,:] = np.array(np.hstack(( 6., 3., 0., forwardcostmult)))
115 basemprimendpts22p5_c[2,:] = np.array(np.hstack((-2., -1., 0., backwardcostmult)))
117 basemprimendpts22p5_c[3,:] = np.array(np.hstack(( 5., 4., 1., forwardandturncostmult)))
118 basemprimendpts22p5_c[4,:] = np.array(np.hstack(( 7., 2., -1., forwardandturncostmult)))
120 basemprimendpts22p5_c[5,:] = np.array(np.hstack(( 0., 0., 1., turninplacecostmult)))
121 basemprimendpts22p5_c[6,:] = np.array(np.hstack(( 0., 0., -1., turninplacecostmult)))
123 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., (numberofangles)+1):
134 currentangle = ((angleind-1)*2.*np.pi)/numberofangles
135 currentangle_36000int = np.round((angleind-1)*36000./numberofangles)
138 fig = plt.figure(angleind)
139 plt.title(
'angle {:2.0f} (= {:3.1f} degrees)'.format(angleind - 1, currentangle_36000int/100.))
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., (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.*np.pi/180.
168 elif ((currentangle_36000int-7875)%9000) == 0:
169 basemprimendpts_c = 1*basemprimendpts33p75_c[primind, :]
170 basemprimendpts_c[0] = basemprimendpts33p75_c[primind, 1]
172 basemprimendpts_c[1] = basemprimendpts33p75_c[primind, 0]
173 basemprimendpts_c[2] = -basemprimendpts33p75_c[primind, 2]
175 angle = currentangle-(78.75*np.pi)/180.
178 elif ((currentangle_36000int-6750)%9000) == 0:
179 basemprimendpts_c = 1*basemprimendpts22p5_c[int(primind)-1,:]
180 basemprimendpts_c[0] = basemprimendpts22p5_c[int(primind)-1, 1]
182 basemprimendpts_c[1] = basemprimendpts22p5_c[int(primind)-1, 0]
183 basemprimendpts_c[2] = -basemprimendpts22p5_c[int(primind)-1, 2]
186 angle = currentangle-(67.5*np.pi)/180.
189 elif ((currentangle_36000int-5625)%9000) == 0:
190 basemprimendpts_c = 1*basemprimendpts11p25_c[primind, :]
191 basemprimendpts_c[0] = basemprimendpts11p25_c[primind, 1]
193 basemprimendpts_c[1] = basemprimendpts11p25_c[primind, 0]
194 basemprimendpts_c[2] = -basemprimendpts11p25_c[primind, 2]
196 angle = currentangle-(56.25*np.pi)/180.
199 elif ((currentangle_36000int-3375)%9000) == 0:
200 basemprimendpts_c = basemprimendpts33p75_c[int(primind), :]
201 angle = currentangle-(33.75*np.pi)/180.
204 elif ((currentangle_36000int-2250)%9000) == 0:
205 basemprimendpts_c = basemprimendpts22p5_c[int(primind)-1,:]
206 angle = currentangle-(22.5*np.pi)/180.
209 elif ((currentangle_36000int-1125)%9000) == 0:
210 basemprimendpts_c = basemprimendpts11p25_c[int(primind), :]
211 angle = currentangle-(11.25*np.pi)/180.
215 print(
'ERROR: invalid angular resolution. angle = %d\n', currentangle_36000int)
220 baseendpose_c = basemprimendpts_c[0:3]
221 additionalactioncostmult = basemprimendpts_c[3]
222 endx_c = np.round((baseendpose_c[0]*np.cos(angle))-(baseendpose_c[1]*np.sin(angle)))
223 endy_c = np.round((baseendpose_c[0]*np.sin(angle))+(baseendpose_c[1]*np.cos(angle)))
224 endtheta_c = np.fmod(angleind-1+baseendpose_c[2], numberofangles)
225 endpose_c = np.array(np.hstack((endx_c, endy_c, endtheta_c)))
226 print "endpose_c=",endpose_c
227 print(
'rotation angle=%f\n'% (angle*180./np.pi))
235 intermcells_m = np.zeros((numofsamples, 3))
236 if UNICYCLE_MPRIM_16DEGS == 1.:
237 startpt = np.array(np.hstack((0., 0., currentangle)))
238 endpt = np.array(np.hstack(((endpose_c[0]*resolution),
239 (endpose_c[1]*resolution),
240 (( (np.fmod(angleind-1+baseendpose_c[2], numberofangles))*2.*np.pi)/numberofangles))))
242 print "startpt =",startpt
243 print "endpt =",endpt
244 intermcells_m = np.zeros((numofsamples, 3))
245 if np.logical_or(np.logical_and(endx_c == 0., endy_c == 0.), baseendpose_c[2] == 0.):
247 for iind
in np.arange(1., (numofsamples)+1):
248 fraction = float(iind-1)/(numofsamples - 1)
249 intermcells_m[int(iind)-1,:] = np.array((startpt[0]+(endpt[0]-startpt[0])*fraction, startpt[1]+(endpt[1]-startpt[1])*fraction, 0))
250 rotation_angle = baseendpose_c[2]*(2.*np.pi/numberofangles)
251 intermcells_m[int(iind)-1,2] = np.fmod(startpt[2]+rotation_angle*fraction, (2.*np.pi))
256 R = np.array(np.vstack((np.hstack((np.cos(startpt[2]), np.sin(endpt[2])-np.sin(startpt[2]))),
257 np.hstack((np.sin(startpt[2]), -np.cos(endpt[2])+np.cos(startpt[2]))) )))
259 S = np.dot(np.linalg.pinv(R), np.array(np.vstack((endpt[0]-startpt[0], endpt[1]-startpt[1])) ))
262 rv = (baseendpose_c[2]*2.*np.pi/numberofangles)+ l/tvoverrv
274 print(
'WARNING: l = %f < 0 -> bad action start/end points\n'%(l))
285 for iind
in np.arange(1, numofsamples+1):
286 dt = (iind-1)/(numofsamples-1)
292 intermcells_m[int(iind)-1,:] = np.array(np.hstack((startpt[0]+dt*tv*np.cos(startpt[2]),
293 startpt[1]+dt*tv*np.sin(startpt[2]),
296 dtheta = rv*(dt-l/tv)+startpt[2]
297 intermcells_m[int(iind)-1,:] = np.array(np.hstack((startpt[0] + l*np.cos(startpt[2]) + tvoverrv*(np.sin(dtheta)-np.sin(startpt[2])),
298 startpt[1] + l*np.sin(startpt[2]) - tvoverrv*(np.cos(dtheta)-np.cos(startpt[2])),
303 errorxy = np.array(np.hstack((endpt[0] -intermcells_m[int(numofsamples)-1,0],
304 endpt[1] -intermcells_m[int(numofsamples)-1,1])))
306 interpfactor = np.array(np.hstack((np.arange(0., 1.+(1./(numofsamples)), 1./(numofsamples-1)))))
311 intermcells_m[:,0] = intermcells_m[:,0]+errorxy[0]*interpfactor.conj().T
312 intermcells_m[:,1] = intermcells_m[:,1]+errorxy[1]*interpfactor.conj().T
315 fout.write(
'endpose_c: %d %d %d\n'% ( endpose_c[0], endpose_c[1], endpose_c[2]))
316 fout.write(
'additionalactioncostmult: %d\n'%( additionalactioncostmult))
317 fout.write(
'intermediateposes: %d\n'%(
matrix_size(intermcells_m, 1.)))
318 for interind
in np.arange(1., (
matrix_size(intermcells_m, 1.))+1):
319 fout.write(
'%.4f %.4f %.4f\n'%( intermcells_m[int(interind)-1,0], intermcells_m[int(interind)-1,1], intermcells_m[int(interind)-1,2]))
322 plt.plot(intermcells_m[:,0], intermcells_m[:,1],linestyle=
"-",marker=
"o")
323 plt.text(endpt[0], endpt[1],
'{:2.0f}'.format(endpose_c[2]))
334 if __name__ ==
"__main__":
335 rospack = rospkg.RosPack()
336 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)