1
1
import asyncio
2
2
import datetime
3
3
import enum
4
+ import logging
4
5
import math
5
6
import os .path
6
7
import pathlib
17
18
from bosdyn .api .data_chunk_pb2 import DataChunk
18
19
from bosdyn .api .spot_cam import audio_pb2
19
20
from bosdyn .api .spot_cam .camera_pb2 import Camera
21
+ from bosdyn .api .spot_cam .compositor_pb2 import IrColorMap
20
22
from bosdyn .api .spot_cam .logging_pb2 import Logpoint
23
+ from bosdyn .api .spot_cam .power_pb2 import PowerStatus
21
24
from bosdyn .api .spot_cam .ptz_pb2 import PtzDescription , PtzPosition , PtzVelocity
22
25
from bosdyn .client import Robot , spot_cam
23
26
from bosdyn .client .payload import PayloadClient
@@ -50,7 +53,7 @@ class LEDPosition(enum.Enum):
50
53
FRONT_RIGHT = 2
51
54
REAR_RIGHT = 3
52
55
53
- def __init__ (self , robot : Robot , logger ) -> None :
56
+ def __init__ (self , robot : Robot , logger : logging . Logger ) -> None :
54
57
self .logger = logger
55
58
self .client : LightingClient = robot .ensure_client (LightingClient .default_service_name )
56
59
@@ -82,11 +85,11 @@ class PowerWrapper:
82
85
Wrapper for power interaction
83
86
"""
84
87
85
- def __init__ (self , robot : Robot , logger ) -> None :
88
+ def __init__ (self , robot : Robot , logger : logging . Logger ) -> None :
86
89
self .logger = logger
87
90
self .client : PowerClient = robot .ensure_client (PowerClient .default_service_name )
88
91
89
- def get_power_status (self ):
92
+ def get_power_status (self ) -> PowerStatus :
90
93
"""
91
94
Get power status for the devices
92
95
"""
@@ -134,7 +137,7 @@ class CompositorWrapper:
134
137
Wrapper for compositor interaction
135
138
"""
136
139
137
- def __init__ (self , robot : Robot , logger ) -> None :
140
+ def __init__ (self , robot : Robot , logger : logging . Logger ) -> None :
138
141
self .logger = logger
139
142
self .client : CompositorClient = robot .ensure_client (CompositorClient .default_service_name )
140
143
@@ -175,7 +178,7 @@ def get_screen(self) -> str:
175
178
"""
176
179
return self .client .get_screen ()
177
180
178
- def set_ir_colormap (self , colormap , min_temp : float , max_temp : float , auto_scale : bool = True ) -> None :
181
+ def set_ir_colormap (self , colormap : IrColorMap , min_temp : float , max_temp : float , auto_scale : bool = True ) -> None :
179
182
"""
180
183
Set the colormap used for the IR camera
181
184
@@ -205,7 +208,7 @@ class HealthWrapper:
205
208
Wrapper for health details
206
209
"""
207
210
208
- def __init__ (self , robot : Robot , logger ) -> None :
211
+ def __init__ (self , robot : Robot , logger : logging . Logger ) -> None :
209
212
self .client : HealthClient = robot .ensure_client (HealthClient .default_service_name )
210
213
self .logger = logger
211
214
@@ -250,7 +253,7 @@ class AudioWrapper:
250
253
Wrapper for audio commands on the camera
251
254
"""
252
255
253
- def __init__ (self , robot : Robot , logger ) -> None :
256
+ def __init__ (self , robot : Robot , logger : logging . Logger ) -> None :
254
257
self .client : AudioClient = robot .ensure_client (AudioClient .default_service_name )
255
258
self .logger = logger
256
259
@@ -334,11 +337,11 @@ class StreamQualityWrapper:
334
337
Wrapper for stream quality commands
335
338
"""
336
339
337
- def __init__ (self , robot : Robot , logger ) -> None :
340
+ def __init__ (self , robot : Robot , logger : logging . Logger ) -> None :
338
341
self .client : StreamQualityClient = robot .ensure_client (StreamQualityClient .default_service_name )
339
342
self .logger = logger
340
343
341
- def set_stream_params (self , target_bitrate : int , refresh_interval : int , idr_interval : int , awb ) -> None :
344
+ def set_stream_params (self , target_bitrate : int , refresh_interval : int , idr_interval : int , awb : typing . Any ) -> None :
342
345
"""
343
346
Set image compression and postprocessing parameters
344
347
@@ -402,7 +405,7 @@ class MediaLogWrapper:
402
405
Some functionality adapted from https://github.com/boston-dynamics/spot-sdk/blob/master/python/examples/spot_cam/media_log.py
403
406
"""
404
407
405
- def __init__ (self , robot : Robot , logger ) -> None :
408
+ def __init__ (self , robot : Robot , logger : logging . Logger ) -> None :
406
409
self .client : MediaLogClient = robot .ensure_client (MediaLogClient .default_service_name )
407
410
self .logger = logger
408
411
@@ -656,7 +659,7 @@ class PTZWrapper:
656
659
Wrapper for controlling the PTZ unit
657
660
"""
658
661
659
- def __init__ (self , robot : Robot , logger ) -> None :
662
+ def __init__ (self , robot : Robot , logger : logging . Logger ) -> None :
660
663
self .client : PtzClient = robot .ensure_client (PtzClient .default_service_name )
661
664
self .logger = logger
662
665
self .ptzs = {}
@@ -681,7 +684,7 @@ def list_ptz(self) -> typing.Dict[str, typing.Dict]:
681
684
682
685
return ptzs
683
686
684
- def _get_ptz_description (self , name ) :
687
+ def _get_ptz_description (self , name : str ) -> PtzDescription :
685
688
"""
686
689
Get the bosdyn version of the ptz description
687
690
@@ -697,7 +700,7 @@ def _get_ptz_description(self, name):
697
700
698
701
return self .ptzs [name ]
699
702
700
- def _clamp_value_to_limits (self , value , limits : PtzDescription .Limits ):
703
+ def _clamp_value_to_limits (self , value : float , limits : PtzDescription .Limits ) -> float :
701
704
"""
702
705
Clamp the given value to the specified limits. If the limits are unspecified (i.e. both 0), the value is not
703
706
clamped
@@ -717,7 +720,9 @@ def _clamp_value_to_limits(self, value, limits: PtzDescription.Limits):
717
720
718
721
return max (min (value , limits .max .value ), limits .min .value )
719
722
720
- def _clamp_request_to_limits (self , ptz_name , pan , tilt , zoom ) -> typing .Tuple [float , float , float ]:
723
+ def _clamp_request_to_limits (
724
+ self , ptz_name : str , pan : float , tilt : float , zoom : float
725
+ ) -> typing .Tuple [float , float , float ]:
721
726
"""
722
727
723
728
Args:
@@ -734,7 +739,7 @@ def _clamp_request_to_limits(self, ptz_name, pan, tilt, zoom) -> typing.Tuple[fl
734
739
self ._clamp_value_to_limits (zoom , ptz_desc .zoom_limit ),
735
740
)
736
741
737
- def get_ptz_position (self , ptz_name ) -> PtzPosition :
742
+ def get_ptz_position (self , ptz_name : str ) -> PtzPosition :
738
743
"""
739
744
Get the position of the ptz with the given name
740
745
@@ -746,7 +751,7 @@ def get_ptz_position(self, ptz_name) -> PtzPosition:
746
751
"""
747
752
return self .client .get_ptz_position (PtzDescription (name = ptz_name ))
748
753
749
- def set_ptz_position (self , ptz_name , pan , tilt , zoom , blocking = False ):
754
+ def set_ptz_position (self , ptz_name : str , pan : float , tilt : float , zoom : float , blocking : bool = False ) -> None :
750
755
"""
751
756
Set the position of the specified ptz
752
757
@@ -771,7 +776,7 @@ def set_ptz_position(self, ptz_name, pan, tilt, zoom, blocking=False):
771
776
current_position = self .client .get_ptz_position (self ._get_ptz_description (ptz_name ))
772
777
time .sleep (0.2 )
773
778
774
- def get_ptz_velocity (self , ptz_name ) -> PtzVelocity :
779
+ def get_ptz_velocity (self , ptz_name : str ) -> PtzVelocity :
775
780
"""
776
781
Get the velocity of the ptz with the given name
777
782
@@ -783,7 +788,7 @@ def get_ptz_velocity(self, ptz_name) -> PtzVelocity:
783
788
"""
784
789
return self .client .get_ptz_velocity (PtzDescription (name = ptz_name ))
785
790
786
- def set_ptz_velocity (self , ptz_name , pan , tilt , zoom ) -> None :
791
+ def set_ptz_velocity (self , ptz_name : str , pan : float , tilt : float , zoom : float ) -> None :
787
792
"""
788
793
Set the velocity of the various axes of the specified ptz
789
794
@@ -820,10 +825,10 @@ def __init__(
820
825
self ,
821
826
hostname : str ,
822
827
robot : Robot ,
823
- logger ,
824
- sdp_port = 31102 ,
825
- sdp_filename = "h264.sdp" ,
826
- cam_ssl_cert_path = None ,
828
+ logger : logging . Logger ,
829
+ sdp_port : int = 31102 ,
830
+ sdp_filename : str = "h264.sdp" ,
831
+ cam_ssl_cert_path : typing . Optional [ str ] = None ,
827
832
) -> None :
828
833
"""
829
834
Initialise the wrapper
@@ -895,7 +900,9 @@ async def _process_func(self) -> None:
895
900
896
901
897
902
class SpotCamWrapper :
898
- def __init__ (self , hostname , username , password , logger , port : typing .Optional [int ] = None ) -> None :
903
+ def __init__ (
904
+ self , hostname : str , username : str , password : str , logger : logging .Logger , port : typing .Optional [int ] = None
905
+ ) -> None :
899
906
self ._hostname = hostname
900
907
self ._username = username
901
908
self ._password = password
0 commit comments