|
@@ -3,21 +3,151 @@ import gpsimu_pb2
|
|
|
import mapdata_pb2
|
|
|
|
|
|
import math
|
|
|
+from typing import List
|
|
|
+
|
|
|
+from datetime import datetime, timedelta
|
|
|
+import time
|
|
|
|
|
|
class Point2D:
|
|
|
def __init__(self, x, y):
|
|
|
self.mx = x
|
|
|
self.my = y
|
|
|
|
|
|
+ def __str__(self):
|
|
|
+ return f"Point2D({self.mx}, {self.my})"
|
|
|
+
|
|
|
class DecisionDemo:
|
|
|
def __init__(self):
|
|
|
# 初始化代码...
|
|
|
pass
|
|
|
|
|
|
- def CalcDecision(self,msg_mapdata : mapdata_pb2, msg_gpsimu : gpsimu_pb2):
|
|
|
- x,y = self.GaussProj(gpsimu_pb2.lon,gpsimu_pb2.lat)
|
|
|
+ def CalcDecision(self,tracemap : mapdata_pb2.tracemap, msg_gpsimu : gpsimu_pb2.gpsimu):
|
|
|
+ # x,y = self.GaussProj(gpsimu_pb2.lon,gpsimu_pb2.lat)
|
|
|
+ print(" in calc: map size: ",len(tracemap.point))
|
|
|
+ nearindex = self.FindNearIndex(tracemap,msg_gpsimu)
|
|
|
+ print("near index: ",nearindex)
|
|
|
|
|
|
- pass
|
|
|
+ if nearindex < 0 :
|
|
|
+ print(" not found near point, return")
|
|
|
+ return
|
|
|
+
|
|
|
+ localpoints,distoend = self.CalcLocalPath(nearindex,tracemap,msg_gpsimu)
|
|
|
+ print(f"disttoend: {distoend}")
|
|
|
+
|
|
|
+ realspeed = 3.6 * math.sqrt(math.pow(msg_gpsimu.vn,2) + math.pow(msg_gpsimu.ve,2))
|
|
|
+
|
|
|
+ def CalcCmd(self,localpoints : List[Point2D],realspeed):
|
|
|
+ desiredspeed = 10
|
|
|
+ defaultacc = 1.0
|
|
|
+ pd = realspeed * 0.3
|
|
|
+ if pd < 4.0 :
|
|
|
+ pd = 4.0
|
|
|
+
|
|
|
+ sumdis = 0
|
|
|
+ i = 1
|
|
|
+ size = len(localpoints)
|
|
|
+ ppindex = 0
|
|
|
+
|
|
|
+ while i < size:
|
|
|
+ sumdis = math.sqrt(math.pow(localpoints[i].mx - localpoints[i-1].mx,2)
|
|
|
+ + math.pow(localpoints[i].my - localpoints[i-1].my,2))
|
|
|
+ ppindex = i
|
|
|
+ if sumdis >= pd :
|
|
|
+ ppindex = i
|
|
|
+ break
|
|
|
+ acc = -0.5
|
|
|
+ wheel = 0.0
|
|
|
+ if ppindex < 3:
|
|
|
+ acc = 0.0
|
|
|
+ wheel = 0.0
|
|
|
+ return acc,wheel
|
|
|
+
|
|
|
+ if desiredspeed > 0.1:
|
|
|
+ if realspeed < desiredspeed :
|
|
|
+ if realspeed < desiredspeed*0.9:
|
|
|
+ acc = defaultacc
|
|
|
+ else:
|
|
|
+ acc = defaultacc *(desiredspeed - realspeed) * (1/0.1)/desiredspeed
|
|
|
+ else:
|
|
|
+ if realspeed > desiredspeed*1.1:
|
|
|
+ if realspeed > desiredspeed * 2.0:
|
|
|
+ acc = defaultacc * (-1.0)
|
|
|
+ else:
|
|
|
+ acc = defaultacc * (desiredspeed - realspeed)/desiredspeed
|
|
|
+ else:
|
|
|
+ acc = 0.0
|
|
|
+
|
|
|
+
|
|
|
+ denominator = 2 * localpoints[ppindex].mx *(-1);
|
|
|
+ numerator = math.pow(localpoints[ppindex].mx,2) + pow(localpoints[ppindex].my,2);
|
|
|
+ fRadius = 1e9;
|
|
|
+ if math.fabs(denominator)>0:
|
|
|
+ fRadius = numerator/denominator
|
|
|
+ else:
|
|
|
+ fRadius = 1e9
|
|
|
+ if fRadius == 0:
|
|
|
+ wheel = 0
|
|
|
+ kappa = 1.0/fRadius
|
|
|
+ wheel_base = 2.9
|
|
|
+ wheelratio = 13.6
|
|
|
+ wheel = (-1.0)*kappa * wheel_base * wheelratio * 180.0/math.pi
|
|
|
+
|
|
|
+ return acc,wheel
|
|
|
+
|
|
|
+
|
|
|
+ def FindNearIndex(self,tracemap : mapdata_pb2.tracemap,xgpsimu : gpsimu_pb2.gpsimu) :
|
|
|
+ x,y = self.GaussProj(xgpsimu.lon,xgpsimu.lat)
|
|
|
+ nearindex = -1
|
|
|
+ neardis = 100000
|
|
|
+ index = 0
|
|
|
+ for p in tracemap.point:
|
|
|
+ dis = math.sqrt(math.pow(x - p.gps_x,2) + math.pow(y - p.gps_y,2))
|
|
|
+ headingdiff = xgpsimu.heading - p.ins_heading_angle
|
|
|
+ while headingdiff < -180:
|
|
|
+ headingdiff = headingdiff + 360
|
|
|
+ while headingdiff >= 180:
|
|
|
+ headingdiff = headingdiff - 360
|
|
|
+ if math.fabs(headingdiff) < 80 :
|
|
|
+ if dis < neardis :
|
|
|
+ neardis = dis
|
|
|
+ nearindex = index
|
|
|
+ index = index + 1
|
|
|
+ return nearindex
|
|
|
+
|
|
|
+ def CalcLocalPath(self,index,xtracemap : mapdata_pb2.tracemap,xgpsimu : gpsimu_pb2.gpsimu):
|
|
|
+ x0,y0 = self.GaussProj(xgpsimu.lon,xgpsimu.lat)
|
|
|
+ localpoints = []
|
|
|
+ i = index
|
|
|
+ npoint = 0;
|
|
|
+ nmaxpoint = 600
|
|
|
+ length = len(xtracemap.point)
|
|
|
+ distoend = 0;
|
|
|
+ while i< length :
|
|
|
+ xraw = xtracemap.point[i].gps_x - x0
|
|
|
+ yraw = xtracemap.point[i].gps_y - y0
|
|
|
+ # print(f"i: {i-index} xraw:{xraw} yraw:{yraw} ")
|
|
|
+ theta = (90 - xgpsimu.heading) * math.pi /180.0
|
|
|
+ theta = theta * (-1)
|
|
|
+ theta = theta + math.pi/2.0
|
|
|
+ x = xraw * math.cos(theta) - yraw * math.sin(theta)
|
|
|
+ y = xraw * math.sin(theta) + yraw * math.cos(theta)
|
|
|
+ # print(f"i: {i-index} x:{x} y:{y} ")
|
|
|
+ localpoints.append(Point2D(x,y))
|
|
|
+ if i>index :
|
|
|
+ distoend = distoend + math.sqrt(math.pow(xtracemap.point[i].gps_x - xtracemap.point[i-1].gps_x,2)
|
|
|
+ + math.pow(xtracemap.point[i].gps_y - xtracemap.point[i-1].gps_y,2))
|
|
|
+ if npoint >= nmaxpoint:
|
|
|
+ break
|
|
|
+ i = i+1
|
|
|
+ npoint = npoint + 1
|
|
|
+ while i < length :
|
|
|
+ if i>index :
|
|
|
+ distoend = distoend + math.sqrt(math.pow(xtracemap.point[i].gps_x - xtracemap.point[i-1].gps_x,2)
|
|
|
+ + math.pow(xtracemap.point[i].gps_y - xtracemap.point[i-1].gps_y,2))
|
|
|
+ i = i+1
|
|
|
+ if distoend > 300:
|
|
|
+ break
|
|
|
+ return localpoints,distoend
|
|
|
|
|
|
def GaussProj(self,lon,lat):
|
|
|
iPI = 0.0174532925199433
|