Log 分析
依旧是过去的流程
1. 获取waypoints
这一步没什么特别,与以往一样在代码中加入
waypoints=params['waypoints']
track_width = params['track_width']
print(f'LOG_DATA:{waypoints}')
print(f'LOG_DATA:{track_width}')
提取log之后得到赛道的基本信息,通过编写分析脚本得到以下数据:
一共 119
个点, 其中第一个点和最后一个点重合
-
中线长度 :
center_length=17.709159380569023m
-
赛道宽度 :
0.76 m
-
内线长度:
inner_length=15.699500827244645m
-
外线长度:
outer_length=19.732614828772252m
-
各个点的曲率,曲率比较大的地方弯转的比较急,也是训练时难以通过的地方
-
各个点的最大速度
### 部分代码入下
npyfileList = [filefullpath for filefullpath in glob2.glob('../CalcWaypoint/NpyFolder/*.npy')]
wayLineList = np.load(npyfileList[5])
inner_line,race_line,center_line,outer_line = loadWayPoint(wayLineList)
lineSelect = race_line
modeNumber = len(lineSelect)-1
cList=[] # curvature 曲率
for j in range(1,10,1):
cList.append([menger_curvature(lineSelect[i%modeNumber], lineSelect[(i+j)%modeNumber], lineSelect[(i+2*j)%modeNumber], atol=1e-3) for i in range(len(lineSelect))])
mList = [(i,min(item),max(item)) for i,item in enumerate(cList,start=1)]
speedList = []
# [speedList.append([1.4**2*1.3/(i+0.2) for i in iCount]) for iCount in cList]
[speedList.append([sqrt(3.6/(curvature+0.05)) for curvature in curvatureList]) for curvatureList in cList]
sList = [(i,min(item),max(item)) for i,item in enumerate(speedList,start=1)]
这里曲率在基础点上增加了0.05 是为了使速度控制在一定范围,否则曲率接近0时,速度为无穷大
这里我理解的最大速度就是小车失控打滑的速度,即离心力小于等于摩擦力
fmg=mv^2/r, 而 曲率 k = 1/r, 得到 v <= sqrt(fg/k),根据实际获取的log数据,计算得到 fg = 1.6 ** 2 * 1.4 =3.6
2. 计算最优线路
最优线路的原理就是将一点的曲率与相邻两点曲率的平均值做对比,如果小于相邻两点,就要将该点进行调整使得该点曲率等于相邻两点平均值,每进行一圈循环算一个迭代。
-
宽度系数0.9,迭代250次
-
宽度系数0.9,迭代500次
-
宽度系数0.9,迭代750次
-
宽度系数0.9,迭代1000次
-
宽度系数0.9,迭代1250次
-
宽度系数0.9,迭代1500次
3. 制定策略
我的策略是在完成度相同的情况下使用的步数越小,奖励值越多,即 核心 奖励:` progress / step`
4. 编写函数
base on yourself
5. 选择超参
算法选择:PPO
batch size : 512
学习率: 初始第一可选大一点, 0.0008,clone时根据实际情况依次减小
6. 不同速度/训练时间迭代
初始化第一次的时候选择 512,0.0008,[0.8,1.6], 45min
clone : 512,0.0006,[0.9,1.9], 35min
clone : 512,0.0004,[1,2.1], 35min
clone : 512,0.0003,[1,2.3], 35min
clone : 512,0.0003,[1,2.5], 30min
clone : 512,0.0002,[1,2.7], 30min
clone : 512,0.0002,[1,2.9], 30min
clone : 512,0.0002,[1,3.2], 30min
6.1 分析log,根据Log结果回到第3步
上面的迭代参数仅供参考,一般规则就是bath size选择最大,learn rate逐步减小,速度逐步增加
在策略这一块,当速度提高到一定时候,上面的策略不够用了,后面我增加了瞬时奖励,即越靠近最优线路并且 速度越大奖励值越高
,这种做法短时间内将速度提高起来,整体来看效果还不错,将单圈8.2s 提高到7.9s,不过到速度提高到3.4m/s时发现小车喜欢跑蛇形,不过目前的奖励函数 对于这次比赛已经够用了,后面再想提高的话只能从控制转角使车头沿着最佳线路跑,尽量少走蛇形
7. 达到赛道极限之后使用自动提交工具自动提交
这个我称之为黑科技,一般通过多次提交能刷新自己的成绩,当然需要自己编写自动化脚本提交勒。
这次比赛的前几名都是通过编写工具不断提交刷新成绩,好的成绩离不开不断的尝试,看,第二名提交了1400次
注意:
最近有不少人私信我,上来就要 reward function做参考,在这里我申明下: 看上面的过程就知道这个reward function在迭代中会做相应的修改,也就是说最后的reward function 并不是说你用它来从头开始训练就能达到相同的效果,就算我给你了你也达不到同样的效果,因为整个过程中需要不停的分析再做小幅度修改代码以及超参。实在要参考,默认的三个reward function 你可以试试,大家参加比赛就不要想白嫖。