Source code for Mapping.rectangle_fitting.rectangle_fitting
"""Object shape recognition with L-shape fittingauthor: Atsushi Sakai (@Atsushi_twi)Ref:- Efficient L-Shape Fitting for Vehicle Detection Using Laser Scanners -The Robotics Institute Carnegie Mellon Universityhttps://www.ri.cmu.edu/publications/efficient-l-shape-fitting-for-vehicle-detection-using-laser-scanners/"""importsysimportpathlibsys.path.append(str(pathlib.Path(__file__).parent.parent.parent))importmatplotlib.pyplotaspltimportnumpyasnpimportitertoolsfromenumimportEnumfromutils.angleimportrot_mat_2dfromMapping.rectangle_fitting.simulator \
importVehicleSimulator,LidarSimulatorshow_animation=True
[docs]classLShapeFitting:""" LShapeFitting class. You can use this class by initializing the class and changing the parameters, and then calling the fitting method. """
def__init__(self):""" Default parameter settings """#: Fitting criteria parameterself.criteria=self.Criteria.VARIANCE#: Minimum distance for closeness criteria parameter [m]self.min_dist_of_closeness_criteria=0.01#: Angle difference parameter [deg]self.d_theta_deg_for_search=1.0#: Range segmentation parameter [m]self.R0=3.0#: Range segmentation parameter [m]self.Rd=0.001
[docs]deffitting(self,ox,oy):""" Fitting L-shape model to object points Parameters ---------- ox : x positions of range points from an object oy : y positions of range points from an object Returns ------- rects: Fitting rectangles id_sets: id sets of each cluster """# step1: Adaptive Range Segmentationid_sets=self._adoptive_range_segmentation(ox,oy)# step2 Rectangle searchrects=[]foridsinid_sets:# for each clustercx=[ox[i]foriinrange(len(ox))ifiinids]cy=[oy[i]foriinrange(len(oy))ifiinids]rects.append(self._rectangle_search(cx,cy))returnrects,id_sets
classRectangleData:def__init__(self):self.a=[None]*4self.b=[None]*4self.c=[None]*4self.rect_c_x=[None]*5self.rect_c_y=[None]*5defplot(self):self.calc_rect_contour()plt.plot(self.rect_c_x,self.rect_c_y,"-r")defcalc_rect_contour(self):self.rect_c_x[0],self.rect_c_y[0]=self.calc_cross_point(self.a[0:2],self.b[0:2],self.c[0:2])self.rect_c_x[1],self.rect_c_y[1]=self.calc_cross_point(self.a[1:3],self.b[1:3],self.c[1:3])self.rect_c_x[2],self.rect_c_y[2]=self.calc_cross_point(self.a[2:4],self.b[2:4],self.c[2:4])self.rect_c_x[3],self.rect_c_y[3]=self.calc_cross_point([self.a[3],self.a[0]],[self.b[3],self.b[0]],[self.c[3],self.c[0]])self.rect_c_x[4],self.rect_c_y[4]=self.rect_c_x[0],self.rect_c_y[0]@staticmethoddefcalc_cross_point(a,b,c):x=(b[0]*-c[1]-b[1]*-c[0])/(a[0]*b[1]-a[1]*b[0])y=(a[1]*-c[0]-a[0]*-c[1])/(a[0]*b[1]-a[1]*b[0])returnx,ydefmain():# simulation parameterssim_time=30.0# simulation timedt=0.2# time tickangle_resolution=np.deg2rad(3.0)# sensor angle resolutionv1=VehicleSimulator(-10.0,0.0,np.deg2rad(90.0),0.0,50.0/3.6,3.0,5.0)v2=VehicleSimulator(20.0,10.0,np.deg2rad(180.0),0.0,50.0/3.6,4.0,10.0)l_shape_fitting=LShapeFitting()lidar_sim=LidarSimulator()time=0.0whiletime<=sim_time:time+=dtv1.update(dt,0.1,0.0)v2.update(dt,0.1,-0.05)ox,oy=lidar_sim.get_observation_points([v1,v2],angle_resolution)rects,id_sets=l_shape_fitting.fitting(ox,oy)ifshow_animation:# pragma: no coverplt.cla()# for stopping simulation with the esc key.plt.gcf().canvas.mpl_connect('key_release_event',lambdaevent:[exit(0)ifevent.key=='escape'elseNone])plt.axis("equal")plt.plot(0.0,0.0,"*r")v1.plot()v2.plot()# Plot range observationforidsinid_sets:x=[ox[i]foriinrange(len(ox))ifiinids]y=[oy[i]foriinrange(len(ox))ifiinids]for(ix,iy)inzip(x,y):plt.plot([0.0,ix],[0.0,iy],"-og")plt.plot([ox[i]foriinrange(len(ox))ifiinids],[oy[i]foriinrange(len(ox))ifiinids],"o")forrectinrects:rect.plot()plt.pause(0.1)print("Done")if__name__=='__main__':main()