1. 比赛介绍
比赛介绍:http://news.china.com.cn/mts/2021-10/14/content_1174366.htm
2021CIVC官网: https://civc.verodata.com.cn/
AD Chauffeur 仿真平台官网: https://www.adchauffeur.cn/
中国(沈阳)智能网联汽车大赛分为仿真算法挑战赛和实车前瞻应用挑战赛。
仿真算法挑战赛包括驾驶辅助(决策组)、驾驶辅助(感知组)、自动泊车、自动驾驶四个项目。来自天津大学、清华大学、东南大学、东北大学、大连理工大学、毫末智行等众多高校以及企业的100余支赛队踊跃参与,其中企业赛队近30个,高校赛队70余个。比赛从9月15日开始,经过练习,预赛,决赛几个阶段,历时20多天,在10月10日落下帷幕。
前瞻应用挑战赛吸引了来自毫末智行科技有限公司、重庆金康赛力斯新能源汽车设计院有限公司、北京享智科技有限公司、苏州驾驶宝智能科技有限公司、上海翌勤软件开发中心、上海雷霞软件开发中心、天津大学、清华大学、北京航空航天大学、北京交通大学、北京联合大学、中国矿业大学(北京)、长安大学等众多企业及高校赛队踊跃参与。 前瞻应用挑战赛中,参赛车型为智能大巴车,该车辆是依托于海河教育园区建立智能网联测试道路开发的公交巴士。
本次参加的是驾驶辅助组的比赛,因此决定在比赛结束后结合优胜队伍开源代码对本次比赛做一次梳理回顾。
2. 驾驶辅助决策组任务介绍
借助车道线传感器、相机传感器、仿真车自身动力学参数(车速、加速度、油门开度、刹车开度等)信息实现三个场景任务:前车静止、行人横穿马路、曲线道路,前车障碍。
3. 优胜队伍开源代码下载
棋天大圣-东北大学队开源项目: https://github.com/NEUAutonomousDriving408/CIVCAutoDrivingDecision.git
4. 开源代码解析
- 文件介绍
.
├── ADCplatform # 官方控制API接口
│ ├── api.py
│ ├── business.py
│ ├── init.py
│ ├── request_basic.py
│ ├── request_node.py
│ ├── task_info.py
│ ├── tools.py
│ ├── type_node.py
│ └── version.py
├── control # 自定义控制
│ ├── control.py
│ ├── final_task # 决赛控制逻辑
│ ├── init.py
│ ├── pid.py # 自建PID控制类
│ ├── state.py # 自建车辆类与车辆控制类
│ ├── task
│ └── version.py
├── image
│ ├── 90score.png
│ └── README.md
├── main.py
├── README.md
└── requirements.txt - 代码运行逻辑介绍
-
main.py 连接仿真平台,根据不同任务调用不同final_task的控制逻辑 -> control.run() 初始化传感器,初始化车辆类和车辆控制类,选择需要执行的任务 -> final_task.task0.run_task0_test() 调用具体的控制逻辑来完成相应任务
-
main.py
-
control.run()
-
final_task.task0.run_task0_test()
-
pid.py 设置PID控制类
import time class PID: """PID Controller """ def __init__(self, P=1.0, I=0.0, D=0.0): self.Kp = P self.Ki = I self.Kd = D self.SetPoint = -1 self.sample_time = 0.00 self.current_time = time.time() self.last_time = self.current_time self.clear() def clear(self): """Clears PID computations and coefficients""" self.SetPoint = 0.0 self.PTerm = 0.0 self.ITerm = 0.0 self.DTerm = 0.0 self.last_error = 0.0 # 上次的误差 # Windup Guard self.int_error = 0.0 self.windup_guard = 20.0 self.output = 0.0 self.thorro_ = 0.0 self.brake_ = 0.0 self.steer_ = 0.0 self.yrsteer_ = 0.0 def update(self, feedback_value): """Calculates PID value for given reference feedback .. math:: u(t) = K_p e(t) + K_i \int_{0}^{t} e(t)dt + K_d {de}/{dt} .. figure:: images/pid_1.png :align: center Test PID with Kp=1.2, Ki=1, Kd=0.001 (test_pid.py) """ error = self.SetPoint - feedback_value self.current_time = time.time() delta_time = self.current_time - self.last_time delta_error = error - self.last_error # if (delta_time >= self.sample_time): self.PTerm = self.Kp * error self.ITerm += error * delta_time if (self.ITerm < -self.windup_guard): self.ITerm = -self.windup_guard elif (self.ITerm > self.windup_guard): self.ITerm = self.windup_guard self.DTerm = 0.0 if delta_time > 0: self.DTerm = delta_error / delta_time # Remember last time and last error for next calculation self.last_time = self.current_time self.last_error = error self.output = self.PTerm + (self.Ki * self.ITerm) + (self.Kd * self.DTerm) def setKp(self, proportional_gain): """Determines how aggressively the PID reacts to the current error with setting Proportional Gain""" self.Kp = proportional_gain def setKi(self, integral_gain): """Determines how aggressively the PID reacts to the current error with setting Integral Gain""" self.Ki = integral_gain def setKd(self, derivative_gain): """Determines how aggressively the PID reacts to the current error with setting Derivative Gain""" self.Kd = derivative_gain def setSetpoint(self, target): """Determines how aggressively the PID reacts to the current error with setting Derivative Gain""" self.SetPoint = target
-
state.py 设置车辆类与车辆控制类
from control import pid class CarState(object): def __init__(self): self.speed = 0 # 车辆当前速度 self.cao = 0 # 车辆当前姿态 self.cardecision = 'speedup' # planning计算得到决策 self.midlane = -1 # 7 0 -7 latpid 参考 target self.positionnow = 0 # 两车道线A1求和 self.saftydistance = 25 # 与前车的安全距离 self.delta_v = 0 self.acc = 0 self.dist = 10 # 与前车的实际距离 self.yr = 0 # 车辆当前姿态 class ControlData(object): def __init__(self): ''' self.lat_kp = 1.10 self.lat_ki = 0.08 self.lat_kd = 6.2 ''' self.lat_kp = 1.35 self.lat_ki = 0.06 self.lat_kd = 10.2 self.latPid = pid.PID(self.lat_kp, self.lat_ki, self.lat_kd) self.yr_kp = 1.0 self.yr_ki = 0.10 self.yr_kd = 0 self.yrPid = pid.PID(self.yr_kp, self.yr_ki, self.yr_kd) self.targetSpeedInit = 60.0 # 想要到达的速度 self.speed_kp = 1.20 self.speed_ki = 0.02 self.speed_kd = 0.5 self.speedPid = pid.PID(self.speed_kp, 0, self.speed_kp) self.speedPidThread_1 = 10 self.speedPidThread_2 = 2 def initPID(self): self.speedPid.clear() # lon self.latPid.clear() # lat self.yrPid.clear() # lat self.speedPid.setSetpoint(self.targetSpeedInit) # 保持40km/h self.latPid.setSetpoint(0) # lat aim 0 self.yrPid.setSetpoint(0) # lat aim 0
-
5. 感谢
感谢本次组委会的辛勤付出,为我们打造了这样一个竞赛平台。同时也感谢这次比赛的棋天大圣队伍开源自己的比赛代码让大家一起交流谈论,推进比赛的发展。感兴趣的可以关注他们的github:https://github.com/NEUAutonomousDriving408