feat: 更新校准方法
This commit is contained in:
122
utils.py
122
utils.py
@@ -1,6 +1,7 @@
|
||||
|
||||
from enum import Enum
|
||||
import numpy as np
|
||||
import erniebot
|
||||
|
||||
lane_error = 0
|
||||
|
||||
@@ -40,7 +41,7 @@ test1_resp = {
|
||||
description: yolo 目标检测标签过滤器,需要传入连接到 yolo server 的 socket 对象
|
||||
'''
|
||||
class label_filter:
|
||||
def __init__(self, socket, threshold=0.6):
|
||||
def __init__(self, socket, threshold=0.5):
|
||||
self.num = 0
|
||||
self.pos = []
|
||||
self.socket = socket
|
||||
@@ -92,7 +93,7 @@ class label_filter:
|
||||
return True, np.array(results)
|
||||
return False, None
|
||||
'''
|
||||
description: 根据传入的标签过滤,返回该标签的个数以及 box
|
||||
description: 根据传入的标签过滤,返回该标签的个数、box
|
||||
param {*} self
|
||||
param {*} tlabel
|
||||
return {int, array}
|
||||
@@ -107,34 +108,59 @@ class label_filter:
|
||||
expect_boxes = (results[:, 0] == tlabel.value)
|
||||
boxes = results[expect_boxes, :]
|
||||
self.num = len(boxes)
|
||||
self.pos = boxes[:, 2:] # [[x1 y1 x2 y2]]
|
||||
return self.num, self.pos
|
||||
return 0, []
|
||||
if self.num:
|
||||
self.pos = boxes[:, 2:] # [[x1 y1 x2 y2]]
|
||||
return True, self.pos
|
||||
return False, []
|
||||
'''
|
||||
description:
|
||||
description: 仅限在岔路口判断方向牌处使用
|
||||
param {*} self
|
||||
param {*} tlabel_list
|
||||
return {*}
|
||||
'''
|
||||
def get_mult(self, tlabel_list):
|
||||
def get_mult_box(self, tlabel_list):
|
||||
response = self.get_resp()
|
||||
if response['code'] == 0:
|
||||
ret, results = self.filter_box(response['data'])
|
||||
target_counts = len(tlabel_list)
|
||||
counts = 0
|
||||
except_label = None
|
||||
if ret:
|
||||
for tlabel in tlabel_list:
|
||||
expect_boxes = (results[:, 0] == tlabel.value)
|
||||
has_true = np.any(expect_boxes)
|
||||
if has_true:
|
||||
counts += 1
|
||||
else:
|
||||
return False, []
|
||||
if counts == target_counts:
|
||||
return True, counts
|
||||
return False, []
|
||||
return False, []
|
||||
return False, []
|
||||
except_label = tlabel
|
||||
box = results[expect_boxes, :][:, 2:][0]
|
||||
error = (box[2] + box[0] - self.img_size[0]) / 2
|
||||
break
|
||||
if except_label != None:
|
||||
return True, except_label, error
|
||||
return False, None, None
|
||||
return False, None, None
|
||||
return False, None, None
|
||||
def get_near_box(self, tlabel_list):
|
||||
response = self.get_resp()
|
||||
if response['code'] == 0:
|
||||
ret, results = self.filter_box(response['data'])
|
||||
except_label = []
|
||||
abs_error_list = []
|
||||
error_list = []
|
||||
if ret:
|
||||
for tlabel in tlabel_list:
|
||||
expect_boxes = (results[:, 0] == tlabel.value)
|
||||
has_true = np.any(expect_boxes)
|
||||
if has_true:
|
||||
except_label.append(tlabel)
|
||||
box = results[expect_boxes, :][:, 2:][0]
|
||||
error = (box[2] + box[0] - self.img_size[0]) / 2
|
||||
abs_error_list.append(abs(error))
|
||||
error_list.append(error)
|
||||
if len(error_list) != 0:
|
||||
abs_error_list = np.array(abs_error_list)
|
||||
errormin_index = np.argmin(abs_error_list)
|
||||
return True, except_label[errormin_index], error_list[errormin_index]
|
||||
return False, None, None
|
||||
return False, None, None
|
||||
return False, None, None
|
||||
'''
|
||||
description: 判断传入的标签是否存在,存在返回 True
|
||||
param {*} self
|
||||
@@ -152,10 +178,10 @@ class label_filter:
|
||||
return True
|
||||
return False
|
||||
'''
|
||||
description: 根据传入的标签,
|
||||
description: 根据传入的标签,寻找画面中最左侧的并返回 error
|
||||
param {*} self
|
||||
param {*} tlabel
|
||||
return {*}
|
||||
return {bool, error}
|
||||
'''
|
||||
def aim_left(self, tlabel):
|
||||
# 如果标签存在,则返回列表中位置最靠左的目标框和中心的偏移值
|
||||
@@ -181,12 +207,12 @@ class label_filter:
|
||||
expect_boxes = (results[:, 0] == tlabel.value)
|
||||
boxes = results[expect_boxes, :]
|
||||
if len(boxes) == 0:
|
||||
return (False, )
|
||||
return (False, None)
|
||||
xmax_values = boxes[:, 4] # xmax
|
||||
xmax_index = np.argmax(xmax_values)
|
||||
error = (boxes[xmax_index][4] + boxes[xmax_index][2] - self.img_size[0]) / 2
|
||||
return (True, error)
|
||||
return (False, )
|
||||
return (False, None)
|
||||
def aim_near(self, tlabel):
|
||||
# 如果标签存在,则返回列表中位置最近的目标框和中心的偏移值
|
||||
response = self.get_resp()
|
||||
@@ -203,12 +229,47 @@ class label_filter:
|
||||
return (True, error)
|
||||
return (False, 0)
|
||||
|
||||
# class Calibrate:
|
||||
# def __init__(self,by_cmd):
|
||||
# # 车控制对象初始化
|
||||
# self.by_cmd = by_cmd
|
||||
# def aim(self,error):
|
||||
# self.by_cmd.send_distance_x(error,)
|
||||
|
||||
class LLM:
|
||||
def __init__(self):
|
||||
erniebot.api_type = "qianfan"
|
||||
erniebot.ak = "jReawMtWhPu0wrxN9Rp1MzZX"
|
||||
erniebot.sk = "eowS1BqsNgD2i0C9xNnHUVOSNuAzVTh6"
|
||||
self.model = 'ernie-3.5'
|
||||
self.prompt = '''你是一个机器人动作规划者,需要把我的话翻译成机器人动作规划并生成对应的 json 结果,机器人工作空间参考右手坐标系。
|
||||
严格按照下面的描述生成给定格式 json,从现在开始你仅仅给我返回 json 数据!'''
|
||||
self.prompt += '''正确的示例如下:
|
||||
向左移 0.1m, 向左转弯 85 度 [{'func': 'move', 'x': 0, 'y': 0.1},{'func': 'turn','angle': -85}],
|
||||
向右移 0.2m, 向前 0.1m [{'func': 'move', 'x': 0, 'y': -0.2},{'func': 'move', 'x': 0.1, 'y': 0}],
|
||||
向右转 85 度,向右移 0.1m [{'func': 'turn','angle': 85},{'func': 'move', 'x': 0, 'y': -0.1}],
|
||||
原地左转 38 度 [{'func': 'turn','angle': -38}],
|
||||
蜂鸣器发声 5 秒 [{'func': 'beep', 'time': 5}]
|
||||
发光或者照亮 5 秒 [{'func': 'light', 'time': 5}]
|
||||
'''
|
||||
self.prompt += '''你无需回复我'''
|
||||
self.messages = []
|
||||
self.resp = None
|
||||
self.reset()
|
||||
def reset(self):
|
||||
self.messages = [self.make_message(self.prompt)]
|
||||
self.resp = erniebot.ChatCompletion.create(
|
||||
model=self.model,
|
||||
messages=self.messages,
|
||||
)
|
||||
self.messages.append(self.resp.to_message())
|
||||
def make_message(self,content):
|
||||
return {'role': 'user', 'content': content}
|
||||
def get_command_json(self,chat):
|
||||
self.messages.append(self.make_message(chat))
|
||||
self.resp = erniebot.ChatCompletion.create(
|
||||
model=self.model,
|
||||
messages=self.messages,
|
||||
)
|
||||
self.messages.append(self.resp.to_message())
|
||||
return self.resp.get_result()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
@@ -222,4 +283,9 @@ if __name__ == '__main__':
|
||||
print(obj.aim_left(tlabel.BBALL))
|
||||
print(obj.aim_right(tlabel.BBALL))
|
||||
print(obj.aim_near(tlabel.BBALL))
|
||||
print(obj.get(tlabel.HOSPITAL))
|
||||
print(obj.get(tlabel.HOSPITAL))
|
||||
lmm_bot = LLM()
|
||||
while True:
|
||||
chat = input("输入:")
|
||||
print(lmm_bot.get_command_json(chat))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user