You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
WRC/pure_test.py

422 lines
16 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import time
# import txt2
import numpy as np
import math
import matplotlib.pyplot as plt
from loguru import logger
# import tcp4
import sqlite3
import threading
import CUR
ag = [0,0]
a = []
# import test5
k = 0 # 前视距离系数
Lfc =2# 前视距离
Kp = 1.0 # 速度P控制器系数
dt = 0.1 # 时间间隔单位s
L = 2.7 # 车辆轴距单位m
x1=[]
y1=[]
# yaw1 = math.radians(414)
# print('y',yaw1)
# arc=math.atan2(1, 1)
# print('acr',arc)
yaw = math.radians(450 - (344 + 180 - 360))
f=0
T = []
TX = []
curvature=0
A=0
B=0
C=0
def calculate_curvature(point_a, point_b, point_c):
global curvature
# 将输入点转换为 NumPy 数组
a = np.array(point_a)
b = np.array(point_b)
c = np.array(point_c)
# 计算各边长
ab = np.linalg.norm(a - b)
bc = np.linalg.norm(b - c)
ca = np.linalg.norm(c - a)
# 使用海伦公式计算三角形面积
s = (ab + bc + ca) / 2
area = np.sqrt(s * (s - ab) * (s - bc) * (s - ca))
# 计算曲率
curvature = 4 * area / (ab * bc * ca)
print('cur',curvature)
# i=0
# # a = path[i]
# # b = path[i + 10]
# # c = path[i + 20]
# # curvature = calculate_curvature(a, b, c)
# i=i+1
# print(i)
# return curvature
class VehicleState:
# state = VehicleState(x = tcp4.x_car, y =tcp4.y_car, yaw = tcp4.yaw, v = 0)
def __init__(self, x=88, y=47, yaw=yaw, v=0.0):
self.x = x
self.y = y
self.yaw = yaw
self.v = v
def update(state, a, delta):
state.x =state.x + state.v * math.cos(state.yaw) * dt
# print("state.x",state.x)
state.y = state.y + state.v * math.sin(state.yaw) * dt
# print("state.y",state.y)
state.yaw = state.yaw + state.v / L * math.tan(delta) * dt
# print('state.yaw',state.yaw)
state.v = state.v + a * dt
return state
def PControl(target, current):
a = Kp * (target - current)
return a
def remove_adjacent_duplicates(coords):
result = []
for coord in coords:
if not result or coord != result[-1]:
result.append(coord)
print('coor',result)
def pure_pursuit_control(state, cx, cy, pind):
global ag,f, Lfc, delta, curvature, A, B, C
ind = calc_target_index(state, cx, cy)
# if pind >= ind:
# ind = pind
if ind < len(cx):
tx = cx[ind]
# print('tx1',tx)
ty = cy[ind]
# print('ty1',ty)
TX.append((tx, ty))
# print(TX)
else:
tx = cx[-1]
print('tx2',tx)
ty = cy[-1]
print('ty2',ty)
ind = len(cx) - 1
T.append(TX)
# print('T0',T[0][0])
# print('t',TX)
# A=0
# if len(T)>20:
# remove_adjacent_duplicates(T)
# seen = set()
# coords_without_duplicates = []
# for coord in T:
# if coord not in seen:
# coords_without_duplicates.append(coord)
# seen.add(coord)
# else:
# coords_without_duplicates.remove(coord)
#
# print(coords_without_duplicates)
# return result
TX_TY = [x for i, x in enumerate(T[0]) if i == 0 or x != T[0][i - 1]]
# print('txty',TX_TY)
if len(TX_TY)>15:
A=TX_TY[-1]
B=TX_TY[-15]
C=TX_TY[-7]
calculate_curvature(A,B,C)
if curvature>0:
a.append(curvature)
print('a', a)
# if len(T)>300:
# for i in range(len(T)):
# global curvature
# curvature=calculate_curvature(T[0][i],T[0][i+10],T[0][i+20])
# print('cur,1',curvature)
# print('to',T[0][i])
# print('t1',T[0][i+10])
# print('t2',T[0][i+20])
# if curvature>=0.18:
# Lfc=0.05
print('cur', curvature)
# # print('lfc', Lfc)
# if 0.1<=curvature< 0.15:
# Lfc = 0.3
# # print('cur', curvature)
# # print('lfc', Lfc)
# if 0.15 <= curvature < 0.2:
# Lfc = 0.05
# else:
# Lfc =0.8
# print('cur', curvature)
# print('lfc', Lfc)
#
if len(TX_TY)>20:
Lfc=Lfc*curvature*0.5
# Lfc=round(Lfc)
if curvature<0.07:
Lfc=0.4558
if Lfc==0:
Lfc=1
if np.isnan(Lfc):
Lfc = 1
print('a is NaN')
print('lcf',Lfc)
alpta_1=math.atan2(ty - state.y, tx - state.x)
alpha = alpta_1- state.yaw
# print('alpha',alpha)
delta = math.atan2(2.0 * L * math.sin(alpha) / Lfc, 1.0)
# print('delta',delta)
#
if delta > np.pi / 6.0:
delta = np.pi / 6.0
# print('delta1', delta)
elif delta < - np.pi / 6.0:
delta = - np.pi / 6.0
# print('delta2', delta)
# print('deltal1',delta1)
angle = delta * 57.3
#
fangxp = int((angle) *18)
fxp=int(fangxp)
# d=(fangxp-f)
# print('d',d)
# if d>4:
# d=4
# fangxp = f + d
# fangxp=f+d
#
# if d<-4:
# d=-4
# fangxp=f+d
# f = fangxp
# print('f', f)
#
#
# # print('fangx[',fangxp)
#
#
# ag.append(fangxp)
# print('ag',ag)
#
print('fxp',fangxp)
time.sleep(0.04)
# print(delta)
return delta, ind
def calc_target_index(state, cx, cy):
# 搜索最临近的路点
dx = [state.x - icx for icx in cx]
# print('dx',dx)
dy = [state.y - icy for icy in cy]
# print('dy',dy)
d = [abs(math.sqrt(idx ** 2 + idy ** 2)) for (idx, idy) in zip(dx, dy)]
# print('d',d)
ind = d.index(min(d))
# print('ind',ind)
L = 0.0
Lf = k * state.v + Lfc
while Lf > L and (ind + 1) < len(cx):
dx = cx[ind + 1] - cx[ind]
dy = cx[ind + 1] - cx[ind]
L += math.sqrt(dx ** 2 + dy ** 2)
ind += 1
return ind
def main():
global x1,y1
# 设置目标路点
cx = [
96.048, 96.078, 96.109, 96.139, 96.17, 96.203, 96.234, 96.266, 96.299, 96.33, 96.364, 96.395, 96.424,
96.456, 96.487, 96.514, 96.546, 96.576, 96.609, 96.638, 96.667, 96.701, 96.735, 96.765, 96.795, 96.825,
96.855, 96.888, 96.918, 96.953, 96.982, 97.013, 97.045, 97.095, 97.123, 97.157, 97.179, 97.208, 97.243,
97.277,
97.308, 97.342, 97.376, 97.407, 97.435, 97.47, 97.501, 97.534, 97.565, 97.595, 97.624, 97.649, 97.684, 97.716,
97.749,
97.776, 97.811, 97.84, 97.869, 97.901, 97.931, 97.96, 97.984, 98.016, 98.042, 98.07, 98.1, 98.128, 98.155,
98.188, 98.218, 98.244, 98.273, 98.304, 98.339, 98.366, 98.397, 98.42, 98.465, 98.495, 98.523, 98.549, 98.578,
98.61,
98.637, 98.667, 98.7, 98.729, 98.757, 98.789, 98.819, 98.843, 98.872, 98.892, 98.921, 98.955, 98.984, 99.01,
99.04, 99.06, 99.09, 99.121, 99.152, 99.178, 99.208, 99.233, 99.26, 99.29, 99.32, 99.349, 99.376, 99.4,
99.428,
99.456, 99.486, 99.514, 99.544, 99.571, 99.598, 99.627, 99.654, 99.682, 99.714, 99.741, 99.769, 99.799,
99.831,
99.859, 99.888, 99.932, 99.957, 99.987, 100.012, 100.043, 100.076, 100.108, 100.135, 100.167, 100.191,
100.221,
100.252, 100.281, 100.311, 100.342, 100.371, 100.394, 100.427, 100.455, 100.49, 100.522, 100.553, 100.58,
100.614,
100.641, 100.672, 100.702, 100.728, 100.761, 100.792, 100.824, 100.849, 100.876, 100.909, 100.942, 100.967,
100.999,
101.031, 101.059, 101.09, 101.121, 101.15, 101.175, 101.204, 101.235, 101.264, 101.288, 101.32, 101.348,
101.38, 101.404, 101.433, 101.468, 101.495, 101.521, 101.551, 101.575, 101.604, 101.632, 101.66, 101.683,
101.716,
101.744, 101.776, 101.808, 101.83, 101.854, 101.889, 101.918, 101.945, 101.967, 101.99, 102.013, 102.033,
102.057,
102.082, 102.102, 102.116, 102.134, 102.149, 102.164, 102.176, 102.184, 102.187, 102.185, 102.183, 102.176,
102.165,
102.141, 102.112, 102.086, 102.058, 102.031, 101.989, 101.955, 101.912, 101.861, 101.805, 101.748, 101.68,
101.606, 101.522, 101.44, 101.353, 101.272, 101.185, 101.09, 100.999, 100.9, 100.804, 100.706, 100.611,
100.505,
100.406, 100.299, 100.195, 100.085, 99.979, 99.867, 99.739, 99.62, 99.493, 99.363, 99.231, 99.102, 98.965,
98.83,
98.623, 98.48, 98.339, 98.198, 98.06, 97.927, 97.794, 97.659, 97.534, 97.402, 97.268, 97.143, 97.023, 96.896,
96.773,
96.645, 96.518, 96.393, 96.26, 96.127, 95.988, 95.845, 95.706, 95.558, 95.409, 95.258, 95.102, 94.945, 94.788,
94.633, 94.475, 94.315, 94.16, 94.002, 93.903, 93.75, 93.589, 93.434, 93.274, 93.118, 92.963, 92.807, 92.648,
92.487, 92.333, 92.18, 92.022, 91.864, 91.711, 91.553, 91.407, 91.252, 91.102, 90.954, 90.806, 90.652, 90.511,
90.354, 90.203, 90.049, 89.89, 89.737, 89.581, 89.422, 89.26, 89.108, 88.949, 88.793, 88.636, 88.48, 88.326,
88.168, 88.01, 87.855, 87.7, 87.548, 87.395, 87.243, 87.088, 86.939, 86.785, 86.635, 86.482, 86.334, 86.185,
86.038, 85.886, 85.666, 85.516, 85.367, 85.217, 85.067, 84.913, 84.766, 84.62, 84.473, 84.322, 84.171, 84.022,
83.871, 83.722, 83.576, 83.429, 83.282, 83.132, 82.981, 82.834, 82.687, 82.524, 82.375, 82.225, 82.072,
81.918, 81.772, 81.618, 81.457, 81.309, 81.154, 80.998, 80.843, 80.694, 80.543, 80.385, 80.237, 80.086,
79.937,
79.785, 79.639, 79.493, 79.355, 79.205, 79.063, 78.922, 78.784, 78.647, 78.517, 78.384, 78.25, 78.119, 77.986,
77.856,
77.741, 77.625, 77.511, 77.403, 77.298, 77.199, 77.065, 76.938, 76.826, 76.707]
cy = [
9.935, 9.788, 9.642, 9.494, 9.342, 9.194, 9.046, 8.896, 8.747, 8.598, 8.451, 8.302, 8.158, 8.012, 7.864,
7.718, 7.569, 7.425, 7.28, 7.132, 6.986, 6.841, 6.693, 6.543, 6.396, 6.246, 6.099, 5.95, 5.801, 5.653, 5.5,
5.351, 5.2, 4.974, 4.821, 4.669, 4.522, 4.373, 4.222, 4.068, 3.918, 3.77, 3.623, 3.472, 3.322, 3.173, 3.025,
2.882, 2.733, 2.583, 2.436, 2.289, 2.144, 1.994, 1.845, 1.695, 1.546, 1.397, 1.245, 1.091, 0.939, 0.791,
0.641, 0.493, 0.346, 0.197, 0.051, -0.102, -0.254, -0.404, -0.553, -0.708, -0.859, -1.012, -1.166, -1.321,
-1.474, -1.628, -1.858, -2.012, -2.164, -2.32, -2.473, -2.626, -2.776, -2.927, -3.078, -3.231, -3.384, -3.535,
-3.686, -3.836, -3.987, -4.136, -4.287, -4.43, -4.58, -4.728, -4.872, -5.013, -5.158, -5.302, -5.442, -5.585,
-5.728, -5.873, -6.015, -6.158, -6.305, -6.447, -6.59, -6.733, -6.877, -7.022, -7.165, -7.307, -7.449, -7.59,
-7.732, -7.871, -8.012, -8.151, -8.29, -8.429, -8.576, -8.718, -8.863, -9.006, -9.153, -9.371, -9.514, -9.657,
-9.789, -9.937, -10.083, -10.229, -10.378, -10.523, -10.668, -10.812, -10.958, -11.103, -11.247, -11.395,
-11.54, -11.689, -11.832, -11.978, -12.121, -12.267, -12.412, -12.559, -12.705, -12.85, -13.006, -13.15,
-13.3, -13.447, -13.593, -13.741, -13.889, -14.033, -14.182, -14.326, -14.474, -14.607, -14.754, -14.903,
-15.051, -15.195, -15.346, -15.491, -15.642, -15.794, -15.945, -16.091, -16.249, -16.401, -16.546, -16.696,
-16.843, -16.986, -17.132, -17.272, -17.413, -17.553, -17.694, -17.839, -17.984, -18.128, -18.271, -18.413,
-18.558, -18.705, -18.857, -19.008, -19.149, -19.293, -19.441, -19.586, -19.73, -19.876, -20.023, -20.169,
-20.317, -20.462, -20.61, -20.763, -20.912, -21.067, -21.225, -21.373, -21.528, -21.675, -21.818, -21.953,
-22.076, -22.203, -22.372, -22.481, -22.601, -22.718, -22.832, -22.95, -23.07, -23.192, -23.315, -23.439,
-23.56, -23.68, -23.799, -23.912, -24.022, -24.132, -24.242, -24.34, -24.435, -24.518, -24.605, -24.686,
-24.761, -24.838, -24.911, -24.978, -25.039, -25.1, -25.154, -25.213, -25.253, -25.307, -25.361, -25.408,
-25.451, -25.493, -25.53, -25.573, -25.62, -25.642, -25.665, -25.683, -25.703, -25.718, -25.732, -25.747,
-25.758, -25.759, -25.769, -25.778, -25.789, -25.799, -25.799, -25.8, -25.8, -25.8, -25.8, -25.807, -25.816,
-25.823, -25.836, -25.841, -25.861, -25.884, -25.908, -25.936, -25.961, -25.99, -26.017, -26.048, -26.084,
-26.118, -26.141, -26.176, -26.213, -26.247, -26.274, -26.299, -26.34, -26.373, -26.403, -26.435, -26.467,
-26.5, -26.532, -26.563, -26.599, -26.624, -26.661, -26.683, -26.715, -26.748, -26.78, -26.813, -26.842,
-26.873, -26.908, -26.943, -26.977, -27.008, -27.043, -27.068, -27.095, -27.133, -27.164, -27.193, -27.224,
-27.255, -27.287, -27.319, -27.348, -27.381, -27.407, -27.448, -27.483, -27.518, -27.55, -27.587, -27.615,
-27.643, -27.673, -27.697, -27.725, -27.753, -27.782, -27.823, -27.849, -27.876, -27.901, -27.931, -27.955,
-27.982, -28.009, -28.036, -28.065, -28.088, -28.117, -28.142, -28.172, -28.201, -28.232, -28.251, -28.278,
-28.304, -28.333, -28.361, -28.38, -28.403, -28.436, -28.464, -28.495, -28.531, -28.558, -28.581, -28.618,
-28.649, -28.679, -28.711, -28.74, -28.769, -28.792, -28.825, -28.851, -28.877, -28.901, -28.931, -28.955,
-28.984, -29.007, -29.039, -29.063, -29.097, -29.129, -29.158, -29.18, -29.206, -29.227, -29.251, -29.28,
-29.304, -29.328, -29.346, -29.369, -29.384, -29.409, -29.426, -29.458, -29.479, -29.499]
target_speed = 3/ 3.6 # [m/s]
T = 500.0 # 最大模拟时间
# 设置车辆的出事状态
yaw=math.radians(450-(347+180-360))
x_car = np.cos(yaw) * 2.3 + float(96.048)
# print('x',x_car)
# north = beidou[15] # 北向位置坐标:以基站为原点的地理坐标系下的北向位置,单位:米,小数点后 3 位
y_car = -np.sin(yaw) * 2.3 + float( 9.935)
# print('yaw_1',yaw)
state = VehicleState(x =96, y=10, yaw = float(yaw), v = 0)
# state = VehicleState(x=89, y=20, yaw=0.0, v=0.0)
lastIndex = len(cx) - 1
time = 0.0
x = [state.x]
# print('x',x)
y = [state.y]
# print('y',y)
yaw = [state.yaw]
v = [state.v]
t = [0.0]
target_ind = calc_target_index(state, cx, cy)
while lastIndex > target_ind:
ai = PControl(target_speed, state.v)
di, target_ind = pure_pursuit_control(state, cx, cy, target_ind)
# fxp=int(di*57.3*18)
# print('fxp1',fxp)
state = update(state, ai, di)
time = time + dt
x.append(state.x)
x1=x[-1]
# print('x1',x[-1])
y.append(state.y)
y1=y[-1]
# print('y1',y[-1])
yaw.append(state.yaw)
yaw1=yaw[-1]
# print('yaw',yaw[-1])
v.append(state.v)
# print('v',v[-1])
t.append(time)
# logger.add('file.log')
# logger.debug('角度 {},y {},x {}',str(yaw1),str(y1),str(x1))
# f = open('data1,txt', 'a')
# # print('fff')
# f.write("角度"+str(yaw1))
# f.write('\n')
# f.write("\n")
# f.close()
plt.cla()
plt.plot(cx, cy, ".r", label="course")
plt.plot(x, y, "-b", label="trajectory")
plt.plot(cx[target_ind], cy[target_ind], "go", label="target")
plt.axis("equal")
plt.grid(True)
plt.title("Speed[km/h]:" + str(state.v * 3.6)[:4])
plt.pause(0.001)
plt.ioff()
plt.show()
if __name__ == '__main__':
main()
# t1 = threading.Thread(target=test5.can165) # 读取eps状态
# t2 = threading.Thread(target=test5.can0a5) # 读取目前方向盘角度
# t3 = threading.Thread(target=test5.main)
# t4 = threading.Thread(target=test5.update)
t5 = threading.Thread(target=main)
t8=threading.Thread(target=CUR.calculate_curvature)
# t6 = threading.Thread(target=tcp4.zuo_biao)
# t7=threading.Thread(target=txt2.txt)
#
# # 启动线程
# t7.start()
t5.start()
# t6.start()
# t1.start()
# t2.start()
# t3.start()
# t4.start()