pypylon
pypylon copied to clipboard
Read operation on device '2676:ba02:2:4:44' failed: 'The requested operation timed out.' : TimeoutException thrown (file 'PylonUsbDevice.cpp', line 778)
I am using two basler acA1300-200uc camera and two Flir cameras. Running one script for Basler camera in sequence and other script for Flir. I am using Powered USB Hub in between Computer and Cameras.
In two days time, Consistently I am getting the following error. Read operation on device '2676:ba02:2:4:44' failed: 'The requested operation timed out.' : TimeoutException thrown (file 'PylonUsbDevice.cpp', line 778) in one of the two basler cameras
Following is the script I am using for frame capturing
`from tendo import singleton me = singleton.SingleInstance()
import cv2 import time import os import threading import logging from pypylon import pylon import traceback import multiprocessing as mp #for recording time limit import queue import shutil import datetime import mysql.connector from mysql.connector import Error
grab_state=True mv_logger = None
import pymysql #DB credentials db_user = 'root' db_pass = 'insightzz123' db_host = 'localhost'
processID = os.getpid() print("This process has the PID", processID)
def update_cam_status(cam_pos, status): try: db_update = pymysql.connect(host=db_host, # your host, usually localhost user=db_user, # your username passwd=db_pass, # your password db="ASTA_DB") cur = db_update.cursor() query = "UPDATE CAM_HEALTH_TABLE set ACTIVE = '"+ status + "' where CAM_POSITION = '" + cam_pos +"'" cur.execute(query) db_update.commit() cur.close() #print(data_set) except Exception as e: print('Exception : ',e) cur.close()
class NumpyMySQLConverter(mysql.connector.conversion.MySQLConverter): """ A mysql.connector Converter that handles Numpy types """
def _float32_to_mysql(self, value):
return float(value)
def _float64_to_mysql(self, value):
return float(value)
def _int32_to_mysql(self, value):
return int(value)
def _int64_to_mysql(self, value):
return int(value)
config = { 'user': 'root', 'host': 'localhost', 'password': 'insightzz123', 'database': 'ASTA_DB' }
def updateProcessId(processId):
try:
mySQLconnection = mysql.connector.connect(**config)
mySQLconnection.set_converter_class(NumpyMySQLConverter)
sql_update_query = "UPDATE PROCESS_ID_TABLE set PROCESS_ID = " +
str(processId) + " where PROCESS_NAME = 'ALL_CAM'"
cursor = mySQLconnection.cursor()
result = cursor.execute(sql_update_query)
# print("Update Result is ", result)
mySQLconnection.commit()
except Error as e:
print("Error while connecting to MySQL", e)
finally:
# closing database connection.
if(mySQLconnection .is_connected()):
mySQLconnection.close()
class mvrecordingObj:
global grab_state,mv_logger
logging.basicConfig(filename="MV_RECORD_ACT_.log",filemode='a',format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
mv_logger=logging.getLogger("MV_RECORD_ACT_")
mv_logger.setLevel(logging.DEBUG)
mv_logger.debug("CODE STARTED")
def init(self,vid_save_loc,vid_fl_prefx,vid_duration):
global grab_state,mv_logger
grab_state=True
self.clear_raw_frames()
def init_cam(self):
try:
# Pypylon get camera by serial number
top_cam_post = None
bottom_cam_post = None
top_cam_pre = None
bottom_cam_pre = None
left_cam_pre = None
right_cam_pre = None
all_cam_list_dict = {}
all_cam_list = []
for i in pylon.TlFactory.GetInstance().EnumerateDevices():
if i.GetSerialNumber() == "23571608":
try:
top_cam_post = i
except Exception as e:
print("top post error i : "+str(e))
mv_logger.debug("top post error i : "+str(e))
elif i.GetSerialNumber() == "23541722":
try:
bottom_cam_post = i
except Exception as e:
print("bottom post error i : "+str(e))
mv_logger.debug("bottom post error i : "+str(e))
self.startframegrabing(top_cam_post,bottom_cam_post,top_cam_pre,bottom_cam_pre,left_cam_pre,right_cam_pre)
except Exception as e:
print("main() Exception : ", e)
mv_logger.debug("main() Exception : "+str(e))
def startframegrabing(self,top_cam_post,bottom_cam_post,top_cam_pre,bottom_cam_pre,left_cam_pre,right_cam_pre):
global FRAME_LOCATION
try:
# VERY IMPORTANT STEP! To use Basler PyPylon OpenCV viewer you have to call .Open() method on you camera
if top_cam_post is not None:
try:
camera_top_cam_post = pylon.InstantCamera(pylon.TlFactory.GetInstance().CreateDevice(top_cam_post))
camera_top_cam_post.Open()
camera_top_cam_post.StartGrabbing(pylon.GrabStrategy_LatestImageOnly)
camera_top_cam_post.AcquisitionFrameRateEnable=True
camera_top_cam_post.AcquisitionFrameRate=25
camera_top_cam_post.ExposureTime=300
except Exception as e:
print("top post error : "+str(e))
mv_logger.debug("top post error : "+str(e))
if bottom_cam_post is not None:
try:
camera_bottom_cam_post = pylon.InstantCamera(pylon.TlFactory.GetInstance().CreateDevice(bottom_cam_post))
camera_bottom_cam_post.Open()
camera_bottom_cam_post.StartGrabbing(pylon.GrabStrategy_LatestImageOnly)
camera_bottom_cam_post.AcquisitionFrameRateEnable=True
camera_bottom_cam_post.AcquisitionFrameRate=25
camera_bottom_cam_post.ExposureTime=280
except Exception as e:
print("bottom post error : "+str(e))
mv_logger.debug("bottom post error : "+str(e))
converter = pylon.ImageFormatConverter()
converter.OutputPixelFormat = pylon.PixelType_BGR8packed
converter.OutputBitAlignment = pylon.OutputBitAlignment_MsbAligned
post_top_once1 = True
post_top_once2 = True
post_bottom_once1 = True
post_bottom_once2 = True
while True:
############# Top Post ###################
try:
t1 = int(time.time()*1000)
if camera_top_cam_post.IsGrabbing():
grabResult = camera_top_cam_post.RetrieveResult(1000, pylon.TimeoutHandling_ThrowException)
if grabResult.GrabSucceeded():
# Access the image data
image = converter.Convert(grabResult)
img = image.GetArray()
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#cv2.imshow("img", img)
#cv2.putText(img,str(time.time())[8:-5], (20, 80),
#cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 2, cv2.LINE_AA)
cv2.imwrite("FRAMES_TOP_POST/IMG_"+".jpg",img)
shutil.move("FRAMES_TOP_POST/IMG_"+".jpg", "FRAMES_TOP_POST/TMP/IMG_"+".jpg")
if(top_cam_post is not None):
grabResult.Release()
#print("time for camera_top_cam_post frame : ", int(time.time()*1000) - t1)
post_top_once1 = True
if post_top_once2:
update_cam_status("TOP_POST","YES")
post_top_once2 = False
except Exception as e:
if post_top_once1:
post_top_once2 = True
print("Exception in top post is ", e)
mv_logger.debug("Exception in top post is "+str(e))
update_cam_status("TOP_POST","NO")
post_top_once1 = False
############# Bottom Post ###################
try:
t1 = int(time.time()*1000)
if camera_bottom_cam_post.IsGrabbing():
grabResult = camera_bottom_cam_post.RetrieveResult(1000, pylon.TimeoutHandling_ThrowException)
if grabResult.GrabSucceeded():
# Access the image data
image = converter.Convert(grabResult)
img = image.GetArray()
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#cv2.imshow("img", img)
#cv2.putText(img,str(time.time())[8:-5], (20, 80),
#cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 2, cv2.LINE_AA)
cv2.imwrite("FRAMES_BOTTOM_POST/IMG_"+".jpg",img)
shutil.move("FRAMES_BOTTOM_POST/IMG_"+".jpg", "FRAMES_BOTTOM_POST/TMP/IMG_"+".jpg")
if(bottom_cam_post is not None):
grabResult.Release()
#print("time for camera_top_cam_post frame : ", int(time.time()*1000) - t1)
post_bottom_once1 = True
if post_bottom_once2:
update_cam_status("BOTTOM_POST","YES")
post_bottom_once2 = False
except Exception as e:
if post_bottom_once1:
post_bottom_once2 = True
print("Exception in bottom post is ", e)
mv_logger.debug("Exception in bottom post is "+str(e))
update_cam_status("BOTTOM_POST","NO")
post_bottom_once1 = False
if cv2.waitKey(1) & 0xFF == ord('q'):
break
if(camera_top_cam_post is not None):
camera_top_cam_post.StopGrabbing()
camera_top_cam_post.close()
if(camera_bottom_cam_post is not None):
camera_bottom_cam_post.StopGrabbing()
camera_bottom_cam_post.close()
except Exception as e:
print("after while Exception : ", e)
mv_logger.debug("after while Exception : "+str(e))
threading.Timer(10.0,self.init_cam()).start()
def clear_raw_frames(self):
pass
def run_module(self):
#mv_logger.debug("MV Record Process Started")
self.init_cam()
#mv_logger.debug("Process ended")
def run_once(f): def wrapper(*args, **kwargs): if not wrapper.has_run: wrapper.has_run = True return f(*args, **kwargs) wrapper.has_run = False return wrapper
def call_error(cam_pos): print("Error in function my function "+str(cam_pos))
if name=="main":
updateProcessId(processID)
obj1=mvrecordingObj(os.getcwd(), "FNL_TST", 60)
obj1.run_module()`
what action is needed to get the system in a good shape after issue have occurred?
- Restarting the app enough?
- camera power cycle needed?
- PC Reboot?