Compare commits

..

7 Commits

Author SHA1 Message Date
bmy
5aef09bb63 国赛出发前版本
fix: 补充 action 列表检查
pref: 修改 BBALL offset 值 (未同步到其他备份 subtask.py 中)
套用8822参数
2024-08-17 22:18:49 +08:00
bmy
7dd0d6677e update: 更新891/8822/raw的subtask文件 2024-08-17 01:59:00 +08:00
bmy
91d6491f64 暂存
fix: 修复task多次开启问题
feat: 新增 891 参数(医院停早,红球靠外)
pref: 弃用 action 类
2024-08-17 01:40:07 +08:00
bmy
7ae8162da7 pref: 扫黑除暴动作修改 2024-08-12 14:56:20 +08:00
bmy
18154917a1 新建8822参数 2024-08-10 17:41:11 +08:00
bmy
7e3e280257 补交raw参数更改 2024-08-08 22:23:57 +08:00
bmy
4f2103d984 pref: subtask_raw 击打动作优化 2024-08-08 22:18:06 +08:00
13 changed files with 4014 additions and 325 deletions

View File

@@ -13,15 +13,19 @@ move = None
axis = None
cmd = None
action_run_flag = None
cfg = toml.load('/home/evan/Workplace/project_main/cfg_action.toml')
def import_obj(_bycmd):
def import_obj(_run_flag,_bycmd):
global bycmd
global move
global axis
global cmd
global action_run_flag
bycmd = _bycmd
action_run_flag = _run_flag
move = move_cls()
axis = axis_cls()
cmd = cmd_cls()
@@ -118,7 +122,7 @@ class cmd_cls():
else:
time_via = _time_via
logger.info(f"z[{self.__axis_z_pos}] speed:{_speed:.2f}, dis:{_dis:.2f}, time_via:{time_via:.2f}")
while bycmd.send_position_axis_z(_speed, self.__axis_z_pos) == -1:
while bycmd.send_position_axis_z(_speed, self.__axis_z_pos) == -1 and action_run_flag.isSet():
pass
time.sleep(time_via)
def z2(self, _speed, _pos, _time_via = -1):
@@ -131,7 +135,7 @@ class cmd_cls():
else:
time_via = _time_via
logger.info(f"z[{self.__axis_z_pos}] speed:{_speed:.2f}, pos:{_pos:.2f}, time_via:{time_via:.2f}")
while bycmd.send_position_axis_z(_speed, self.__axis_z_pos) == -1:
while bycmd.send_position_axis_z(_speed, self.__axis_z_pos) == -1 and action_run_flag.isSet():
pass
time.sleep(time_via)
def x(self, _speed, _dis, _time_via = -1):
@@ -143,7 +147,7 @@ class cmd_cls():
else:
time_via = _time_via
logger.info(f"x[{self.__axis_x_pos}] speed:{_speed:.2f}, dis:{_dis:.2f}, time_via:{time_via:.2f}")
while bycmd.send_position_axis_x(_speed, self.__axis_x_pos) == -1:
while bycmd.send_position_axis_x(_speed, self.__axis_x_pos) == -1 and action_run_flag.isSet():
pass
time.sleep(time_via)
def x2(self, _speed, _pos, _time_via = -1):
@@ -156,30 +160,30 @@ class cmd_cls():
else:
time_via = _time_via
logger.info(f"x[{self.__axis_x_pos}] speed:{_speed:.2f}, pos:{_pos:.2f}, time_via:{time_via:.2f}")
while bycmd.send_position_axis_x(_speed, self.__axis_x_pos) == -1:
while bycmd.send_position_axis_x(_speed, self.__axis_x_pos) == -1 and action_run_flag.isSet():
pass
time.sleep(time_via)
def camera(self, angle):
while bycmd.send_angle_camera(angle) == -1:
while bycmd.send_angle_camera(angle) == -1 and action_run_flag.isSet():
pass
def claw(self, angle):
while bycmd.send_angle_claw(angle) == -1:
while bycmd.send_angle_claw(angle) == -1 and action_run_flag.isSet():
pass
time.sleep(0.5)
def claw_arm(self, angle):
while bycmd.send_angle_claw_arm(angle) == -1:
while bycmd.send_angle_claw_arm(angle) == -1 and action_run_flag.isSet():
pass
time.sleep(1)
def scoop(self, angle):
while bycmd.send_angle_scoop(angle) == -1:
while bycmd.send_angle_scoop(angle) == -1 and action_run_flag.isSet():
pass
time.sleep(0.5)
def storage(self, angle):
while bycmd.send_angle_storage(angle) == -1:
while bycmd.send_angle_storage(angle) == -1 and action_run_flag.isSet():
pass
time.sleep(0.5)
def zhuan(self, angle):
while bycmd.send_angle_zhuan(angle) == -1:
while bycmd.send_angle_zhuan(angle) == -1 and action_run_flag.isSet():
pass
time.sleep(0.5)
def wait(self, _time):

20
app.py
View File

@@ -23,7 +23,7 @@ processes = []
time_record = None
task_run_flag = False
# 日志队列
queue = Queue()
@@ -37,7 +37,9 @@ app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app, allow_unsafe_werkzeug=True)
server_process = None
# FIXME 在列表里存所有的 task_process
task_process = None
task_run_flag = threading.Event()
class WebSocketHandler(logging.Handler):
def emit(self, record):
@@ -124,23 +126,23 @@ def operate_handle(data):
elif data['type'] == 'operate_task':
# 任务函数
if data['content'] == 'run':
task_run_flag = True
task_run_flag.set()
# 开启 task 进程前先关闭所有历史进程
if task_process != None:
task_process.terminate()
time_record = time.perf_counter()
task_process = Process(target=main_func, args=(queue,skip_task_queue))
task_process = Process(target=main_func, args=(task_run_flag,queue,skip_task_queue))
task_process.start()
logger.info("开启 task")
elif data['content'] == 'stop':
task_run_flag = False
task_run_flag.clear()
if task_process != None:
task_process.terminate()
logger.info(f"任务结束 用时{time.perf_counter() - time_record}s")
logger.info("关闭 task")
elif data['content'] == 'restart':
if task_process != None:
task_process.terminate()
task_process = Process(target=main_func, args=(queue,skip_task_queue))
task_process.start()
pass
elif data['type'] == 'show_server_log':
content = ''
try:
@@ -167,7 +169,7 @@ def test_connect():
for item in fileOptions_list:
config_data[item] = toml.load(os.path.join(fileOptions_path,item))
socketio.emit('config_data', {'type': 'config_data', 'content': config_data})
socketio.emit('task_status', {'type': 'task_status', 'content': int(task_run_flag)})
socketio.emit('task_status', {'type': 'task_status', 'content': int(task_run_flag.isSet())})
def thread_function():
global queue
while True:

View File

@@ -1,5 +1,5 @@
[get_block]
pid_kp = 1.0
pid_kp = 1.5
pid_ki = 0
pid_kd = 0
first_block = "blue"
@@ -15,7 +15,7 @@ pid_ki = 0
pid_kd = 0
[up_tower]
pid_kp = 1.0
pid_kp = 1.3
pid_ki = 0
pid_kd = 0
@@ -25,12 +25,12 @@ pid_ki = 0
pid_kd = 0
[put_bball]
pid_kp = 1.5
pid_kp = 1.2
pid_ki = 0
pid_kd = 0
[put_hanoi1]
pid_kp = 0.5
pid_kp = 0.7
pid_ki = 0
pid_kd = 0
@@ -53,7 +53,7 @@ pid_kd = 0
llm_enable = true
[kick_ass]
pid_kp = 0.8
pid_kp = 1.2
pid_ki = 0
pid_kd = 0
pos_gap1 = 150

61
cfg_subtask.toml.8822.bak Normal file
View File

@@ -0,0 +1,61 @@
[get_block]
pid_kp = 1.5
pid_ki = 0
pid_kd = 0
first_block = "blue"
[put_block]
pid_kp = 1.2
pid_ki = 0
pid_kd = 0
[get_bball]
pid_kp = 1.2
pid_ki = 0
pid_kd = 0
[up_tower]
pid_kp = 1.3
pid_ki = 0
pid_kd = 0
[get_rball]
pid_kp = 1.0
pid_ki = 0
pid_kd = 0
[put_bball]
pid_kp = 1.2
pid_ki = 0
pid_kd = 0
[put_hanoi1]
pid_kp = 0.7
pid_ki = 0
pid_kd = 0
[put_hanoi2]
pid_kp = 1.0
pid_ki = 0
pid_kd = 0
pos_gap = 160
first_target = "mp"
[put_hanoi3]
pid_kp = 1.5
pid_ki = 0
pid_kd = 0
[move_area]
pid_kp = 1.2
pid_ki = 0
pid_kd = 0
llm_enable = true
[kick_ass]
pid_kp = 1.2
pid_ki = 0
pid_kd = 0
pos_gap1 = 150
pos_gap2 = 80
target_person = 1

