2021CIVC仿真算法挑战赛--决策组比赛回顾

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董*飞飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值