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,175 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from multiprocessing import Pipe
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from grpclib.server import Stream
|
|
6
|
+
from h2.exceptions import StreamClosedError
|
|
7
|
+
|
|
8
|
+
import viam
|
|
9
|
+
from viam.errors import NotSupportedError
|
|
10
|
+
from viam.proto.common import DoCommandRequest, DoCommandResponse, GetGeometriesRequest, GetGeometriesResponse
|
|
11
|
+
from viam.proto.component.inputcontroller import (
|
|
12
|
+
GetControlsRequest,
|
|
13
|
+
GetControlsResponse,
|
|
14
|
+
GetEventsRequest,
|
|
15
|
+
GetEventsResponse,
|
|
16
|
+
InputControllerServiceBase,
|
|
17
|
+
StreamEventsRequest,
|
|
18
|
+
StreamEventsResponse,
|
|
19
|
+
TriggerEventRequest,
|
|
20
|
+
TriggerEventResponse,
|
|
21
|
+
)
|
|
22
|
+
from viam.resource.rpc_service_base import ResourceRPCServiceBase
|
|
23
|
+
from viam.utils import dict_to_struct, struct_to_dict
|
|
24
|
+
|
|
25
|
+
from .input import Control, Controller, Event, EventType
|
|
26
|
+
|
|
27
|
+
LOGGER = viam.logging.getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class InputControllerRPCService(InputControllerServiceBase, ResourceRPCServiceBase[Controller]):
|
|
31
|
+
"""
|
|
32
|
+
gRPC Service for an input controller
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
RESOURCE_TYPE = Controller
|
|
36
|
+
|
|
37
|
+
async def GetControls(self, stream: Stream[GetControlsRequest, GetControlsResponse]) -> None:
|
|
38
|
+
request = await stream.recv_message()
|
|
39
|
+
assert request is not None
|
|
40
|
+
name = request.controller
|
|
41
|
+
controller = self.get_resource(name)
|
|
42
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
43
|
+
controls = await controller.get_controls(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
|
|
44
|
+
response = GetControlsResponse(controls=[c.value for c in controls])
|
|
45
|
+
await stream.send_message(response)
|
|
46
|
+
|
|
47
|
+
async def GetEvents(self, stream: Stream[GetEventsRequest, GetEventsResponse]) -> None:
|
|
48
|
+
request = await stream.recv_message()
|
|
49
|
+
assert request is not None
|
|
50
|
+
name = request.controller
|
|
51
|
+
controller = self.get_resource(name)
|
|
52
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
53
|
+
events = await controller.get_events(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
|
|
54
|
+
pb_events = [e.proto for e in events.values()]
|
|
55
|
+
response = GetEventsResponse(events=pb_events)
|
|
56
|
+
await stream.send_message(response)
|
|
57
|
+
|
|
58
|
+
async def StreamEvents(self, stream: Stream[StreamEventsRequest, StreamEventsResponse]) -> None:
|
|
59
|
+
request = await stream.recv_message()
|
|
60
|
+
assert request is not None
|
|
61
|
+
name = request.controller
|
|
62
|
+
controller = self.get_resource(name)
|
|
63
|
+
|
|
64
|
+
loop = asyncio.get_running_loop()
|
|
65
|
+
# Using Pipes to send event data back to this function so it can be streamed to clients
|
|
66
|
+
# The write pipe is added to the callbacks for a control, so whenever that control sends a watched event,
|
|
67
|
+
# that event is sent through the pipe, where it will be read (further down) and sent over the stream
|
|
68
|
+
pipe_r, pipe_w = Pipe(duplex=False)
|
|
69
|
+
|
|
70
|
+
def ctrlFunc(event: Event):
|
|
71
|
+
try:
|
|
72
|
+
pipe_w.send(event)
|
|
73
|
+
except Exception as e:
|
|
74
|
+
LOGGER.error(e)
|
|
75
|
+
cleanup(e)
|
|
76
|
+
|
|
77
|
+
# Register the pipe callbacks
|
|
78
|
+
for event in request.events:
|
|
79
|
+
triggers = [EventType(et) for et in event.events]
|
|
80
|
+
if len(triggers):
|
|
81
|
+
controller.register_control_callback(
|
|
82
|
+
Control(event.control),
|
|
83
|
+
triggers,
|
|
84
|
+
ctrlFunc,
|
|
85
|
+
extra=struct_to_dict(request.extra),
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
cancelled_triggers = [EventType(et) for et in event.cancelled_events]
|
|
89
|
+
if len(cancelled_triggers):
|
|
90
|
+
controller.register_control_callback(
|
|
91
|
+
Control(event.control),
|
|
92
|
+
cancelled_triggers,
|
|
93
|
+
None,
|
|
94
|
+
extra=struct_to_dict(request.extra),
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
# Asynchronously wait for messages to come over the read pipe and run the READ function whenever the pipe is ready.
|
|
98
|
+
def read():
|
|
99
|
+
ev: Event = pipe_r.recv()
|
|
100
|
+
pb_ev = ev.proto
|
|
101
|
+
response = StreamEventsResponse(event=pb_ev)
|
|
102
|
+
|
|
103
|
+
async def send_message():
|
|
104
|
+
try:
|
|
105
|
+
stream._cancel_done = False # Undo hack, see below
|
|
106
|
+
await stream.send_message(response)
|
|
107
|
+
except StreamClosedError:
|
|
108
|
+
cleanup()
|
|
109
|
+
except Exception as e:
|
|
110
|
+
cleanup(e)
|
|
111
|
+
|
|
112
|
+
loop.create_task(send_message(), name=f"{viam._TASK_PREFIX}-input_send_event")
|
|
113
|
+
|
|
114
|
+
loop.add_reader(pipe_r, read)
|
|
115
|
+
|
|
116
|
+
# HACK: Keep the stream open when this function returns.
|
|
117
|
+
# When the StreamEvents function returns, the Stream is closed. But we don't want the stream to close because we still need
|
|
118
|
+
# to send events to any clients who have registered callbacks.
|
|
119
|
+
# By setting ``stream._cancel_done`` to ``True``, this tricks grpclib into thinking it already closed the stream, so it doesn't
|
|
120
|
+
# perform any cleanup (like removing the stream). We eventually do want to actually close this stream, so we undo this hack
|
|
121
|
+
# every time we send a message. That way, the trailing metadata is sent when either the server closes or the client disconnects.
|
|
122
|
+
stream._cancel_done = True
|
|
123
|
+
|
|
124
|
+
# Remove ctrl functions when this stream is closed
|
|
125
|
+
def cleanup(exc: Optional[Exception] = None):
|
|
126
|
+
loop.remove_reader(pipe_r)
|
|
127
|
+
pipe_w.close()
|
|
128
|
+
pipe_r.close()
|
|
129
|
+
unregister_pipe_callbacks()
|
|
130
|
+
asyncio.create_task(stream.__aexit__(None, exc, None))
|
|
131
|
+
|
|
132
|
+
def unregister_pipe_callbacks():
|
|
133
|
+
for event in request.events:
|
|
134
|
+
triggers = [EventType(et) for et in event.events]
|
|
135
|
+
if len(triggers):
|
|
136
|
+
controller.register_control_callback(
|
|
137
|
+
Control(event.control),
|
|
138
|
+
triggers,
|
|
139
|
+
None,
|
|
140
|
+
extra=struct_to_dict(request.extra),
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
async def TriggerEvent(self, stream: Stream[TriggerEventRequest, TriggerEventResponse]) -> None:
|
|
144
|
+
request = await stream.recv_message()
|
|
145
|
+
assert request is not None
|
|
146
|
+
name = request.controller
|
|
147
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
148
|
+
controller = self.get_resource(name)
|
|
149
|
+
try:
|
|
150
|
+
pb_event = request.event
|
|
151
|
+
event = Event.from_proto(pb_event)
|
|
152
|
+
await controller.trigger_event(event, extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
|
|
153
|
+
except NotSupportedError as e:
|
|
154
|
+
raise e.grpc_error
|
|
155
|
+
|
|
156
|
+
response = TriggerEventResponse()
|
|
157
|
+
await stream.send_message(response)
|
|
158
|
+
|
|
159
|
+
async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None:
|
|
160
|
+
request = await stream.recv_message()
|
|
161
|
+
assert request is not None
|
|
162
|
+
controller = self.get_resource(request.name)
|
|
163
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
164
|
+
result = await controller.do_command(command=struct_to_dict(request.command), timeout=timeout, metadata=stream.metadata)
|
|
165
|
+
response = DoCommandResponse(result=dict_to_struct(result))
|
|
166
|
+
await stream.send_message(response)
|
|
167
|
+
|
|
168
|
+
async def GetGeometries(self, stream: Stream[GetGeometriesRequest, GetGeometriesResponse]) -> None:
|
|
169
|
+
request = await stream.recv_message()
|
|
170
|
+
assert request is not None
|
|
171
|
+
arm = self.get_resource(request.name)
|
|
172
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
173
|
+
geometries = await arm.get_geometries(extra=struct_to_dict(request.extra), timeout=timeout)
|
|
174
|
+
response = GetGeometriesResponse(geometries=geometries)
|
|
175
|
+
await stream.send_message(response)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from viam.resource.registry import Registry, ResourceRegistration
|
|
2
|
+
|
|
3
|
+
from .client import MotorClient
|
|
4
|
+
from .motor import Motor
|
|
5
|
+
from .service import MotorRPCService
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"Motor",
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
Registry.register_api(ResourceRegistration(Motor, MotorRPCService, lambda name, channel: MotorClient(name, channel)))
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
from typing import Any, Dict, List, Mapping, Optional, Tuple
|
|
2
|
+
|
|
3
|
+
from grpclib.client import Channel
|
|
4
|
+
|
|
5
|
+
from viam.proto.common import DoCommandRequest, DoCommandResponse, Geometry
|
|
6
|
+
from viam.proto.component.motor import (
|
|
7
|
+
GetPositionRequest,
|
|
8
|
+
GetPositionResponse,
|
|
9
|
+
GetPropertiesRequest,
|
|
10
|
+
GetPropertiesResponse,
|
|
11
|
+
GoForRequest,
|
|
12
|
+
GoToRequest,
|
|
13
|
+
IsMovingRequest,
|
|
14
|
+
IsMovingResponse,
|
|
15
|
+
IsPoweredRequest,
|
|
16
|
+
IsPoweredResponse,
|
|
17
|
+
MotorServiceStub,
|
|
18
|
+
ResetZeroPositionRequest,
|
|
19
|
+
SetPowerRequest,
|
|
20
|
+
SetRPMRequest,
|
|
21
|
+
StopRequest,
|
|
22
|
+
)
|
|
23
|
+
from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
|
|
24
|
+
from viam.utils import ValueTypes, dict_to_struct, get_geometries, struct_to_dict
|
|
25
|
+
|
|
26
|
+
from .motor import Motor
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class MotorClient(Motor, ReconfigurableResourceRPCClientBase):
|
|
30
|
+
"""
|
|
31
|
+
gRPC client for the Motor component.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def __init__(self, name: str, channel: Channel):
|
|
35
|
+
self.channel = channel
|
|
36
|
+
self.client = MotorServiceStub(channel)
|
|
37
|
+
super().__init__(name)
|
|
38
|
+
|
|
39
|
+
async def set_power(
|
|
40
|
+
self,
|
|
41
|
+
power: float,
|
|
42
|
+
*,
|
|
43
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
44
|
+
timeout: Optional[float] = None,
|
|
45
|
+
**kwargs,
|
|
46
|
+
):
|
|
47
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
48
|
+
request = SetPowerRequest(name=self.name, power_pct=power, extra=dict_to_struct(extra))
|
|
49
|
+
await self.client.SetPower(request, timeout=timeout, metadata=md)
|
|
50
|
+
|
|
51
|
+
async def go_for(
|
|
52
|
+
self,
|
|
53
|
+
rpm: float,
|
|
54
|
+
revolutions: float,
|
|
55
|
+
*,
|
|
56
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
57
|
+
timeout: Optional[float] = None,
|
|
58
|
+
**kwargs,
|
|
59
|
+
):
|
|
60
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
61
|
+
request = GoForRequest(name=self.name, rpm=rpm, revolutions=revolutions, extra=dict_to_struct(extra))
|
|
62
|
+
await self.client.GoFor(request, timeout=timeout, metadata=md)
|
|
63
|
+
|
|
64
|
+
async def go_to(
|
|
65
|
+
self,
|
|
66
|
+
rpm: float,
|
|
67
|
+
position_revolutions: float,
|
|
68
|
+
*,
|
|
69
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
70
|
+
timeout: Optional[float] = None,
|
|
71
|
+
**kwargs,
|
|
72
|
+
):
|
|
73
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
74
|
+
request = GoToRequest(name=self.name, rpm=rpm, position_revolutions=position_revolutions, extra=dict_to_struct(extra))
|
|
75
|
+
await self.client.GoTo(request, timeout=timeout, metadata=md)
|
|
76
|
+
|
|
77
|
+
async def set_rpm(
|
|
78
|
+
self,
|
|
79
|
+
rpm: float,
|
|
80
|
+
*,
|
|
81
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
82
|
+
timeout: Optional[float] = None,
|
|
83
|
+
**kwargs,
|
|
84
|
+
):
|
|
85
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
86
|
+
request = SetRPMRequest(name=self.name, rpm=rpm, extra=dict_to_struct(extra))
|
|
87
|
+
await self.client.SetRPM(request, timeout=timeout, metadata=md)
|
|
88
|
+
|
|
89
|
+
async def reset_zero_position(
|
|
90
|
+
self,
|
|
91
|
+
offset: float,
|
|
92
|
+
*,
|
|
93
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
94
|
+
timeout: Optional[float] = None,
|
|
95
|
+
**kwargs,
|
|
96
|
+
):
|
|
97
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
98
|
+
request = ResetZeroPositionRequest(name=self.name, offset=offset, extra=dict_to_struct(extra))
|
|
99
|
+
await self.client.ResetZeroPosition(request, timeout=timeout, metadata=md)
|
|
100
|
+
|
|
101
|
+
async def get_position(
|
|
102
|
+
self,
|
|
103
|
+
*,
|
|
104
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
105
|
+
timeout: Optional[float] = None,
|
|
106
|
+
**kwargs,
|
|
107
|
+
) -> float:
|
|
108
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
109
|
+
request = GetPositionRequest(name=self.name, extra=dict_to_struct(extra))
|
|
110
|
+
response: GetPositionResponse = await self.client.GetPosition(request, timeout=timeout, metadata=md)
|
|
111
|
+
return response.position
|
|
112
|
+
|
|
113
|
+
async def get_properties(
|
|
114
|
+
self,
|
|
115
|
+
*,
|
|
116
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
117
|
+
timeout: Optional[float] = None,
|
|
118
|
+
**kwargs,
|
|
119
|
+
) -> Motor.Properties:
|
|
120
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
121
|
+
request = GetPropertiesRequest(name=self.name, extra=dict_to_struct(extra))
|
|
122
|
+
response: GetPropertiesResponse = await self.client.GetProperties(request, timeout=timeout, metadata=md)
|
|
123
|
+
return Motor.Properties(position_reporting=response.position_reporting)
|
|
124
|
+
|
|
125
|
+
async def stop(
|
|
126
|
+
self,
|
|
127
|
+
*,
|
|
128
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
129
|
+
timeout: Optional[float] = None,
|
|
130
|
+
**kwargs,
|
|
131
|
+
):
|
|
132
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
133
|
+
request = StopRequest(name=self.name, extra=dict_to_struct(extra))
|
|
134
|
+
await self.client.Stop(request, timeout=timeout, metadata=md)
|
|
135
|
+
|
|
136
|
+
async def is_powered(
|
|
137
|
+
self,
|
|
138
|
+
*,
|
|
139
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
140
|
+
timeout: Optional[float] = None,
|
|
141
|
+
**kwargs,
|
|
142
|
+
) -> Tuple[bool, float]:
|
|
143
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
144
|
+
request = IsPoweredRequest(name=self.name, extra=dict_to_struct(extra))
|
|
145
|
+
response: IsPoweredResponse = await self.client.IsPowered(request, timeout=timeout, metadata=md)
|
|
146
|
+
return response.is_on, response.power_pct
|
|
147
|
+
|
|
148
|
+
async def is_moving(self, *, timeout: Optional[float] = None, **kwargs) -> bool:
|
|
149
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
150
|
+
request = IsMovingRequest(name=self.name)
|
|
151
|
+
response: IsMovingResponse = await self.client.IsMoving(request, timeout=timeout, metadata=md)
|
|
152
|
+
return response.is_moving
|
|
153
|
+
|
|
154
|
+
async def do_command(
|
|
155
|
+
self,
|
|
156
|
+
command: Mapping[str, ValueTypes],
|
|
157
|
+
*,
|
|
158
|
+
timeout: Optional[float] = None,
|
|
159
|
+
**kwargs,
|
|
160
|
+
) -> Mapping[str, ValueTypes]:
|
|
161
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
162
|
+
request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
|
|
163
|
+
response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
|
|
164
|
+
return struct_to_dict(response.result)
|
|
165
|
+
|
|
166
|
+
async def get_geometries(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[Geometry]:
|
|
167
|
+
md = kwargs.get("metadata", self.Metadata())
|
|
168
|
+
return await get_geometries(self.client, self.name, extra, timeout, md)
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import Any, Dict, Final, Optional, Tuple
|
|
4
|
+
|
|
5
|
+
from viam.resource.types import API, RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT
|
|
6
|
+
|
|
7
|
+
from ..component_base import ComponentBase
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Motor(ComponentBase):
|
|
11
|
+
"""Motor represents a physical motor.
|
|
12
|
+
|
|
13
|
+
This acts as an abstract base class for any drivers representing specific
|
|
14
|
+
motor implementations. This cannot be used on its own. If the ``__init__()`` function is
|
|
15
|
+
overridden, it must call the ``super().__init__()`` function.
|
|
16
|
+
|
|
17
|
+
::
|
|
18
|
+
|
|
19
|
+
from viam.components.motor import Motor
|
|
20
|
+
|
|
21
|
+
For more information, see `Motor component <https://docs.viam.com/dev/reference/apis/components/motor/>`_.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
@dataclass
|
|
25
|
+
class Properties:
|
|
26
|
+
position_reporting: bool
|
|
27
|
+
|
|
28
|
+
API: Final = API( # pyright: ignore [reportIncompatibleVariableOverride]
|
|
29
|
+
RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, "motor"
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
@abc.abstractmethod
|
|
33
|
+
async def set_power(
|
|
34
|
+
self,
|
|
35
|
+
power: float,
|
|
36
|
+
*,
|
|
37
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
38
|
+
timeout: Optional[float] = None,
|
|
39
|
+
**kwargs,
|
|
40
|
+
):
|
|
41
|
+
"""
|
|
42
|
+
Sets the "percentage" of power the motor should employ between -1 and 1.
|
|
43
|
+
When ``power`` is negative, the rotation will be in the backward direction.
|
|
44
|
+
|
|
45
|
+
::
|
|
46
|
+
|
|
47
|
+
my_motor = Motor.from_robot(robot=machine, name="my_motor")
|
|
48
|
+
|
|
49
|
+
# Set the power to 40% forwards.
|
|
50
|
+
await my_motor.set_power(power=0.4)
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
power (float): Power between -1 and 1
|
|
54
|
+
(negative implies backwards).
|
|
55
|
+
|
|
56
|
+
For more information, see `Motor component <https://docs.viam.com/dev/reference/apis/components/motor/#setpower>`_.
|
|
57
|
+
"""
|
|
58
|
+
...
|
|
59
|
+
|
|
60
|
+
@abc.abstractmethod
|
|
61
|
+
async def go_for(
|
|
62
|
+
self,
|
|
63
|
+
rpm: float,
|
|
64
|
+
revolutions: float,
|
|
65
|
+
*,
|
|
66
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
67
|
+
timeout: Optional[float] = None,
|
|
68
|
+
**kwargs,
|
|
69
|
+
):
|
|
70
|
+
"""
|
|
71
|
+
Spin the motor the specified number of ``revolutions`` at specified ``rpm``.
|
|
72
|
+
When ``rpm`` or ``revolutions`` is a negative value, the rotation will be in the backward direction.
|
|
73
|
+
Note: if both ``rpm`` and ``revolutions`` are negative, the motor will spin in the forward direction.
|
|
74
|
+
|
|
75
|
+
::
|
|
76
|
+
|
|
77
|
+
my_motor = Motor.from_robot(robot=machine, name="my_motor")
|
|
78
|
+
|
|
79
|
+
# Turn the motor 7.2 revolutions at 60 RPM.
|
|
80
|
+
await my_motor.go_for(rpm=60, revolutions=7.2)
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
rpm (float): Speed at which the motor should move in rotations per minute
|
|
84
|
+
(negative implies backwards).
|
|
85
|
+
revolutions (float): Number of revolutions the motor should run for
|
|
86
|
+
(negative implies backwards).
|
|
87
|
+
|
|
88
|
+
For more information, see `Motor component <https://docs.viam.com/dev/reference/apis/components/motor/#gofor>`_.
|
|
89
|
+
"""
|
|
90
|
+
...
|
|
91
|
+
|
|
92
|
+
@abc.abstractmethod
|
|
93
|
+
async def go_to(
|
|
94
|
+
self,
|
|
95
|
+
rpm: float,
|
|
96
|
+
position_revolutions: float,
|
|
97
|
+
*,
|
|
98
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
99
|
+
timeout: Optional[float] = None,
|
|
100
|
+
**kwargs,
|
|
101
|
+
):
|
|
102
|
+
"""
|
|
103
|
+
Spin the motor to the specified position (provided in revolutions from home/zero),
|
|
104
|
+
at the specified speed, in revolutions per minute.
|
|
105
|
+
Regardless of the directionality of the ``rpm`` this function will move
|
|
106
|
+
the motor towards the specified position.
|
|
107
|
+
|
|
108
|
+
::
|
|
109
|
+
|
|
110
|
+
my_motor = Motor.from_robot(robot=machine, name="my_motor")
|
|
111
|
+
|
|
112
|
+
# Turn the motor to 8.3 revolutions from home at 75 RPM.
|
|
113
|
+
await my_motor.go_to(rpm=75, revolutions=8.3)
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
rpm (float): Speed at which the motor should rotate (absolute value).
|
|
117
|
+
position_revolutions (float): Target position relative to home/zero, in revolutions.
|
|
118
|
+
|
|
119
|
+
For more information, see `Motor component <https://docs.viam.com/dev/reference/apis/components/motor/#goto>`_.
|
|
120
|
+
"""
|
|
121
|
+
...
|
|
122
|
+
|
|
123
|
+
@abc.abstractmethod
|
|
124
|
+
async def set_rpm(
|
|
125
|
+
self,
|
|
126
|
+
rpm: float,
|
|
127
|
+
*,
|
|
128
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
129
|
+
timeout: Optional[float] = None,
|
|
130
|
+
**kwargs,
|
|
131
|
+
):
|
|
132
|
+
"""
|
|
133
|
+
Spin the motor indefinitely at the specified speed, in revolutions per minute.
|
|
134
|
+
Positive ``rpm`` will result in forward movement and negative ``rpm`` will result in backwards movement
|
|
135
|
+
|
|
136
|
+
::
|
|
137
|
+
|
|
138
|
+
my_motor = Motor.from_robot(robot=machine, name="my_motor")
|
|
139
|
+
|
|
140
|
+
# Spin the motor at 75 RPM.
|
|
141
|
+
await my_motor.set_rpm(rpm=75)
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
rpm (float): Speed at which the motor should rotate.
|
|
145
|
+
|
|
146
|
+
For more information, see `Motor component <https://docs.viam.com/dev/reference/apis/components/motor/#setrpm>`_.
|
|
147
|
+
"""
|
|
148
|
+
...
|
|
149
|
+
|
|
150
|
+
@abc.abstractmethod
|
|
151
|
+
async def reset_zero_position(
|
|
152
|
+
self,
|
|
153
|
+
offset: float,
|
|
154
|
+
*,
|
|
155
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
156
|
+
timeout: Optional[float] = None,
|
|
157
|
+
**kwargs,
|
|
158
|
+
):
|
|
159
|
+
"""
|
|
160
|
+
Set the current position (modified by ``offset``) to be the new zero (home) position.
|
|
161
|
+
|
|
162
|
+
::
|
|
163
|
+
|
|
164
|
+
my_motor = Motor.from_robot(robot=machine, name="my_motor")
|
|
165
|
+
|
|
166
|
+
# Set the current position as the new home position with no offset.
|
|
167
|
+
await my_motor.reset_zero_position(offset=0.0)
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
offset (float): The offset from the current position to new home/zero position.
|
|
171
|
+
|
|
172
|
+
For more information, see `Motor component <https://docs.viam.com/dev/reference/apis/components/motor/#resetzeroposition>`_.
|
|
173
|
+
"""
|
|
174
|
+
...
|
|
175
|
+
|
|
176
|
+
@abc.abstractmethod
|
|
177
|
+
async def get_position(
|
|
178
|
+
self,
|
|
179
|
+
*,
|
|
180
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
181
|
+
timeout: Optional[float] = None,
|
|
182
|
+
**kwargs,
|
|
183
|
+
) -> float:
|
|
184
|
+
"""
|
|
185
|
+
Report the position of the motor based on its encoder.
|
|
186
|
+
The value returned is the number of revolutions relative to its zero position.
|
|
187
|
+
This method will raise an exception if position reporting is not supported by the motor.
|
|
188
|
+
|
|
189
|
+
::
|
|
190
|
+
|
|
191
|
+
my_motor = Motor.from_robot(robot=machine, name="my_motor")
|
|
192
|
+
|
|
193
|
+
# Get the current position of the motor.
|
|
194
|
+
position = await my_motor.get_position()
|
|
195
|
+
|
|
196
|
+
Returns:
|
|
197
|
+
float: Number of revolutions the motor is away from zero/home.
|
|
198
|
+
|
|
199
|
+
For more information, see `Motor component <https://docs.viam.com/dev/reference/apis/components/motor/#getposition>`_.
|
|
200
|
+
"""
|
|
201
|
+
...
|
|
202
|
+
|
|
203
|
+
@abc.abstractmethod
|
|
204
|
+
async def get_properties(
|
|
205
|
+
self,
|
|
206
|
+
*,
|
|
207
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
208
|
+
timeout: Optional[float] = None,
|
|
209
|
+
**kwargs,
|
|
210
|
+
) -> Properties:
|
|
211
|
+
"""
|
|
212
|
+
Report a dictionary mapping optional properties to
|
|
213
|
+
whether it is supported by this motor.
|
|
214
|
+
|
|
215
|
+
::
|
|
216
|
+
|
|
217
|
+
my_motor = Motor.from_robot(robot=machine, name="my_motor")
|
|
218
|
+
|
|
219
|
+
# Report a dictionary mapping optional properties to whether it is supported by
|
|
220
|
+
# this motor.
|
|
221
|
+
properties = await my_motor.get_properties()
|
|
222
|
+
|
|
223
|
+
# Print out the properties.
|
|
224
|
+
print(f'Properties: {properties}')
|
|
225
|
+
|
|
226
|
+
Returns:
|
|
227
|
+
Properties: Map of feature names to supported status.
|
|
228
|
+
|
|
229
|
+
For more information, see `Motor component <https://docs.viam.com/dev/reference/apis/components/motor/#getproperties>`_.
|
|
230
|
+
"""
|
|
231
|
+
...
|
|
232
|
+
|
|
233
|
+
@abc.abstractmethod
|
|
234
|
+
async def stop(
|
|
235
|
+
self,
|
|
236
|
+
*,
|
|
237
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
238
|
+
timeout: Optional[float] = None,
|
|
239
|
+
**kwargs,
|
|
240
|
+
):
|
|
241
|
+
"""
|
|
242
|
+
Stop the motor immediately, without any gradual step down.
|
|
243
|
+
|
|
244
|
+
::
|
|
245
|
+
|
|
246
|
+
my_motor = Motor.from_robot(robot=machine, name="my_motor")
|
|
247
|
+
|
|
248
|
+
# Stop the motor.
|
|
249
|
+
await my_motor.stop()
|
|
250
|
+
|
|
251
|
+
For more information, see `Motor component <https://docs.viam.com/dev/reference/apis/components/motor/#stop>`_.
|
|
252
|
+
"""
|
|
253
|
+
...
|
|
254
|
+
|
|
255
|
+
@abc.abstractmethod
|
|
256
|
+
async def is_powered(
|
|
257
|
+
self,
|
|
258
|
+
*,
|
|
259
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
260
|
+
timeout: Optional[float] = None,
|
|
261
|
+
**kwargs,
|
|
262
|
+
) -> Tuple[bool, float]:
|
|
263
|
+
"""
|
|
264
|
+
Returns whether or not the motor is currently running.
|
|
265
|
+
|
|
266
|
+
::
|
|
267
|
+
|
|
268
|
+
my_motor = Motor.from_robot(robot=machine, name="my_motor")
|
|
269
|
+
|
|
270
|
+
# Check whether the motor is currently running.
|
|
271
|
+
powered = await my_motor.is_powered()
|
|
272
|
+
|
|
273
|
+
print('Powered: ', powered)
|
|
274
|
+
|
|
275
|
+
Returns:
|
|
276
|
+
Tuple[bool, float]: A tuple containing two values; the first [0] value indicates whether the motor is currently powered, and
|
|
277
|
+
the second [1] value indicates the current power percentage of the motor.
|
|
278
|
+
|
|
279
|
+
For more information, see `Motor component <https://docs.viam.com/dev/reference/apis/components/motor/#ispowered>`_.
|
|
280
|
+
"""
|
|
281
|
+
...
|
|
282
|
+
|
|
283
|
+
@abc.abstractmethod
|
|
284
|
+
async def is_moving(self) -> bool:
|
|
285
|
+
"""
|
|
286
|
+
Get if the motor is currently moving.
|
|
287
|
+
|
|
288
|
+
::
|
|
289
|
+
|
|
290
|
+
my_motor = Motor.from_robot(robot=machine, name="my_motor")
|
|
291
|
+
|
|
292
|
+
# Check whether the motor is currently moving.
|
|
293
|
+
moving = await my_motor.is_moving()
|
|
294
|
+
print('Moving: ', moving)
|
|
295
|
+
|
|
296
|
+
Returns:
|
|
297
|
+
bool: Whether the motor is moving.
|
|
298
|
+
|
|
299
|
+
For more information, see `Motor component <https://docs.viam.com/dev/reference/apis/components/motor/#ismoving>`_.
|
|
300
|
+
"""
|
|
301
|
+
...
|