dss笔记¶
结论¶
对于快要撞到的车,尝试找解(随机),找不到就急刹车。判断是否碰撞是用几小段匀加速直线运动模拟
代码详细剖析¶
入口¶
tempVel = DynamicSafetySearch::Instance()->SafetySearch(vecNumber, globalVel, pVision, priority, target, task().player.flag, usedtime, capability.maxAccel);
最终返回处理后的_nvel,即修正后的规划速度
具体处理¶
速度<100且不需要避球不会用到dss
- _stoptime=usedtime
- _flag 传入的flag
- _pos 位置
- refresh_priority:离目标0-1车身时pri为-1,1-3车身时pri为1,其余为0
- _nvel 原规划速度
- _vel 视觉速度
- _CNum 预测多少周期之后的事情,最多15个周期,如果速度小能及时减速那就更小,max((_vel.length()/maxacc*60),15)
- _C 单周期时长 1/60
- _acc 原规划加速度 (_nvel-_vel)/_C
- _gamma 预测多少秒后的事情 _C*_CNum
首先定义[安全]=CheckAccel
若priority=-1或CheckAccel是safe,保持原规划速度 否则要处理:
(a)计算参数:加速度可取angle¶
(开局先)算每个对象的AVOID_DIST,敌方和我是一个min_dist(1)和max_dist(9)之间的距离,速度越大dist越大;球取5 算avoid_dist和avoid_angle:对我方的容忍度有点高,其余的看图。
- max_radius 最大加速度
- t_mid_angle=crashed_car_dir的角度
- 算safe_angle_start/end:avoid_angle是会撞车的角度,除开之后算个start和end用于随机
(b)_t_acc,_e初始化¶
默认0和1
如果上次find_flag为true而且这一帧[安全],_t_acc设为上次的加速度,然后据此评估_e
否则我的-1车号的find_flag变成false
©迭代15次¶
每次随机加速度,评分,所有安全的加速度里找分最小的(最好),同时find_flag为true 即如果找不到安全的,那find_flag就是false
(d)计算点temp和向量tp¶
如果type是球,不会被初始化。而且这个东西没啥用
最后如果find_flag了,那就是有好解,记录下来并得到最终dss后速度 否则急刹,分数归1,记录
工具函数¶
angle_all¶
\(0-2\pi\)的atan
随机加速度¶
角度范围内,保证考虑时间内加速后不超速的一个加速度(也可能为0)
Evaluation¶
对加速度和车号评估_e,这个加速度好不好的评分,涉及上周期的评分,加速度方向和加速度大小: 两个指标,这一帧的原目标加速度(目标)和上一帧的加速度(好变),且上一帧分数越高后者系数c越大,下面的值算法相同 先得到加速度的夹角,记为v,则\(s=v^2 +0.5(pi^2-v^2)/400^2*|a.mod-a0.mod|\),不能超过\(\pi^2\) s2的计算类似,但系数为0.3 最后\(_e=(s1+c*s2)/(1+c)/(\pi^2)\)
CheckAccel(player, _acc, pVision, crashed_car_dir, crash_car_num, type, _C)¶
避我方车:将非自己,且有效的车存储到order中,由远到近排序,从后往前一个一个看 算目标的p,v,a,其中a有两种拿法,车号大于自己的(这一帧没规划)用视觉差分,小于的用last_acc 如果CheckRobot是unsafe,就unsafe结束判断
crashed_car_dir(也许是预测撞车的方向向量):考虑pva,t后的位置和我位置的连线。t的计算:一般看对面沿着这个加速度加速到最大速度要多久,加速度小于1取_gamma
避敌方车和球基本一致,但球的crash_car_num=-1
最后crashed_car_dir,crash_car_num,type拿出去用
CheckRobot(player, _pos, _vel, acc, order.back().first, pj, vj, Aj, type, limitTime)¶
我,目标点,视觉速度,原规划加速度,要判断的车号,目标的p,v,a,类型,单周期时长 limitTime是单周期时长吗??
tradius=TEAMMATE_AVOID_DIST(1~9)\(*\sqrt{1+2\frac{|v|}{250}\)(半径参数,我友敌球均不同,大概是6)
分别对我和对象构建路径,看是否碰撞(具体参数不同,回来看!)
MakeTrajectory(player, pi, vi, Ai, 0.0f, _gamma, _stoptime, tradius ,_DECMAX, THISPLAYER)¶
目的是构建 CQuadraticEquation q[3] 二维向量关于t的二次方程 的数组
(A) 我自己¶
t0=0 tc=_gamma tend=usedtime
确定_tend:如果预计快到了,_tend就取tend,假设车子以最大减速度进行原方向减速,把该轨迹存进q[0]里 否则,q[0]按规划加速度存一版,算一下按这个加速度tc后: - 如果停下来了(速度小),_tend取tc,不存 - 否则,让它在tc后按那时的原速度方向最大减速,一直考虑到tend的时候(过了t2=t1+t),存_tend=t2,存q[1]
(B) 队友¶
_stoptime(tend)只取到我自己的tend(已经算好了)
静止的好说,否则,tc=min(急刹车时间,gamma)。如果tend比tc小,只存到tend的一版进q[0]结束,可以准备比较了 否则,先存到tend的一版进q[0],然后同样逻辑考虑急刹段和静止段
(C) 敌人或球¶
只考虑一直匀速
CheckTrajectory¶
(A) 自己人¶
远离他的话直接safe,否则正常流程遍历轨迹看看有没有crash
如果有的话,除非相交点的时间比_C还短,而且位置差值矢量-加速度矢量的夹角不够大,才算safe,不然都是unsafe
(B) 敌人或球¶
正常流程
CQuadraticEquation的相减¶
首先构造关于t的四次方程,t取0开始算,保持相交时间那么长(但是起点时间信息丢失了,不能丢吧)
Question¶
- 60帧1s?A:也许问题不大,cmotion底层都是这样算的
- CheckAccel的加速度只用一阶差分?A:也许问题不大,噪声环境下差不太多
- CheckAccel计算crashed_car_dir时用的t有点怪(容易太长?)而且最大速度都按照我们车的来处理?
- line215,车号-1完全不合理!!!A:确实有问题
- 随机加速度,两个rand其实功能是重复的,是为了让它小一点吗
- 评分函数看起来分数会很小很小,max_translation到底是限制速度还是加速度,还是我对加速度的认知有错误。即使没错为啥平方
- CQuadraticEquation的相减 done
找问题思路¶
- CheckRobot得到unsafe是否及时
- 如果及时,是不是每次能找到解的时候都找到了(15次迭代?评分?)
- 找到的解随时间是否收敛
tyh¶
- 看log,not allowed很难进去(开局判断safe)
- 有没有可能,以前进去之后迭代不出来(找解有问题),就把进去的条件锁紧了?
debug记录¶
浅蓝色-目前的v 蓝色-规划的v 白色-规划的acc 红黑-acc禁区 黄-不会撞的随机acc 紫色-调整后的acc