Skip to content

Commit ce91119

Browse files
committed
Add ability to request camera diagnostics from camera_ui_node
1 parent 77c0c24 commit ce91119

File tree

2 files changed

+84
-18
lines changed

2 files changed

+84
-18
lines changed

coffee_ws/src/coffee_vision/coffee_vision/camera_node.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1209,6 +1209,8 @@ def _setup_ros_control_interface(self):
12091209
Bool, '/coffee_bot/camera/cmd/face_detection', self._on_face_detection_command, 10)
12101210
self.camera_refresh_sub = self.create_subscription(
12111211
String, '/coffee_bot/camera/cmd/refresh', self._on_camera_refresh_command, 10)
1212+
self.diagnostics_request_sub = self.create_subscription(
1213+
String, '/coffee_bot/camera/cmd/diagnostics', self._on_diagnostics_request, 10)
12121214

12131215
# Subscriber for state queries from separated UI
12141216
self.state_query_sub = self.create_subscription(
@@ -1275,6 +1277,80 @@ def _on_camera_refresh_command(self, msg):
12751277
status_msg.data = "Camera scan completed"
12761278
self.camera_status_pub.publish(status_msg)
12771279

1280+
def _on_diagnostics_request(self, msg):
1281+
"""Handle diagnostics request from separated UI"""
1282+
self.get_logger().info('Received diagnostics request from separated UI')
1283+
1284+
# Generate diagnostics information
1285+
diagnostics_info = self._generate_diagnostics_info()
1286+
1287+
# Publish diagnostics response
1288+
diagnostics_msg = String()
1289+
diagnostics_msg.data = diagnostics_info
1290+
self.diagnostics_pub.publish(diagnostics_msg)
1291+
1292+
self.get_logger().info('Published diagnostics information')
1293+
1294+
def _generate_diagnostics_info(self):
1295+
"""Generate comprehensive diagnostics information"""
1296+
import os
1297+
import subprocess
1298+
import cv2
1299+
1300+
info = "Camera Node Diagnostics:\n\n"
1301+
1302+
# Check for video devices
1303+
video_devices = []
1304+
if os.path.exists('/dev'):
1305+
for device in os.listdir('/dev'):
1306+
if device.startswith('video'):
1307+
full_path = f"/dev/{device}"
1308+
access = os.access(full_path, os.R_OK)
1309+
video_devices.append(f"{full_path} (Readable: {access})")
1310+
1311+
if video_devices:
1312+
info += "Video Devices:\n" + "\n".join(video_devices) + "\n\n"
1313+
else:
1314+
info += "No video devices found!\n\n"
1315+
1316+
# OpenCV version and backend info
1317+
info += f"OpenCV Version: {cv2.__version__}\n"
1318+
1319+
# Camera state
1320+
if hasattr(self, 'ui') and hasattr(self.ui, 'frame_grabber'):
1321+
info += f"Frame Grabber Running: {self.ui.frame_grabber.running}\n"
1322+
info += f"Current Camera Index: {getattr(self.ui.frame_grabber, 'camera_index', 'Unknown')}\n"
1323+
info += f"Frame Dimensions: {getattr(self.ui.frame_grabber, 'frame_width', 'Unknown')}x{getattr(self.ui.frame_grabber, 'frame_height', 'Unknown')}\n"
1324+
info += f"Face Detection: {'Enabled' if getattr(self.ui.frame_grabber, 'enable_face_detection', False) else 'Disabled'}\n\n"
1325+
1326+
# ROS Topics
1327+
info += "Active ROS Publishers:\n"
1328+
info += "- /coffee_bot/camera/image_raw (camera frames)\n"
1329+
info += "- /coffee_bot/camera/status/info (status updates)\n"
1330+
info += "- /coffee_bot/camera/status/available (camera list)\n"
1331+
info += "- /coffee_bot/camera/status/diagnostics (this message)\n"
1332+
info += "- /vision/face_position (face tracking)\n"
1333+
info += "- face_detection_data (face data)\n\n"
1334+
1335+
info += "Active ROS Subscribers:\n"
1336+
info += "- /coffee_bot/camera/cmd/select (camera selection)\n"
1337+
info += "- /coffee_bot/camera/cmd/quality (quality control)\n"
1338+
info += "- /coffee_bot/camera/cmd/face_detection (face detection toggle)\n"
1339+
info += "- /coffee_bot/camera/cmd/refresh (camera refresh)\n"
1340+
info += "- /coffee_bot/camera/cmd/diagnostics (this request)\n"
1341+
info += "- /coffee_bot/camera/query/state (state queries)\n\n"
1342+
1343+
# Available cameras
1344+
if hasattr(self, 'ui') and hasattr(self.ui, 'available_cameras'):
1345+
camera_count = len(getattr(self.ui, 'available_cameras', []))
1346+
info += f"Available Cameras: {camera_count}\n"
1347+
for idx, name in getattr(self.ui, 'available_cameras', []):
1348+
info += f" - {name} (index: {idx})\n"
1349+
else:
1350+
info += "Available Cameras: Not scanned yet\n"
1351+
1352+
return info
1353+
12781354
def _on_state_query(self, msg):
12791355
"""Handle state query from separated UI and respond with current camera state"""
12801356
self.get_logger().info('Received state query from separated UI')

coffee_ws/src/coffee_vision_ui/coffee_vision_ui/ros_interface/camera_controller.py

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ def _setup_publishers(self):
6666
Bool, '/coffee_bot/camera/cmd/face_detection', 10)
6767
self.camera_refresh_pub = self.node.create_publisher(
6868
String, '/coffee_bot/camera/cmd/refresh', 10)
69+
self.diagnostics_request_pub = self.node.create_publisher(
70+
String, '/coffee_bot/camera/cmd/diagnostics', 10)
6971

7072
def _setup_subscribers(self):
7173
"""Set up ROS subscribers for receiving status from camera_node."""
@@ -126,25 +128,13 @@ def request_diagnostics(self):
126128
"""
127129
Request camera node to provide diagnostic information.
128130
129-
Note: This is a placeholder - in full implementation this might
130-
be a service call rather than a topic.
131+
Sends a diagnostics command to camera_node, which will respond
132+
by publishing detailed diagnostic information.
131133
"""
132-
# TODO: Implement service call for diagnostics
133-
# For now, emit a placeholder diagnostic
134-
self._generate_placeholder_diagnostics()
135-
136-
def _generate_placeholder_diagnostics(self):
137-
"""Generate placeholder diagnostic information."""
138-
diagnostics = """Camera Diagnostics (UI-side placeholder):
139-
140-
Status: Camera controller operational
141-
ROS Communication: Active
142-
Namespace: /coffee_bot/
143-
144-
TODO: Implement full diagnostic service integration
145-
with camera_node for complete system diagnostics."""
146-
147-
self.diagnostics_ready.emit(diagnostics)
134+
msg = String()
135+
msg.data = "get_diagnostics"
136+
self.diagnostics_request_pub.publish(msg)
137+
self.node.get_logger().info("Requested camera diagnostics from camera_node")
148138

149139
def _camera_status_callback(self, msg):
150140
"""

0 commit comments

Comments
 (0)