don't make small movements

This commit is contained in:
Josh Hawkins 2023-09-04 18:34:14 -05:00
parent 0b598ce2dc
commit a1531a0a6e

View File

@ -240,10 +240,6 @@ class PtzAutoTracker:
else: else:
if zoom > 0: if zoom > 0:
self.onvif._zoom_absolute(camera, zoom, 1) self.onvif._zoom_absolute(camera, zoom, 1)
# on some cameras with cheaper motors it seems like small values can cause jerky movement
# TODO: double check, might not need this
if abs(pan) > 0.02 or abs(tilt) > 0.02:
self.onvif._move_relative(camera, pan, tilt, 0, 1) self.onvif._move_relative(camera, pan, tilt, 0, 1)
else: else:
logger.debug( logger.debug(
@ -264,10 +260,17 @@ class PtzAutoTracker:
frame_time > self.ptz_metrics[camera]["ptz_start_time"].value frame_time > self.ptz_metrics[camera]["ptz_start_time"].value
and frame_time > self.ptz_metrics[camera]["ptz_stop_time"].value and frame_time > self.ptz_metrics[camera]["ptz_stop_time"].value
): ):
logger.debug( # don't make small movements
f"enqueue pan: {pan}, enqueue tilt: {tilt}, enqueue zoom: {zoom}" if abs(pan) < 0.02:
) pan = 0
self.move_queues[camera].put(move_data) if abs(tilt) < 0.02:
tilt = 0
if pan != 0 or tilt != 0 or zoom != 0:
logger.debug(
f"enqueue pan: {pan}, enqueue tilt: {tilt}, enqueue zoom: {zoom}"
)
self.move_queues[camera].put(move_data)
def _should_zoom_in(self, obj, camera): def _should_zoom_in(self, obj, camera):
camera_config = self.config.cameras[camera] camera_config = self.config.cameras[camera]
@ -309,30 +312,34 @@ class PtzAutoTracker:
camera_config.onvif.autotracking.zooming camera_config.onvif.autotracking.zooming
and camera_config.onvif.autotracking.zoom_relative and camera_config.onvif.autotracking.zoom_relative
): ):
# relative zooming concurrently with pan/tilt
zoom = obj.obj_data["area"] / (camera_width * camera_height) zoom = obj.obj_data["area"] / (camera_width * camera_height)
# test if we need to zoom out # test if we need to zoom out
if not self._should_zoom_in(obj, camera): if not self._should_zoom_in(obj, camera):
zoom = -(1 - zoom) zoom = -(1 - zoom)
self._enqueue_move( # don't make small movements if area hasn't changed significantly
camera, if (
obj.obj_data["frame_time"], "area" in obj.previous
pan, and abs(obj.obj_data["area"] - obj.previous["area"])
tilt, / obj.obj_data["area"]
zoom, < 0.1
) ):
zoom = 0
else: else:
self._enqueue_move(camera, obj.obj_data["frame_time"], pan, tilt, 0) zoom = 0
def _autotrack_zoom_ptz(self, camera, obj): self._enqueue_move(camera, obj.obj_data["frame_time"], pan, tilt, zoom)
def _autotrack_zoom_only(self, camera, obj):
camera_config = self.config.cameras[camera] camera_config = self.config.cameras[camera]
# absolute zooming separately from pan/tilt
if ( if (
camera_config.onvif.autotracking.zooming camera_config.onvif.autotracking.zooming
and not camera_config.onvif.autotracking.zoom_relative and not camera_config.onvif.autotracking.zoom_relative
): ):
# absolute zooming
zoom_level = self.ptz_metrics[camera]["ptz_zoom_level"].value zoom_level = self.ptz_metrics[camera]["ptz_zoom_level"].value
if 0 < zoom_level <= 1: if 0 < zoom_level <= 1:
@ -420,8 +427,8 @@ class PtzAutoTracker:
f"Autotrack: Existing object (do NOT move ptz): {obj.obj_data['id']} {obj.obj_data['box']} {obj.obj_data['frame_time']}" f"Autotrack: Existing object (do NOT move ptz): {obj.obj_data['id']} {obj.obj_data['box']} {obj.obj_data['frame_time']}"
) )
# no need to move, but try zooming # no need to move, but try absolute zooming
self._autotrack_zoom_ptz(camera, obj) self._autotrack_zoom_only(camera, obj)
return return
@ -431,8 +438,8 @@ class PtzAutoTracker:
self.tracked_object_previous[camera] = copy.deepcopy(obj) self.tracked_object_previous[camera] = copy.deepcopy(obj)
self._autotrack_move_ptz(camera, obj) self._autotrack_move_ptz(camera, obj)
# try zooming too # try absolute zooming too
self._autotrack_zoom_ptz(camera, obj) self._autotrack_zoom_only(camera, obj)
return return