2024-06-05 16:07:32 +08:00
|
|
|
|
2024-05-29 21:23:05 +08:00
|
|
|
import zmq
|
|
|
|
|
import time
|
|
|
|
|
from loguru import logger
|
2024-06-02 17:49:52 +08:00
|
|
|
import utils
|
2024-06-14 15:11:17 +08:00
|
|
|
from utils import PidWrap
|
2024-05-22 12:37:15 +08:00
|
|
|
|
|
|
|
|
class main_task():
|
2024-05-29 21:23:05 +08:00
|
|
|
def __init__(self,by_cmd):
|
|
|
|
|
self.context = zmq.Context()
|
|
|
|
|
self.socket = self.context.socket(zmq.REQ)
|
|
|
|
|
self.socket.connect("tcp://localhost:6666")
|
2024-05-22 12:37:15 +08:00
|
|
|
|
|
|
|
|
# 赛道回归相关
|
|
|
|
|
self.x = 0
|
|
|
|
|
self.y = 0
|
|
|
|
|
self.error_counts = 0
|
|
|
|
|
self.lane_error = 0
|
|
|
|
|
|
|
|
|
|
# 车控制对象初始化
|
2024-05-29 21:23:05 +08:00
|
|
|
self.by_cmd = by_cmd
|
2024-05-22 12:37:15 +08:00
|
|
|
|
|
|
|
|
# 转向 pid
|
2024-06-12 20:33:32 +08:00
|
|
|
# self.pid1 = PidWrap(0.5, 0, 0, output_limits=55) # 1.2
|
2024-06-14 11:18:50 +08:00
|
|
|
self.pid1 = PidWrap(1.2, 0, 0, output_limits=50) # 1.2
|
2024-05-22 12:37:15 +08:00
|
|
|
self.pid1.set_target(0)
|
|
|
|
|
|
|
|
|
|
def parse_data(self,data):
|
|
|
|
|
if data.get('code') == 0:
|
2024-05-29 21:23:05 +08:00
|
|
|
self.x += data.get('data')[0]
|
|
|
|
|
self.y += data.get('data')[1]
|
|
|
|
|
self.error_counts += 1
|
2024-05-22 12:37:15 +08:00
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
pass
|
2024-06-02 17:49:52 +08:00
|
|
|
|
|
|
|
|
|
2024-05-22 12:37:15 +08:00
|
|
|
def run(self):
|
|
|
|
|
# 运行巡线任务
|
|
|
|
|
self.lane_task()
|
2024-06-02 17:49:52 +08:00
|
|
|
|
|
|
|
|
def lane_ntask(self):
|
|
|
|
|
# time.sleep(0.002)
|
|
|
|
|
# self.socket.send_string("")
|
|
|
|
|
# resp = self.socket.recv_pyobj()
|
|
|
|
|
# return resp.get('data')[0] - 160
|
|
|
|
|
pass
|
2024-05-22 12:37:15 +08:00
|
|
|
def lane_task(self):
|
|
|
|
|
# TODO 巡航参数从配置文件中读取
|
2024-05-29 21:23:05 +08:00
|
|
|
time.sleep(0.002)
|
2024-05-22 12:37:15 +08:00
|
|
|
if self.error_counts > 2:
|
|
|
|
|
self.x = self.x / 3
|
|
|
|
|
self.y = self.y / 3
|
|
|
|
|
self.lane_error = self.x - 160
|
2024-06-02 17:49:52 +08:00
|
|
|
utils.lane_error = self.lane_error # 赋全局变量
|
2024-05-22 12:37:15 +08:00
|
|
|
self.error_counts = 0
|
|
|
|
|
self.x = 0
|
|
|
|
|
self.y = 0
|
2024-05-29 21:23:05 +08:00
|
|
|
error_abs = abs(self.lane_error)
|
2024-06-12 20:33:32 +08:00
|
|
|
|
|
|
|
|
if error_abs > 50:
|
2024-06-14 11:18:50 +08:00
|
|
|
speed = 15
|
2024-06-12 20:33:32 +08:00
|
|
|
elif error_abs > 45:
|
2024-06-14 11:18:50 +08:00
|
|
|
speed = 15
|
2024-05-29 21:23:05 +08:00
|
|
|
elif error_abs > 35:
|
2024-06-14 11:18:50 +08:00
|
|
|
speed = 15
|
2024-06-09 21:54:22 +08:00
|
|
|
elif error_abs > 25:
|
2024-06-09 22:31:32 +08:00
|
|
|
speed = 15
|
2024-06-09 21:54:22 +08:00
|
|
|
elif error_abs > 15:
|
2024-06-09 22:31:32 +08:00
|
|
|
speed = 15
|
2024-05-22 12:37:15 +08:00
|
|
|
else:
|
2024-06-12 20:33:32 +08:00
|
|
|
speed = 18
|
|
|
|
|
|
|
|
|
|
# lane_model initial
|
|
|
|
|
# if error_abs > 50:
|
|
|
|
|
# speed = 10
|
|
|
|
|
# elif error_abs > 45:
|
|
|
|
|
# speed = 11
|
|
|
|
|
# elif error_abs > 35:
|
|
|
|
|
# speed = 13
|
|
|
|
|
# elif error_abs > 25:
|
|
|
|
|
# speed = 15
|
|
|
|
|
# elif error_abs > 15:
|
|
|
|
|
# speed = 15
|
|
|
|
|
# else:
|
|
|
|
|
# speed = 18
|
|
|
|
|
|
2024-06-07 20:08:41 +08:00
|
|
|
if utils.task_speed != 0:
|
|
|
|
|
speed = utils.task_speed
|
|
|
|
|
self.by_cmd.send_speed_x(speed)
|
2024-06-02 17:49:52 +08:00
|
|
|
# pid_out = self.pid1.get(self.lane_error*0.65)
|
2024-06-09 21:54:22 +08:00
|
|
|
pid_out = self.pid1.get(self.lane_error)
|
|
|
|
|
# pid_out = -pid_out
|
|
|
|
|
# logger.debug(f"err={self.lane_error}, pwm out={pid_out}")
|
2024-05-29 21:23:05 +08:00
|
|
|
self.by_cmd.send_speed_omega(pid_out)
|
2024-06-05 16:07:32 +08:00
|
|
|
|
2024-05-29 21:23:05 +08:00
|
|
|
self.socket.send_string("")
|
|
|
|
|
resp = self.socket.recv_pyobj()
|
|
|
|
|
# logger.info(resp)
|
|
|
|
|
self.parse_data(resp)
|