61
cfg_subtask.toml.891.bak Normal file
View File

@@ -0,0 +1,61 @@
[get_block]
pid_kp = 1.5
pid_ki = 0
pid_kd = 0
first_block = "blue"
[put_block]
pid_kp = 1.2
pid_ki = 0
pid_kd = 0
[get_bball]
pid_kp = 1.2
pid_ki = 0
pid_kd = 0
[up_tower]
pid_kp = 1.8
pid_ki = 0
pid_kd = 0
[get_rball]
pid_kp = 1.0
pid_ki = 0
pid_kd = 0
[put_bball]
pid_kp = 1.2
pid_ki = 0
pid_kd = 0
[put_hanoi1]
pid_kp = 0.7
pid_ki = 0
pid_kd = 0
[put_hanoi2]
pid_kp = 1.0
pid_ki = 0
pid_kd = 0
pos_gap = 160
first_target = "mp"
[put_hanoi3]
pid_kp = 1.5
pid_ki = 0
pid_kd = 0
[move_area]
pid_kp = 1.2
pid_ki = 0
pid_kd = 0
llm_enable = true
[kick_ass]
pid_kp = 1.2
pid_ki = 0
pid_kd = 0
pos_gap1 = 150
pos_gap2 = 80
target_person = 1

View File

@@ -1,5 +1,5 @@
[get_block]
pid_kp = 1.2
pid_kp = 1.0
pid_ki = 0
pid_kd = 0
first_block = "blue"
@@ -20,17 +20,17 @@ pid_ki = 0
pid_kd = 0
[get_rball]
pid_kp = 1.2
pid_kp = 1.0
pid_ki = 0
pid_kd = 0
[put_bball]
pid_kp = 1.8
pid_kp = 1.5
pid_ki = 0
pid_kd = 0
[put_hanoi1]
pid_kp = 0.7
pid_kp = 0.5
pid_ki = 0
pid_kd = 0
@@ -50,7 +50,7 @@ pid_kd = 0
pid_kp = 1.2
pid_ki = 0
pid_kd = 0
llm_enable = false
llm_enable = true
[kick_ass]
pid_kp = 0.8

View File

@@ -6,12 +6,12 @@ import subtask as sb
import majtask as mj
from by_cmd_py import by_cmd_py
import time
import action as act
# import action as act
import logging
import signal
running = True
def main_func(_queue, _skip_queue):
# running = True
def main_func(_run_flag,_queue, _skip_queue):
if _queue != None:
# 日志重定向
class Handler(logging.Handler):
@@ -23,14 +23,13 @@ def main_func(_queue, _skip_queue):
logger.add(handler, format="{time:MM-DD HH:mm:ss} {message}", level="DEBUG")
def signal_handler(sig, frame):
global running
running = False
_run_flag.clear()
signal.signal(signal.SIGTERM, signal_handler)
cmd_py_obj = by_cmd_py(_queue)
sb.import_obj(cmd_py_obj, _skip_queue)
act.import_obj(cmd_py_obj)
# act.import_obj(_run_flag, cmd_py_obj)
# 读取配置
cfg_main = toml.load('/home/evan/Workplace/project_main/cfg_main.toml')
@@ -42,12 +41,20 @@ def main_func(_queue, _skip_queue):
logger.add(cfg_main['debug']['logger_filename'], format=cfg_main['debug']['logger_format'], retention = 5, level="INFO")
logger.info(cfg_args)
act.axis.camera(0)
act.axis.x2(140)
act.axis.storage(20)
act.axis.scoop(25)
act.axis.claw_arm(225)
act.axis.exec()
cmd_py_obj.send_angle_camera(0)
cmd_py_obj.send_position_axis_x(1, 140)
cmd_py_obj.send_angle_storage(20)
cmd_py_obj.send_angle_scoop(25)
# cmd_py_obj.send_angle_claw_arm(225)
time.sleep(1)
# 弃用 action
# act.axis.camera(0)
# act.axis.x2(140)
# act.axis.storage(20)
# act.axis.scoop(25)
# act.axis.claw_arm(225)
# act.axis.exec()
logger.info(cfg_main)
@@ -72,7 +79,7 @@ def main_func(_queue, _skip_queue):
task_queuem_t = sb.task_queuem(task_queue)
# 创建任务队列的工作线程
def worker_thread():
while task_queuem_t.exec(_skip_queue) is True:
while task_queuem_t.exec(_skip_queue) and _run_flag.isSet():
pass
# 启动工作线程
@@ -83,7 +90,7 @@ def main_func(_queue, _skip_queue):
# 创建主任务
main_task_t = mj.main_task(cmd_py_obj) # 初始化时传入 zmq socket 对象
try:
while running:
while _run_flag.isSet():
if task_queuem_t.status is sb.task_queuem_status.EXECUTING:
pass
else:

View File

