viam-sdk 0.45.2__py3-none-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of viam-sdk might be problematic. Click here for more details.
- viam/__init__.py +71 -0
- viam/app/__init__.py +0 -0
- viam/app/_logs.py +34 -0
- viam/app/app_client.py +2525 -0
- viam/app/billing_client.py +143 -0
- viam/app/data_client.py +1715 -0
- viam/app/ml_training_client.py +251 -0
- viam/app/provisioning_client.py +95 -0
- viam/app/viam_client.py +260 -0
- viam/components/__init__.py +0 -0
- viam/components/arm/__init__.py +16 -0
- viam/components/arm/arm.py +223 -0
- viam/components/arm/client.py +124 -0
- viam/components/arm/service.py +123 -0
- viam/components/audio_input/__init__.py +18 -0
- viam/components/audio_input/audio_input.py +81 -0
- viam/components/audio_input/client.py +70 -0
- viam/components/audio_input/service.py +114 -0
- viam/components/base/__init__.py +13 -0
- viam/components/base/base.py +260 -0
- viam/components/base/client.py +153 -0
- viam/components/base/service.py +138 -0
- viam/components/board/__init__.py +9 -0
- viam/components/board/board.py +414 -0
- viam/components/board/client.py +241 -0
- viam/components/board/service.py +223 -0
- viam/components/button/__init__.py +10 -0
- viam/components/button/button.py +41 -0
- viam/components/button/client.py +52 -0
- viam/components/button/service.py +46 -0
- viam/components/camera/__init__.py +22 -0
- viam/components/camera/camera.py +138 -0
- viam/components/camera/client.py +98 -0
- viam/components/camera/service.py +105 -0
- viam/components/component_base.py +65 -0
- viam/components/encoder/__init__.py +18 -0
- viam/components/encoder/client.py +83 -0
- viam/components/encoder/encoder.py +118 -0
- viam/components/encoder/service.py +72 -0
- viam/components/gantry/__init__.py +11 -0
- viam/components/gantry/client.py +115 -0
- viam/components/gantry/gantry.py +156 -0
- viam/components/gantry/service.py +113 -0
- viam/components/generic/__init__.py +18 -0
- viam/components/generic/client.py +62 -0
- viam/components/generic/generic.py +76 -0
- viam/components/generic/service.py +40 -0
- viam/components/gripper/__init__.py +11 -0
- viam/components/gripper/client.py +85 -0
- viam/components/gripper/gripper.py +114 -0
- viam/components/gripper/service.py +81 -0
- viam/components/input/__init__.py +15 -0
- viam/components/input/client.py +194 -0
- viam/components/input/input.py +297 -0
- viam/components/input/service.py +175 -0
- viam/components/motor/__init__.py +11 -0
- viam/components/motor/client.py +168 -0
- viam/components/motor/motor.py +301 -0
- viam/components/motor/service.py +150 -0
- viam/components/movement_sensor/__init__.py +21 -0
- viam/components/movement_sensor/client.py +161 -0
- viam/components/movement_sensor/movement_sensor.py +253 -0
- viam/components/movement_sensor/service.py +146 -0
- viam/components/pose_tracker/__init__.py +17 -0
- viam/components/pose_tracker/client.py +50 -0
- viam/components/pose_tracker/pose_tracker.py +40 -0
- viam/components/pose_tracker/service.py +45 -0
- viam/components/power_sensor/__init__.py +17 -0
- viam/components/power_sensor/client.py +86 -0
- viam/components/power_sensor/power_sensor.py +104 -0
- viam/components/power_sensor/service.py +72 -0
- viam/components/sensor/__init__.py +18 -0
- viam/components/sensor/client.py +49 -0
- viam/components/sensor/sensor.py +48 -0
- viam/components/sensor/service.py +51 -0
- viam/components/servo/__init__.py +11 -0
- viam/components/servo/client.py +86 -0
- viam/components/servo/service.py +80 -0
- viam/components/servo/servo.py +114 -0
- viam/components/switch/__init__.py +10 -0
- viam/components/switch/client.py +83 -0
- viam/components/switch/service.py +72 -0
- viam/components/switch/switch.py +95 -0
- viam/errors.py +105 -0
- viam/gen/__init__.py +0 -0
- viam/gen/app/__init__.py +0 -0
- viam/gen/app/agent/__init__.py +0 -0
- viam/gen/app/agent/v1/__init__.py +0 -0
- viam/gen/app/agent/v1/agent_grpc.py +29 -0
- viam/gen/app/agent/v1/agent_pb2.py +47 -0
- viam/gen/app/agent/v1/agent_pb2.pyi +280 -0
- viam/gen/app/cloudslam/__init__.py +0 -0
- viam/gen/app/cloudslam/v1/__init__.py +0 -0
- viam/gen/app/cloudslam/v1/cloud_slam_grpc.py +70 -0
- viam/gen/app/cloudslam/v1/cloud_slam_pb2.py +54 -0
- viam/gen/app/cloudslam/v1/cloud_slam_pb2.pyi +384 -0
- viam/gen/app/data/__init__.py +0 -0
- viam/gen/app/data/v1/__init__.py +0 -0
- viam/gen/app/data/v1/data_grpc.py +206 -0
- viam/gen/app/data/v1/data_pb2.py +178 -0
- viam/gen/app/data/v1/data_pb2.pyi +1485 -0
- viam/gen/app/datapipelines/__init__.py +0 -0
- viam/gen/app/datapipelines/v1/__init__.py +0 -0
- viam/gen/app/datapipelines/v1/data_pipelines_grpc.py +84 -0
- viam/gen/app/datapipelines/v1/data_pipelines_pb2.py +56 -0
- viam/gen/app/datapipelines/v1/data_pipelines_pb2.pyi +370 -0
- viam/gen/app/dataset/__init__.py +0 -0
- viam/gen/app/dataset/v1/__init__.py +0 -0
- viam/gen/app/dataset/v1/dataset_grpc.py +60 -0
- viam/gen/app/dataset/v1/dataset_pb2.py +40 -0
- viam/gen/app/dataset/v1/dataset_pb2.pyi +179 -0
- viam/gen/app/datasync/__init__.py +0 -0
- viam/gen/app/datasync/v1/__init__.py +0 -0
- viam/gen/app/datasync/v1/data_sync_grpc.py +47 -0
- viam/gen/app/datasync/v1/data_sync_pb2.py +70 -0
- viam/gen/app/datasync/v1/data_sync_pb2.pyi +425 -0
- viam/gen/app/mlinference/__init__.py +0 -0
- viam/gen/app/mlinference/v1/__init__.py +0 -0
- viam/gen/app/mlinference/v1/ml_inference_grpc.py +28 -0
- viam/gen/app/mlinference/v1/ml_inference_pb2.py +23 -0
- viam/gen/app/mlinference/v1/ml_inference_pb2.pyi +63 -0
- viam/gen/app/mltraining/__init__.py +0 -0
- viam/gen/app/mltraining/v1/__init__.py +0 -0
- viam/gen/app/mltraining/v1/ml_training_grpc.py +78 -0
- viam/gen/app/mltraining/v1/ml_training_pb2.py +124 -0
- viam/gen/app/mltraining/v1/ml_training_pb2.pyi +415 -0
- viam/gen/app/packages/__init__.py +0 -0
- viam/gen/app/packages/v1/__init__.py +0 -0
- viam/gen/app/packages/v1/packages_grpc.py +54 -0
- viam/gen/app/packages/v1/packages_pb2.py +52 -0
- viam/gen/app/packages/v1/packages_pb2.pyi +311 -0
- viam/gen/app/v1/__init__.py +0 -0
- viam/gen/app/v1/app_grpc.py +863 -0
- viam/gen/app/v1/app_pb2.py +649 -0
- viam/gen/app/v1/app_pb2.pyi +5279 -0
- viam/gen/app/v1/billing_grpc.py +76 -0
- viam/gen/app/v1/billing_pb2.py +92 -0
- viam/gen/app/v1/billing_pb2.pyi +463 -0
- viam/gen/app/v1/end_user_grpc.py +59 -0
- viam/gen/app/v1/end_user_pb2.py +55 -0
- viam/gen/app/v1/end_user_pb2.pyi +181 -0
- viam/gen/app/v1/robot_grpc.py +55 -0
- viam/gen/app/v1/robot_pb2.py +127 -0
- viam/gen/app/v1/robot_pb2.pyi +1202 -0
- viam/gen/common/__init__.py +0 -0
- viam/gen/common/v1/__init__.py +0 -0
- viam/gen/common/v1/common_grpc.py +0 -0
- viam/gen/common/v1/common_pb2.py +78 -0
- viam/gen/common/v1/common_pb2.pyi +687 -0
- viam/gen/component/__init__.py +0 -0
- viam/gen/component/arm/__init__.py +0 -0
- viam/gen/component/arm/v1/__init__.py +0 -0
- viam/gen/component/arm/v1/arm_grpc.py +102 -0
- viam/gen/component/arm/v1/arm_pb2.py +74 -0
- viam/gen/component/arm/v1/arm_pb2.pyi +344 -0
- viam/gen/component/audioinput/__init__.py +0 -0
- viam/gen/component/audioinput/v1/__init__.py +0 -0
- viam/gen/component/audioinput/v1/audioinput_grpc.py +63 -0
- viam/gen/component/audioinput/v1/audioinput_pb2.py +45 -0
- viam/gen/component/audioinput/v1/audioinput_pb2.pyi +179 -0
- viam/gen/component/base/__init__.py +0 -0
- viam/gen/component/base/v1/__init__.py +0 -0
- viam/gen/component/base/v1/base_grpc.py +94 -0
- viam/gen/component/base/v1/base_pb2.py +66 -0
- viam/gen/component/base/v1/base_pb2.pyi +258 -0
- viam/gen/component/board/__init__.py +0 -0
- viam/gen/component/board/v1/__init__.py +0 -0
- viam/gen/component/board/v1/board_grpc.py +127 -0
- viam/gen/component/board/v1/board_pb2.py +103 -0
- viam/gen/component/board/v1/board_pb2.pyi +496 -0
- viam/gen/component/button/__init__.py +0 -0
- viam/gen/component/button/v1/__init__.py +0 -0
- viam/gen/component/button/v1/button_grpc.py +38 -0
- viam/gen/component/button/v1/button_pb2.py +28 -0
- viam/gen/component/button/v1/button_pb2.pyi +39 -0
- viam/gen/component/camera/__init__.py +0 -0
- viam/gen/component/camera/v1/__init__.py +0 -0
- viam/gen/component/camera/v1/camera_grpc.py +79 -0
- viam/gen/component/camera/v1/camera_pb2.py +67 -0
- viam/gen/component/camera/v1/camera_pb2.pyi +373 -0
- viam/gen/component/encoder/__init__.py +0 -0
- viam/gen/component/encoder/v1/__init__.py +0 -0
- viam/gen/component/encoder/v1/encoder_grpc.py +62 -0
- viam/gen/component/encoder/v1/encoder_pb2.py +44 -0
- viam/gen/component/encoder/v1/encoder_pb2.pyi +147 -0
- viam/gen/component/gantry/__init__.py +0 -0
- viam/gen/component/gantry/v1/__init__.py +0 -0
- viam/gen/component/gantry/v1/gantry_grpc.py +86 -0
- viam/gen/component/gantry/v1/gantry_pb2.py +62 -0
- viam/gen/component/gantry/v1/gantry_pb2.pyi +239 -0
- viam/gen/component/generic/__init__.py +0 -0
- viam/gen/component/generic/v1/__init__.py +0 -0
- viam/gen/component/generic/v1/generic_grpc.py +37 -0
- viam/gen/component/generic/v1/generic_pb2.py +23 -0
- viam/gen/component/generic/v1/generic_pb2.pyi +6 -0
- viam/gen/component/gripper/__init__.py +0 -0
- viam/gen/component/gripper/v1/__init__.py +0 -0
- viam/gen/component/gripper/v1/gripper_grpc.py +70 -0
- viam/gen/component/gripper/v1/gripper_pb2.py +48 -0
- viam/gen/component/gripper/v1/gripper_pb2.pyi +137 -0
- viam/gen/component/inputcontroller/__init__.py +0 -0
- viam/gen/component/inputcontroller/v1/__init__.py +0 -0
- viam/gen/component/inputcontroller/v1/input_controller_grpc.py +71 -0
- viam/gen/component/inputcontroller/v1/input_controller_pb2.py +55 -0
- viam/gen/component/inputcontroller/v1/input_controller_pb2.pyi +243 -0
- viam/gen/component/motor/__init__.py +0 -0
- viam/gen/component/motor/v1/__init__.py +0 -0
- viam/gen/component/motor/v1/motor_grpc.py +118 -0
- viam/gen/component/motor/v1/motor_pb2.py +86 -0
- viam/gen/component/motor/v1/motor_pb2.pyi +368 -0
- viam/gen/component/movementsensor/__init__.py +0 -0
- viam/gen/component/movementsensor/v1/__init__.py +0 -0
- viam/gen/component/movementsensor/v1/movementsensor_grpc.py +110 -0
- viam/gen/component/movementsensor/v1/movementsensor_pb2.py +78 -0
- viam/gen/component/movementsensor/v1/movementsensor_pb2.pyi +384 -0
- viam/gen/component/posetracker/__init__.py +0 -0
- viam/gen/component/posetracker/v1/__init__.py +0 -0
- viam/gen/component/posetracker/v1/pose_tracker_grpc.py +46 -0
- viam/gen/component/posetracker/v1/pose_tracker_pb2.py +34 -0
- viam/gen/component/posetracker/v1/pose_tracker_pb2.pyi +79 -0
- viam/gen/component/powersensor/__init__.py +0 -0
- viam/gen/component/powersensor/v1/__init__.py +0 -0
- viam/gen/component/powersensor/v1/powersensor_grpc.py +62 -0
- viam/gen/component/powersensor/v1/powersensor_pb2.py +42 -0
- viam/gen/component/powersensor/v1/powersensor_pb2.pyi +124 -0
- viam/gen/component/sensor/__init__.py +0 -0
- viam/gen/component/sensor/v1/__init__.py +0 -0
- viam/gen/component/sensor/v1/sensor_grpc.py +45 -0
- viam/gen/component/sensor/v1/sensor_pb2.py +25 -0
- viam/gen/component/sensor/v1/sensor_pb2.pyi +6 -0
- viam/gen/component/servo/__init__.py +0 -0
- viam/gen/component/servo/v1/__init__.py +0 -0
- viam/gen/component/servo/v1/servo_grpc.py +70 -0
- viam/gen/component/servo/v1/servo_pb2.py +50 -0
- viam/gen/component/servo/v1/servo_pb2.pyi +150 -0
- viam/gen/component/switch/__init__.py +0 -0
- viam/gen/component/switch/v1/__init__.py +0 -0
- viam/gen/component/switch/v1/switch_grpc.py +54 -0
- viam/gen/component/switch/v1/switch_pb2.py +40 -0
- viam/gen/component/switch/v1/switch_pb2.pyi +109 -0
- viam/gen/component/testecho/__init__.py +0 -0
- viam/gen/component/testecho/v1/__init__.py +0 -0
- viam/gen/component/testecho/v1/testecho_grpc.py +52 -0
- viam/gen/component/testecho/v1/testecho_pb2.py +36 -0
- viam/gen/component/testecho/v1/testecho_pb2.pyi +114 -0
- viam/gen/module/__init__.py +0 -0
- viam/gen/module/v1/__init__.py +0 -0
- viam/gen/module/v1/module_grpc.py +61 -0
- viam/gen/module/v1/module_pb2.py +43 -0
- viam/gen/module/v1/module_pb2.pyi +211 -0
- viam/gen/proto/__init__.py +0 -0
- viam/gen/proto/rpc/__init__.py +0 -0
- viam/gen/proto/rpc/examples/__init__.py +0 -0
- viam/gen/proto/rpc/examples/echo/__init__.py +0 -0
- viam/gen/proto/rpc/examples/echo/v1/__init__.py +0 -0
- viam/gen/proto/rpc/examples/echo/v1/echo_grpc.py +44 -0
- viam/gen/proto/rpc/examples/echo/v1/echo_pb2.py +32 -0
- viam/gen/proto/rpc/examples/echo/v1/echo_pb2.pyi +87 -0
- viam/gen/proto/rpc/examples/echoresource/__init__.py +0 -0
- viam/gen/proto/rpc/examples/echoresource/v1/__init__.py +0 -0
- viam/gen/proto/rpc/examples/echoresource/v1/echoresource_grpc.py +43 -0
- viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.py +29 -0
- viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.pyi +93 -0
- viam/gen/proto/rpc/v1/__init__.py +0 -0
- viam/gen/proto/rpc/v1/auth_grpc.py +47 -0
- viam/gen/proto/rpc/v1/auth_pb2.py +34 -0
- viam/gen/proto/rpc/v1/auth_pb2.pyi +92 -0
- viam/gen/proto/rpc/webrtc/__init__.py +0 -0
- viam/gen/proto/rpc/webrtc/v1/__init__.py +0 -0
- viam/gen/proto/rpc/webrtc/v1/grpc_grpc.py +0 -0
- viam/gen/proto/rpc/webrtc/v1/grpc_pb2.py +43 -0
- viam/gen/proto/rpc/webrtc/v1/grpc_pb2.pyi +304 -0
- viam/gen/proto/rpc/webrtc/v1/signaling_grpc.py +54 -0
- viam/gen/proto/rpc/webrtc/v1/signaling_pb2.py +70 -0
- viam/gen/proto/rpc/webrtc/v1/signaling_pb2.pyi +496 -0
- viam/gen/provisioning/__init__.py +0 -0
- viam/gen/provisioning/v1/__init__.py +0 -0
- viam/gen/provisioning/v1/provisioning_grpc.py +51 -0
- viam/gen/provisioning/v1/provisioning_pb2.py +39 -0
- viam/gen/provisioning/v1/provisioning_pb2.pyi +188 -0
- viam/gen/robot/__init__.py +0 -0
- viam/gen/robot/v1/__init__.py +0 -0
- viam/gen/robot/v1/robot_grpc.py +208 -0
- viam/gen/robot/v1/robot_pb2.py +188 -0
- viam/gen/robot/v1/robot_pb2.pyi +1020 -0
- viam/gen/service/__init__.py +0 -0
- viam/gen/service/datamanager/__init__.py +0 -0
- viam/gen/service/datamanager/v1/__init__.py +0 -0
- viam/gen/service/datamanager/v1/data_manager_grpc.py +38 -0
- viam/gen/service/datamanager/v1/data_manager_pb2.py +28 -0
- viam/gen/service/datamanager/v1/data_manager_pb2.pyi +39 -0
- viam/gen/service/discovery/__init__.py +0 -0
- viam/gen/service/discovery/v1/__init__.py +0 -0
- viam/gen/service/discovery/v1/discovery_grpc.py +39 -0
- viam/gen/service/discovery/v1/discovery_pb2.py +29 -0
- viam/gen/service/discovery/v1/discovery_pb2.pyi +51 -0
- viam/gen/service/generic/__init__.py +0 -0
- viam/gen/service/generic/v1/__init__.py +0 -0
- viam/gen/service/generic/v1/generic_grpc.py +29 -0
- viam/gen/service/generic/v1/generic_pb2.py +21 -0
- viam/gen/service/generic/v1/generic_pb2.pyi +6 -0
- viam/gen/service/mlmodel/__init__.py +0 -0
- viam/gen/service/mlmodel/v1/__init__.py +0 -0
- viam/gen/service/mlmodel/v1/mlmodel_grpc.py +37 -0
- viam/gen/service/mlmodel/v1/mlmodel_pb2.py +83 -0
- viam/gen/service/mlmodel/v1/mlmodel_pb2.pyi +480 -0
- viam/gen/service/motion/__init__.py +0 -0
- viam/gen/service/motion/v1/__init__.py +0 -0
- viam/gen/service/motion/v1/motion_grpc.py +87 -0
- viam/gen/service/motion/v1/motion_pb2.py +97 -0
- viam/gen/service/motion/v1/motion_pb2.pyi +838 -0
- viam/gen/service/navigation/__init__.py +0 -0
- viam/gen/service/navigation/v1/__init__.py +0 -0
- viam/gen/service/navigation/v1/navigation_grpc.py +102 -0
- viam/gen/service/navigation/v1/navigation_pb2.py +84 -0
- viam/gen/service/navigation/v1/navigation_pb2.pyi +419 -0
- viam/gen/service/sensors/__init__.py +0 -0
- viam/gen/service/sensors/v1/__init__.py +0 -0
- viam/gen/service/sensors/v1/sensors_grpc.py +46 -0
- viam/gen/service/sensors/v1/sensors_pb2.py +68 -0
- viam/gen/service/sensors/v1/sensors_pb2.pyi +137 -0
- viam/gen/service/shell/__init__.py +0 -0
- viam/gen/service/shell/v1/__init__.py +0 -0
- viam/gen/service/shell/v1/shell_grpc.py +55 -0
- viam/gen/service/shell/v1/shell_pb2.py +45 -0
- viam/gen/service/shell/v1/shell_pb2.pyi +307 -0
- viam/gen/service/slam/__init__.py +0 -0
- viam/gen/service/slam/v1/__init__.py +0 -0
- viam/gen/service/slam/v1/slam_grpc.py +61 -0
- viam/gen/service/slam/v1/slam_pb2.py +51 -0
- viam/gen/service/slam/v1/slam_pb2.pyi +213 -0
- viam/gen/service/vision/__init__.py +0 -0
- viam/gen/service/vision/v1/__init__.py +0 -0
- viam/gen/service/vision/v1/vision_grpc.py +87 -0
- viam/gen/service/vision/v1/vision_pb2.py +69 -0
- viam/gen/service/vision/v1/vision_pb2.pyi +454 -0
- viam/gen/stream/__init__.py +0 -0
- viam/gen/stream/v1/__init__.py +0 -0
- viam/gen/stream/v1/stream_grpc.py +59 -0
- viam/gen/stream/v1/stream_pb2.py +39 -0
- viam/gen/stream/v1/stream_pb2.pyi +161 -0
- viam/gen/tagger/__init__.py +0 -0
- viam/gen/tagger/v1/__init__.py +0 -0
- viam/gen/tagger/v1/tagger_grpc.py +0 -0
- viam/gen/tagger/v1/tagger_pb2.py +16 -0
- viam/gen/tagger/v1/tagger_pb2.pyi +15 -0
- viam/logging.py +216 -0
- viam/media/__init__.py +0 -0
- viam/media/audio.py +16 -0
- viam/media/utils/__init__.py +0 -0
- viam/media/utils/pil/__init__.py +51 -0
- viam/media/utils/pil/viam_rgba_plugin.py +73 -0
- viam/media/viam_rgba.py +10 -0
- viam/media/video.py +217 -0
- viam/module/__init__.py +5 -0
- viam/module/module.py +281 -0
- viam/module/service.py +66 -0
- viam/module/types.py +23 -0
- viam/operations.py +124 -0
- viam/proto/__init__.py +0 -0
- viam/proto/app/__init__.py +554 -0
- viam/proto/app/agent/__init__.py +28 -0
- viam/proto/app/billing.py +58 -0
- viam/proto/app/cloudslam/__init__.py +48 -0
- viam/proto/app/data/__init__.py +138 -0
- viam/proto/app/datapipelines/__init__.py +56 -0
- viam/proto/app/dataset/__init__.py +36 -0
- viam/proto/app/datasync/__init__.py +44 -0
- viam/proto/app/end_user.py +34 -0
- viam/proto/app/mlinference/__init__.py +15 -0
- viam/proto/app/mltraining/__init__.py +52 -0
- viam/proto/app/packages/__init__.py +38 -0
- viam/proto/app/robot.py +84 -0
- viam/proto/common/__init__.py +66 -0
- viam/proto/component/__init__.py +0 -0
- viam/proto/component/arm/__init__.py +48 -0
- viam/proto/component/audioinput/__init__.py +30 -0
- viam/proto/component/base/__init__.py +42 -0
- viam/proto/component/board/__init__.py +62 -0
- viam/proto/component/button/__init__.py +15 -0
- viam/proto/component/camera/__init__.py +46 -0
- viam/proto/component/encoder/__init__.py +28 -0
- viam/proto/component/gantry/__init__.py +40 -0
- viam/proto/component/generic/__init__.py +12 -0
- viam/proto/component/gripper/__init__.py +30 -0
- viam/proto/component/inputcontroller/__init__.py +38 -0
- viam/proto/component/motor/__init__.py +56 -0
- viam/proto/component/movementsensor/__init__.py +50 -0
- viam/proto/component/posetracker/__init__.py +19 -0
- viam/proto/component/powersensor/__init__.py +30 -0
- viam/proto/component/sensor/__init__.py +12 -0
- viam/proto/component/servo/__init__.py +32 -0
- viam/proto/component/switch/__init__.py +26 -0
- viam/proto/component/testecho/__init__.py +30 -0
- viam/proto/module/__init__.py +38 -0
- viam/proto/provisioning/__init__.py +36 -0
- viam/proto/robot/__init__.py +130 -0
- viam/proto/rpc/__init__.py +0 -0
- viam/proto/rpc/auth.py +34 -0
- viam/proto/rpc/examples/__init__.py +0 -0
- viam/proto/rpc/examples/echo/__init__.py +26 -0
- viam/proto/rpc/examples/echoresource/__init__.py +30 -0
- viam/proto/rpc/webrtc/__init__.py +0 -0
- viam/proto/rpc/webrtc/grpc.py +36 -0
- viam/proto/rpc/webrtc/signaling.py +58 -0
- viam/proto/service/__init__.py +0 -0
- viam/proto/service/datamanager/__init__.py +19 -0
- viam/proto/service/discovery/__init__.py +15 -0
- viam/proto/service/generic/__init__.py +12 -0
- viam/proto/service/mlmodel/__init__.py +54 -0
- viam/proto/service/motion/__init__.py +68 -0
- viam/proto/service/navigation/__init__.py +58 -0
- viam/proto/service/sensors/__init__.py +18 -0
- viam/proto/service/shell/__init__.py +36 -0
- viam/proto/service/slam/__init__.py +36 -0
- viam/proto/service/vision/__init__.py +46 -0
- viam/proto/stream/__init__.py +36 -0
- viam/proto/tagger/__init__.py +6 -0
- viam/py.typed +0 -0
- viam/resource/__init__.py +0 -0
- viam/resource/base.py +123 -0
- viam/resource/easy_resource.py +153 -0
- viam/resource/manager.py +126 -0
- viam/resource/registry.py +199 -0
- viam/resource/rpc_client_base.py +65 -0
- viam/resource/rpc_service_base.py +48 -0
- viam/resource/types.py +213 -0
- viam/robot/__init__.py +0 -0
- viam/robot/client.py +909 -0
- viam/robot/service.py +69 -0
- viam/rpc/__init__.py +0 -0
- viam/rpc/dial.py +420 -0
- viam/rpc/libviam_rust_utils.dll +0 -0
- viam/rpc/server.py +201 -0
- viam/rpc/signaling.py +29 -0
- viam/rpc/types.py +22 -0
- viam/services/__init__.py +0 -0
- viam/services/discovery/__init__.py +12 -0
- viam/services/discovery/client.py +55 -0
- viam/services/discovery/discovery.py +52 -0
- viam/services/discovery/service.py +43 -0
- viam/services/generic/__init__.py +18 -0
- viam/services/generic/client.py +58 -0
- viam/services/generic/generic.py +58 -0
- viam/services/generic/service.py +29 -0
- viam/services/mlmodel/__init__.py +24 -0
- viam/services/mlmodel/client.py +37 -0
- viam/services/mlmodel/mlmodel.py +78 -0
- viam/services/mlmodel/service.py +38 -0
- viam/services/mlmodel/utils.py +101 -0
- viam/services/motion/__init__.py +17 -0
- viam/services/motion/client.py +215 -0
- viam/services/motion/motion.py +378 -0
- viam/services/motion/service.py +132 -0
- viam/services/navigation/__init__.py +11 -0
- viam/services/navigation/client.py +99 -0
- viam/services/navigation/navigation.py +250 -0
- viam/services/navigation/service.py +137 -0
- viam/services/service_base.py +78 -0
- viam/services/service_client_base.py +46 -0
- viam/services/slam/__init__.py +17 -0
- viam/services/slam/client.py +62 -0
- viam/services/slam/service.py +75 -0
- viam/services/slam/slam.py +111 -0
- viam/services/vision/__init__.py +15 -0
- viam/services/vision/client.py +206 -0
- viam/services/vision/service.py +146 -0
- viam/services/vision/vision.py +315 -0
- viam/sessions_client.py +245 -0
- viam/streams.py +44 -0
- viam/utils.py +365 -0
- viam/version_metadata.py +4 -0
- viam_sdk-0.45.2.dist-info/METADATA +157 -0
- viam_sdk-0.45.2.dist-info/RECORD +476 -0
- viam_sdk-0.45.2.dist-info/WHEEL +4 -0
- viam_sdk-0.45.2.dist-info/licenses/LICENSE +202 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
from logging import Logger
|
|
3
|
+
from typing import TYPE_CHECKING, ClassVar, Mapping, Optional, cast
|
|
4
|
+
|
|
5
|
+
from typing_extensions import Self
|
|
6
|
+
|
|
7
|
+
from viam.logging import getLogger
|
|
8
|
+
from viam.resource.base import ResourceBase
|
|
9
|
+
from viam.utils import ValueTypes
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from viam.resource.types import API
|
|
13
|
+
from viam.robot.client import RobotClient
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ServiceBase(abc.ABC, ResourceBase):
|
|
17
|
+
"""This class describes the base functionality required for a Viam Service.
|
|
18
|
+
All services must inherit from this class.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
API: ClassVar["API"]
|
|
22
|
+
|
|
23
|
+
def __init__(self, name: str, *, logger: Optional[Logger] = None) -> None:
|
|
24
|
+
self.name = name
|
|
25
|
+
self.logger = logger if logger is not None else getLogger(f"{self.API}.{name}")
|
|
26
|
+
|
|
27
|
+
@classmethod
|
|
28
|
+
def from_robot(cls, robot: "RobotClient", name: str) -> Self:
|
|
29
|
+
"""Get the service named ``name`` from the provided robot.
|
|
30
|
+
|
|
31
|
+
::
|
|
32
|
+
|
|
33
|
+
async def connect() -> RobotClient:
|
|
34
|
+
# Replace "<API-KEY>" (including brackets) with your API key and "<API-KEY-ID>" with your API key ID
|
|
35
|
+
options = RobotClient.Options.with_api_key("<API-KEY>", "<API-KEY-ID>")
|
|
36
|
+
# Replace "<MACHINE-URL>" (included brackets) with your machine's connection URL or FQDN
|
|
37
|
+
return await RobotClient.at_address("<MACHINE-URL>", options)
|
|
38
|
+
|
|
39
|
+
async def main():
|
|
40
|
+
robot = await connect()
|
|
41
|
+
|
|
42
|
+
# Can be used with any resource, using the motion service as an example
|
|
43
|
+
motion = MotionClient.from_robot(robot=machine, name="builtin")
|
|
44
|
+
|
|
45
|
+
robot.close()
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
robot (RobotClient): The robot
|
|
49
|
+
name (str): The name of the service
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
Self: The service, if it exists on the robot
|
|
53
|
+
"""
|
|
54
|
+
service = robot.get_service(cls.get_resource_name(name))
|
|
55
|
+
return cast(cls, service) # type: ignore
|
|
56
|
+
|
|
57
|
+
async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Optional[float] = None, **kwargs) -> Mapping[str, ValueTypes]:
|
|
58
|
+
"""Send/receive arbitrary commands.
|
|
59
|
+
|
|
60
|
+
::
|
|
61
|
+
|
|
62
|
+
service = SERVICE.from_robot(robot=machine, "builtin") # replace SERVICE with the appropriate class
|
|
63
|
+
|
|
64
|
+
my_command = {
|
|
65
|
+
"cmnd": "dosomething",
|
|
66
|
+
"someparameter": 52
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
# Can be used with any resource, using the motion service as an example
|
|
70
|
+
await service.do_command(command=my_command)
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
command (Dict[str, ValueTypes]): The command to execute
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
Dict[str, ValueTypes]: Result of the executed command
|
|
77
|
+
"""
|
|
78
|
+
raise NotImplementedError()
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
from typing import TYPE_CHECKING, ClassVar, Mapping, Optional
|
|
3
|
+
|
|
4
|
+
from grpclib.client import Channel
|
|
5
|
+
from typing_extensions import Self
|
|
6
|
+
|
|
7
|
+
from viam.errors import ResourceNotFoundError
|
|
8
|
+
from viam.proto.common import ResourceName
|
|
9
|
+
from viam.resource.base import API, ResourceBase
|
|
10
|
+
from viam.utils import ValueTypes
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from viam.robot.client import RobotClient
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ServiceClientBase(abc.ABC, ResourceBase):
|
|
17
|
+
"""
|
|
18
|
+
Base service client.
|
|
19
|
+
All service clients must inherit from this class.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
API: ClassVar[API]
|
|
23
|
+
channel: Channel
|
|
24
|
+
|
|
25
|
+
def __init__(self, name: str, channel: Channel):
|
|
26
|
+
self.name = name
|
|
27
|
+
self.channel = channel
|
|
28
|
+
|
|
29
|
+
@classmethod
|
|
30
|
+
def from_robot(cls, robot: "RobotClient", name: str = "builtin") -> Self:
|
|
31
|
+
"""Get the service client named ``name`` from the provided robot.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
robot (RobotClient): The robot
|
|
35
|
+
name (str): The name of the service client
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
Self: The service client, if it exists on the robot
|
|
39
|
+
"""
|
|
40
|
+
resource_name = ResourceName(namespace="rdk", type="service", subtype=cls.API.resource_subtype, name=name)
|
|
41
|
+
if resource_name not in robot.resource_names:
|
|
42
|
+
raise ResourceNotFoundError(resource_name.subtype, resource_name.name)
|
|
43
|
+
return cls(name, robot._channel)
|
|
44
|
+
|
|
45
|
+
async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Optional[float] = None, **kwargs) -> Mapping[str, ValueTypes]:
|
|
46
|
+
raise NotImplementedError()
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from viam.proto.common import Pose
|
|
2
|
+
from viam.proto.service.slam import MappingMode, SensorInfo
|
|
3
|
+
from viam.resource.registry import Registry, ResourceRegistration
|
|
4
|
+
|
|
5
|
+
from .client import SLAMClient
|
|
6
|
+
from .service import SLAMRPCService
|
|
7
|
+
from .slam import SLAM
|
|
8
|
+
|
|
9
|
+
__all__ = [
|
|
10
|
+
"Pose",
|
|
11
|
+
"MappingMode",
|
|
12
|
+
"SensorInfo",
|
|
13
|
+
"SLAMClient",
|
|
14
|
+
"SLAM",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
Registry.register_api(ResourceRegistration(SLAM, SLAMRPCService, lambda name, channel: SLAMClient(name, channel)))
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
from typing import List, Mapping, Optional
|
|
2
|
+
|
|
3
|
+
from grpclib.client import Channel
|
|
4
|
+
|
|
5
|
+
from viam.proto.common import DoCommandRequest, DoCommandResponse
|
|
6
|
+
from viam.proto.service.slam import (
|
|
7
|
+
GetInternalStateRequest,
|
|
8
|
+
GetInternalStateResponse,
|
|
9
|
+
GetPointCloudMapRequest,
|
|
10
|
+
GetPointCloudMapResponse,
|
|
11
|
+
GetPositionRequest,
|
|
12
|
+
GetPositionResponse,
|
|
13
|
+
GetPropertiesRequest,
|
|
14
|
+
SLAMServiceStub,
|
|
15
|
+
)
|
|
16
|
+
from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
|
|
17
|
+
from viam.utils import ValueTypes, dict_to_struct, struct_to_dict
|
|
18
|
+
|
|
19
|
+
from . import Pose
|
|
20
|
+
from .slam import SLAM
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class SLAMClient(SLAM, ReconfigurableResourceRPCClientBase):
|
|
24
|
+
"""
|
|
25
|
+
Connect to the SLAMService, which allows the robot to create a map of its surroundings and find its location in that map.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
client: SLAMServiceStub
|
|
29
|
+
|
|
30
|
+
def __init__(self, name: str, channel: Channel):
|
|
31
|
+
self.channel = channel
|
|
32
|
+
self.client = SLAMServiceStub(channel)
|
|
33
|
+
super().__init__(name)
|
|
34
|
+
|
|
35
|
+
async def get_position(self, *, timeout: Optional[float] = None, **kwargs) -> Pose:
|
|
36
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
37
|
+
request = GetPositionRequest(name=self.name)
|
|
38
|
+
response: GetPositionResponse = await self.client.GetPosition(request, timeout=timeout, metadata=md)
|
|
39
|
+
return response.pose
|
|
40
|
+
|
|
41
|
+
async def get_point_cloud_map(self, return_edited_map: bool = False, *, timeout: Optional[float] = None, **kwargs) -> List[bytes]:
|
|
42
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
43
|
+
request = GetPointCloudMapRequest(name=self.name, return_edited_map=return_edited_map)
|
|
44
|
+
response: List[GetPointCloudMapResponse] = await self.client.GetPointCloudMap(request, timeout=timeout, metadata=md)
|
|
45
|
+
return [r.point_cloud_pcd_chunk for r in response]
|
|
46
|
+
|
|
47
|
+
async def get_internal_state(self, *, timeout: Optional[float] = None, **kwargs) -> List[bytes]:
|
|
48
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
49
|
+
request = GetInternalStateRequest(name=self.name)
|
|
50
|
+
response: List[GetInternalStateResponse] = await self.client.GetInternalState(request, timeout=timeout, metadata=md)
|
|
51
|
+
return [r.internal_state_chunk for r in response]
|
|
52
|
+
|
|
53
|
+
async def get_properties(self, *, timeout: Optional[float] = None, **kwargs) -> SLAM.Properties:
|
|
54
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
55
|
+
request = GetPropertiesRequest(name=self.name)
|
|
56
|
+
return await self.client.GetProperties(request, timeout=timeout, metadata=md)
|
|
57
|
+
|
|
58
|
+
async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Optional[float] = None, **kwargs) -> Mapping[str, ValueTypes]:
|
|
59
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
60
|
+
request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
|
|
61
|
+
response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
|
|
62
|
+
return struct_to_dict(response.result)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
from grpclib.server import Stream
|
|
2
|
+
|
|
3
|
+
from viam.proto.common import DoCommandRequest, DoCommandResponse
|
|
4
|
+
from viam.proto.service.slam import (
|
|
5
|
+
GetInternalStateRequest,
|
|
6
|
+
GetInternalStateResponse,
|
|
7
|
+
GetPointCloudMapRequest,
|
|
8
|
+
GetPointCloudMapResponse,
|
|
9
|
+
GetPositionRequest,
|
|
10
|
+
GetPositionResponse,
|
|
11
|
+
GetPropertiesRequest,
|
|
12
|
+
GetPropertiesResponse,
|
|
13
|
+
SLAMServiceBase,
|
|
14
|
+
)
|
|
15
|
+
from viam.resource.rpc_service_base import ResourceRPCServiceBase
|
|
16
|
+
from viam.utils import dict_to_struct, struct_to_dict
|
|
17
|
+
|
|
18
|
+
from .slam import SLAM
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class SLAMRPCService(SLAMServiceBase, ResourceRPCServiceBase):
|
|
22
|
+
"""
|
|
23
|
+
gRPC Service for a SLAM service
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
RESOURCE_TYPE = SLAM
|
|
27
|
+
|
|
28
|
+
async def GetInternalState(self, stream: Stream[GetInternalStateRequest, GetInternalStateResponse]) -> None:
|
|
29
|
+
request = await stream.recv_message()
|
|
30
|
+
assert request is not None
|
|
31
|
+
name = request.name
|
|
32
|
+
slam = self.get_resource(name)
|
|
33
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
34
|
+
chunks = await slam.get_internal_state(timeout=timeout)
|
|
35
|
+
for chunk in chunks:
|
|
36
|
+
response = GetInternalStateResponse(internal_state_chunk=chunk)
|
|
37
|
+
await stream.send_message(response)
|
|
38
|
+
|
|
39
|
+
async def GetPointCloudMap(self, stream: Stream[GetPointCloudMapRequest, GetPointCloudMapResponse]) -> None:
|
|
40
|
+
request = await stream.recv_message()
|
|
41
|
+
assert request is not None
|
|
42
|
+
name = request.name
|
|
43
|
+
slam = self.get_resource(name)
|
|
44
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
45
|
+
chunks = await slam.get_point_cloud_map(return_edited_map=request.return_edited_map, timeout=timeout)
|
|
46
|
+
for chunk in chunks:
|
|
47
|
+
response = GetPointCloudMapResponse(point_cloud_pcd_chunk=chunk)
|
|
48
|
+
await stream.send_message(response)
|
|
49
|
+
|
|
50
|
+
async def GetPosition(self, stream: Stream[GetPositionRequest, GetPositionResponse]) -> None:
|
|
51
|
+
request = await stream.recv_message()
|
|
52
|
+
assert request is not None
|
|
53
|
+
name = request.name
|
|
54
|
+
slam = self.get_resource(name)
|
|
55
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
56
|
+
position = await slam.get_position(timeout=timeout)
|
|
57
|
+
response = GetPositionResponse(pose=position)
|
|
58
|
+
await stream.send_message(response)
|
|
59
|
+
|
|
60
|
+
async def GetProperties(self, stream: Stream[GetPropertiesRequest, GetPropertiesResponse]) -> None:
|
|
61
|
+
request = await stream.recv_message()
|
|
62
|
+
assert request is not None
|
|
63
|
+
slam = self.get_resource(request.name)
|
|
64
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
65
|
+
properties = await slam.get_properties(timeout=timeout)
|
|
66
|
+
await stream.send_message(properties)
|
|
67
|
+
|
|
68
|
+
async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None:
|
|
69
|
+
request = await stream.recv_message()
|
|
70
|
+
assert request is not None
|
|
71
|
+
slam = self.get_resource(request.name)
|
|
72
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
73
|
+
result = await slam.do_command(command=struct_to_dict(request.command), timeout=timeout, metadata=stream.metadata)
|
|
74
|
+
response = DoCommandResponse(result=dict_to_struct(result))
|
|
75
|
+
await stream.send_message(response)
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
import sys
|
|
3
|
+
from typing import Final, List, Optional
|
|
4
|
+
|
|
5
|
+
from viam.proto.service.slam import GetPropertiesResponse
|
|
6
|
+
from viam.resource.types import API, RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_SERVICE
|
|
7
|
+
|
|
8
|
+
from ..service_base import ServiceBase
|
|
9
|
+
from . import Pose
|
|
10
|
+
|
|
11
|
+
if sys.version_info >= (3, 10):
|
|
12
|
+
from typing import TypeAlias
|
|
13
|
+
else:
|
|
14
|
+
from typing_extensions import TypeAlias
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class SLAM(ServiceBase):
|
|
18
|
+
"""
|
|
19
|
+
SLAM represents a SLAM service.
|
|
20
|
+
|
|
21
|
+
This acts as an abstract base class for any drivers representing specific
|
|
22
|
+
arm implementations. This cannot be used on its own. If the ``__init__()`` function is
|
|
23
|
+
overridden, it must call the ``super().__init__()`` function.
|
|
24
|
+
|
|
25
|
+
For more information, see `SLAM service <https://docs.viam.com/dev/reference/apis/services/slam/>`_.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
API: Final = API(RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_SERVICE, "slam") # pyright: ignore [reportIncompatibleVariableOverride]
|
|
29
|
+
|
|
30
|
+
Properties: "TypeAlias" = GetPropertiesResponse
|
|
31
|
+
|
|
32
|
+
@abc.abstractmethod
|
|
33
|
+
async def get_internal_state(self, *, timeout: Optional[float]) -> List[bytes]:
|
|
34
|
+
"""
|
|
35
|
+
Get the internal state of the SLAM algorithm required to continue mapping/localization.
|
|
36
|
+
|
|
37
|
+
::
|
|
38
|
+
|
|
39
|
+
slam = SLAMClient.from_robot(robot=machine, name="my_slam_service")
|
|
40
|
+
|
|
41
|
+
# Get the internal state of the SLAM algorithm required to continue mapping/localization.
|
|
42
|
+
internal_state = await slam.get_internal_state()
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
List[GetInternalStateResponse]: Chunks of the internal state of the SLAM algorithm
|
|
46
|
+
|
|
47
|
+
For more information, see `SLAM service <https://docs.viam.com/dev/reference/apis/services/slam/#getinternalstate>`_.
|
|
48
|
+
"""
|
|
49
|
+
...
|
|
50
|
+
|
|
51
|
+
@abc.abstractmethod
|
|
52
|
+
async def get_point_cloud_map(self, return_edited_map: bool = False, *, timeout: Optional[float]) -> List[bytes]:
|
|
53
|
+
"""
|
|
54
|
+
Get the point cloud map.
|
|
55
|
+
|
|
56
|
+
::
|
|
57
|
+
|
|
58
|
+
slam_svc = SLAMClient.from_robot(robot=machine, name="my_slam_service")
|
|
59
|
+
|
|
60
|
+
# Get the point cloud map in standard PCD format.
|
|
61
|
+
pcd_map = await slam_svc.get_point_cloud_map()
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
return_edited_map (bool): signal to the SLAM service to return an edited map, if the map package contains one and if
|
|
65
|
+
the SLAM service supports the feature
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
List[GetPointCloudMapResponse]: Complete pointcloud in standard PCD format. Chunks of the PointCloud, concatenating all
|
|
69
|
+
GetPointCloudMapResponse.point_cloud_pcd_chunk values.
|
|
70
|
+
|
|
71
|
+
For more information, see `SLAM service <https://docs.viam.com/dev/reference/apis/services/slam/#getpointcloudmap>`_.
|
|
72
|
+
"""
|
|
73
|
+
...
|
|
74
|
+
|
|
75
|
+
@abc.abstractmethod
|
|
76
|
+
async def get_position(self, *, timeout: Optional[float]) -> Pose:
|
|
77
|
+
"""
|
|
78
|
+
Get current position of the specified component in the SLAM Map.
|
|
79
|
+
|
|
80
|
+
::
|
|
81
|
+
|
|
82
|
+
slam_svc = SLAMClient.from_robot(robot=machine, name="my_slam_service")
|
|
83
|
+
|
|
84
|
+
# Get the current position of the specified source component in the SLAM map as a Pose.
|
|
85
|
+
pose = await slam.get_position()
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
Pose: The current position of the specified component
|
|
89
|
+
|
|
90
|
+
For more information, see `SLAM service <https://docs.viam.com/dev/reference/apis/services/slam/#getposition>`_.
|
|
91
|
+
"""
|
|
92
|
+
...
|
|
93
|
+
|
|
94
|
+
@abc.abstractmethod
|
|
95
|
+
async def get_properties(self, *, timeout: Optional[float]) -> Properties:
|
|
96
|
+
"""
|
|
97
|
+
Get information regarding the current SLAM session.
|
|
98
|
+
|
|
99
|
+
::
|
|
100
|
+
|
|
101
|
+
slam_svc = SLAMClient.from_robot(robot=machine, name="my_slam_service")
|
|
102
|
+
|
|
103
|
+
# Get the properties of your current SLAM session.
|
|
104
|
+
slam_properties = await slam_svc.get_properties()
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
Properties: The properties of SLAM
|
|
108
|
+
|
|
109
|
+
For more information, see `SLAM service <https://docs.viam.com/dev/reference/apis/services/slam/#getproperties>`_.
|
|
110
|
+
"""
|
|
111
|
+
...
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from viam.resource.registry import Registry, ResourceRegistration
|
|
2
|
+
from viam.services.vision.service import VisionRPCService
|
|
3
|
+
|
|
4
|
+
from .client import Classification, Detection, VisionClient
|
|
5
|
+
from .vision import CaptureAllResult, Vision
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"CaptureAllResult",
|
|
9
|
+
"Classification",
|
|
10
|
+
"Detection",
|
|
11
|
+
"VisionClient",
|
|
12
|
+
"Vision",
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
Registry.register_api(ResourceRegistration(Vision, VisionRPCService, lambda name, channel: VisionClient(name, channel)))
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
from typing import Any, List, Mapping, Optional
|
|
2
|
+
|
|
3
|
+
from grpclib.client import Channel
|
|
4
|
+
|
|
5
|
+
from viam.errors import ViamError
|
|
6
|
+
from viam.media.video import CameraMimeType, ViamImage
|
|
7
|
+
from viam.proto.common import DoCommandRequest, DoCommandResponse, PointCloudObject
|
|
8
|
+
from viam.proto.service.vision import (
|
|
9
|
+
CaptureAllFromCameraRequest,
|
|
10
|
+
CaptureAllFromCameraResponse,
|
|
11
|
+
Classification,
|
|
12
|
+
Detection,
|
|
13
|
+
GetClassificationsFromCameraRequest,
|
|
14
|
+
GetClassificationsFromCameraResponse,
|
|
15
|
+
GetClassificationsRequest,
|
|
16
|
+
GetClassificationsResponse,
|
|
17
|
+
GetDetectionsFromCameraRequest,
|
|
18
|
+
GetDetectionsFromCameraResponse,
|
|
19
|
+
GetDetectionsRequest,
|
|
20
|
+
GetDetectionsResponse,
|
|
21
|
+
GetObjectPointCloudsRequest,
|
|
22
|
+
GetObjectPointCloudsResponse,
|
|
23
|
+
GetPropertiesRequest,
|
|
24
|
+
GetPropertiesResponse,
|
|
25
|
+
VisionServiceStub,
|
|
26
|
+
)
|
|
27
|
+
from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
|
|
28
|
+
from viam.utils import ValueTypes, dict_to_struct, struct_to_dict
|
|
29
|
+
|
|
30
|
+
from .vision import CaptureAllResult, Vision
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class VisionClient(Vision, ReconfigurableResourceRPCClientBase):
|
|
34
|
+
"""
|
|
35
|
+
Connect to the Vision service, which allows you to access various computer vision algorithms
|
|
36
|
+
(like detection, segmentation, tracking, etc) that usually only require a camera or image input.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
client: VisionServiceStub
|
|
40
|
+
|
|
41
|
+
def __init__(self, name: str, channel: Channel):
|
|
42
|
+
super().__init__(name)
|
|
43
|
+
self.channel = channel
|
|
44
|
+
self.client = VisionServiceStub(channel)
|
|
45
|
+
|
|
46
|
+
async def capture_all_from_camera(
|
|
47
|
+
self,
|
|
48
|
+
camera_name: str,
|
|
49
|
+
return_image: bool = False,
|
|
50
|
+
return_classifications: bool = False,
|
|
51
|
+
return_detections: bool = False,
|
|
52
|
+
return_object_point_clouds: bool = False,
|
|
53
|
+
*,
|
|
54
|
+
extra: Optional[Mapping[str, Any]] = None,
|
|
55
|
+
timeout: Optional[float] = None,
|
|
56
|
+
**kwargs,
|
|
57
|
+
) -> CaptureAllResult:
|
|
58
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
59
|
+
request = CaptureAllFromCameraRequest(
|
|
60
|
+
name=self.name,
|
|
61
|
+
camera_name=camera_name,
|
|
62
|
+
return_image=return_image,
|
|
63
|
+
return_classifications=return_classifications,
|
|
64
|
+
return_detections=return_detections,
|
|
65
|
+
return_object_point_clouds=return_object_point_clouds,
|
|
66
|
+
extra=dict_to_struct(extra),
|
|
67
|
+
)
|
|
68
|
+
response: CaptureAllFromCameraResponse = await self.client.CaptureAllFromCamera(request, timeout=timeout, metadata=md)
|
|
69
|
+
result = CaptureAllResult()
|
|
70
|
+
result.extra = struct_to_dict(response.extra)
|
|
71
|
+
if return_image:
|
|
72
|
+
mime_type = CameraMimeType.from_proto(response.image.format)
|
|
73
|
+
img = ViamImage(response.image.image, mime_type)
|
|
74
|
+
result.image = img
|
|
75
|
+
if return_classifications:
|
|
76
|
+
result.classifications = list(response.classifications)
|
|
77
|
+
if return_detections:
|
|
78
|
+
result.detections = list(response.detections)
|
|
79
|
+
if return_object_point_clouds:
|
|
80
|
+
result.objects = list(response.objects)
|
|
81
|
+
return result
|
|
82
|
+
|
|
83
|
+
async def get_detections_from_camera(
|
|
84
|
+
self,
|
|
85
|
+
camera_name: str,
|
|
86
|
+
*,
|
|
87
|
+
extra: Optional[Mapping[str, Any]] = None,
|
|
88
|
+
timeout: Optional[float] = None,
|
|
89
|
+
**kwargs,
|
|
90
|
+
) -> List[Detection]:
|
|
91
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
92
|
+
request = GetDetectionsFromCameraRequest(name=self.name, camera_name=camera_name, extra=dict_to_struct(extra))
|
|
93
|
+
response: GetDetectionsFromCameraResponse = await self.client.GetDetectionsFromCamera(request, timeout=timeout, metadata=md)
|
|
94
|
+
return list(response.detections)
|
|
95
|
+
|
|
96
|
+
async def get_detections(
|
|
97
|
+
self,
|
|
98
|
+
image: ViamImage,
|
|
99
|
+
*,
|
|
100
|
+
extra: Optional[Mapping[str, Any]] = None,
|
|
101
|
+
timeout: Optional[float] = None,
|
|
102
|
+
**kwargs,
|
|
103
|
+
) -> List[Detection]:
|
|
104
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
105
|
+
mime_type = CameraMimeType.JPEG
|
|
106
|
+
|
|
107
|
+
if image.width is None or image.height is None:
|
|
108
|
+
raise ViamError(f"image {image} needs to have a specified width and height")
|
|
109
|
+
else:
|
|
110
|
+
request = GetDetectionsRequest(
|
|
111
|
+
name=self.name,
|
|
112
|
+
image=image.data,
|
|
113
|
+
width=image.width,
|
|
114
|
+
height=image.height,
|
|
115
|
+
mime_type=mime_type,
|
|
116
|
+
extra=dict_to_struct(extra),
|
|
117
|
+
)
|
|
118
|
+
response: GetDetectionsResponse = await self.client.GetDetections(request, timeout=timeout, metadata=md)
|
|
119
|
+
return list(response.detections)
|
|
120
|
+
|
|
121
|
+
async def get_classifications_from_camera(
|
|
122
|
+
self,
|
|
123
|
+
camera_name: str,
|
|
124
|
+
count: int,
|
|
125
|
+
*,
|
|
126
|
+
extra: Optional[Mapping[str, Any]] = None,
|
|
127
|
+
timeout: Optional[float] = None,
|
|
128
|
+
**kwargs,
|
|
129
|
+
) -> List[Classification]:
|
|
130
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
131
|
+
request = GetClassificationsFromCameraRequest(name=self.name, camera_name=camera_name, n=count, extra=dict_to_struct(extra))
|
|
132
|
+
response: GetClassificationsFromCameraResponse = await self.client.GetClassificationsFromCamera(
|
|
133
|
+
request, timeout=timeout, metadata=md
|
|
134
|
+
)
|
|
135
|
+
return list(response.classifications)
|
|
136
|
+
|
|
137
|
+
async def get_classifications(
|
|
138
|
+
self,
|
|
139
|
+
image: ViamImage,
|
|
140
|
+
count: int,
|
|
141
|
+
*,
|
|
142
|
+
extra: Optional[Mapping[str, Any]] = None,
|
|
143
|
+
timeout: Optional[float] = None,
|
|
144
|
+
**kwargs,
|
|
145
|
+
) -> List[Classification]:
|
|
146
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
147
|
+
|
|
148
|
+
mime_type = CameraMimeType.JPEG
|
|
149
|
+
if image.width is None or image.height is None:
|
|
150
|
+
raise ViamError(f"image {image} needs to have a specified width and height")
|
|
151
|
+
request = GetClassificationsRequest(
|
|
152
|
+
name=self.name,
|
|
153
|
+
image=image.data,
|
|
154
|
+
width=image.width,
|
|
155
|
+
height=image.height,
|
|
156
|
+
mime_type=mime_type,
|
|
157
|
+
n=count,
|
|
158
|
+
extra=dict_to_struct(extra),
|
|
159
|
+
)
|
|
160
|
+
response: GetClassificationsResponse = await self.client.GetClassifications(request, timeout=timeout, metadata=md)
|
|
161
|
+
return list(response.classifications)
|
|
162
|
+
|
|
163
|
+
async def get_object_point_clouds(
|
|
164
|
+
self,
|
|
165
|
+
camera_name: str,
|
|
166
|
+
*,
|
|
167
|
+
extra: Optional[Mapping[str, Any]] = None,
|
|
168
|
+
timeout: Optional[float] = None,
|
|
169
|
+
**kwargs,
|
|
170
|
+
) -> List[PointCloudObject]:
|
|
171
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
172
|
+
request = GetObjectPointCloudsRequest(
|
|
173
|
+
name=self.name,
|
|
174
|
+
camera_name=camera_name,
|
|
175
|
+
mime_type=CameraMimeType.PCD,
|
|
176
|
+
extra=dict_to_struct(extra),
|
|
177
|
+
)
|
|
178
|
+
response: GetObjectPointCloudsResponse = await self.client.GetObjectPointClouds(request, timeout=timeout, metadata=md)
|
|
179
|
+
return list(response.objects)
|
|
180
|
+
|
|
181
|
+
async def get_properties(
|
|
182
|
+
self,
|
|
183
|
+
*,
|
|
184
|
+
extra: Optional[Mapping[str, Any]] = None,
|
|
185
|
+
timeout: Optional[float] = None,
|
|
186
|
+
**kwargs,
|
|
187
|
+
) -> Vision.Properties:
|
|
188
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
189
|
+
request = GetPropertiesRequest(
|
|
190
|
+
name=self.name,
|
|
191
|
+
extra=dict_to_struct(extra),
|
|
192
|
+
)
|
|
193
|
+
response: GetPropertiesResponse = await self.client.GetProperties(request, timeout=timeout, metadata=md)
|
|
194
|
+
return response
|
|
195
|
+
|
|
196
|
+
async def do_command(
|
|
197
|
+
self,
|
|
198
|
+
command: Mapping[str, ValueTypes],
|
|
199
|
+
*,
|
|
200
|
+
timeout: Optional[float] = None,
|
|
201
|
+
**kwargs,
|
|
202
|
+
) -> Mapping[str, ValueTypes]:
|
|
203
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
204
|
+
request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
|
|
205
|
+
response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
|
|
206
|
+
return struct_to_dict(response.result)
|