跳转至

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

  1. 60帧1s?A:也许问题不大,cmotion底层都是这样算的
  2. CheckAccel的加速度只用一阶差分?A:也许问题不大,噪声环境下差不太多
  3. CheckAccel计算crashed_car_dir时用的t有点怪(容易太长?)而且最大速度都按照我们车的来处理?
  4. line215,车号-1完全不合理!!!A:确实有问题
  5. 随机加速度,两个rand其实功能是重复的,是为了让它小一点吗
  6. 评分函数看起来分数会很小很小,max_translation到底是限制速度还是加速度,还是我对加速度的认知有错误。即使没错为啥平方
  7. CQuadraticEquation的相减 done

找问题思路

  1. CheckRobot得到unsafe是否及时
  2. 如果及时,是不是每次能找到解的时候都找到了(15次迭代?评分?)
  3. 找到的解随时间是否收敛

tyh

  1. 看log,not allowed很难进去(开局判断safe)
  2. 有没有可能,以前进去之后迭代不出来(找解有问题),就把进去的条件锁紧了?

debug记录

浅蓝色-目前的v 蓝色-规划的v 白色-规划的acc 红黑-acc禁区 黄-不会撞的随机acc 紫色-调整后的acc