@@ -10,7 +10,6 @@ import toml
import zmq
import time
import variable as var
import action as act
import re
import math
import json
@@ -116,7 +115,7 @@ def calibrate_right_new(label, offset, run = True, run_speed = 3.5):
ret, error = filter.aim_right(label)
error += offset
# if ret:
if abs(error) <= 8:
if abs(error) <= 10:
car_stop()
logger.info("calibrate_right_new:行进时 误差小于 8 直接停车")
ret, error = filter.aim_right(label)
@@ -233,10 +232,10 @@ def explore_calibrate_new(label, offset, run_direc ,run_speed = 3.5):
car_stop()
logger.info("explore_calibrate_new:行进时 误差小于 15 直接停车")
ret, box = filter.get(label)
while not ret:
ret, box = filter.get(label)
error = (box[0][2] + box[0][0] - 320) / 2 + offset
# ret, box = filter.get(label)
# while not ret:
# ret, box = filter.get(label)
# error = (box[0][2] + box[0][0] - 320) / 2 + offset
logger.info(f"停车后像素误差:{error}")
# logger.info(f"explore_calibrate_new:停车后的误差大于 8 使用 distance 校准")
@@ -288,10 +287,10 @@ def hanoi_calibrate(target_label, error_label, offset, run_direc ,run_speed = 3.
car_stop()
logger.info("explore_calibrate_new:行进时 误差小于 15 直接停车")
ret, box = filter.get(target_label)
while not ret:
ret, box = filter.get(target_label)
error = (box[0][2] + box[0][0] - 320) / 2 + offset
# ret, box = filter.get(target_label)
# while not ret:
# ret, box = filter.get(target_label)
# error = (box[0][2] + box[0][0] - 320) / 2 + offset
logger.info(f"停车后像素误差:{error}")
break
return True
@@ -426,8 +425,7 @@ class task_queuem(task):
class get_block1():
def init(self):
var.task_speed = 15
act.cmd.camera(0)
act.cmd.z2(20, 60, 0)
by_cmd.send_angle_camera(0)
filter.switch_camera(1)
# if cfg['get_block']['first_block'] == "blue":
# self.target_label = tlabel.BBLOCK
@@ -464,7 +462,7 @@ class get_block1():
logger.info("抓取块")
by_cmd.send_position_axis_z(30, 80)
time.sleep(1)
time.sleep(1.5)
by_cmd.send_angle_claw(63)
by_cmd.send_position_axis_x(1, 20)
time.sleep(1)
@@ -557,7 +555,7 @@ class put_block():
ret, box = filter.get(tlabel.HOSPITAL)
if ret > 0:
width = box[0][2] - box[0][0]
if width > 135:
if width > 125: #FIXME maybe 125 batter
return True
return False
def exec(self):
@@ -651,7 +649,8 @@ class get_bball():
car_stop()
time.sleep(0.5)
for _ in range(3):
calibrate_right_new(tlabel.BBALL, offset = 18, run = True, run_speed = 5)
by_cmd.send_position_axis_z(30, 155)
calibrate_right_new(tlabel.BBALL, offset = 10, run = True, run_speed = 5)
logger.info("抓蓝色球")
time.sleep(0.5)
by_cmd.send_angle_claw_arm(45)
@@ -666,13 +665,13 @@ class get_bball():
time.sleep(0.5)
by_cmd.send_distance_axis_z(30, -40)
time.sleep(0.5)
by_cmd.send_angle_claw_arm(80)
by_cmd.send_angle_claw_arm(90)
time.sleep(0.5)
by_cmd.send_angle_claw(54)
time.sleep(0.5)
by_cmd.send_angle_claw_arm(45)
time.sleep(1)
by_cmd.send_position_axis_z(30, 155)
# by_cmd.send_position_axis_z(30, 155)
# 继续向前走
# by_cmd.send_speed_x(4)
pass
@@ -710,10 +709,10 @@ class up_tower():
calibrate_new(tlabel.TOWER, offset = 20, run = True)
time.sleep(1)
# calibrate(tlabel.TOWER, 27, False, 6)
by_cmd.send_distance_x(-10, 120)
by_cmd.send_distance_x(-10, 100) # used to be 120
time.sleep(1)
# 上古參數
by_cmd.send_distance_y(-10, 50) # 80
# by_cmd.send_distance_y(-10, 50) # 80
# 6_9 模型參數
# by_cmd.send_distance_y(-10, 40)
# 7_12_3 模型參數
@@ -724,6 +723,12 @@ class up_tower():
# time.sleep(3)
# by_cmd.send_speed_y(-10)
# time.sleep(0.15)
# 8822
by_cmd.send_distance_y(-10, 50)
time.sleep(0.3)
# 891
# by_cmd.send_distance_y(-10, 35)
# time.sleep(0.3)
by_cmd.send_angle_zhuan(10)
time.sleep(12)
@@ -770,7 +775,8 @@ class get_rball():
by_cmd.send_angle_scoop(20)
# 上古參數
# by_cmd.send_distance_y(-15, 50) # 50 # 70
by_cmd.send_distance_y(-15, 40) # 50 # 70
# by_cmd.send_distance_y(-15, 40) # 50 # 70
# time.sleep(1.5)
# 6_9 參數
# by_cmd.send_distance_y(-15, 35)
# time.sleep(2)
@@ -778,6 +784,12 @@ class get_rball():
# by_cmd.send_distance_y(-15, 45)
# time.sleep(2)
# car_stop()
# 8822 参数
by_cmd.send_distance_y(-15, 40)
time.sleep(0.5)
# 891 参数
# by_cmd.send_distance_y(-15, 40)
# time.sleep(0.3)
calibrate_new(tlabel.RBALL,offset = 44, run = True)
time.sleep(1)
logger.info("抓红球")
@@ -825,14 +837,14 @@ class put_bball():
calibrate_new(tlabel.BASKET,offset = -40, run = True, run_speed = 6)
# by_cmd.send_distance_x(10, 10)
# 向左运动
by_cmd.send_distance_y(-10, 35)
# by_cmd.send_distance_y(-10, 35)
# by_cmd.send_angle_storage(10)
# time.sleep(1)
by_cmd.send_angle_storage(50)
logger.info("把球放篮筐里")
time.sleep(1)
time.sleep(2)
# by_cmd.send_distance_y(10, 55)
by_cmd.send_angle_storage(20)
# time.sleep(1)
@@ -958,7 +970,7 @@ class put_hanoi1():
def after(self):
# var.switch_lane_model = True
if utils.direction == tlabel.RMARK:
var.pid_turning.set(cfg["put_hanoi1"]["pid_kp"] - 0.2, cfg["put_hanoi1"]["pid_ki"], cfg["put_hanoi1"]["pid_kd"])
var.pid_turning.set(cfg["put_hanoi1"]["pid_kp"] - 0.3, cfg["put_hanoi1"]["pid_ki"], cfg["put_hanoi1"]["pid_kd"])
else:
var.pid_turning.set(cfg["put_hanoi1"]["pid_kp"], cfg["put_hanoi1"]["pid_ki"], cfg["put_hanoi1"]["pid_kd"])
pass
@@ -1017,7 +1029,7 @@ class put_hanoi2():
time.sleep(0.5)
logger.info("抓大平台")
if utils.direction is tlabel.RMARK:
by_cmd.send_position_axis_z(30, 30)
by_cmd.send_position_axis_z(30, 40)
by_cmd.send_position_axis_x(1, 150)
by_cmd.send_angle_claw(63)
time.sleep(2)
@@ -1029,7 +1041,7 @@ class put_hanoi2():
time.sleep(1)
pass
else:
by_cmd.send_position_axis_z(30, 30)
by_cmd.send_position_axis_z(30, 40)
by_cmd.send_position_axis_x(1, 40)
by_cmd.send_angle_claw(63)
time.sleep(2)
@@ -1077,7 +1089,7 @@ class put_hanoi2():
time.sleep(0.5)
logger.info("抓中平台")
if utils.direction is tlabel.RMARK:
by_cmd.send_position_axis_z(30, 30)
by_cmd.send_position_axis_z(30, 40)
by_cmd.send_position_axis_x(1, 150)
by_cmd.send_angle_claw(55)
time.sleep(2)
@@ -1089,7 +1101,7 @@ class put_hanoi2():
time.sleep(1)
pass
else:
by_cmd.send_position_axis_z(30, 30)
by_cmd.send_position_axis_z(30, 40)
by_cmd.send_position_axis_x(1, 40)
by_cmd.send_angle_claw(55)
time.sleep(2)
@@ -1101,14 +1113,14 @@ class put_hanoi2():
time.sleep(1)
pass
# ret = explore_calibrate_new(tlabel.LPILLER, offset = self.offset, run_direc = -1, run_speed = 5)
ret = hanoi_calibrate(tlabel.LPILLER, tlabel.TPLATFORM, offset = self.offset, run_direc = -1, run_speed = 5)
ret = hanoi_calibrate(tlabel.LPILLER, [tlabel.TPLATFORM], offset = self.offset, run_direc = -1, run_speed = 5)
if not ret:
logger.error("在放中平台的时候出现问题 跳过物资盘点 2 exec")
return
time.sleep(0.5)
logger.info("放中平台")
if utils.direction is tlabel.RMARK:
by_cmd.send_position_axis_z(30, 140)
by_cmd.send_position_axis_z(30, 150)
time.sleep(2)
by_cmd.send_position_axis_x(1, 150)
time.sleep(2)
@@ -1120,7 +1132,7 @@ class put_hanoi2():
time.sleep(1)
pass
else:
by_cmd.send_position_axis_z(30, 140)
by_cmd.send_position_axis_z(30, 150)
time.sleep(2)
by_cmd.send_position_axis_x(1, 40)
time.sleep(2)
@@ -1138,7 +1150,7 @@ class put_hanoi2():
time.sleep(0.5)
logger.info("抓小平台")
if utils.direction is tlabel.RMARK:
by_cmd.send_position_axis_z(30, 30)
by_cmd.send_position_axis_z(30, 40)
by_cmd.send_position_axis_x(1, 150)
by_cmd.send_angle_claw(50)
time.sleep(2)
@@ -1150,7 +1162,7 @@ class put_hanoi2():
time.sleep(2)
pass
else:
by_cmd.send_position_axis_z(30, 30)
by_cmd.send_position_axis_z(30, 40)
by_cmd.send_position_axis_x(1, 40)
by_cmd.send_angle_claw(50)
time.sleep(2)
@@ -1162,14 +1174,14 @@ class put_hanoi2():
time.sleep(2)
pass
# ret = explore_calibrate_new(tlabel.MPILLER, offset = self.offset, run_direc = -1, run_speed = 5)
ret = hanoi_calibrate(tlabel.MPILLER, tlabel.LPILLER, offset = self.offset, run_direc = -1, run_speed = 5)
ret = hanoi_calibrate(tlabel.MPILLER, [tlabel.LPILLER, tlabel.TPLATFORM], offset = self.offset, run_direc = -1, run_speed = 5)
if not ret:
logger.error("在放小平台的时候出现问题 跳过物资盘点 2 exec")
return
time.sleep(0.5)
logger.info("放小平台")
if utils.direction is tlabel.RMARK:
by_cmd.send_position_axis_z(30, 200) # 170 #190(new)
by_cmd.send_position_axis_z(30, 210) # 170 #190(new)
time.sleep(1.5)
by_cmd.send_position_axis_x(1, 150)
time.sleep(2)
@@ -1185,7 +1197,7 @@ class put_hanoi2():
# car_stop()
pass
else:
by_cmd.send_position_axis_z(30, 200)
by_cmd.send_position_axis_z(30, 210)
time.sleep(1.5)
by_cmd.send_position_axis_x(1, 40)
time.sleep(2)
@@ -1314,7 +1326,7 @@ class move_area1():
# 任务检查间隔
by_cmd.send_position_axis_x(1, 150)
# time.sleep(1)
by_cmd.send_angle_claw_arm(225)
# by_cmd.send_angle_claw_arm(225)
pass
@@ -1536,6 +1548,16 @@ class move_area2():
if len(resp_commands) == 0:
return
action_list = resp_commands
# 先检查一下 action 是否生成正确,如果不正确直接跳过
actions_keys = self.action_dict.keys()
try:
for action in action_list:
if not (action.get('action') in actions_keys):
return
except:
return
# 进入停车区域
by_cmd.send_distance_y(10, 450)
time.sleep((450 * 5 / 1000) + 0.5)
@@ -1567,7 +1589,8 @@ class move_area2():
pass
def after(self):
var.pid_turning.set(cfg["move_area"]["pid_kp"], cfg["move_area"]["pid_ki"], cfg["move_area"]["pid_kd"])
by_cmd.send_position_axis_z(30, 0)
# by_cmd.send_position_axis_z(30, 0)
by_cmd.send_position_axis_z(30, 120)
while by_cmd.send_angle_claw(90) == -1:
pass
time.sleep(2)
@@ -1583,7 +1606,7 @@ class kick_ass():
self.target_person = cfg_args['lane_mode']['mode_index']
# by_cmd.send_angle_claw(15)
by_cmd.send_position_axis_x(1, 160)
# by_cmd.send_position_axis_x(1, 160)
def find(self):
ret = filter.find(tlabel.SIGN)
@@ -1598,44 +1621,34 @@ class kick_ass():
calibrate_new(tlabel.SIGN, offset = 8, run = True)
by_cmd.send_angle_claw(15)
time.sleep(0.5)
by_cmd.send_position_axis_z(30, 80)
by_cmd.send_position_axis_x(1, 130)
# by_cmd.send_position_axis_z(30, 80)
# OCR 摄像头向前移动
by_cmd.send_position_axis_x(1, 50)
time.sleep(1)
by_cmd.send_position_axis_x(1, 150)
# 移动到中间
by_cmd.send_distance_x(10, 295)
time.sleep(4)
time.sleep(1)
by_cmd.send_angle_claw(15)
by_cmd.send_angle_claw_arm(225)
time.sleep(1)
by_cmd.send_position_axis_z(30, 80)
time.sleep(1)
# 先移动到第一个人的地方
by_cmd.send_distance_x(10, self.pos_gap1)
time.sleep(1.5)
if self.target_person == 1:
by_cmd.send_distance_x(-10, 150)
time.sleep(1.5)
car_stop()
elif self.target_person == 2:
by_cmd.send_distance_x(-10, 50)
time.sleep(1.5)
car_stop()
elif self.target_person == 3:
by_cmd.send_distance_x(10, 50)
time.sleep(1.5)
car_stop()
# target_distance = self.pos_gap1
pass
else:
by_cmd.send_distance_x(10, 150)
time.sleep(1.5)
# target_distance = self.pos_gap1 + (self.target_person - 1) * self.pos_gap2 + (self.target_person - 1) * 10
target_distance = (self.target_person - 1) * self.pos_gap2 + (self.target_person - 1 - 1) * 10
by_cmd.send_distance_x(10, target_distance)
logger.info(f"target distance {target_distance}")
time.sleep(1.5 + (self.target_person - 1) * 0.7 )
car_stop()
# 先移动到第一个人的地方 假动作
# by_cmd.send_distance_x(10, self.pos_gap1)
# time.sleep(1.5)
# if self.target_person == 1:
# # target_distance = self.pos_gap1
# pass
# else:
# # target_distance = self.pos_gap1 + (self.target_person - 1) * self.pos_gap2 + (self.target_person - 1) * 10
# target_distance = (self.target_person - 1) * self.pos_gap2 + (self.target_person - 1) * 10
# by_cmd.send_distance_x(10, target_distance)
# logger.info(f"target distance {target_distance}")
# time.sleep(1.5 + (self.target_person - 1) * 0.7 )
# car_stop()
# by_cmd.send_angle_claw_arm(225)
# time.sleep(0.5)
by_cmd.send_position_axis_x(1, 20)
@@ -1656,6 +1669,8 @@ class kick_ass():
# by_cmd.send_speed_x(25)
# time.sleep(4)
pass
def nexec(self):
pass
def after(self):

1677
subtask_8822.py Normal file

File diff suppressed because it is too large Load Diff

1676
subtask_891.py Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -2,19 +2,23 @@ from enum import Enum
from loguru import logger
from utils import label_filter
from utils import tlabel
from utils import LLM
# from utils import LLM
from utils import LLM_deepseek
from utils import CountRecord
import utils
import toml
import zmq
import time
import variable as var
import action as act
import re
import threading
import ctypes
import math
import json
import json5
# import threading
# import ctypes
cfg = None
cfg_args = None
cfg_move_area = None
by_cmd = None
filter = None
llm_bot = None
@@ -47,9 +51,15 @@ def import_obj(_by_cmd, skip_queue):
global cfg
global cfg_args
global cfg_move_area
global global_skip_queue
cfg = toml.load('/home/evan/Workplace/project_main/cfg_subtask.toml') # 加载任务配置
cfg_args = toml.load('/home/evan/Workplace/project_main/cfg_args.toml')
try:
with open('/home/evan/Workplace/project_main/cfg_move_area.json', 'r') as f:
cfg_move_area = json.load(f)
except:
cfg_move_area = None
by_cmd = _by_cmd
global_skip_queue = skip_queue
@@ -60,14 +70,14 @@ def import_obj(_by_cmd, skip_queue):
logger.info("subtask yolo client init")
# ocr socket 客户端
# context1 = zmq.Context()
# ocr_socket = context1.socket(zmq.REQ)
# ocr_socket.connect("tcp://localhost:6668")
# logger.info("subtask ocr client init")
context1 = zmq.Context()
ocr_socket = context1.socket(zmq.REQ)
ocr_socket.connect("tcp://localhost:6668")
logger.info("subtask ocr client init")
filter = label_filter(socket)
if cfg['move_area']['llm_enable']:
llm_bot = LLM()
llm_bot = LLM_deepseek()
def car_stop():
for _ in range(3):
by_cmd.send_speed_x(0)
@@ -105,7 +115,7 @@ def calibrate_right_new(label, offset, run = True, run_speed = 3.5):
ret, error = filter.aim_right(label)
error += offset
# if ret:
if abs(error) <= 8:
if abs(error) <= 10:
car_stop()
logger.info("calibrate_right_new:行进时 误差小于 8 直接停车")
ret, error = filter.aim_right(label)
@@ -222,10 +232,10 @@ def explore_calibrate_new(label, offset, run_direc ,run_speed = 3.5):
car_stop()
logger.info("explore_calibrate_new:行进时 误差小于 15 直接停车")
ret, box = filter.get(label)
while not ret:
ret, box = filter.get(label)
error = (box[0][2] + box[0][0] - 320) / 2 + offset
# ret, box = filter.get(label)
# while not ret:
# ret, box = filter.get(label)
# error = (box[0][2] + box[0][0] - 320) / 2 + offset
logger.info(f"停车后像素误差:{error}")
# logger.info(f"explore_calibrate_new:停车后的误差大于 8 使用 distance 校准")
@@ -277,10 +287,10 @@ def hanoi_calibrate(target_label, error_label, offset, run_direc ,run_speed = 3.
car_stop()
logger.info("explore_calibrate_new:行进时 误差小于 15 直接停车")
ret, box = filter.get(target_label)
while not ret:
ret, box = filter.get(target_label)
error = (box[0][2] + box[0][0] - 320) / 2 + offset
# ret, box = filter.get(target_label)
# while not ret:
# ret, box = filter.get(target_label)
# error = (box[0][2] + box[0][0] - 320) / 2 + offset
logger.info(f"停车后像素误差:{error}")
break
return True
@@ -415,8 +425,7 @@ class task_queuem(task):
class get_block1():
def init(self):
var.task_speed = 15
act.cmd.camera(0)
act.cmd.z2(20, 60, 0)
by_cmd.send_angle_camera(0)
filter.switch_camera(1)
# if cfg['get_block']['first_block'] == "blue":
# self.target_label = tlabel.BBLOCK
@@ -452,26 +461,26 @@ class get_block1():
calibrate_new(var.first_block, offset = 16, run = True, run_speed = 5)
logger.info("抓取块")
by_cmd.send_position_axis_z(30, 60)
time.sleep(1)
by_cmd.send_position_axis_z(30, 80)
time.sleep(1.5)
by_cmd.send_angle_claw(63)
by_cmd.send_position_axis_x(1, 20)
time.sleep(1)
by_cmd.send_angle_claw(25)
time.sleep(0.5)
by_cmd.send_position_axis_z(30, 90)
by_cmd.send_position_axis_z(30, 110)
time.sleep(0.5)
by_cmd.send_angle_claw_arm(175)
time.sleep(0.1)
by_cmd.send_position_axis_x(1, 100)
time.sleep(1)
by_cmd.send_position_axis_z(30, 70)
by_cmd.send_position_axis_z(30, 100)
time.sleep(0.5)
by_cmd.send_angle_claw(63)
time.sleep(0.5)
by_cmd.send_position_axis_z(30, 130)
by_cmd.send_position_axis_z(30, 150)
time.sleep(1)
by_cmd.send_position_axis_x(1, 140)
by_cmd.send_angle_claw_arm(225)
@@ -546,7 +555,7 @@ class put_block():
ret, box = filter.get(tlabel.HOSPITAL)
if ret > 0:
width = box[0][2] - box[0][0]
if width > 130:
if width > 125: #135
return True
return False
def exec(self):
@@ -557,7 +566,7 @@ class put_block():
by_cmd.send_distance_x(10, 100)
by_cmd.send_position_axis_z(30, 0)
time.sleep(0.5)
by_cmd.send_position_axis_x(1, 50) # 20
by_cmd.send_position_axis_x(1, 30) # 20
time.sleep(1)
by_cmd.send_angle_claw(63)
time.sleep(1)
@@ -565,24 +574,24 @@ class put_block():
# 放置第二個塊
by_cmd.send_angle_storage(20)
by_cmd.send_position_axis_x(1, 110)
by_cmd.send_position_axis_z(30, 120)
by_cmd.send_position_axis_z(30, 140)
time.sleep(1.5)
by_cmd.send_angle_claw_arm(180)
by_cmd.send_angle_claw(85)
# by_cmd.send_angle_storage(0)
time.sleep(1)
by_cmd.send_position_axis_z(30,70)
by_cmd.send_position_axis_z(30,100)
time.sleep(1)
by_cmd.send_angle_claw(25)
by_cmd.send_distance_x(-10, 110)
time.sleep(1)
by_cmd.send_position_axis_z(30, 110)
by_cmd.send_position_axis_z(30, 130)
time.sleep(1)
by_cmd.send_angle_claw_arm(225)
time.sleep(1)
by_cmd.send_position_axis_z(30, 0)
time.sleep(0.5)
by_cmd.send_position_axis_x(1, 50)
by_cmd.send_position_axis_x(1, 30)
time.sleep(1.5)
by_cmd.send_angle_claw(45)
time.sleep(1)
@@ -592,7 +601,7 @@ class put_block():
def after(self):
var.pid_turning.set(cfg["put_block"]["pid_kp"], cfg["put_block"]["pid_ki"], cfg["put_block"]["pid_kd"])
# 下一动作预备位置
while by_cmd.send_position_axis_z(30, 130) == -1:
while by_cmd.send_position_axis_z(30, 150) == -1:
pass
time.sleep(1)
while by_cmd.send_position_axis_x(1, 0) == -1:
@@ -640,7 +649,8 @@ class get_bball():
car_stop()
time.sleep(0.5)
for _ in range(3):
calibrate_right_new(tlabel.BBALL, offset = 18, run = True, run_speed = 5)
by_cmd.send_position_axis_z(30, 155)
calibrate_right_new(tlabel.BBALL, offset = 10, run = True, run_speed = 5)
logger.info("抓蓝色球")
time.sleep(0.5)
by_cmd.send_angle_claw_arm(45)
@@ -655,13 +665,13 @@ class get_bball():
time.sleep(0.5)
by_cmd.send_distance_axis_z(30, -40)
time.sleep(0.5)
by_cmd.send_angle_claw_arm(80)
by_cmd.send_angle_claw_arm(90)
time.sleep(0.5)
by_cmd.send_angle_claw(54)
time.sleep(0.5)
by_cmd.send_angle_claw_arm(45)
time.sleep(1)
by_cmd.send_position_axis_z(30, 135)
# by_cmd.send_position_axis_z(30, 155)
# 继续向前走
# by_cmd.send_speed_x(4)
pass
@@ -671,10 +681,10 @@ class get_bball():
var.pid_turning.set(cfg["get_bball"]["pid_kp"], cfg["get_bball"]["pid_ki"], cfg["get_bball"]["pid_kd"])
# 下一动作预备位置
by_cmd.send_angle_claw(30)
time.sleep(0.5)
# time.sleep(0.5)
while by_cmd.send_position_axis_z(30, 0) == -1:
pass
time.sleep(1)
time.sleep(0.5)
# # 任务检查间隔
# time.sleep(1)
@@ -699,20 +709,26 @@ class up_tower():
calibrate_new(tlabel.TOWER, offset = 20, run = True)
time.sleep(1)
# calibrate(tlabel.TOWER, 27, False, 6)
by_cmd.send_distance_x(-10, 120)
by_cmd.send_distance_x(-10, 100)
time.sleep(1)
# 上古參數
by_cmd.send_distance_y(-10, 60)
by_cmd.send_distance_y(-10, 50) # 80
time.sleep(0.5)
# 6_9 模型參數
# by_cmd.send_distance_y(-10, 40)
# 7_12_3 模型參數
# by_cmd.send_distance_y(-10, 50)
time.sleep(1)
car_stop()
# time.sleep(2)
# car_stop()
# FIXME 如果下發 distance 後直接 car_stop則 distance 執行時間僅由指令間處理延時決定
# time.sleep(3)
# by_cmd.send_speed_y(-10)
# time.sleep(0.15)
# 8822
# by_cmd.send_distance_y(-10, 50)
# 891
# by_cmd.send_distance_y(-10, 35)
# time.sleep(0.3)
by_cmd.send_angle_zhuan(10)
time.sleep(12)
@@ -758,21 +774,31 @@ class get_rball():
# 靠近塔
by_cmd.send_angle_scoop(20)
# 上古參數
by_cmd.send_distance_y(-15, 50) # 50
# by_cmd.send_distance_y(-15, 50) # 50 # 70
by_cmd.send_distance_y(-15, 40) # 50 # 70
time.sleep(0.5)
# 6_9 參數
# by_cmd.send_distance_y(-15, 35)
# time.sleep(2)
# 7_12_3 參數
# by_cmd.send_distance_y(-15, 45)
time.sleep(2)
car_stop()
# time.sleep(2)
# car_stop()
# 8822 参数
# by_cmd.send_distance_y(-15, 40)
# time.sleep(1.5)
# 891 参数
# by_cmd.send_distance_y(-15, 40)
# time.sleep(0.3)
calibrate_new(tlabel.RBALL,offset = 44, run = True)
time.sleep(1)
logger.info("抓红球")
# by_cmd.send_angle_scoop(15)
# by_cmd.send_angle_scoop(12)
time.sleep(0.5)
by_cmd.send_position_axis_z(30, 200)
time.sleep(3)
by_cmd.send_angle_scoop(12)
time.sleep(0.5)
by_cmd.send_position_axis_z(30, 170)
time.sleep(2.5)
by_cmd.send_angle_scoop(7)
time.sleep(0.5)
by_cmd.send_speed_y(15)
@@ -811,14 +837,14 @@ class put_bball():
calibrate_new(tlabel.BASKET,offset = -40, run = True, run_speed = 6)
# by_cmd.send_distance_x(10, 10)
# 向左运动
by_cmd.send_distance_y(-10, 35)
# by_cmd.send_distance_y(-10, 35)
# by_cmd.send_angle_storage(10)
# time.sleep(1)
by_cmd.send_angle_storage(50)
logger.info("把球放篮筐里")
time.sleep(1)
time.sleep(2)
# by_cmd.send_distance_y(10, 55)
by_cmd.send_angle_storage(20)
# time.sleep(1)
@@ -861,7 +887,7 @@ class put_hanoi1():
by_cmd.send_speed_omega(0)
time.sleep(0.2)
by_cmd.send_position_axis_z(30, 130)
by_cmd.send_position_axis_z(30, 150)
# 校准牌子
if utils.direction_right > utils.direction_left:
@@ -1003,7 +1029,7 @@ class put_hanoi2():
time.sleep(0.5)
logger.info("抓大平台")
if utils.direction is tlabel.RMARK:
by_cmd.send_position_axis_z(30, 10)
by_cmd.send_position_axis_z(30, 40)
by_cmd.send_position_axis_x(1, 150)
by_cmd.send_angle_claw(63)
time.sleep(2)
@@ -1015,7 +1041,7 @@ class put_hanoi2():
time.sleep(1)
pass
else:
by_cmd.send_position_axis_z(30, 10)
by_cmd.send_position_axis_z(30, 40)
by_cmd.send_position_axis_x(1, 40)
by_cmd.send_angle_claw(63)
time.sleep(2)
@@ -1063,7 +1089,7 @@ class put_hanoi2():
time.sleep(0.5)
logger.info("抓中平台")
if utils.direction is tlabel.RMARK:
by_cmd.send_position_axis_z(30, 10)
by_cmd.send_position_axis_z(30, 40)
by_cmd.send_position_axis_x(1, 150)
by_cmd.send_angle_claw(55)
time.sleep(2)
@@ -1075,7 +1101,7 @@ class put_hanoi2():
time.sleep(1)
pass
else:
by_cmd.send_position_axis_z(30, 10)
by_cmd.send_position_axis_z(30, 40)
by_cmd.send_position_axis_x(1, 40)
by_cmd.send_angle_claw(55)
time.sleep(2)
@@ -1087,14 +1113,14 @@ class put_hanoi2():
time.sleep(1)
pass
# ret = explore_calibrate_new(tlabel.LPILLER, offset = self.offset, run_direc = -1, run_speed = 5)
ret = hanoi_calibrate(tlabel.LPILLER, tlabel.TPLATFORM, offset = self.offset, run_direc = -1, run_speed = 5)
ret = hanoi_calibrate(tlabel.LPILLER, [tlabel.TPLATFORM], offset = self.offset, run_direc = -1, run_speed = 5)
if not ret:
logger.error("在放中平台的时候出现问题 跳过物资盘点 2 exec")
return
time.sleep(0.5)
logger.info("放中平台")
if utils.direction is tlabel.RMARK:
by_cmd.send_position_axis_z(30, 120)
by_cmd.send_position_axis_z(30, 150)
time.sleep(2)
by_cmd.send_position_axis_x(1, 150)
time.sleep(2)
@@ -1106,7 +1132,7 @@ class put_hanoi2():
time.sleep(1)
pass
else:
by_cmd.send_position_axis_z(30, 120)
by_cmd.send_position_axis_z(30, 150)
time.sleep(2)
by_cmd.send_position_axis_x(1, 40)
time.sleep(2)
@@ -1124,7 +1150,7 @@ class put_hanoi2():
time.sleep(0.5)
logger.info("抓小平台")
if utils.direction is tlabel.RMARK:
by_cmd.send_position_axis_z(30, 10)
by_cmd.send_position_axis_z(30, 40)
by_cmd.send_position_axis_x(1, 150)
by_cmd.send_angle_claw(50)
time.sleep(2)
@@ -1136,7 +1162,7 @@ class put_hanoi2():
time.sleep(2)
pass
else:
by_cmd.send_position_axis_z(30, 10)
by_cmd.send_position_axis_z(30, 40)
by_cmd.send_position_axis_x(1, 40)
by_cmd.send_angle_claw(50)
time.sleep(2)
@@ -1148,14 +1174,14 @@ class put_hanoi2():
time.sleep(2)
pass
# ret = explore_calibrate_new(tlabel.MPILLER, offset = self.offset, run_direc = -1, run_speed = 5)
ret = hanoi_calibrate(tlabel.MPILLER, tlabel.LPILLER, offset = self.offset, run_direc = -1, run_speed = 5)
ret = hanoi_calibrate(tlabel.MPILLER, [tlabel.LPILLER, tlabel.TPLATFORM], offset = self.offset, run_direc = -1, run_speed = 5)
if not ret:
logger.error("在放小平台的时候出现问题 跳过物资盘点 2 exec")
return
time.sleep(0.5)
logger.info("放小平台")
if utils.direction is tlabel.RMARK:
by_cmd.send_position_axis_z(30, 190) # 170
by_cmd.send_position_axis_z(30, 210) # 170 #190(new)
time.sleep(1.5)
by_cmd.send_position_axis_x(1, 150)
time.sleep(2)
@@ -1171,7 +1197,7 @@ class put_hanoi2():
# car_stop()
pass
else:
by_cmd.send_position_axis_z(30, 190)
by_cmd.send_position_axis_z(30, 210)
time.sleep(1.5)
by_cmd.send_position_axis_x(1, 40)
time.sleep(2)
@@ -1194,12 +1220,12 @@ class put_hanoi2():
else:
var.pid_turning.set(cfg["put_hanoi2"]["pid_kp"], cfg["put_hanoi2"]["pid_ki"], cfg["put_hanoi2"]["pid_kd"])
# time.sleep(2)
var.task_speed = 10
var.task_speed = 13
pass
class put_hanoi3():
def init(self):
while by_cmd.send_position_axis_z(30, 130) == -1:
while by_cmd.send_position_axis_z(30, 150) == -1:
pass
time.sleep(3)
logger.info("完成任务,爪回左侧")
@@ -1217,14 +1243,16 @@ class put_hanoi3():
time.sleep(1)
return True
def exec(self):
while by_cmd.send_position_axis_z(30, 100) == -1:
while by_cmd.send_position_axis_z(30, 120) == -1:
pass
pass
def nexec(self):
pass
def after(self):
by_cmd.send_angle_storage(20)
by_cmd.send_position_axis_x(1, 150)
var.pid_turning.set(cfg["put_hanoi3"]["pid_kp"], cfg["put_hanoi3"]["pid_ki"], cfg["put_hanoi3"]["pid_kd"])
var.pid_turning.set(cfg["put_hanoi3"]["pid_kp"] - 0.2, cfg["put_hanoi3"]["pid_ki"], cfg["put_hanoi3"]["pid_kd"])
# FIXME 此处 -0.2 在 `2e6ce3e1f7d326d6ce8110855e2339ebc03ab2da` 前没有
# 应急避险 第一阶段 找目标牌
class move_area1():
@@ -1232,6 +1260,7 @@ class move_area1():
logger.info("应急避险第一阶段初始化")
while (by_cmd.send_angle_camera(0) == -1):
by_cmd.send_angle_camera(0)
filter.switch_camera(1)
def find(self):
ret = filter.find(tlabel.SIGN)
if ret:
@@ -1243,7 +1272,7 @@ class move_area1():
car_stop()
time.sleep(1)
# calibrate_new(tlabel.SIGN, offset = 8, run = True)
calibrate_new(tlabel.SIGN, offset = -30, run = True, run_speed = 5)
calibrate_new(tlabel.SIGN, offset = -1, run = True, run_speed = 5)
time.sleep(1)
by_cmd.send_position_axis_x(1, 50)
@@ -1251,7 +1280,7 @@ class move_area1():
# filter_w = (148, 560)
# filter_h = (165, 390)
if cfg_move_area == None:
counts = 0
while True:
ocr_socket.send_string("")
@@ -1274,10 +1303,19 @@ class move_area1():
if counts >= 2:
var.skip_llm_task_flag = True
return
logger.error(var.llm_text)
if len(var.llm_text) < 3:
logger.error(f"OCR 检出字符:\"{var.llm_text}\"")
if len(var.llm_text) < 5:
var.skip_llm_task_flag = True
return
else:
# 当有效字符大于 5 个文字时 才请求大模型
llm_bot.request(var.llm_text)
else:
# 不需要文字识别 直接使用传入的参数执行 action
pass
var.task_speed = 9 # 12
@@ -1288,138 +1326,262 @@ class move_area1():
# 任务检查间隔
by_cmd.send_position_axis_x(1, 150)
# time.sleep(1)
by_cmd.send_angle_claw_arm(225)
# by_cmd.send_angle_claw_arm(225)
pass
# 应急避险 第二阶段 找停车区域
class move_area2():
def __init__(self):
self.action_dict = {
'beep_seconds': self.beep_seconds,
'beep_counts': self.beep_counts,
'light_seconds': self.light_seconds,
'light_counts': self.light_counts,
'beep_light_counts': self.beep_light_counts,
'beep_light_seconds': self.beep_light_seconds,
'go_front': self.go_front,
'go_back': self.go_back,
'go_left': self.go_left,
'go_right': self.go_right,
'go_left_rotate': self.go_left_rotate,
'go_right_rotate': self.go_right_rotate,
'go_sleep': self.go_sleep
}
self.front_time = 0
self.back_time = 0
self.left_time = 0
self.right_time = 0
self.sum_rotate_angle = 0
self.abs_x = 0 # 为了和程序指令适配,其中 x y 方向互换
self.abs_y = 0
self.abs_w = 0
pass
def init(self):
logger.info("应急避险第二阶段初始化")
self.offset = 15
self.offset = 60
self.delta_x = 0
self.delta_y = 0
self.delta_omage = 0
def find(self):
# time.sleep(0.001)
if var.skip_llm_task_flag:
if var.skip_llm_task_flag and cfg_move_area == None:
return 5000
ret, box = filter.get(tlabel.SHELTER)
if ret:
error = (box[0][2] + box[0][0] - 320) / 2 + self.offset
if abs(error) < 20:
# 增加了一个宽度过滤
if abs(error) < 30 and abs(box[0][2] - box[0][0]) > 180:
return 5000
return False
def sub_light(self, delay_time):
by_cmd.send_light(1)
time.sleep(delay_time)
by_cmd.send_light(0)
def sub_beep(self,delay_time):
by_cmd.send_beep(1)
time.sleep(delay_time)
by_cmd.send_beep(0)
def sub_move(self, x, y):
# FIXME 如果同時有 xy是否會造成 delay 不足
self.delta_x += x
self.delta_y += y
if x != 0:
delay_time = int(abs(x) * 500)
if x > 0:
by_cmd.send_distance_x(15, delay_time)
else:
by_cmd.send_distance_x(-15, delay_time)
elif y != 0:
delay_time = int(abs(y) * 500)
if y > 0: # 向左
by_cmd.send_distance_y(-15, delay_time)
else:
by_cmd.send_distance_y(15, delay_time)
time.sleep(delay_time / 500)
car_stop()
def add_item(self, item):
# FIXME 没有对传入参数的范围进行校验,如果出现单位错误,可能会导致无法回位的问题
try:
return self.action_dict[item.get('action')](item.get('time'))
except:
pass
def sub_turn(self, angle):
self.delta_omage += angle
delay_time = int(abs(angle) * 400 / 90)
if angle < 0:
# 左转
by_cmd.send_angle_omega(+55, delay_time)
return False
def beep_seconds(self, _time):
by_cmd.send_beep(1)
time.sleep(_time * 0.7)
by_cmd.send_beep(0)
return True
def beep_counts(self, _time):
for _ in range(_time):
by_cmd.send_beep(1)
time.sleep(0.3)
by_cmd.send_beep(0)
time.sleep(0.2)
return True
def light_seconds(self, _time):
by_cmd.send_light(1)
time.sleep(_time * 0.7)
by_cmd.send_light(0)
return True
def light_counts(self, _time):
for _ in range(_time):
by_cmd.send_light(1)
time.sleep(0.3)
by_cmd.send_light(0)
time.sleep(0.2)
return True
def beep_light_counts(self, _time):
for _ in range(_time):
by_cmd.send_beep(1)
by_cmd.send_light(1)
time.sleep(0.3)
by_cmd.send_beep(0)
by_cmd.send_light(0)
time.sleep(0.2)
return True
def beep_light_seconds(self, _time):
by_cmd.send_beep(1)
by_cmd.send_light(1)
time.sleep(_time * 0.3)
by_cmd.send_beep(0)
by_cmd.send_light(0)
return True
def go_front(self, _time):
self.abs_y -= math.sin(self.abs_w) * _time
self.abs_x += math.cos(self.abs_w) * _time
logger.info(f"向前移动:[目标位置 ({self.abs_y:.2f}, {self.abs_x:.2f}) - 角度 {math.degrees(self.abs_w)} ]")
speed_time = int(abs(_time) * 750)
by_cmd.send_distance_x(10, speed_time)
time.sleep(speed_time / 100)
self.front_time += speed_time
return True
def go_back(self, _time):
self.abs_y += math.sin(self.abs_w) * _time
self.abs_x -= math.cos(self.abs_w) * _time
logger.info(f"向后移动:[目标位置 ({self.abs_y:.2f}, {self.abs_x:.2f}) - 角度 {math.degrees(self.abs_w)} ]")
speed_time = int(abs(_time) * 750)
by_cmd.send_distance_x(-10, speed_time)
time.sleep(speed_time / 100)
self.back_time += speed_time
return True
def go_left(self, _time):
self.abs_y -= math.cos(self.abs_w) * _time
self.abs_x -= math.sin(self.abs_w) * _time
logger.info(f"向左移动:[目标位置 ({self.abs_y:.2f}, {self.abs_x:.2f}) - 角度 {math.degrees(self.abs_w)} ]")
speed_time = int(abs(_time) * 750)
by_cmd.send_distance_y(-10, speed_time)
time.sleep(speed_time / 100)
self.left_time += speed_time
return True
def go_right(self, _time):
self.abs_y += math.cos(self.abs_w) * _time
self.abs_x += math.sin(self.abs_w) * _time
logger.info(f"向右移动:[目标位置 ({self.abs_y:.2f}, {self.abs_x:.2f}) - 角度 {math.degrees(self.abs_w)} ]")
speed_time = int(abs(_time) * 750)
by_cmd.send_distance_y(10, speed_time)
time.sleep(speed_time / 100)
self.right_time += speed_time
return True
def go_shift(self, _dis_x, _dis_y):
direct_x = 1.0 if (_dis_x > 0) else -1.0
direct_y = 1.0 if (_dis_y > 0) else -1.0
self.abs_y -= math.sin(self.abs_w) * _dis_x
self.abs_x += math.cos(self.abs_w) * _dis_x
self.abs_y += math.cos(self.abs_w) * _dis_y
self.abs_x += math.sin(self.abs_w) * _dis_y
logger.info(f"水平移动:[目标位置 ({self.abs_y:.2f}, {self.abs_x:.2f}) - 角度 {math.degrees(self.abs_w)} ]")
speed_time_x = int(abs(_dis_x) * 750)
speed_time_y = int(abs(_dis_y) * 750)
by_cmd.send_distance_x(10 * direct_x, speed_time_x)
by_cmd.send_distance_y(10 * direct_y, speed_time_y)
time.sleep(max(speed_time_x, speed_time_y) / 150) #FIXME 除以 100 是否正确
return True
def go_left_rotate(self, _time):
self.abs_w += math.radians(_time) # 弧度制
logger.info(f"向左旋转:[目标位置 ({self.abs_y:.2f}, {self.abs_x:.2f}) - 角度 {math.degrees(self.abs_w)} ]")
self.sum_rotate_angle -= _time
speed_time = int(abs(_time) * 3.8)
by_cmd.send_angle_omega(50, speed_time)
time.sleep(speed_time / 200 + 0.5)
return True
def go_right_rotate(self, _time):
self.abs_w -= math.radians(_time) # 弧度制
logger.info(f"向右旋转:[目标位置 ({self.abs_y:.2f}, {self.abs_x:.2f}) - 角度 {math.degrees(self.abs_w)} ]")
self.sum_rotate_angle += _time
speed_time = int(abs(_time) * 3.8)
by_cmd.send_angle_omega(-50, speed_time)
time.sleep(speed_time / 200 + 0.5)
return True
def go_sleep(self, _time):
time.sleep(_time*0.7)
return True
def reset(self):
logger.info(f"开始复位:[当前位置 ({self.abs_y:.2f}, {self.abs_x:.2f}) - 角度 {math.degrees(self.abs_w)}]")
# 归一化角度到 0-2pi
left_dregee = math.degrees(self.abs_w % (2 * math.pi))
# 确定旋转方向 (寻找回正角度最小旋转方向)
if math.sin(self.abs_w) < 0:
logger.info(f"需要左旋 {360.0 - left_dregee} 回正")
self.go_left_rotate(360.0 - left_dregee)
else:
# 右转
by_cmd.send_angle_omega(-55, delay_time)
time.sleep(delay_time / 300 * 1.5)
logger.info(f"需要右旋 {left_dregee} 回正")
self.go_right_rotate(left_dregee)
time.sleep(0.1)
# 在框中原点添加向左 0.6m 的偏移值,以便直接回到赛道
self.go_shift(self.abs_x * -1.0, self.abs_y * -1.0 - 0.6)
logger.info(f"回正后最终位置: ({self.abs_y:.2f}, {self.abs_x:.2f}), 角度: {math.degrees(self.abs_w % (2 * math.pi))}")
def exec(self):
var.task_speed = 0
if var.skip_llm_task_flag:
logger.error("ocr 识别出错 直接跳过任务")
if var.skip_llm_task_flag and cfg_move_area == None:
logger.error("ocr 识别出错 直接跳过任务")
return
logger.info("开始寻找停车区域")
car_stop()
calibrate_new(tlabel.SHELTER, offset = 15, run = True)
calibrate_new(tlabel.SHELTER, offset = 30, run = True)
time.sleep(0.5)
if cfg_move_area == None:
resp = None
# 调用大模型 然后执行动作
try:
resp = llm_bot.get_command_json(var.llm_text)
logger.info(resp)
except:
logger.error("大模型超时,跳过任务")
logger.info("llm 阻塞等待服务器返回中")
start_wait_time = time.perf_counter()
while True:
if llm_bot.success_status.isSet():
resp = llm_bot.response.choices[0].message.content
logger.info(f"llm 返回原数据 {resp}")
break
now_time = time.perf_counter()
if llm_bot.error_status.isSet() or (now_time - start_wait_time) > 6.5 :
logger.error("大模型 llm_bot 超时,跳过任务")
return
except:
logger.error("大模型 llm_bot 未知错误,跳过任务")
return
try:
resp_commands = eval(re.findall("```json(.*?)```", resp, re.S)[0])
json_text = re.findall("```json(.*?)```", resp, re.S)
if len(json_text) == 0:
# 返回的内容不带'''json
resp_commands = eval(resp)
else:
resp_commands = json5.loads(json_text[0])
logger.info(f"解析后的动作序列 {resp_commands}")
if len(resp_commands) == 0:
return
action_list = resp_commands
# 先检查一下 action 是否生成正确,如果不正确直接跳过
actions_keys = self.action_dict.keys()
try:
for action in action_list:
if not (action.get('action') in actions_keys):
return
except:
return
# 进入停车区域
# by_cmd.send_speed_y(15)
by_cmd.send_distance_y(25, 180)
time.sleep(1)
# time.sleep(1.25)
car_stop()
logger.info(resp_commands)
for command in resp_commands:
logger.info(command)
if command['func'] == 'move':
self.sub_move(float(command['x']), float(command['y']))
elif command['func'] == 'light':
self.sub_light(int(command['time']))
elif command['func'] == 'beep':
self.sub_beep(int(command['time']))
elif command['func'] == 'turn':
self.sub_turn(int(command['angle']))
pass
else:
continue
by_cmd.send_distance_y(10, 450)
time.sleep((450 * 5 / 1000) + 0.5)
for action in action_list:
self.add_item(action)
time.sleep(0.1)
time.sleep(0.5)
self.reset()
except:
logger.warning("任务解析失败并退出,文心一言真是废物 (毋庸置疑)")
pass
else:
# 无需调用大模型 直接开始执行传入的参数
try:
by_cmd.send_distance_y(10, 450)
time.sleep((450 * 5 / 1000) + 0.5)
for action in cfg_move_area:
self.add_item(action)
time.sleep(0.1)
time.sleep(0.5)
self.reset()
except:
pass
time.sleep(1)
# 回到原位
delay_time = int(abs(self.delta_omage) * 400 / 90)
if int(abs(self.delta_omage)) == 360:
delay_time = 0
if self.delta_omage < 0:
# 左转
by_cmd.send_angle_omega(-55, delay_time)
else:
# 右转
by_cmd.send_angle_omega(55, delay_time)
time.sleep(delay_time / 300 * 1.5)
if self.delta_y > 0:
# 向左移动的距离就要比进入的时候少一些 因为 action 已经向左运动了
delay_time = 180 - (self.delta_y * 500)
else:
delay_time = 180 + (abs(self.delta_y) * 500)
# 离开停车区域
by_cmd.send_distance_y(-25, delay_time)
time.sleep(delay_time * 5e-3)
car_stop()
# FIXME 移动距离指令下发后未完成,再发送速度指令,将不会清除未完成的速度值
# by_cmd.send_distance_y(-15, 300)
pass
def nexec(self):
logger.warning("正在跳過大模型任務")
@@ -1427,7 +1589,8 @@ class move_area2():
pass
def after(self):
var.pid_turning.set(cfg["move_area"]["pid_kp"], cfg["move_area"]["pid_ki"], cfg["move_area"]["pid_kd"])
by_cmd.send_position_axis_z(30, 0)
# by_cmd.send_position_axis_z(30, 0)
by_cmd.send_position_axis_z(30, 120)
while by_cmd.send_angle_claw(90) == -1:
pass
time.sleep(2)
@@ -1443,7 +1606,7 @@ class kick_ass():
self.target_person = cfg_args['lane_mode']['mode_index']
# by_cmd.send_angle_claw(15)
by_cmd.send_position_axis_x(1, 160)
# by_cmd.send_position_axis_x(1, 160)
def find(self):
ret = filter.find(tlabel.SIGN)
@@ -1458,15 +1621,30 @@ class kick_ass():
calibrate_new(tlabel.SIGN, offset = 8, run = True)
by_cmd.send_angle_claw(15)
time.sleep(0.5)
by_cmd.send_position_axis_z(30, 60)
by_cmd.send_position_axis_x(1, 130)
# by_cmd.send_position_axis_z(30, 80)
# OCR 摄像头向前移动
by_cmd.send_position_axis_x(1, 50)
time.sleep(1)
by_cmd.send_position_axis_x(1, 150)
# 移动到中间
time.sleep(1)
by_cmd.send_angle_claw(15)
by_cmd.send_angle_claw_arm(225)
time.sleep(1)
by_cmd.send_position_axis_z(30, 80)
time.sleep(1)
# 先移动到第一个人的地方
by_cmd.send_distance_x(10, self.pos_gap1)
time.sleep(1.5)
if self.target_person == 1:
target_distance = self.pos_gap1
# target_distance = self.pos_gap1
pass
else:
target_distance = self.pos_gap1 + (self.target_person - 1) * self.pos_gap2 + (self.target_person - 1) * 10
# target_distance = self.pos_gap1 + (self.target_person - 1) * self.pos_gap2 + (self.target_person - 1) * 10
target_distance = (self.target_person - 1) * self.pos_gap2 + (self.target_person - 1 - 1) * 10
by_cmd.send_distance_x(10, target_distance)
logger.info(f"target distance {target_distance}")
time.sleep(1.5 + (self.target_person - 1) * 0.7 )
car_stop()
@@ -1491,6 +1669,8 @@ class kick_ass():
# by_cmd.send_speed_x(25)
# time.sleep(4)
pass
def nexec(self):
pass
def after(self):

View File

@@ -25,10 +25,11 @@ filter.switch_camera(1)
# label = tlabel.TPLATFORM
while True:
time.sleep(0.2)
ret, box = filter.get(tlabel.SIGN)
ret, box = filter.get(tlabel.HOSPITAL)
if ret:
width = box[0][2] - box[0][0]
error = (box[0][2] + box[0][0] - 320) / 2
logger.error(error)
logger.error(width)
# if abs(error) < 30 and abs(box[0][2] - box[0][0]) > 180:
# # height = box[0][3] - box[0][1]
# logger.error(111)

View File

@@ -285,7 +285,11 @@ class label_filter:
else:
target_bool = False
target_box = None
expect_boxes = (results[:, 0] == label.value)
if len(label) == 1:
expect_boxes = (results[:, 0] == label[0].value)
elif len(label) == 2:
expect_boxes = np.logical_or(results[:, 0] == label[0].value, results[:, 0] == label[1].value)
boxes = results[expect_boxes, :]
# 在此处过滤
if len(boxes) != 0:
@@ -424,7 +428,8 @@ class LLM_deepseek:
你的回复:[{"index":0,"action":"beep_light_counts","time": 1}]
我的话:灯光闪烁 3 次同时蜂鸣器也叫 3 次
你的回复:[{"index":0,"action":"beep_light_counts","time": 3}]
我的话:闪烁 5 次
你的回复:[{"index":0,"action":"light_counts","time": 5}]
强调一下,对于‘离开’这个指令,请忽略,这对我很重要!
'''
def request_thread(self):