更新加入料带目标检测,判断料带到位,以及控制滚筒逻辑

This commit is contained in:
琉璃月光
2025-12-30 17:29:49 +08:00
parent d6918e90f2
commit 2028a96819
27 changed files with 1499 additions and 1224 deletions

View 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()