From 891ebf5e3f92a5060dbe0b5a792523f1b9a55495 Mon Sep 17 00:00:00 2001 From: Storm Date: Tue, 27 Jan 2026 17:58:06 +0100 Subject: [PATCH 1/5] chore: changed video sending to work without cv2 --- src/robot_interface/core/config.py | 2 +- src/robot_interface/endpoints/video_sender.py | 29 ++++++++++++++----- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/robot_interface/core/config.py b/src/robot_interface/core/config.py index 9e638b5..2d92606 100644 --- a/src/robot_interface/core/config.py +++ b/src/robot_interface/core/config.py @@ -61,7 +61,7 @@ class VideoConfig(object): ): self.camera_index = get_config(camera_index, "VIDEO__CAMERA_INDEX", 0, int) self.resolution = get_config(resolution, "VIDEO__RESOLUTION", 2, int) - self.color_space = get_config(color_space, "VIDEO__COLOR_SPACE", 11, int) + self.color_space = get_config(color_space, "VIDEO__COLOR_SPACE", 13, int) self.fps = get_config(fps, "VIDEO__FPS", 15, int) self.stream_name = get_config(stream_name, "VIDEO__STREAM_NAME", "Pepper Video") self.image_buffer = get_config(image_buffer, "VIDEO__IMAGE_BUFFER", 6, int) diff --git a/src/robot_interface/endpoints/video_sender.py b/src/robot_interface/endpoints/video_sender.py index d822352..4ea4b8e 100644 --- a/src/robot_interface/endpoints/video_sender.py +++ b/src/robot_interface/endpoints/video_sender.py @@ -2,6 +2,8 @@ import zmq import threading import logging +import numpy as np + from robot_interface.endpoints.socket_base import SocketBase from robot_interface.state import state from robot_interface.core.config import settings @@ -52,10 +54,23 @@ class VideoSender(SocketBase): :param vid_stream_name: The name of a camera subscription on the video service object vid_service :type vid_stream_name: str """ - while not state.exit_event.is_set(): - try: - img = vid_service.getImageRemote(vid_stream_name) - #Possibly limit images sent if queuing issues arise - self.socket.send(img[settings.video_config.image_buffer]) - except: - logging.warn("Failed to retrieve video image from robot.") + try: + while not state.exit_event.is_set(): + try: + img = vid_service.getImageRemote(vid_stream_name) + if img is not None: + raw_data = img[6] + width = img[0] + height = img[1] + + width_bytes = width.to_bytes(4, 'little') + height_bytes = height.to_bytes(4, 'little') + + self.socket.send_multipart([width_bytes, height_bytes, raw_data]) + except: + logging.warn("Failed to retrieve video image from robot.") + except KeyboardInterrupt: + logging.info("Video receiving loop interrupted by user.") + finally: + vid_service.unsubscribe(vid_stream_name) + logging.info("Unsubscribed from video stream.") \ No newline at end of file From 4a2cace1cf4151163d86dbedbebb4460514123e7 Mon Sep 17 00:00:00 2001 From: Storm Date: Thu, 29 Jan 2026 12:02:28 +0100 Subject: [PATCH 2/5] chore: changed socket option to set HWM to 3 (max 3 packets in queue --- src/robot_interface/endpoints/video_sender.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/robot_interface/endpoints/video_sender.py b/src/robot_interface/endpoints/video_sender.py index 4ea4b8e..d744e4a 100644 --- a/src/robot_interface/endpoints/video_sender.py +++ b/src/robot_interface/endpoints/video_sender.py @@ -21,7 +21,7 @@ class VideoSender(SocketBase): """ def __init__(self, zmq_context, port=settings.agent_settings.video_sender_port): super(VideoSender, self).__init__("video") - self.create_socket(zmq_context, zmq.PUB, port, [(zmq.CONFLATE,1)]) + self.create_socket(zmq_context, zmq.PUB, port, [(zmq.SNDHWM,3)]) def start_video_rcv(self): """ From 56becd84ac5feebef24e5c96e4810dbf35c34f35 Mon Sep 17 00:00:00 2001 From: Storm Date: Thu, 29 Jan 2026 12:16:48 +0100 Subject: [PATCH 3/5] test: fixed video_sender tests ref: N25B-393 --- src/robot_interface/endpoints/video_sender.py | 5 +++-- test/unit/test_video_sender.py | 15 +++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/robot_interface/endpoints/video_sender.py b/src/robot_interface/endpoints/video_sender.py index d744e4a..f3e28f2 100644 --- a/src/robot_interface/endpoints/video_sender.py +++ b/src/robot_interface/endpoints/video_sender.py @@ -3,6 +3,7 @@ import threading import logging import numpy as np +import struct from robot_interface.endpoints.socket_base import SocketBase from robot_interface.state import state @@ -63,8 +64,8 @@ class VideoSender(SocketBase): width = img[0] height = img[1] - width_bytes = width.to_bytes(4, 'little') - height_bytes = height.to_bytes(4, 'little') + width_bytes = struct.pack(' Date: Thu, 29 Jan 2026 12:28:34 +0100 Subject: [PATCH 4/5] test: 100% coverage ref: N25B-393 --- src/robot_interface/endpoints/video_sender.py | 4 ++-- test/unit/test_video_sender.py | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/robot_interface/endpoints/video_sender.py b/src/robot_interface/endpoints/video_sender.py index f3e28f2..23a071f 100644 --- a/src/robot_interface/endpoints/video_sender.py +++ b/src/robot_interface/endpoints/video_sender.py @@ -68,10 +68,10 @@ class VideoSender(SocketBase): height_bytes = struct.pack(' Date: Thu, 29 Jan 2026 13:09:25 +0100 Subject: [PATCH 5/5] chore: removed numpy import --- src/robot_interface/endpoints/video_sender.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/robot_interface/endpoints/video_sender.py b/src/robot_interface/endpoints/video_sender.py index 23a071f..ebb4baf 100644 --- a/src/robot_interface/endpoints/video_sender.py +++ b/src/robot_interface/endpoints/video_sender.py @@ -2,7 +2,6 @@ import zmq import threading import logging -import numpy as np import struct from robot_interface.endpoints.socket_base import SocketBase