Compare commits
No commits in common. 'master' and 'a97d7f47e990df83d623679e8446288a2b56cd62' have entirely different histories.
master
...
a97d7f47e9
@ -1,3 +0,0 @@
|
|||||||
# 默认忽略的文件
|
|
||||||
/shelf/
|
|
||||||
/workspace.xml
|
|
@ -1,23 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<profile version="1.0">
|
|
||||||
<option name="myName" value="Project Default" />
|
|
||||||
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
|
|
||||||
<option name="ignoredErrors">
|
|
||||||
<list>
|
|
||||||
<option value="N801" />
|
|
||||||
<option value="N806" />
|
|
||||||
<option value="N802" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</inspection_tool>
|
|
||||||
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
|
||||||
<option name="ignoredIdentifiers">
|
|
||||||
<list>
|
|
||||||
<option value="float.*" />
|
|
||||||
<option value="int.__getitem__" />
|
|
||||||
<option value="int.*" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</inspection_tool>
|
|
||||||
</profile>
|
|
||||||
</component>
|
|
@ -1,6 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<settings>
|
|
||||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
|
||||||
<version value="1.0" />
|
|
||||||
</settings>
|
|
||||||
</component>
|
|
@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (pycharm) (2)" project-jdk-type="Python SDK" />
|
|
||||||
</project>
|
|
@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectModuleManager">
|
|
||||||
<modules>
|
|
||||||
<module fileurl="file://$PROJECT_DIR$/.idea/pure_自适应.iml" filepath="$PROJECT_DIR$/.idea/pure_自适应.iml" />
|
|
||||||
</modules>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module type="PYTHON_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager">
|
|
||||||
<content url="file://$MODULE_DIR$" />
|
|
||||||
<orderEntry type="jdk" jdkName="Python 3.8 (pycharm) (2)" jdkType="Python SDK" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="NimToolchainService">
|
|
||||||
<option name="rootPaths">
|
|
||||||
<list />
|
|
||||||
</option>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
@ -0,0 +1,7 @@
|
|||||||
|
# NC=30
|
||||||
|
# for p in range(NC):
|
||||||
|
# print('p', p)
|
||||||
|
# for q in range(p + 1):
|
||||||
|
# print('q', q)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,272 @@
|
|||||||
|
import time
|
||||||
|
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import numpy as np
|
||||||
|
from math import *
|
||||||
|
from cvxopt import matrix, solvers
|
||||||
|
|
||||||
|
|
||||||
|
class MPC:
|
||||||
|
def __init__(self):
|
||||||
|
self.Np = 60 # 预测步长
|
||||||
|
self.Nc = 30 # 控制步长
|
||||||
|
|
||||||
|
self.dt = 0.1 # 时间间隔
|
||||||
|
self.Length = 1.0 # 车辆轴距
|
||||||
|
|
||||||
|
max_steer = 30 * pi / 180 # 最大方向盘打角
|
||||||
|
max_steer_v = 15 * pi / 180 # 最大方向盘打角速度
|
||||||
|
max_v = 8.7 # 最大车速
|
||||||
|
max_a = 1.0 # 最大加速度
|
||||||
|
|
||||||
|
# 目标函数相关矩阵
|
||||||
|
self.Q =150* np.identity(3 * self.Np) # 位姿权重 100为权重
|
||||||
|
print('S',self.Q)
|
||||||
|
self.R = 100 * np.identity(2 * self.Nc) # 控制权重
|
||||||
|
print('r',self.R)
|
||||||
|
|
||||||
|
self.kesi = np.zeros((5, 1))
|
||||||
|
print('kesi',self.kesi)
|
||||||
|
|
||||||
|
self.A = np.identity(5)
|
||||||
|
print('A',self.A)
|
||||||
|
|
||||||
|
self.B = np.block([
|
||||||
|
[np.zeros((3, 2))],
|
||||||
|
[np.identity(2)]
|
||||||
|
])
|
||||||
|
print('B',self.B)
|
||||||
|
|
||||||
|
self.C = np.block([
|
||||||
|
[np.identity(3), np.zeros((3, 2))]
|
||||||
|
])
|
||||||
|
print(self.C)
|
||||||
|
self.PHI = np.zeros((3 * self.Np, 5))
|
||||||
|
self.THETA = np.zeros((3 * self.Np, 2 * self.Nc))
|
||||||
|
|
||||||
|
self.CA = (self.Np + 1) * [self.C]
|
||||||
|
# print(self.CA)
|
||||||
|
self.H = np.zeros((2 * self.Nc, 2 * self.Nc))
|
||||||
|
|
||||||
|
self.f = np.zeros((2 * self.Nc, 1))
|
||||||
|
|
||||||
|
# 不等式约束相关矩阵
|
||||||
|
A_t = np.zeros((self.Nc, self.Nc))
|
||||||
|
for p in range(self.Nc):
|
||||||
|
# print('p',p)
|
||||||
|
for q in range(p + 1):
|
||||||
|
# print('q', q)
|
||||||
|
|
||||||
|
A_t[p][q] = 1
|
||||||
|
|
||||||
|
|
||||||
|
A_I = np.kron(A_t, np.identity(2))
|
||||||
|
# print(A_I)
|
||||||
|
# 控制量约束
|
||||||
|
umin = np.array([[-max_v], [-max_steer]])
|
||||||
|
print(umin)
|
||||||
|
umax = np.array([[max_v], [max_steer]])
|
||||||
|
self.Umin = np.kron(np.ones((self.Nc, 1)), umin)
|
||||||
|
self.Umax = np.kron(np.ones((self.Nc, 1)), umax)
|
||||||
|
|
||||||
|
# 控制增量约束
|
||||||
|
delta_umin = np.array([[-max_a * self.dt], [-max_steer_v * self.dt]])
|
||||||
|
delta_umax = np.array([[max_a * self.dt], [max_steer_v * self.dt]])
|
||||||
|
delta_Umin = np.kron(np.ones((self.Nc, 1)), delta_umin)
|
||||||
|
delta_Umax = np.kron(np.ones((self.Nc, 1)), delta_umax)
|
||||||
|
|
||||||
|
self.A_cons = np.zeros((2 * 2 * self.Nc, 2 * self.Nc))
|
||||||
|
self.A_cons[0:2 * self.Nc, 0:2 * self.Nc] = A_I
|
||||||
|
self.A_cons[2 * self.Nc:4 * self.Nc, 0:2 * self.Nc] = np.identity(2 * self.Nc)
|
||||||
|
|
||||||
|
self.lb_cons = np.zeros((2 * 2 * self.Nc, 1))
|
||||||
|
self.lb_cons[2 * self.Nc:4 * self.Nc, 0:1] = delta_Umin
|
||||||
|
|
||||||
|
self.ub_cons = np.zeros((2 * 2 * self.Nc, 1))
|
||||||
|
self.ub_cons[2 * self.Nc:4 * self.Nc, 0:1] = delta_Umax
|
||||||
|
|
||||||
|
def mpcControl(self, x, y, yaw, v, angle, tar_x, tar_y, tar_yaw, tar_v, tar_angle): # mpc优化控制
|
||||||
|
T = self.dt
|
||||||
|
L = self.Length
|
||||||
|
|
||||||
|
# 更新误差
|
||||||
|
self.kesi[0][0] = x - tar_x
|
||||||
|
print('1,0',self.kesi[0][0])
|
||||||
|
self.kesi[1][0] = y - tar_y
|
||||||
|
self.kesi[2][0] = self.normalizeTheta(yaw - tar_yaw)
|
||||||
|
self.kesi[3][0] = v - tar_v
|
||||||
|
self.kesi[4][0] = angle - tar_angle
|
||||||
|
|
||||||
|
# 更新A矩阵
|
||||||
|
self.A[0][2] = -tar_v * sin(tar_yaw) * T
|
||||||
|
self.A[0][3] = cos(tar_yaw) * T
|
||||||
|
self.A[1][2] = tar_v * cos(tar_yaw) * T
|
||||||
|
self.A[1][3] = sin(tar_yaw) * T
|
||||||
|
self.A[2][3] = tan(tar_angle) * T / L
|
||||||
|
self.A[2][4] = tar_v * T / (L * (cos(tar_angle) ** 2))
|
||||||
|
|
||||||
|
# 更新B矩阵
|
||||||
|
self.B[0][0] = cos(tar_yaw) * T
|
||||||
|
self.B[1][0] = sin(tar_yaw) * T
|
||||||
|
self.B[2][0] = tan(tar_angle) * T / L
|
||||||
|
self.B[2][1] = tar_v * T / (L * (cos(tar_angle) ** 2))
|
||||||
|
|
||||||
|
# 更新CA
|
||||||
|
for i in range(1, self.Np + 1):
|
||||||
|
self.CA[i] = np.dot(self.CA[i - 1], self.A)
|
||||||
|
|
||||||
|
# 更新PHI和THETA
|
||||||
|
for j in range(self.Np):
|
||||||
|
self.PHI[3 * j:3 * (j + 1), 0:5] = self.CA[j + 1]
|
||||||
|
for k in range(min(self.Nc, j + 1)):
|
||||||
|
self.THETA[3 * j:3 * (j + 1), 2 * k: 2 * (k + 1)
|
||||||
|
] = np.dot(self.CA[j - k], self.B)
|
||||||
|
|
||||||
|
# 更新H
|
||||||
|
self.H = np.dot(np.dot(self.THETA.transpose(), self.Q),
|
||||||
|
self.THETA) + self.R
|
||||||
|
|
||||||
|
# 更新f
|
||||||
|
self.f = 2 * np.dot(np.dot(self.THETA.transpose(), self.Q),
|
||||||
|
np.dot(self.PHI, self.kesi))
|
||||||
|
|
||||||
|
# 更新约束
|
||||||
|
Ut = np.kron(np.ones((self.Nc, 1)), np.array([[v], [angle]]))
|
||||||
|
self.lb_cons[0:2 * self.Nc, 0:1] = self.Umin - Ut
|
||||||
|
self.ub_cons[0:2 * self.Nc, 0:1] = self.Umax - Ut
|
||||||
|
|
||||||
|
# 求解QP
|
||||||
|
P = matrix(self.H)
|
||||||
|
q = matrix(self.f)
|
||||||
|
G = matrix(np.block([
|
||||||
|
[self.A_cons],
|
||||||
|
[-self.A_cons]
|
||||||
|
]))
|
||||||
|
h = matrix(np.block([
|
||||||
|
[self.ub_cons],
|
||||||
|
[-self.lb_cons]
|
||||||
|
]))
|
||||||
|
|
||||||
|
solvers.options['show_progress'] = False
|
||||||
|
sol = solvers.qp(P, q, G, h)
|
||||||
|
X = sol['x']
|
||||||
|
|
||||||
|
# 输出结果
|
||||||
|
v += X[0]
|
||||||
|
angle += X[1]
|
||||||
|
|
||||||
|
return v, angle
|
||||||
|
|
||||||
|
def normalizeTheta(self, angle): # 角度归一化
|
||||||
|
while (angle >= pi):
|
||||||
|
angle -= 2 * pi
|
||||||
|
|
||||||
|
while (angle < -pi):
|
||||||
|
angle += 2 * pi
|
||||||
|
|
||||||
|
return angle
|
||||||
|
|
||||||
|
def findIdx(self, x, y, cx, cy): # 寻找欧式距离最近的点
|
||||||
|
min_dis = float('inf')
|
||||||
|
idx = 0
|
||||||
|
|
||||||
|
for i in range(len(cx)):
|
||||||
|
dx = x - cx[i]
|
||||||
|
dy = y - cy[i]
|
||||||
|
dis = dx ** 2 + dy ** 2
|
||||||
|
if (dis < min_dis):
|
||||||
|
min_dis = dis
|
||||||
|
idx = i
|
||||||
|
|
||||||
|
return idx
|
||||||
|
|
||||||
|
def update(self, x, y, yaw, v, angle): # 模拟车辆位置
|
||||||
|
x += v * cos(yaw) * self.dt
|
||||||
|
y += v * sin(yaw) * self.dt
|
||||||
|
yaw += v / self.Length * tan(angle) * self.dt
|
||||||
|
|
||||||
|
return x, y, yaw
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
cx = np.linspace(0, 200, 2000)
|
||||||
|
cy = np.zeros(len(cx))
|
||||||
|
dx = np.zeros(len(cx))
|
||||||
|
ddx = np.zeros(len(cy))
|
||||||
|
cyaw = np.zeros(len(cx))
|
||||||
|
ck = np.zeros(len(cx))
|
||||||
|
|
||||||
|
for i in range(len(cx)):
|
||||||
|
cy[i] = cos(cx[i] / 10) * cx[i] / 10
|
||||||
|
|
||||||
|
# 计算一阶导数
|
||||||
|
for i in range(len(cx) - 1):
|
||||||
|
dx[i] = (cy[i + 1] - cy[i]) / (cx[i + 1] - cx[i])
|
||||||
|
dx[len(cx) - 1] = dx[len(cx) - 2]
|
||||||
|
|
||||||
|
# 计算二阶导数
|
||||||
|
for i in range(len(cx) - 2):
|
||||||
|
ddx[i] = (cy[i + 2] - 2 * cy[i + 1] + cy[i]) / (0.5 * (cx[i + 2] - cx[i])) ** 2
|
||||||
|
ddx[len(cx) - 2] = ddx[len(cx) - 3]
|
||||||
|
ddx[len(cx) - 1] = ddx[len(cx) - 2]
|
||||||
|
|
||||||
|
# 计算偏航角
|
||||||
|
for i in range(len(cx)):
|
||||||
|
cyaw[i] = atan(dx[i])
|
||||||
|
|
||||||
|
# 计算曲率
|
||||||
|
for i in range(len(cx)):
|
||||||
|
ck[i] = ddx[i] / (1 + dx[i] ** 2) ** 1.5
|
||||||
|
|
||||||
|
# 初始状态
|
||||||
|
x = 0.0
|
||||||
|
y = 5.0
|
||||||
|
yaw = 0.0
|
||||||
|
v = 0.0
|
||||||
|
angle = 0.0
|
||||||
|
t = 0
|
||||||
|
|
||||||
|
# 历史状态
|
||||||
|
xs = [x]
|
||||||
|
ys = [y]
|
||||||
|
vs = [v]
|
||||||
|
angles = [angle]
|
||||||
|
ts = [t]
|
||||||
|
|
||||||
|
# 实例化
|
||||||
|
mpc = MPC()
|
||||||
|
|
||||||
|
while (1):
|
||||||
|
idx = mpc.findIdx(x, y, cx, cy)
|
||||||
|
if (idx == len(cx) - 1):
|
||||||
|
break
|
||||||
|
|
||||||
|
tar_v = 80 / 3.6
|
||||||
|
tar_angle = atan(mpc.Length * ck[idx])
|
||||||
|
|
||||||
|
(v, angle) = mpc.mpcControl(x, y, yaw, v, angle,
|
||||||
|
cx[idx], cy[idx], cyaw[idx], tar_v, tar_angle)
|
||||||
|
|
||||||
|
(x, y, yaw) = mpc.update(x, y, yaw, v, angle)
|
||||||
|
|
||||||
|
# 保存状态
|
||||||
|
xs.append(x)
|
||||||
|
ys.append(y)
|
||||||
|
vs.append(v)
|
||||||
|
angles.append(angle)
|
||||||
|
t = t + 0.1
|
||||||
|
ts.append(t)
|
||||||
|
|
||||||
|
# 显示
|
||||||
|
plt.plot(cx, cy)
|
||||||
|
plt.scatter(xs, ys, c='r', marker='*')
|
||||||
|
plt.pause(0.01) # 暂停0.01秒
|
||||||
|
plt.clf()
|
||||||
|
|
||||||
|
|
||||||
|
# plt.close()
|
||||||
|
# plt.subplot(2, 1, 1)
|
||||||
|
# plt.plot(ts, vs)
|
||||||
|
# plt.subplot(2, 1, 2)
|
||||||
|
# plt.plot(ts, angles)
|
||||||
|
# plt.show()
|
@ -0,0 +1,76 @@
|
|||||||
|
import numpy as np
|
||||||
|
import scipy.linalg
|
||||||
|
from cvxopt import solvers, matrix
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
|
A = np.array([[1, 1], [-1, 2]])
|
||||||
|
n = A.shape[0]
|
||||||
|
|
||||||
|
B = np.array([[1, 1], [1, 2]])
|
||||||
|
p = B.shape[1]
|
||||||
|
|
||||||
|
Q = np.array([[1, 0], [0, 1]])
|
||||||
|
F = np.array([[1, 0], [0, 1]])
|
||||||
|
R = np.array([[1, 0], [0, 0.1]])
|
||||||
|
|
||||||
|
k_steps = 100
|
||||||
|
|
||||||
|
X_k = np.zeros((n, k_steps))
|
||||||
|
|
||||||
|
X_k[:, 0] = [10, -10]
|
||||||
|
|
||||||
|
U_k = np.zeros((p, k_steps))
|
||||||
|
|
||||||
|
N = 5
|
||||||
|
|
||||||
|
|
||||||
|
def cal_matrices(A, B, Q, R, F, N):
|
||||||
|
n = A.shape[0]
|
||||||
|
p = B.shape[1]
|
||||||
|
|
||||||
|
M = np.vstack((np.eye((n)), np.zeros((N * n, n))))
|
||||||
|
C = np.zeros(((N + 1) * n, N * p))
|
||||||
|
tmp = np.eye(n)
|
||||||
|
|
||||||
|
for i in range(N):
|
||||||
|
rows = i * n + n
|
||||||
|
C[rows:rows + n, :] = np.hstack((np.dot(tmp, B), C[rows - n:rows, 0:(N - 1) * p]))
|
||||||
|
tmp = np.dot(A, tmp)
|
||||||
|
M[rows:rows + n, :] = tmp
|
||||||
|
|
||||||
|
Q_bar_be = np.kron(np.eye(N), Q)
|
||||||
|
Q_bar = scipy.linalg.block_diag(Q_bar_be, F)
|
||||||
|
R_bar = np.kron(np.eye(N), R)
|
||||||
|
|
||||||
|
G = np.matmul(np.matmul(M.transpose(), Q_bar), M)
|
||||||
|
E = np.matmul(np.matmul(C.transpose(), Q_bar), M)
|
||||||
|
H = np.matmul(np.matmul(C.transpose(), Q_bar), C) + R_bar
|
||||||
|
|
||||||
|
return H, E
|
||||||
|
|
||||||
|
|
||||||
|
def Prediction(M, T):
|
||||||
|
sol = solvers.qp(M, T)
|
||||||
|
U_thk = np.array(sol["x"])
|
||||||
|
u_k = U_thk[0:2, :]
|
||||||
|
|
||||||
|
return u_k
|
||||||
|
|
||||||
|
|
||||||
|
M, C = cal_matrices(A, B, Q, R, F, N)
|
||||||
|
M = matrix(M)
|
||||||
|
|
||||||
|
for k in range(1, k_steps):
|
||||||
|
x_kshort = X_k[:, k - 1].reshape(2, 1)
|
||||||
|
u_kshort = U_k[:, k - 1].reshape(2, 1)
|
||||||
|
T = np.dot(C, x_kshort)
|
||||||
|
T = matrix(T)
|
||||||
|
for i in range(2):
|
||||||
|
U_k[i:, k - 1] = Prediction(M, T)[i, 0]
|
||||||
|
|
||||||
|
X_knew = np.dot(A, x_kshort) + np.dot(B, u_kshort)
|
||||||
|
|
||||||
|
for j in range(2):
|
||||||
|
X_k[j:, k] = X_knew[j, 0]
|
||||||
|
|
||||||
|
print(X_k)
|
@ -1,48 +0,0 @@
|
|||||||
import math
|
|
||||||
|
|
||||||
A = [100.012, -9.789]
|
|
||||||
C = [100.076, -10.083]
|
|
||||||
B = [100.043, -9.937]
|
|
||||||
s = abs((A[0] * B[1] + B[0] * C[1] + C[0] * A[1] - A[1] * B[0] - B[1] * C[0] - C[1] * 1) / 2)
|
|
||||||
print('s',s)
|
|
||||||
a = abs(math.sqrt(abs(A[0] - C[0]) ** 2) + abs((A[1] - C[1]) ** 2))
|
|
||||||
print('a',a)
|
|
||||||
b = abs(math.sqrt(abs(B[0] - C[0]) ** 2) + abs((B[1] - C[1]) ** 2))
|
|
||||||
print('b',b)
|
|
||||||
c = abs(math.sqrt(a ** 2 + b ** 2))
|
|
||||||
print('c',c)
|
|
||||||
k = 4 * s / (a * b * c)
|
|
||||||
print(k)
|
|
||||||
|
|
||||||
# import numpy as np
|
|
||||||
# def get_arc_curve(pts):
|
|
||||||
# '''
|
|
||||||
# 获取弧度值
|
|
||||||
# :param pts:
|
|
||||||
# :return:
|
|
||||||
# '''
|
|
||||||
#
|
|
||||||
# # 计算弦长
|
|
||||||
# start = np.array(pts[0])
|
|
||||||
# end = np.array(pts[len(pts) - 1])
|
|
||||||
# l_arc = np.sqrt(np.sum(np.power(end - start, 2)))
|
|
||||||
#
|
|
||||||
# # 计算弧上的点到直线的最大距离
|
|
||||||
# # 计算公式:\frac{1}{2a}\sqrt{(a+b+c)(a+b-c)(a+c-b)(b+c-a)}
|
|
||||||
# a = l_arc
|
|
||||||
# b = np.sqrt(np.sum(np.power(pts - start, 2), axis=1))
|
|
||||||
# c = np.sqrt(np.sum(np.power(pts - end, 2), axis=1))
|
|
||||||
# dist = np.sqrt((a + b + c) * (a + b - c) * (a + c - b) * (b + c - a)) / (2 * a)
|
|
||||||
# h = dist.max()
|
|
||||||
#
|
|
||||||
# # 计算曲率
|
|
||||||
# r = ((a * a) / 4 + h * h) / (2 * h)
|
|
||||||
#
|
|
||||||
# return r
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# if __name__ == '__main__':
|
|
||||||
# x = np.linspace(1, 100, 99).astype(np.int64)
|
|
||||||
# y = (x ** 2)
|
|
||||||
# xy = list(zip(x, y)) # list of points in 2D space
|
|
||||||
# print(get_arc_curve(xy))
|
|
@ -1,134 +0,0 @@
|
|||||||
import sqlite3
|
|
||||||
import time
|
|
||||||
def init():
|
|
||||||
gear_cmd = 0
|
|
||||||
auto_acc=0
|
|
||||||
brk_open=0
|
|
||||||
brk_change=0
|
|
||||||
stop=0
|
|
||||||
db_file = "geardb.db"
|
|
||||||
conn = sqlite3.connect(db_file)
|
|
||||||
cur = conn.cursor()
|
|
||||||
# sql='INSERT INTO geardb(id) VALUES(1);'
|
|
||||||
sql = "update geardb set gear_cmd='%s',auto_acc='%s',brk_open='%s',brk_change='%s' ,stop='%s'WHERE id = 1"%(
|
|
||||||
gear_cmd,auto_acc,brk_open,brk_change,stop)
|
|
||||||
cur.execute(sql)
|
|
||||||
conn.commit()
|
|
||||||
cur.close()
|
|
||||||
conn.close()
|
|
||||||
def gear_p():
|
|
||||||
print('P')
|
|
||||||
gear_cmd = 1
|
|
||||||
auto_acc=0
|
|
||||||
db_file = "geardb.db"
|
|
||||||
conn = sqlite3.connect(db_file)
|
|
||||||
cur = conn.cursor()
|
|
||||||
# sql='INSERT INTO geardb(id) VALUES(1);'
|
|
||||||
sql = "update geardb set gear_cmd='%s',auto_acc='%s' WHERE id = 1"%(gear_cmd,auto_acc)
|
|
||||||
cur.execute(sql)
|
|
||||||
conn.commit()
|
|
||||||
cur.close()
|
|
||||||
conn.close()
|
|
||||||
|
|
||||||
def gear_n():
|
|
||||||
print('N')
|
|
||||||
gear_cmd = 3 # n
|
|
||||||
auto_acc=0
|
|
||||||
db_file = "geardb.db"
|
|
||||||
conn = sqlite3.connect(db_file)
|
|
||||||
cur = conn.cursor()
|
|
||||||
# sql='INSERT INTO geardb(id) VALUES(1);'
|
|
||||||
sql = "update geardb set gear_cmd='%s',auto_acc='%s' WHERE id = 1"%(gear_cmd,auto_acc)
|
|
||||||
cur.execute(sql)
|
|
||||||
conn.commit()
|
|
||||||
cur.close()
|
|
||||||
conn.close()
|
|
||||||
def gear_r():
|
|
||||||
gear_cmd = 2 # r
|
|
||||||
print('r')
|
|
||||||
auto_acc = input("请输入油门深度:")
|
|
||||||
db_file = "geardb.db"
|
|
||||||
conn = sqlite3.connect(db_file)
|
|
||||||
cur = conn.cursor()
|
|
||||||
# sql='INSERT INTO geardb(id) VALUES(1);'
|
|
||||||
sql = "update geardb set gear_cmd='%s',auto_acc='%s' WHERE id = 1"%(gear_cmd,auto_acc)
|
|
||||||
cur.execute(sql)
|
|
||||||
conn.commit()
|
|
||||||
cur.close()
|
|
||||||
conn.close()
|
|
||||||
def gear_d():
|
|
||||||
gear_cmd = 4 # r
|
|
||||||
print('d')
|
|
||||||
auto_acc = input("请输入油门深度:")
|
|
||||||
db_file = "geardb.db"
|
|
||||||
conn = sqlite3.connect(db_file)
|
|
||||||
cur = conn.cursor()
|
|
||||||
# sql='INSERT INTO geardb(id) VALUES(1);'
|
|
||||||
sql = "update geardb set gear_cmd='%s',auto_acc='%s' WHERE id = 1"%(gear_cmd,auto_acc)
|
|
||||||
cur.execute(sql)
|
|
||||||
conn.commit()
|
|
||||||
cur.close()
|
|
||||||
conn.close()
|
|
||||||
def shache():
|
|
||||||
brk_open = 30
|
|
||||||
brk_change=1
|
|
||||||
db_file = "geardb.db"
|
|
||||||
conn = sqlite3.connect(db_file)
|
|
||||||
cur = conn.cursor()
|
|
||||||
# sql='INSERT INTO geardb(id) VALUES(1);'
|
|
||||||
sql = "update geardb set brk_open='%s',brk_change='%s' WHERE id = 1"%(brk_open,brk_change)
|
|
||||||
cur.execute(sql)
|
|
||||||
conn.commit()
|
|
||||||
cur.close()
|
|
||||||
conn.close()
|
|
||||||
def shache2():
|
|
||||||
brk_change=0
|
|
||||||
db_file = "geardb.db"
|
|
||||||
conn = sqlite3.connect(db_file)
|
|
||||||
cur = conn.cursor()
|
|
||||||
# sql='INSERT INTO geardb(id) VALUES(1);'
|
|
||||||
sql = "update geardb set brk_change='%s' WHERE id = 1"%brk_change
|
|
||||||
cur.execute(sql)
|
|
||||||
conn.commit()
|
|
||||||
cur.close()
|
|
||||||
conn.close()
|
|
||||||
def stop():
|
|
||||||
stop=1
|
|
||||||
db_file = "geardb.db"
|
|
||||||
conn = sqlite3.connect(db_file)
|
|
||||||
cur = conn.cursor()
|
|
||||||
# sql='INSERT INTO geardb(id) VALUES(1);'
|
|
||||||
sql = "update geardb set stop='%s' WHERE id = 1"%stop
|
|
||||||
cur.execute(sql)
|
|
||||||
conn.commit()
|
|
||||||
cur.close()
|
|
||||||
conn.close()
|
|
||||||
def main():
|
|
||||||
while True:
|
|
||||||
gear_change = int(input('请输入档位:\n'
|
|
||||||
'1:P档\n'
|
|
||||||
'2:R档\n'
|
|
||||||
'3:N档\n'
|
|
||||||
'4:D档\n'
|
|
||||||
'5:刹车\n'
|
|
||||||
'6:紧急停止\n'))
|
|
||||||
if gear_change==1:
|
|
||||||
gear_p()
|
|
||||||
elif gear_change==3:
|
|
||||||
gear_n()
|
|
||||||
elif gear_change==2:
|
|
||||||
gear_r()
|
|
||||||
elif gear_change==4:
|
|
||||||
gear_d()
|
|
||||||
elif gear_change==5:
|
|
||||||
shache()
|
|
||||||
time.sleep(0.1)
|
|
||||||
shache2()
|
|
||||||
elif gear_change==6:
|
|
||||||
stop()
|
|
||||||
|
|
||||||
else:
|
|
||||||
print('请重新输入')
|
|
||||||
if __name__=='__main__':
|
|
||||||
init()
|
|
||||||
main()
|
|
Loading…
Reference in New Issue