From a2e4c710b69cea5c8abe0b8ecc483b9460c41f4f Mon Sep 17 00:00:00 2001 From: scorbett123 <50634068+scorbett123@users.noreply.github.com> Date: Wed, 9 Nov 2022 21:05:05 +0000 Subject: [PATCH 1/4] Search for USB cams in RoboConUSBCamera instead of just assuming /dev/video0 --- robot/vision.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/robot/vision.py b/robot/vision.py index 9411796..19f200b 100644 --- a/robot/vision.py +++ b/robot/vision.py @@ -6,6 +6,7 @@ import os import threading import queue +import subprocess as sp from datetime import datetime from typing import NamedTuple, Any @@ -209,13 +210,29 @@ class RoboConUSBCamera(Camera): def __init__(self, start_res=(1296, 736), focal_lengths=None): - self._cv_capture = cv2.VideoCapture(0) + self._source = self.find_usb_cam() + if self._source == None: + raise Exception("No USB camera detected") + self._cv_capture = cv2.VideoCapture(self._source) self._res = start_res self.focal_lengths = (LOGITECH_C270_FOCAL_LENGTHS if focal_lengths is None else focal_lengths) self._update_camera_params(self.focal_lengths) + def find_usb_cam(self): + indicator_string = "bm2835" # if this string is present in the output then it is a pi cam + options = ["/dev/video0", "/dev/video1"] # Only two options so this is hardcoded + for option in options: + try: + output = sp.check_output(["v4l2-ctl", "-d", option, "-D"]).decode() + except sp.CalledProcessError: + continue + + if indicator_string not in output: + return option + return None + @property def res(self): return self._res From ff97dbc36c9a1654d20e1ed6c0ed12b085cab5b0 Mon Sep 17 00:00:00 2001 From: scorbett123 <50634068+scorbett123@users.noreply.github.com> Date: Thu, 10 Nov 2022 10:59:36 +0000 Subject: [PATCH 2/4] Add next steps to no USB camera detected error Co-authored-by: Skyler --- robot/vision.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/robot/vision.py b/robot/vision.py index 19f200b..819a4ef 100644 --- a/robot/vision.py +++ b/robot/vision.py @@ -212,7 +212,7 @@ def __init__(self, focal_lengths=None): self._source = self.find_usb_cam() if self._source == None: - raise Exception("No USB camera detected") + raise Exception("No USB camera detected, please make sure it's plugged in") self._cv_capture = cv2.VideoCapture(self._source) self._res = start_res self.focal_lengths = (LOGITECH_C270_FOCAL_LENGTHS From 42feb838c05ed0ab09729901a62c47f426f0da9b Mon Sep 17 00:00:00 2001 From: scorbett123 <50634068+scorbett123@users.noreply.github.com> Date: Thu, 10 Nov 2022 13:38:42 +0000 Subject: [PATCH 3/4] Improve find_usb_camera search all of /dev/videoX Check whether a camera is a USB cam instead of not being a pi cam Co-authored-by: Skyler --- robot/vision.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/robot/vision.py b/robot/vision.py index 819a4ef..0b6ac75 100644 --- a/robot/vision.py +++ b/robot/vision.py @@ -221,17 +221,27 @@ def __init__(self, self._update_camera_params(self.focal_lengths) def find_usb_cam(self): - indicator_string = "bm2835" # if this string is present in the output then it is a pi cam - options = ["/dev/video0", "/dev/video1"] # Only two options so this is hardcoded + options = filter(lambda file: file.startswith("video"), + os.listdir("/dev/")) for option in options: try: - output = sp.check_output(["v4l2-ctl", "-d", option, "-D"]).decode() + output = sp.check_output(["v4l2-ctl", "-d", f"/dev/{option}", "-D"]).decode() except sp.CalledProcessError: continue - if indicator_string not in output: - return option - return None + bus_info = re.search(r"Bus info *: (.*)", output) + + if bus_info is None or "usb" not in bus_info.group(1): + # If this isn't a USB camera... + continue + + video_capture_capabilities = re.search( + r"Device Caps *: .*(\n\t\t(.*))*\n\t\tVideo Capture\n", output, re.MULTILINE + ) + + if video_capture_capabilities is not None: + # If we have Video Capture listed under capabilities + return f"/dev/{option}" @property def res(self): From 9d81ba2d8720fbe1e4471e899f6731797f910795 Mon Sep 17 00:00:00 2001 From: scorbett123 <50634068+scorbett123@users.noreply.github.com> Date: Thu, 10 Nov 2022 13:39:10 +0000 Subject: [PATCH 4/4] Add re import Forgot this Co-authored-by: Skyler --- robot/vision.py | 1 + 1 file changed, 1 insertion(+) diff --git a/robot/vision.py b/robot/vision.py index 0b6ac75..8778976 100644 --- a/robot/vision.py +++ b/robot/vision.py @@ -7,6 +7,7 @@ import threading import queue import subprocess as sp +import re from datetime import datetime from typing import NamedTuple, Any