Слияние кода завершено, страница обновится автоматически
import ADCPlatform
import sys
sys.path.append("../")
speedPidThread_1 = 10 # 控制阈值1
speedPidThread_2 = 2 # 控制阈值2
''' xld - lat yr pid control
定速巡航下进行变道
yrsteer_ - pid计算方向盘输出 角速度补偿
'''
def latitudeyrControlpos(yr, yrPid):
yrPid.update(yr)
yrPid.yrsteer_ = yrPid.output * -1
''' xld - lat pid control
定速巡航下进行变道
positionnow = 车道多项式 A1之和
steer_ - pid计算方向盘输出
'''
def latitudeControlpos(positionnow, latPid):
latPid.update(positionnow)
latPid.steer_ = latPid.output * -1
# 缓慢变道尝试 可以但没必要 不利于提速
# if abs(latPid.steer_) > 70:
# latPid.steer_ = 70 if latPid.steer_ > 0 else -70
''' xld - speed pid control
加速时能够较快达到设定目标
减速时能较快减到设定速度
stage 1 - 加速
stage 2 - 保持
stage 3 - 微调
stage 4 - 快速减速
stage 5 - 减速微调
'''
def lontitudeControlSpeed(speed, lonPid):
lonPid.update(speed-5.0)
if (lonPid.output > speedPidThread_1): # 加速阶段
# print('speed is:', speed, 'output is:', lonPid.output, 'stage 1')
lonPid.thorro_ = 1
lonPid.brake_ = 0
elif (lonPid.output > speedPidThread_2): # 稳定控速阶段
# print('speed is:', speed, 'output is:', lonPid.output, 'stage 2')
lonPid.thorro_ = min((lonPid.output / speedPidThread_1) * 0.85, 1.0)
lonPid.brake_ = min(((speedPidThread_1 - lonPid.output) / speedPidThread_1) * 0.1, 1.0)
elif (lonPid.output > 0): # 下侧 微调
# print('speed is:', speed, 'output is:', lonPid.output, 'stage 3')
lonPid.thorro_ = (lonPid.output / speedPidThread_2) * 0.3
lonPid.brake_= ((speedPidThread_2 - lonPid.output) / speedPidThread_2) * 0.5
elif (lonPid.output < -1 * speedPidThread_1): # 减速阶段
# print('speed is:', speed, 'output is:', lonPid.output, 'stage 4')
lonPid.thorro_ = (-1 * lonPid.output / 5) * 0.3
lonPid.brake_= 0.8
else :
# print('speed is:', speed, 'output is:', lonPid.output, 'stage 5')
lonPid.thorro_ = (-1 * lonPid.output / speedPidThread_2) * 0.15
lonPid.brake_ = abs((speedPidThread_2 - (-1 * lonPid.output)) / speedPidThread_2) * 0.6
# lonPid.brake_ = 1.0
print(lonPid.thorro_, ' ', lonPid.brake_)
def speedupJob(Controller, MyCar):
Controller.speedPid.setSetpoint(Controller.speeduplimit)
# 纵向控制 thorro_ and brake_
lontitudeControlSpeed(MyCar.speed, Controller.speedPid)
# 横向控制 steer_
latitudeControlpos(MyCar.positionnow, Controller.latPid)
ADCPlatform.control(Controller.speedPid.thorro_, Controller.latPid.steer_, Controller.speedPid.brake_, 1)
def followJob(Controller, MyCar):
Controller.speedPid.setSetpoint(Controller.followlimit)
# 纵向控制 thorro_ and brake_
lontitudeControlSpeed(MyCar.speed, Controller.speedPid)
# 横向控制 steer_
latitudeControlpos(MyCar.positionnow, Controller.latPid)
ADCPlatform.control(Controller.speedPid.thorro_, Controller.latPid.steer_, Controller.speedPid.brake_, 1)
def overtakeJob(Controller, MyCar):
Controller.speedPid.setSetpoint(Controller.overtakelimit)
# 纵向控制 thorro_ and brake_
lontitudeControlSpeed(MyCar.speed, Controller.speedPid)
# overtake 车道中线调整
if (not MyCar.changing):
if (MyCar.direction == 'left'):
MyCar.midlane = min(7 , 7 + MyCar.midlane) # 最左侧不可左变道
elif (MyCar.direction == 'right'):
MyCar.midlane = max(-7 , -7 + MyCar.midlane)
Controller.latPid.setSetpoint(MyCar.midlane)
MyCar.changing = True # 更新中线 进入超车
# overtake 切换 follow 状态跟车
print("minus : ", MyCar.midlane - MyCar.positionnow)
if (MyCar.changing and abs(MyCar.midlane - MyCar.positionnow) < 0.4):
MyCar.cardecision = 'follow'
MyCar.direction = 'mid'
MyCar.changing = False
MyCar.overtakeSum += 1
# 横向控制 steer_ 加入角度速度约束
latitudeyrControlpos(MyCar.yr, Controller.yrPid)
# print('yr is', MyCar.yr, 'steeryr is', Controller.yrPid.yrsteer_) # overtake >15 , normal < 3
# print('latsteer is ', Controller.latPid.steer_)
latitudeControlpos(MyCar.positionnow, Controller.latPid)
ADCPlatform.control(Controller.speedPid.thorro_,
Controller.latPid.steer_, # - Controller.yrPid.yrsteer_,
Controller.speedPid.brake_, 1)
''' xld - speed control
'''
def run(Controller, MyCar, SensorID):
# 获取车辆控制数据包
control_data_package = ADCPlatform.get_control_data()
# 获取数据包
landLine_package = ADCPlatform.get_data(SensorID["landLine"])
# 平台bug 存在读不到数据的情况
if landLine_package:
if landLine_package.json:
if len(landLine_package.json) >= 3 and landLine_package.json[1] and landLine_package.json[2]:
MyCar.positionnow = landLine_package.json[2]['A1'] + landLine_package.json[1]['A1']
else:
pass
else:
pass
else:
pass
if not control_data_package:
print("任务结束")
MyCar.speed = control_data_package.json['FS']
MyCar.cao = control_data_package.json['CAO']
MyCar.yr = control_data_package.json['YR']
# 有限3种状态任务
if (MyCar.cardecision == 'overtake'):
overtakeJob(Controller, MyCar)
elif (MyCar.cardecision == 'speedup'):
speedupJob(Controller, MyCar)
elif (MyCar.cardecision == 'follow'):
followJob(Controller, MyCar)
# print(MyCar.cardecision, MyCar.midlane, MyCar.direction)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарий ( 0 )