更新加入料带目标检测,判断料带到位,以及控制滚筒逻辑
This commit is contained in:
128
detect_bagor35bag/main_bag_judgment.py
Normal file
128
detect_bagor35bag/main_bag_judgment.py
Normal file
@ -0,0 +1,128 @@
|
||||
import cv2
|
||||
import time
|
||||
from detect_bag import detect_bag
|
||||
#这个要注意放在Feeding同一目录下是这样调用EMV的
|
||||
from EMV.EMV import RelayController
|
||||
|
||||
THRESHOLD_X = 537 # 到位阈值
|
||||
THRESHOLD_maxX = 1430 # 掉出滚筒阈值
|
||||
|
||||
relay_controller = RelayController()
|
||||
|
||||
# ==================================================
|
||||
# 不同料包的滚筒控制逻辑
|
||||
# ==================================================
|
||||
def handle_bag_motor(cls, status_bool, status_text):
|
||||
"""
|
||||
滚筒控制总逻辑:
|
||||
- 没检测到料包 → 不发信号
|
||||
- 未到位 → 不发信号
|
||||
- 掉出滚筒 → 报警(不再操作滚筒)
|
||||
- 到位:
|
||||
bag → 立刻停止滚筒
|
||||
bag35 → 持续正转1.5s反转1.5秒 → 停止
|
||||
"""
|
||||
|
||||
# 没检测到料包
|
||||
if cls is None:
|
||||
return
|
||||
|
||||
# 掉出滚筒(最高优先级)
|
||||
if status_text == "料包掉出滚筒":
|
||||
print("料包掉出滚筒 → 报警 / 停机")
|
||||
relay_controller.close(conveyor2=True)
|
||||
relay_controller.close(conveyor2_reverse=True)
|
||||
return
|
||||
|
||||
# 未到位 → 什么都不做
|
||||
if status_bool is not True:
|
||||
return
|
||||
|
||||
# ================== 到位 + 分类 ==================
|
||||
if cls == "bag":
|
||||
print("[bag] 到位 → 立刻停止滚筒")
|
||||
relay_controller.close(conveyor2=True)
|
||||
|
||||
elif cls == "bag35":
|
||||
print("[bag35] 到位 → 持续正转滚筒1.5秒 后,反转滚筒 1.5 秒 到原位置→ 停止滚筒")
|
||||
time.sleep(1.5)
|
||||
relay_controller.open(conveyor2_reverse=True)
|
||||
time.sleep(1.5)
|
||||
relay_controller.close(conveyor2_reverse=True)
|
||||
|
||||
else:
|
||||
# 预留扩展
|
||||
return
|
||||
|
||||
|
||||
# ==================================================
|
||||
# 料袋状态判断
|
||||
# ==================================================
|
||||
def bag_judgment(img, return_conf=True, return_vis=False):
|
||||
"""
|
||||
判断图片中的料袋状态
|
||||
"""
|
||||
cls = None
|
||||
conf = None
|
||||
min_x = None
|
||||
vis_img = None
|
||||
|
||||
# ================== 唯一检测调用 ==================
|
||||
if return_vis:
|
||||
cls, conf, min_x, vis_img = detect_bag(img, return_vis=True)
|
||||
else:
|
||||
cls, conf, min_x = detect_bag(img, return_vis=False)
|
||||
|
||||
# ================== 状态判断 ==================
|
||||
if min_x is None:
|
||||
status_bool = None
|
||||
status_text = "没有料袋"
|
||||
|
||||
elif min_x > THRESHOLD_maxX:
|
||||
status_bool = False
|
||||
status_text = "料包掉出滚筒"
|
||||
|
||||
elif THRESHOLD_X <= min_x <= THRESHOLD_maxX:
|
||||
status_bool = True
|
||||
status_text = "料袋到位"
|
||||
|
||||
else:
|
||||
status_bool = False
|
||||
status_text = "料袋未到位"
|
||||
|
||||
# ================== 滚筒控制 ==================
|
||||
handle_bag_motor(cls, status_bool, status_text)
|
||||
|
||||
# ================== 返回 ==================
|
||||
if not return_conf:
|
||||
conf = None
|
||||
if not return_vis:
|
||||
vis_img = None
|
||||
|
||||
return status_bool, status_text, conf, min_x, vis_img
|
||||
|
||||
|
||||
# ====================== 测试 ======================
|
||||
if __name__ == "__main__":
|
||||
IMG_PATH = "./test_image/3.jpg"
|
||||
img = cv2.imread(IMG_PATH)
|
||||
if img is None:
|
||||
raise FileNotFoundError(f"图片无法读取: {IMG_PATH}")
|
||||
#这里面包含 handle_bag_motor滚筒控制,只要你记得后面机械臂抓完包之后要打开滚筒,Feeding里self.relay_controller.open(conveyor2=True)
|
||||
status_bool, status_text, conf, min_x, vis_img = bag_judgment(
|
||||
img,
|
||||
return_conf = True,
|
||||
return_vis = False
|
||||
)
|
||||
|
||||
print(
|
||||
f"判断结果: {status_bool}, "
|
||||
f"中文状态: {status_text}, "
|
||||
f"conf={conf}, min_x={min_x}"
|
||||
)
|
||||
|
||||
if vis_img is not None:
|
||||
cv2.imshow("Vis", vis_img)
|
||||
cv2.waitKey(0)
|
||||
cv2.destroyAllWindows()
|
||||
|
||||
Reference in New Issue
Block a user