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,156 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
from typing import Any, Dict, Final, List, Optional
|
|
3
|
+
|
|
4
|
+
from viam.resource.types import API, RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT
|
|
5
|
+
|
|
6
|
+
from ..component_base import ComponentBase
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Gantry(ComponentBase):
|
|
10
|
+
"""
|
|
11
|
+
Gantry represents a physical Gantry and can be used for controlling gantries of N axes.
|
|
12
|
+
|
|
13
|
+
This acts as an abstract base class for any drivers representing specific
|
|
14
|
+
gantry 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.gantry import Gantry
|
|
20
|
+
|
|
21
|
+
For more information, see `Gantry component <https://docs.viam.com/dev/reference/apis/components/gantry/>`_.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
API: Final = API( # pyright: ignore [reportIncompatibleVariableOverride]
|
|
25
|
+
RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, "gantry"
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
@abc.abstractmethod
|
|
29
|
+
async def get_position(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[float]:
|
|
30
|
+
"""
|
|
31
|
+
Get the positions of the axes of the gantry in millimeters.
|
|
32
|
+
|
|
33
|
+
::
|
|
34
|
+
|
|
35
|
+
my_gantry = Gantry.from_robot(robot=machine, name="my_gantry")
|
|
36
|
+
|
|
37
|
+
# Get the current positions of the axes of the gantry in millimeters.
|
|
38
|
+
positions = await my_gantry.get_position()
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
List[float]: A list of the position of the axes of the gantry in millimeters.
|
|
42
|
+
|
|
43
|
+
For more information, see `Gantry component <https://docs.viam.com/dev/reference/apis/components/gantry/#getposition>`_.
|
|
44
|
+
"""
|
|
45
|
+
...
|
|
46
|
+
|
|
47
|
+
@abc.abstractmethod
|
|
48
|
+
async def move_to_position(
|
|
49
|
+
self,
|
|
50
|
+
positions: List[float],
|
|
51
|
+
speeds: List[float],
|
|
52
|
+
*,
|
|
53
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
54
|
+
timeout: Optional[float] = None,
|
|
55
|
+
**kwargs,
|
|
56
|
+
):
|
|
57
|
+
"""
|
|
58
|
+
Move the axes of the gantry to the desired positions (mm) at the requested speeds (mm/sec).
|
|
59
|
+
|
|
60
|
+
::
|
|
61
|
+
|
|
62
|
+
my_gantry = Gantry.from_robot(robot=machine, name="my_gantry")
|
|
63
|
+
|
|
64
|
+
# Create a list of positions for the axes of the gantry to move to. Assume in
|
|
65
|
+
# this example that the gantry is multi-axis, with 3 axes.
|
|
66
|
+
examplePositions = [1, 2, 3]
|
|
67
|
+
|
|
68
|
+
exampleSpeeds = [3, 9, 12]
|
|
69
|
+
|
|
70
|
+
# Move the axes of the gantry to the positions specified.
|
|
71
|
+
await my_gantry.move_to_position(
|
|
72
|
+
positions=examplePositions, speeds=exampleSpeeds)
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
positions (List[float]): A list of positions for the axes of the gantry to move to, in millimeters.
|
|
76
|
+
speeds (List[float]): A list of speeds in millimeters per second for the gantry to move at respective to each axis.
|
|
77
|
+
|
|
78
|
+
For more information, see `Gantry component <https://docs.viam.com/dev/reference/apis/components/gantry/#movetoposition>`_.
|
|
79
|
+
"""
|
|
80
|
+
...
|
|
81
|
+
|
|
82
|
+
@abc.abstractmethod
|
|
83
|
+
async def home(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> bool:
|
|
84
|
+
"""
|
|
85
|
+
Run the homing sequence of the gantry to re-calibrate the axes with respect to the limit switches.
|
|
86
|
+
|
|
87
|
+
::
|
|
88
|
+
|
|
89
|
+
my_gantry = Gantry.from_robot(robot=machine, name="my_gantry")
|
|
90
|
+
|
|
91
|
+
await my_gantry.home()
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
bool: Whether the gantry has run the homing sequence successfully.
|
|
95
|
+
|
|
96
|
+
For more information, see `Gantry component <https://docs.viam.com/dev/reference/apis/components/gantry/#home>`_.
|
|
97
|
+
"""
|
|
98
|
+
|
|
99
|
+
@abc.abstractmethod
|
|
100
|
+
async def get_lengths(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[float]:
|
|
101
|
+
"""
|
|
102
|
+
Get the lengths of the axes of the gantry in millimeters.
|
|
103
|
+
|
|
104
|
+
::
|
|
105
|
+
|
|
106
|
+
my_gantry = Gantry.from_robot(robot=machine, name="my_gantry")
|
|
107
|
+
|
|
108
|
+
# Get the lengths of the axes of the gantry in millimeters.
|
|
109
|
+
lengths_mm = await my_gantry.get_lengths()
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
List[float]: A list of the lengths of the axes of the gantry in millimeters.
|
|
113
|
+
|
|
114
|
+
For more information, see `Gantry component <https://docs.viam.com/dev/reference/apis/components/gantry/#getlengths>`_.
|
|
115
|
+
"""
|
|
116
|
+
...
|
|
117
|
+
|
|
118
|
+
@abc.abstractmethod
|
|
119
|
+
async def stop(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs):
|
|
120
|
+
"""
|
|
121
|
+
Stop all motion of the gantry. It is assumed that the gantry stops immediately.
|
|
122
|
+
|
|
123
|
+
::
|
|
124
|
+
|
|
125
|
+
my_gantry = Gantry.from_robot(robot=machine, name="my_gantry")
|
|
126
|
+
|
|
127
|
+
# Stop all motion of the gantry. It is assumed that the gantry stops
|
|
128
|
+
# immediately.
|
|
129
|
+
await my_gantry.stop()
|
|
130
|
+
|
|
131
|
+
For more information, see `Gantry component <https://docs.viam.com/dev/reference/apis/components/gantry/#stop>`_.
|
|
132
|
+
"""
|
|
133
|
+
...
|
|
134
|
+
|
|
135
|
+
@abc.abstractmethod
|
|
136
|
+
async def is_moving(self) -> bool:
|
|
137
|
+
"""
|
|
138
|
+
Get if the gantry is currently moving.
|
|
139
|
+
|
|
140
|
+
::
|
|
141
|
+
|
|
142
|
+
my_gantry = Gantry.from_robot(robot=machine, name="my_gantry")
|
|
143
|
+
|
|
144
|
+
# Stop all motion of the gantry. It is assumed that the
|
|
145
|
+
# gantry stops immediately.
|
|
146
|
+
await my_gantry.stop()
|
|
147
|
+
|
|
148
|
+
# Print if the gantry is currently moving.
|
|
149
|
+
print(await my_gantry.is_moving())
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
bool: Whether the gantry is moving.
|
|
153
|
+
|
|
154
|
+
For more information, see `Gantry component <https://docs.viam.com/dev/reference/apis/components/gantry/#ismoving>`_.
|
|
155
|
+
"""
|
|
156
|
+
...
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
from grpclib.server import Stream
|
|
2
|
+
|
|
3
|
+
from viam.proto.common import DoCommandRequest, DoCommandResponse, GetGeometriesRequest, GetGeometriesResponse
|
|
4
|
+
from viam.proto.component.gantry import (
|
|
5
|
+
GantryServiceBase,
|
|
6
|
+
GetLengthsRequest,
|
|
7
|
+
GetLengthsResponse,
|
|
8
|
+
GetPositionRequest,
|
|
9
|
+
GetPositionResponse,
|
|
10
|
+
HomeRequest,
|
|
11
|
+
HomeResponse,
|
|
12
|
+
IsMovingRequest,
|
|
13
|
+
IsMovingResponse,
|
|
14
|
+
MoveToPositionRequest,
|
|
15
|
+
MoveToPositionResponse,
|
|
16
|
+
StopRequest,
|
|
17
|
+
StopResponse,
|
|
18
|
+
)
|
|
19
|
+
from viam.resource.rpc_service_base import ResourceRPCServiceBase
|
|
20
|
+
from viam.utils import dict_to_struct, struct_to_dict
|
|
21
|
+
|
|
22
|
+
from .gantry import Gantry
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class GantryRPCService(GantryServiceBase, ResourceRPCServiceBase[Gantry]):
|
|
26
|
+
"""
|
|
27
|
+
gRPC Service for a Gantry
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
RESOURCE_TYPE = Gantry
|
|
31
|
+
|
|
32
|
+
async def GetPosition(self, stream: Stream[GetPositionRequest, GetPositionResponse]) -> None:
|
|
33
|
+
request = await stream.recv_message()
|
|
34
|
+
assert request is not None
|
|
35
|
+
name = request.name
|
|
36
|
+
gantry = self.get_resource(name)
|
|
37
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
38
|
+
position = await gantry.get_position(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
|
|
39
|
+
response = GetPositionResponse(positions_mm=position)
|
|
40
|
+
await stream.send_message(response)
|
|
41
|
+
|
|
42
|
+
async def MoveToPosition(self, stream: Stream[MoveToPositionRequest, MoveToPositionResponse]) -> None:
|
|
43
|
+
request = await stream.recv_message()
|
|
44
|
+
assert request is not None
|
|
45
|
+
name = request.name
|
|
46
|
+
gantry = self.get_resource(name)
|
|
47
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
48
|
+
await gantry.move_to_position(
|
|
49
|
+
list(request.positions_mm),
|
|
50
|
+
list(request.speeds_mm_per_sec),
|
|
51
|
+
extra=struct_to_dict(request.extra),
|
|
52
|
+
timeout=timeout,
|
|
53
|
+
metadata=stream.metadata,
|
|
54
|
+
)
|
|
55
|
+
response = MoveToPositionResponse()
|
|
56
|
+
await stream.send_message(response)
|
|
57
|
+
|
|
58
|
+
async def Home(self, stream: Stream[HomeRequest, HomeResponse]) -> None:
|
|
59
|
+
request = await stream.recv_message()
|
|
60
|
+
assert request is not None
|
|
61
|
+
name = request.name
|
|
62
|
+
gantry = self.get_resource(name)
|
|
63
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
64
|
+
homed = await gantry.home(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
|
|
65
|
+
response = HomeResponse(homed=homed)
|
|
66
|
+
await stream.send_message(response)
|
|
67
|
+
|
|
68
|
+
async def GetLengths(self, stream: Stream[GetLengthsRequest, GetLengthsResponse]) -> None:
|
|
69
|
+
request = await stream.recv_message()
|
|
70
|
+
assert request is not None
|
|
71
|
+
name = request.name
|
|
72
|
+
gantry = self.get_resource(name)
|
|
73
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
74
|
+
lengths = await gantry.get_lengths(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
|
|
75
|
+
response = GetLengthsResponse(lengths_mm=lengths)
|
|
76
|
+
await stream.send_message(response)
|
|
77
|
+
|
|
78
|
+
async def Stop(self, stream: Stream[StopRequest, StopResponse]) -> None:
|
|
79
|
+
request = await stream.recv_message()
|
|
80
|
+
assert request is not None
|
|
81
|
+
name = request.name
|
|
82
|
+
gantry = self.get_resource(name)
|
|
83
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
84
|
+
await gantry.stop(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
|
|
85
|
+
response = StopResponse()
|
|
86
|
+
await stream.send_message(response)
|
|
87
|
+
|
|
88
|
+
async def IsMoving(self, stream: Stream[IsMovingRequest, IsMovingResponse]) -> None:
|
|
89
|
+
request = await stream.recv_message()
|
|
90
|
+
assert request is not None
|
|
91
|
+
name = request.name
|
|
92
|
+
gantry = self.get_resource(name)
|
|
93
|
+
is_moving = await gantry.is_moving()
|
|
94
|
+
response = IsMovingResponse(is_moving=is_moving)
|
|
95
|
+
await stream.send_message(response)
|
|
96
|
+
|
|
97
|
+
async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None:
|
|
98
|
+
request = await stream.recv_message()
|
|
99
|
+
assert request is not None
|
|
100
|
+
gantry = self.get_resource(request.name)
|
|
101
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
102
|
+
result = await gantry.do_command(command=struct_to_dict(request.command), timeout=timeout, metadata=stream.metadata)
|
|
103
|
+
response = DoCommandResponse(result=dict_to_struct(result))
|
|
104
|
+
await stream.send_message(response)
|
|
105
|
+
|
|
106
|
+
async def GetGeometries(self, stream: Stream[GetGeometriesRequest, GetGeometriesResponse]) -> None:
|
|
107
|
+
request = await stream.recv_message()
|
|
108
|
+
assert request is not None
|
|
109
|
+
arm = self.get_resource(request.name)
|
|
110
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
111
|
+
geometries = await arm.get_geometries(extra=struct_to_dict(request.extra), timeout=timeout)
|
|
112
|
+
response = GetGeometriesResponse(geometries=geometries)
|
|
113
|
+
await stream.send_message(response)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import viam.gen.component.generic.v1.generic_pb2 # Need this import for Generic service descriptors to resolve
|
|
2
|
+
from viam.resource.registry import Registry, ResourceRegistration
|
|
3
|
+
|
|
4
|
+
from .client import GenericClient
|
|
5
|
+
from .generic import Generic
|
|
6
|
+
from .service import GenericRPCService
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"Generic",
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
Registry.register_api(
|
|
13
|
+
ResourceRegistration(
|
|
14
|
+
Generic,
|
|
15
|
+
GenericRPCService,
|
|
16
|
+
lambda name, channel: GenericClient(name, channel),
|
|
17
|
+
)
|
|
18
|
+
)
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
from typing import Any, Dict, List, Mapping, Optional
|
|
2
|
+
|
|
3
|
+
from grpclib import GRPCError, Status
|
|
4
|
+
from grpclib.client import Channel
|
|
5
|
+
|
|
6
|
+
from viam.proto.common import DoCommandRequest, DoCommandResponse, Geometry
|
|
7
|
+
from viam.proto.component.generic import GenericServiceStub
|
|
8
|
+
from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase, ResourceRPCClientBase
|
|
9
|
+
from viam.utils import ValueTypes, dict_to_struct, get_geometries, struct_to_dict
|
|
10
|
+
|
|
11
|
+
from .generic import Generic
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class GenericClient(Generic, ReconfigurableResourceRPCClientBase):
|
|
15
|
+
"""
|
|
16
|
+
gRPC client for the Generic component.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
def __init__(self, name: str, channel: Channel):
|
|
20
|
+
self.channel = channel
|
|
21
|
+
self.client = GenericServiceStub(channel)
|
|
22
|
+
super().__init__(name)
|
|
23
|
+
|
|
24
|
+
async def do_command(
|
|
25
|
+
self,
|
|
26
|
+
command: Mapping[str, Any],
|
|
27
|
+
*,
|
|
28
|
+
timeout: Optional[float] = None,
|
|
29
|
+
**kwargs,
|
|
30
|
+
) -> Mapping[str, Any]:
|
|
31
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
32
|
+
request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
|
|
33
|
+
try:
|
|
34
|
+
response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
|
|
35
|
+
except GRPCError as e:
|
|
36
|
+
if e.status == Status.UNIMPLEMENTED:
|
|
37
|
+
raise NotImplementedError()
|
|
38
|
+
raise e
|
|
39
|
+
|
|
40
|
+
return struct_to_dict(response.result)
|
|
41
|
+
|
|
42
|
+
async def get_geometries(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[Geometry]:
|
|
43
|
+
md = kwargs.get("metadata", self.Metadata())
|
|
44
|
+
return await get_geometries(self.client, self.name, extra, timeout, md)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
async def do_command(
|
|
48
|
+
channel: Channel, name: str, command: Mapping[str, ValueTypes], *, timeout: Optional[float] = None, **kwargs
|
|
49
|
+
) -> Mapping[str, ValueTypes]:
|
|
50
|
+
"""Convenience method to allow component clients to execute ``do_command`` functions
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
channel (Channel): A gRPC channel
|
|
54
|
+
name (str): The name of the component
|
|
55
|
+
command (Dict[str, Any]): The command to execute
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
Dict[str, Any]: The result of the executed command
|
|
59
|
+
"""
|
|
60
|
+
md = kwargs.get("metadata", ResourceRPCClientBase.Metadata()).proto
|
|
61
|
+
client = GenericClient(name, channel)
|
|
62
|
+
return await client.do_command(command, timeout=timeout, metadata=md)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
from typing import Final
|
|
2
|
+
|
|
3
|
+
from viam.resource.types import API, RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT
|
|
4
|
+
|
|
5
|
+
from ..component_base import ComponentBase
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Generic(ComponentBase):
|
|
9
|
+
"""
|
|
10
|
+
Generic component, which represents any type of component that can executes arbitrary commands
|
|
11
|
+
|
|
12
|
+
This acts as an abstract base class for any drivers representing generic components.
|
|
13
|
+
This cannot be used on its own. If the ``__init__()`` function is overridden, it must call the ``super().__init__()`` function.
|
|
14
|
+
|
|
15
|
+
To create a Generic component (an arbitrary component that can process commands), this ``Generic`` component should be subclassed
|
|
16
|
+
and the ``do_command`` function implemented.
|
|
17
|
+
|
|
18
|
+
::
|
|
19
|
+
|
|
20
|
+
from viam.components.generic import Generic
|
|
21
|
+
|
|
22
|
+
Example::
|
|
23
|
+
|
|
24
|
+
class ComplexComponent(Generic):
|
|
25
|
+
|
|
26
|
+
async def do_command(
|
|
27
|
+
self,
|
|
28
|
+
command: Mapping[str, ValueTypes],
|
|
29
|
+
*,
|
|
30
|
+
timeout: Optional[float] = None,
|
|
31
|
+
**kwargs
|
|
32
|
+
) -> Mapping[str, ValueTypes]:
|
|
33
|
+
result = {key: False for key in command.keys()}
|
|
34
|
+
for (name, args) in command.items():
|
|
35
|
+
if name == 'on':
|
|
36
|
+
self.on(*args)
|
|
37
|
+
result[name] = True
|
|
38
|
+
if name == 'set_frequency':
|
|
39
|
+
self.set_frequency(*args)
|
|
40
|
+
result[name] = True
|
|
41
|
+
if name == 'get_frequency':
|
|
42
|
+
result[name] = self.frequency
|
|
43
|
+
if name == 'complex_command':
|
|
44
|
+
self.complex_command(*args)
|
|
45
|
+
result[name] = True
|
|
46
|
+
return result
|
|
47
|
+
|
|
48
|
+
def set_frequency(self, frequency: int):
|
|
49
|
+
self.frequency = frequency
|
|
50
|
+
|
|
51
|
+
def on(self, frequency: int, duration: int):
|
|
52
|
+
self.frequency = frequency
|
|
53
|
+
self.power = 1
|
|
54
|
+
task = threading.Timer(duration, self.off)
|
|
55
|
+
task.start()
|
|
56
|
+
|
|
57
|
+
def off(self):
|
|
58
|
+
self.power = 0
|
|
59
|
+
|
|
60
|
+
def complex_command(self, arg1, arg2, arg3):
|
|
61
|
+
...
|
|
62
|
+
|
|
63
|
+
To execute commands, simply call the ``do_command`` function with the appropriate parameters.
|
|
64
|
+
::
|
|
65
|
+
|
|
66
|
+
await component.do_command({'on': [300, 10]})
|
|
67
|
+
component.power # 1
|
|
68
|
+
await asyncio.sleep(10)
|
|
69
|
+
component.power # 0
|
|
70
|
+
|
|
71
|
+
For more information, see `Gantry component <https://docs.viam.com/dev/reference/apis/components/generic/>`_.
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
API: Final = API( # pyright: ignore [reportIncompatibleVariableOverride]
|
|
75
|
+
RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, "generic"
|
|
76
|
+
)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from grpclib import GRPCError, Status
|
|
2
|
+
from grpclib.server import Stream
|
|
3
|
+
|
|
4
|
+
from viam.components.component_base import ComponentBase
|
|
5
|
+
from viam.proto.common import DoCommandRequest, DoCommandResponse, GetGeometriesRequest, GetGeometriesResponse
|
|
6
|
+
from viam.proto.component.generic import GenericServiceBase
|
|
7
|
+
from viam.resource.rpc_service_base import ResourceRPCServiceBase
|
|
8
|
+
from viam.utils import dict_to_struct, struct_to_dict
|
|
9
|
+
|
|
10
|
+
# from .generic import Generic
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class GenericRPCService(GenericServiceBase, ResourceRPCServiceBase):
|
|
14
|
+
"""
|
|
15
|
+
gRPC Service for a Generic component
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
RESOURCE_TYPE = ComponentBase
|
|
19
|
+
|
|
20
|
+
async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None:
|
|
21
|
+
request = await stream.recv_message()
|
|
22
|
+
assert request is not None
|
|
23
|
+
name = request.name
|
|
24
|
+
component = self.get_resource(name)
|
|
25
|
+
try:
|
|
26
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
27
|
+
result = await component.do_command(struct_to_dict(request.command), timeout=timeout, metadata=stream.metadata)
|
|
28
|
+
except NotImplementedError:
|
|
29
|
+
raise GRPCError(Status.UNIMPLEMENTED, f"``DO`` command is unimplemented for component named: {name}")
|
|
30
|
+
response = DoCommandResponse(result=dict_to_struct(result))
|
|
31
|
+
await stream.send_message(response)
|
|
32
|
+
|
|
33
|
+
async def GetGeometries(self, stream: Stream[GetGeometriesRequest, GetGeometriesResponse]) -> None:
|
|
34
|
+
request = await stream.recv_message()
|
|
35
|
+
assert request is not None
|
|
36
|
+
component = self.get_resource(request.name)
|
|
37
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
38
|
+
geometries = await component.get_geometries(extra=struct_to_dict(request.extra), timeout=timeout)
|
|
39
|
+
response = GetGeometriesResponse(geometries=geometries)
|
|
40
|
+
await stream.send_message(response)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from viam.resource.registry import Registry, ResourceRegistration
|
|
2
|
+
|
|
3
|
+
from .client import GripperClient
|
|
4
|
+
from .gripper import Gripper
|
|
5
|
+
from .service import GripperRPCService
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"Gripper",
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
Registry.register_api(ResourceRegistration(Gripper, GripperRPCService, lambda name, channel: GripperClient(name, channel)))
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
from typing import Any, Dict, List, Mapping, Optional
|
|
2
|
+
|
|
3
|
+
from grpclib.client import Channel
|
|
4
|
+
|
|
5
|
+
from viam.proto.common import DoCommandRequest, DoCommandResponse, Geometry
|
|
6
|
+
from viam.proto.component.gripper import (
|
|
7
|
+
GrabRequest,
|
|
8
|
+
GrabResponse,
|
|
9
|
+
GripperServiceStub,
|
|
10
|
+
IsMovingRequest,
|
|
11
|
+
IsMovingResponse,
|
|
12
|
+
OpenRequest,
|
|
13
|
+
StopRequest,
|
|
14
|
+
)
|
|
15
|
+
from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
|
|
16
|
+
from viam.utils import ValueTypes, dict_to_struct, get_geometries, struct_to_dict
|
|
17
|
+
|
|
18
|
+
from .gripper import Gripper
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class GripperClient(Gripper, ReconfigurableResourceRPCClientBase):
|
|
22
|
+
"""
|
|
23
|
+
gRPC client for the Gripper component
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
def __init__(self, name: str, channel: Channel):
|
|
27
|
+
self.channel = channel
|
|
28
|
+
self.client = GripperServiceStub(channel)
|
|
29
|
+
super().__init__(name)
|
|
30
|
+
|
|
31
|
+
async def open(
|
|
32
|
+
self,
|
|
33
|
+
*,
|
|
34
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
35
|
+
timeout: Optional[float] = None,
|
|
36
|
+
**kwargs,
|
|
37
|
+
):
|
|
38
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
39
|
+
request = OpenRequest(name=self.name, extra=dict_to_struct(extra))
|
|
40
|
+
await self.client.Open(request, timeout=timeout, metadata=md)
|
|
41
|
+
|
|
42
|
+
async def grab(
|
|
43
|
+
self,
|
|
44
|
+
*,
|
|
45
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
46
|
+
timeout: Optional[float] = None,
|
|
47
|
+
**kwargs,
|
|
48
|
+
) -> bool:
|
|
49
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
50
|
+
request = GrabRequest(name=self.name, extra=dict_to_struct(extra))
|
|
51
|
+
response: GrabResponse = await self.client.Grab(request, timeout=timeout, metadata=md)
|
|
52
|
+
return response.success
|
|
53
|
+
|
|
54
|
+
async def stop(
|
|
55
|
+
self,
|
|
56
|
+
*,
|
|
57
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
58
|
+
timeout: Optional[float] = None,
|
|
59
|
+
**kwargs,
|
|
60
|
+
):
|
|
61
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
62
|
+
request = StopRequest(name=self.name, extra=dict_to_struct(extra))
|
|
63
|
+
await self.client.Stop(request, timeout=timeout, metadata=md)
|
|
64
|
+
|
|
65
|
+
async def is_moving(self, *, timeout: Optional[float] = None, **kwargs) -> bool:
|
|
66
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
67
|
+
request = IsMovingRequest(name=self.name)
|
|
68
|
+
response: IsMovingResponse = await self.client.IsMoving(request, timeout=timeout, metadata=md)
|
|
69
|
+
return response.is_moving
|
|
70
|
+
|
|
71
|
+
async def do_command(
|
|
72
|
+
self,
|
|
73
|
+
command: Mapping[str, ValueTypes],
|
|
74
|
+
*,
|
|
75
|
+
timeout: Optional[float] = None,
|
|
76
|
+
**kwargs,
|
|
77
|
+
) -> Mapping[str, ValueTypes]:
|
|
78
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
79
|
+
request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
|
|
80
|
+
response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
|
|
81
|
+
return struct_to_dict(response.result)
|
|
82
|
+
|
|
83
|
+
async def get_geometries(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[Geometry]:
|
|
84
|
+
md = kwargs.get("metadata", self.Metadata())
|
|
85
|
+
return await get_geometries(self.client, self.name, extra, timeout, md)
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
from typing import Any, Dict, Final, Optional
|
|
3
|
+
|
|
4
|
+
from viam.components.component_base import ComponentBase
|
|
5
|
+
from viam.resource.types import API, RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Gripper(ComponentBase):
|
|
9
|
+
"""
|
|
10
|
+
Gripper represents a physical robotic gripper.
|
|
11
|
+
|
|
12
|
+
This acts as an abstract base class for any drivers representing specific
|
|
13
|
+
gripper implementations. This cannot be used on its own. If the ``__init__()`` function is
|
|
14
|
+
overridden, it must call the ``super().__init__()`` function.
|
|
15
|
+
|
|
16
|
+
::
|
|
17
|
+
|
|
18
|
+
from viam.components.gripper import Gripper
|
|
19
|
+
|
|
20
|
+
For more information, see `Gripper component <https://docs.viam.com/dev/reference/apis/components/gripper/>`_.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
API: Final = API( # pyright: ignore [reportIncompatibleVariableOverride]
|
|
24
|
+
RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, "gripper"
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
@abc.abstractmethod
|
|
28
|
+
async def open(
|
|
29
|
+
self,
|
|
30
|
+
*,
|
|
31
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
32
|
+
timeout: Optional[float] = None,
|
|
33
|
+
**kwargs,
|
|
34
|
+
):
|
|
35
|
+
"""
|
|
36
|
+
Open the gripper.
|
|
37
|
+
|
|
38
|
+
::
|
|
39
|
+
|
|
40
|
+
my_gripper = Gripper.from_robot(robot=machine, name="my_gripper")
|
|
41
|
+
|
|
42
|
+
# Open the gripper.
|
|
43
|
+
await my_gripper.open()
|
|
44
|
+
|
|
45
|
+
For more information, see `Gripper component <https://docs.viam.com/dev/reference/apis/components/gripper/#open>`_.
|
|
46
|
+
"""
|
|
47
|
+
...
|
|
48
|
+
|
|
49
|
+
@abc.abstractmethod
|
|
50
|
+
async def grab(
|
|
51
|
+
self,
|
|
52
|
+
*,
|
|
53
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
54
|
+
timeout: Optional[float] = None,
|
|
55
|
+
**kwargs,
|
|
56
|
+
) -> bool:
|
|
57
|
+
"""
|
|
58
|
+
Instruct the gripper to grab.
|
|
59
|
+
|
|
60
|
+
::
|
|
61
|
+
|
|
62
|
+
my_gripper = Gripper.from_robot(robot=machine, name="my_gripper")
|
|
63
|
+
|
|
64
|
+
# Grab with the gripper.
|
|
65
|
+
grabbed = await my_gripper.grab()
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
bool: Indicates if the gripper grabbed something.
|
|
69
|
+
|
|
70
|
+
For more information, see `Gripper component <https://docs.viam.com/dev/reference/apis/components/gripper/#grab>`_.
|
|
71
|
+
"""
|
|
72
|
+
...
|
|
73
|
+
|
|
74
|
+
@abc.abstractmethod
|
|
75
|
+
async def stop(
|
|
76
|
+
self,
|
|
77
|
+
*,
|
|
78
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
79
|
+
timeout: Optional[float] = None,
|
|
80
|
+
**kwargs,
|
|
81
|
+
):
|
|
82
|
+
"""
|
|
83
|
+
Stop the gripper. It is assumed the gripper stops immediately.
|
|
84
|
+
|
|
85
|
+
::
|
|
86
|
+
|
|
87
|
+
my_gripper = Gripper.from_robot(robot=machine, name="my_gripper")
|
|
88
|
+
|
|
89
|
+
# Stop the gripper.
|
|
90
|
+
await my_gripper.stop()
|
|
91
|
+
|
|
92
|
+
For more information, see `Gripper component <https://docs.viam.com/dev/reference/apis/components/gripper/#stop>`_.
|
|
93
|
+
"""
|
|
94
|
+
...
|
|
95
|
+
|
|
96
|
+
@abc.abstractmethod
|
|
97
|
+
async def is_moving(self) -> bool:
|
|
98
|
+
"""
|
|
99
|
+
Get if the gripper is currently moving.
|
|
100
|
+
|
|
101
|
+
::
|
|
102
|
+
|
|
103
|
+
my_gripper = Gripper.from_robot(robot=machine, name="my_gripper")
|
|
104
|
+
|
|
105
|
+
# Check whether the gripper is currently moving.
|
|
106
|
+
moving = await my_gripper.is_moving()
|
|
107
|
+
print('Moving:', moving)
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
bool: Whether the gripper is moving.
|
|
111
|
+
|
|
112
|
+
For more information, see `Gripper component <https://docs.viam.com/dev/reference/apis/components/gripper/#is_moving>`_.
|
|
113
|
+
"""
|
|
114
|
+
...
|