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,114 @@
|
|
|
1
|
+
import wave
|
|
2
|
+
from datetime import timedelta
|
|
3
|
+
from io import BytesIO
|
|
4
|
+
|
|
5
|
+
from google.api.httpbody_pb2 import HttpBody # type: ignore
|
|
6
|
+
from grpclib import GRPCError, Status
|
|
7
|
+
from grpclib.server import Stream
|
|
8
|
+
|
|
9
|
+
from viam.errors import NotSupportedError
|
|
10
|
+
from viam.proto.common import DoCommandRequest, DoCommandResponse, GetGeometriesRequest, GetGeometriesResponse
|
|
11
|
+
from viam.proto.component.audioinput import (
|
|
12
|
+
AudioInputServiceBase,
|
|
13
|
+
ChunksRequest,
|
|
14
|
+
ChunksResponse,
|
|
15
|
+
PropertiesRequest,
|
|
16
|
+
PropertiesResponse,
|
|
17
|
+
RecordRequest,
|
|
18
|
+
SampleFormat,
|
|
19
|
+
)
|
|
20
|
+
from viam.resource.rpc_service_base import ResourceRPCServiceBase
|
|
21
|
+
from viam.utils import dict_to_struct, struct_to_dict
|
|
22
|
+
|
|
23
|
+
from .audio_input import AudioInput
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class AudioInputRPCService(AudioInputServiceBase, ResourceRPCServiceBase[AudioInput]):
|
|
27
|
+
"""
|
|
28
|
+
gRPC Service for a generic AudioInput
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
RESOURCE_TYPE = AudioInput
|
|
32
|
+
|
|
33
|
+
async def Chunks(self, stream: Stream[ChunksRequest, ChunksResponse]) -> None:
|
|
34
|
+
request = await stream.recv_message()
|
|
35
|
+
assert request is not None
|
|
36
|
+
audio_input = self.get_resource(request.name)
|
|
37
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
38
|
+
audio_stream = await audio_input.stream(timeout=timeout, metadata=stream.metadata)
|
|
39
|
+
first_chunk = await audio_stream.__anext__()
|
|
40
|
+
await stream.send_message(ChunksResponse(info=first_chunk.info))
|
|
41
|
+
await stream.send_message(ChunksResponse(chunk=first_chunk.chunk))
|
|
42
|
+
|
|
43
|
+
async for audio in audio_stream:
|
|
44
|
+
await stream.send_message(ChunksResponse(chunk=audio.chunk))
|
|
45
|
+
|
|
46
|
+
async def Properties(self, stream: Stream[PropertiesRequest, PropertiesResponse]) -> None:
|
|
47
|
+
request = await stream.recv_message()
|
|
48
|
+
assert request is not None
|
|
49
|
+
audio_input = self.get_resource(request.name)
|
|
50
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
51
|
+
response = (await audio_input.get_properties(timeout=timeout, metadata=stream.metadata)).proto
|
|
52
|
+
await stream.send_message(response)
|
|
53
|
+
|
|
54
|
+
async def Record(self, stream: Stream[RecordRequest, HttpBody]) -> None: # pyright: ignore [reportInvalidTypeForm]
|
|
55
|
+
raise NotSupportedError("Recording audio input is not supported").grpc_error
|
|
56
|
+
|
|
57
|
+
# TODO: Eventually implement recording
|
|
58
|
+
request = await stream.recv_message()
|
|
59
|
+
assert request is not None
|
|
60
|
+
duration = request.duration.ToTimedelta()
|
|
61
|
+
if duration.total_seconds() == 0:
|
|
62
|
+
duration = timedelta(seconds=1)
|
|
63
|
+
if duration.total_seconds() > 5:
|
|
64
|
+
raise GRPCError(Status.INVALID_ARGUMENT, "Can only record up to 5 seconds")
|
|
65
|
+
|
|
66
|
+
audio_input = self.get_resource(request.name)
|
|
67
|
+
audio_stream = await audio_input.stream()
|
|
68
|
+
first_chunk = await audio_stream.__anext__()
|
|
69
|
+
num_chunks = int(duration.total_seconds() * float(first_chunk.info.sampling_rate / first_chunk.chunk.length))
|
|
70
|
+
|
|
71
|
+
sample_width: int
|
|
72
|
+
if first_chunk.info.sample_format == SampleFormat.SAMPLE_FORMAT_INT16_INTERLEAVED:
|
|
73
|
+
sample_width = 2
|
|
74
|
+
elif first_chunk.info.sample_format == SampleFormat.SAMPLE_FORMAT_FLOAT32_INTERLEAVED:
|
|
75
|
+
sample_width = 4
|
|
76
|
+
else:
|
|
77
|
+
raise GRPCError(Status.INVALID_ARGUMENT, "Unspecified type of audio buffer")
|
|
78
|
+
|
|
79
|
+
output = BytesIO()
|
|
80
|
+
wav_file = wave.open(output, "w")
|
|
81
|
+
wav_file.setnchannels(first_chunk.info.channels)
|
|
82
|
+
wav_file.setframerate(first_chunk.info.sampling_rate)
|
|
83
|
+
wav_file.setsampwidth(sample_width)
|
|
84
|
+
try:
|
|
85
|
+
wav_file.writeframes(first_chunk.chunk.data)
|
|
86
|
+
for _ in range(num_chunks - 1):
|
|
87
|
+
chunk = await audio_stream.__anext__()
|
|
88
|
+
wav_file.writeframes(chunk.chunk.data)
|
|
89
|
+
finally:
|
|
90
|
+
wav_file.close()
|
|
91
|
+
output.close()
|
|
92
|
+
|
|
93
|
+
output.seek(0)
|
|
94
|
+
response = HttpBody(data=output.read(), content_type="audio/wav")
|
|
95
|
+
|
|
96
|
+
await stream.send_message(response)
|
|
97
|
+
|
|
98
|
+
async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None:
|
|
99
|
+
request = await stream.recv_message()
|
|
100
|
+
assert request is not None
|
|
101
|
+
audio_input = self.get_resource(request.name)
|
|
102
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
103
|
+
result = await audio_input.do_command(command=struct_to_dict(request.command), timeout=timeout, metadata=stream.metadata)
|
|
104
|
+
response = DoCommandResponse(result=dict_to_struct(result))
|
|
105
|
+
await stream.send_message(response)
|
|
106
|
+
|
|
107
|
+
async def GetGeometries(self, stream: Stream[GetGeometriesRequest, GetGeometriesResponse]) -> None:
|
|
108
|
+
request = await stream.recv_message()
|
|
109
|
+
assert request is not None
|
|
110
|
+
audio_input = self.get_resource(request.name)
|
|
111
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
112
|
+
geometries = await audio_input.get_geometries(extra=struct_to_dict(request.extra), timeout=timeout)
|
|
113
|
+
response = GetGeometriesResponse(geometries=geometries)
|
|
114
|
+
await stream.send_message(response)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from viam.proto.common import Vector3
|
|
2
|
+
from viam.resource.registry import Registry, ResourceRegistration
|
|
3
|
+
|
|
4
|
+
from .base import Base
|
|
5
|
+
from .client import BaseClient
|
|
6
|
+
from .service import BaseRPCService
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"Base",
|
|
10
|
+
"Vector3",
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
Registry.register_api(ResourceRegistration(Base, BaseRPCService, lambda name, channel: BaseClient(name, channel)))
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import Any, Dict, Final, Optional
|
|
4
|
+
|
|
5
|
+
from viam.resource.types import API, RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT
|
|
6
|
+
|
|
7
|
+
from ..component_base import ComponentBase
|
|
8
|
+
from . import Vector3
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Base(ComponentBase):
|
|
12
|
+
"""
|
|
13
|
+
Base represents a physical base of a robot.
|
|
14
|
+
|
|
15
|
+
This acts as an abstract base class for any drivers representing specific
|
|
16
|
+
base implementations. This cannot be used on its own. If the ``__init__()`` function is
|
|
17
|
+
overridden, it must call the ``super().__init__()`` function.
|
|
18
|
+
|
|
19
|
+
::
|
|
20
|
+
|
|
21
|
+
from viam.components.base import Base
|
|
22
|
+
|
|
23
|
+
For more information, see `Base component <https://docs.viam.com/dev/reference/apis/components/base/>`_.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
API: Final = API( # pyright: ignore [reportIncompatibleVariableOverride]
|
|
27
|
+
RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, "base"
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
@dataclass
|
|
31
|
+
class Properties:
|
|
32
|
+
width_meters: float
|
|
33
|
+
turning_radius_meters: float
|
|
34
|
+
wheel_circumference_meters: float
|
|
35
|
+
|
|
36
|
+
@abc.abstractmethod
|
|
37
|
+
async def move_straight(
|
|
38
|
+
self,
|
|
39
|
+
distance: int,
|
|
40
|
+
velocity: float,
|
|
41
|
+
*,
|
|
42
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
43
|
+
timeout: Optional[float] = None,
|
|
44
|
+
**kwargs,
|
|
45
|
+
):
|
|
46
|
+
"""
|
|
47
|
+
Move the base in a straight line the given ``distance``, expressed in millimeters,
|
|
48
|
+
at the given ``velocity``, expressed in millimeters per second.
|
|
49
|
+
When ``distance`` or ``velocity`` is 0, the base will stop.
|
|
50
|
+
This method blocks until completed or cancelled.
|
|
51
|
+
|
|
52
|
+
::
|
|
53
|
+
|
|
54
|
+
my_base = Base.from_robot(robot=machine, name="my_base")
|
|
55
|
+
|
|
56
|
+
# Move the base 40 mm at a velocity of 90 mm/s, forward.
|
|
57
|
+
await my_base.move_straight(distance=40, velocity=90)
|
|
58
|
+
|
|
59
|
+
# Move the base 40 mm at a velocity of -90 mm/s, backward.
|
|
60
|
+
await my_base.move_straight(distance=40, velocity=-90)
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
distance (int): The distance (in millimeters) to move.
|
|
64
|
+
Negative implies backwards.
|
|
65
|
+
velocity (float): The velocity (in millimeters per second) to move.
|
|
66
|
+
Negative implies backwards.
|
|
67
|
+
|
|
68
|
+
For more information, see `Base component <https://docs.viam.com/dev/reference/apis/components/base/#movestraight>`_.
|
|
69
|
+
"""
|
|
70
|
+
...
|
|
71
|
+
|
|
72
|
+
@abc.abstractmethod
|
|
73
|
+
async def spin(
|
|
74
|
+
self,
|
|
75
|
+
angle: float,
|
|
76
|
+
velocity: float,
|
|
77
|
+
*,
|
|
78
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
79
|
+
timeout: Optional[float] = None,
|
|
80
|
+
**kwargs,
|
|
81
|
+
):
|
|
82
|
+
"""
|
|
83
|
+
Spin the base in place ``angle`` degrees, at the given angular ``velocity``,
|
|
84
|
+
expressed in degrees per second.
|
|
85
|
+
When ``velocity`` is 0, the base will stop.
|
|
86
|
+
This method blocks until completed or cancelled.
|
|
87
|
+
|
|
88
|
+
::
|
|
89
|
+
|
|
90
|
+
my_base = Base.from_robot(robot=machine, name="my_base")
|
|
91
|
+
|
|
92
|
+
# Spin the base 10 degrees at an angular velocity of 15 deg/sec.
|
|
93
|
+
await my_base.spin(angle=10, velocity=15)
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
angle (float): The angle (in degrees) to spin.
|
|
97
|
+
velocity (float): The angular velocity (in degrees per second)
|
|
98
|
+
to spin.
|
|
99
|
+
Given a positive angle and a positive velocity, the base will turn to the left.
|
|
100
|
+
|
|
101
|
+
For more information, see `Base component <https://docs.viam.com/dev/reference/apis/components/base/#spin>`_.
|
|
102
|
+
"""
|
|
103
|
+
...
|
|
104
|
+
|
|
105
|
+
@abc.abstractmethod
|
|
106
|
+
async def set_power(
|
|
107
|
+
self,
|
|
108
|
+
linear: Vector3,
|
|
109
|
+
angular: Vector3,
|
|
110
|
+
*,
|
|
111
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
112
|
+
timeout: Optional[float] = None,
|
|
113
|
+
**kwargs,
|
|
114
|
+
):
|
|
115
|
+
"""Set the linear and angular velocity of the Base
|
|
116
|
+
When ``linear`` is 0, the base will spin.
|
|
117
|
+
When ``angular`` is 0, the base will move in a straight line.
|
|
118
|
+
When both ``linear`` and ``angular`` are 0, the base will stop.
|
|
119
|
+
When ``linear`` and ``angular`` are both nonzero, the base will move in an arc,
|
|
120
|
+
with a tighter radius if angular power is greater than linear power.
|
|
121
|
+
|
|
122
|
+
::
|
|
123
|
+
|
|
124
|
+
my_base = Base.from_robot(robot=machine, name="my_base")
|
|
125
|
+
|
|
126
|
+
# Make your wheeled base move forward. Set linear power to 75%.
|
|
127
|
+
print("move forward")
|
|
128
|
+
await my_base.set_power(
|
|
129
|
+
linear=Vector3(x=0, y=.75, z=0),
|
|
130
|
+
angular=Vector3(x=0, y=0, z=0))
|
|
131
|
+
|
|
132
|
+
# Make your wheeled base move backward. Set linear power to -100%.
|
|
133
|
+
print("move backward")
|
|
134
|
+
await my_base.set_power(
|
|
135
|
+
linear=Vector3(x=0, y=-1.0, z=0),
|
|
136
|
+
angular=Vector3(x=0, y=0, z=0))
|
|
137
|
+
|
|
138
|
+
# Make your wheeled base spin left. Set angular power to 100%.
|
|
139
|
+
print("spin left")
|
|
140
|
+
await my_base.set_power(
|
|
141
|
+
linear=Vector3(x=0, y=0, z=0),
|
|
142
|
+
angular=Vector3(x=0, y=0, z=1))
|
|
143
|
+
|
|
144
|
+
# Make your wheeled base spin right. Set angular power to -75%.
|
|
145
|
+
print("spin right")
|
|
146
|
+
await my_base.set_power(
|
|
147
|
+
linear=Vector3(x=0, y=0, z=0),
|
|
148
|
+
angular=Vector3(x=0, y=0, z=-.75))
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
linear (Vector3): The linear component. Only the Y component is used
|
|
152
|
+
for wheeled base. Positive implies forwards.
|
|
153
|
+
angular (Vector3): The angular component. Only the Z component is used
|
|
154
|
+
for wheeled base. Positive turns left; negative turns right.
|
|
155
|
+
|
|
156
|
+
For more information, see `Base component <https://docs.viam.com/dev/reference/apis/components/base/#setpower>`_.
|
|
157
|
+
"""
|
|
158
|
+
...
|
|
159
|
+
|
|
160
|
+
@abc.abstractmethod
|
|
161
|
+
async def set_velocity(
|
|
162
|
+
self,
|
|
163
|
+
linear: Vector3,
|
|
164
|
+
angular: Vector3,
|
|
165
|
+
*,
|
|
166
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
167
|
+
timeout: Optional[float] = None,
|
|
168
|
+
**kwargs,
|
|
169
|
+
):
|
|
170
|
+
"""
|
|
171
|
+
Set the linear and angular velocities of the base.
|
|
172
|
+
|
|
173
|
+
::
|
|
174
|
+
|
|
175
|
+
my_base = Base.from_robot(robot=machine, name="my_base")
|
|
176
|
+
|
|
177
|
+
# Set the linear velocity to 50 mm/sec and the angular velocity to
|
|
178
|
+
# 15 degree/sec.
|
|
179
|
+
await my_base.set_velocity(
|
|
180
|
+
linear=Vector3(x=0, y=50, z=0), angular=Vector3(x=0, y=0, z=15))
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
linear (Vector3): Velocity in mm/sec
|
|
184
|
+
angular (Vector3): Velocity in deg/sec
|
|
185
|
+
|
|
186
|
+
For more information, see `Base component <https://docs.viam.com/dev/reference/apis/components/base/#setvelocity>`_.
|
|
187
|
+
"""
|
|
188
|
+
|
|
189
|
+
@abc.abstractmethod
|
|
190
|
+
async def stop(
|
|
191
|
+
self,
|
|
192
|
+
*,
|
|
193
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
194
|
+
timeout: Optional[float] = None,
|
|
195
|
+
**kwargs,
|
|
196
|
+
):
|
|
197
|
+
"""
|
|
198
|
+
Stop the base.
|
|
199
|
+
|
|
200
|
+
::
|
|
201
|
+
|
|
202
|
+
my_base = Base.from_robot(robot=machine, name="my_base")
|
|
203
|
+
|
|
204
|
+
# Move the base forward 10 mm at a velocity of 50 mm/s.
|
|
205
|
+
await my_base.move_straight(distance=10, velocity=50)
|
|
206
|
+
|
|
207
|
+
# Stop the base.
|
|
208
|
+
await my_base.stop()
|
|
209
|
+
|
|
210
|
+
For more information, see `Base component <https://docs.viam.com/dev/reference/apis/components/base/#stop>`_.
|
|
211
|
+
"""
|
|
212
|
+
...
|
|
213
|
+
|
|
214
|
+
@abc.abstractmethod
|
|
215
|
+
async def is_moving(self) -> bool:
|
|
216
|
+
"""
|
|
217
|
+
Get if the base is currently moving.
|
|
218
|
+
|
|
219
|
+
::
|
|
220
|
+
|
|
221
|
+
my_base = Base.from_robot(robot=machine, name="my_base")
|
|
222
|
+
|
|
223
|
+
# Check whether the base is currently moving.
|
|
224
|
+
moving = await my_base.is_moving()
|
|
225
|
+
print('Moving: ', moving)
|
|
226
|
+
|
|
227
|
+
Returns:
|
|
228
|
+
bool: Whether the base is moving.
|
|
229
|
+
|
|
230
|
+
For more information, see `Base component <https://docs.viam.com/dev/reference/apis/components/base/#ismoving>`_.
|
|
231
|
+
"""
|
|
232
|
+
...
|
|
233
|
+
|
|
234
|
+
@abc.abstractmethod
|
|
235
|
+
async def get_properties(self, *, timeout: Optional[float] = None, **kwargs) -> Properties:
|
|
236
|
+
"""
|
|
237
|
+
Get the base width and turning radius
|
|
238
|
+
|
|
239
|
+
::
|
|
240
|
+
|
|
241
|
+
my_base = Base.from_robot(robot=machine, name="my_base")
|
|
242
|
+
|
|
243
|
+
# Get the width and turning radius of the base
|
|
244
|
+
properties = await my_base.get_properties()
|
|
245
|
+
|
|
246
|
+
# Get the width
|
|
247
|
+
print(f"Width of base: {properties.width_meters}")
|
|
248
|
+
|
|
249
|
+
# Get the turning radius
|
|
250
|
+
print(f"Turning radius of base: {properties.turning_radius_meters}")
|
|
251
|
+
|
|
252
|
+
# Get the wheel circumference
|
|
253
|
+
print(f"Wheel circumference of base: {properties.wheel_circumference_meters}")
|
|
254
|
+
|
|
255
|
+
Returns:
|
|
256
|
+
Properties: The properties of the base
|
|
257
|
+
|
|
258
|
+
For more information, see `Base component <https://docs.viam.com/dev/reference/apis/components/base/#getproperties>`_.
|
|
259
|
+
"""
|
|
260
|
+
...
|
|
@@ -0,0 +1,153 @@
|
|
|
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.base import (
|
|
7
|
+
BaseServiceStub,
|
|
8
|
+
GetPropertiesRequest,
|
|
9
|
+
GetPropertiesResponse,
|
|
10
|
+
IsMovingRequest,
|
|
11
|
+
IsMovingResponse,
|
|
12
|
+
MoveStraightRequest,
|
|
13
|
+
SetPowerRequest,
|
|
14
|
+
SetVelocityRequest,
|
|
15
|
+
SpinRequest,
|
|
16
|
+
StopRequest,
|
|
17
|
+
)
|
|
18
|
+
from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
|
|
19
|
+
from viam.utils import ValueTypes, dict_to_struct, get_geometries, struct_to_dict
|
|
20
|
+
|
|
21
|
+
from . import Base, Vector3
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class BaseClient(Base, ReconfigurableResourceRPCClientBase):
|
|
25
|
+
"""
|
|
26
|
+
gRPC client for the Base component.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(self, name: str, channel: Channel):
|
|
30
|
+
self.channel = channel
|
|
31
|
+
self.client = BaseServiceStub(channel)
|
|
32
|
+
super().__init__(name)
|
|
33
|
+
|
|
34
|
+
async def move_straight(
|
|
35
|
+
self,
|
|
36
|
+
distance: int,
|
|
37
|
+
velocity: float,
|
|
38
|
+
*,
|
|
39
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
40
|
+
timeout: Optional[float] = None,
|
|
41
|
+
**kwargs,
|
|
42
|
+
):
|
|
43
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
44
|
+
request = MoveStraightRequest(
|
|
45
|
+
name=self.name,
|
|
46
|
+
distance_mm=distance,
|
|
47
|
+
mm_per_sec=velocity,
|
|
48
|
+
extra=dict_to_struct(extra),
|
|
49
|
+
)
|
|
50
|
+
await self.client.MoveStraight(request, timeout=timeout, metadata=md)
|
|
51
|
+
|
|
52
|
+
async def spin(
|
|
53
|
+
self,
|
|
54
|
+
angle: float,
|
|
55
|
+
velocity: float,
|
|
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 = SpinRequest(
|
|
63
|
+
name=self.name,
|
|
64
|
+
angle_deg=angle,
|
|
65
|
+
degs_per_sec=velocity,
|
|
66
|
+
extra=dict_to_struct(extra),
|
|
67
|
+
)
|
|
68
|
+
await self.client.Spin(request, timeout=timeout, metadata=md)
|
|
69
|
+
|
|
70
|
+
async def set_power(
|
|
71
|
+
self,
|
|
72
|
+
linear: Vector3,
|
|
73
|
+
angular: Vector3,
|
|
74
|
+
*,
|
|
75
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
76
|
+
timeout: Optional[float] = None,
|
|
77
|
+
**kwargs,
|
|
78
|
+
):
|
|
79
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
80
|
+
request = SetPowerRequest(
|
|
81
|
+
name=self.name,
|
|
82
|
+
linear=linear,
|
|
83
|
+
angular=angular,
|
|
84
|
+
extra=dict_to_struct(extra),
|
|
85
|
+
)
|
|
86
|
+
await self.client.SetPower(request, timeout=timeout, metadata=md)
|
|
87
|
+
|
|
88
|
+
async def set_velocity(
|
|
89
|
+
self,
|
|
90
|
+
linear: Vector3,
|
|
91
|
+
angular: Vector3,
|
|
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 = SetVelocityRequest(name=self.name, linear=linear, angular=angular, extra=dict_to_struct(extra))
|
|
99
|
+
await self.client.SetVelocity(request, timeout=timeout, metadata=md)
|
|
100
|
+
|
|
101
|
+
async def stop(
|
|
102
|
+
self,
|
|
103
|
+
*,
|
|
104
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
105
|
+
timeout: Optional[float] = None,
|
|
106
|
+
**kwargs,
|
|
107
|
+
):
|
|
108
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
109
|
+
request = StopRequest(name=self.name, extra=dict_to_struct(extra))
|
|
110
|
+
await self.client.Stop(request, timeout=timeout, metadata=md)
|
|
111
|
+
|
|
112
|
+
async def is_moving(
|
|
113
|
+
self,
|
|
114
|
+
*,
|
|
115
|
+
timeout: Optional[float] = None,
|
|
116
|
+
**kwargs,
|
|
117
|
+
) -> bool:
|
|
118
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
119
|
+
request = IsMovingRequest(name=self.name)
|
|
120
|
+
response: IsMovingResponse = await self.client.IsMoving(request, timeout=timeout, metadata=md)
|
|
121
|
+
return response.is_moving
|
|
122
|
+
|
|
123
|
+
async def get_properties(
|
|
124
|
+
self,
|
|
125
|
+
*,
|
|
126
|
+
extra: Optional[Dict[str, Any]] = None,
|
|
127
|
+
timeout: Optional[float] = None,
|
|
128
|
+
**kwargs,
|
|
129
|
+
) -> Base.Properties:
|
|
130
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
131
|
+
request = GetPropertiesRequest(name=self.name, extra=dict_to_struct(extra))
|
|
132
|
+
response: GetPropertiesResponse = await self.client.GetProperties(request, timeout=timeout, metadata=md)
|
|
133
|
+
return Base.Properties(
|
|
134
|
+
width_meters=response.width_meters,
|
|
135
|
+
turning_radius_meters=response.turning_radius_meters,
|
|
136
|
+
wheel_circumference_meters=response.wheel_circumference_meters,
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
async def do_command(
|
|
140
|
+
self,
|
|
141
|
+
command: Mapping[str, ValueTypes],
|
|
142
|
+
*,
|
|
143
|
+
timeout: Optional[float] = None,
|
|
144
|
+
**kwargs,
|
|
145
|
+
) -> Mapping[str, ValueTypes]:
|
|
146
|
+
md = kwargs.get("metadata", self.Metadata()).proto
|
|
147
|
+
request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
|
|
148
|
+
response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
|
|
149
|
+
return struct_to_dict(response.result)
|
|
150
|
+
|
|
151
|
+
async def get_geometries(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[Geometry]:
|
|
152
|
+
md = kwargs.get("metadata", self.Metadata())
|
|
153
|
+
return await get_geometries(self.client, self.name, extra, timeout, md)
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
from grpclib.server import Stream
|
|
2
|
+
|
|
3
|
+
from viam.proto.common import DoCommandRequest, DoCommandResponse, GetGeometriesRequest, GetGeometriesResponse
|
|
4
|
+
from viam.proto.component.base import (
|
|
5
|
+
BaseServiceBase,
|
|
6
|
+
GetPropertiesRequest,
|
|
7
|
+
GetPropertiesResponse,
|
|
8
|
+
IsMovingRequest,
|
|
9
|
+
IsMovingResponse,
|
|
10
|
+
MoveStraightRequest,
|
|
11
|
+
MoveStraightResponse,
|
|
12
|
+
SetPowerRequest,
|
|
13
|
+
SetPowerResponse,
|
|
14
|
+
SetVelocityRequest,
|
|
15
|
+
SetVelocityResponse,
|
|
16
|
+
SpinRequest,
|
|
17
|
+
SpinResponse,
|
|
18
|
+
StopRequest,
|
|
19
|
+
StopResponse,
|
|
20
|
+
)
|
|
21
|
+
from viam.resource.rpc_service_base import ResourceRPCServiceBase
|
|
22
|
+
from viam.utils import dict_to_struct, struct_to_dict
|
|
23
|
+
|
|
24
|
+
from .base import Base
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class BaseRPCService(BaseServiceBase, ResourceRPCServiceBase[Base]):
|
|
28
|
+
"""
|
|
29
|
+
gRPC service for a robotic Base
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
RESOURCE_TYPE = Base
|
|
33
|
+
|
|
34
|
+
async def MoveStraight(self, stream: Stream[MoveStraightRequest, MoveStraightResponse]) -> None:
|
|
35
|
+
request = await stream.recv_message()
|
|
36
|
+
assert request is not None
|
|
37
|
+
name = request.name
|
|
38
|
+
base = self.get_resource(name)
|
|
39
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
40
|
+
await base.move_straight(
|
|
41
|
+
distance=request.distance_mm,
|
|
42
|
+
velocity=request.mm_per_sec,
|
|
43
|
+
extra=struct_to_dict(request.extra),
|
|
44
|
+
timeout=timeout,
|
|
45
|
+
metadata=stream.metadata,
|
|
46
|
+
)
|
|
47
|
+
response = MoveStraightResponse()
|
|
48
|
+
await stream.send_message(response)
|
|
49
|
+
|
|
50
|
+
async def Spin(self, stream: Stream[SpinRequest, SpinResponse]) -> None:
|
|
51
|
+
request = await stream.recv_message()
|
|
52
|
+
assert request is not None
|
|
53
|
+
name = request.name
|
|
54
|
+
base = self.get_resource(name)
|
|
55
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
56
|
+
await base.spin(
|
|
57
|
+
angle=request.angle_deg,
|
|
58
|
+
velocity=request.degs_per_sec,
|
|
59
|
+
extra=struct_to_dict(request.extra),
|
|
60
|
+
timeout=timeout,
|
|
61
|
+
metadata=stream.metadata,
|
|
62
|
+
)
|
|
63
|
+
response = SpinResponse()
|
|
64
|
+
await stream.send_message(response)
|
|
65
|
+
|
|
66
|
+
async def SetPower(self, stream: Stream[SetPowerRequest, SetPowerResponse]) -> None:
|
|
67
|
+
request = await stream.recv_message()
|
|
68
|
+
assert request is not None
|
|
69
|
+
name = request.name
|
|
70
|
+
base = self.get_resource(name)
|
|
71
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
72
|
+
await base.set_power(
|
|
73
|
+
request.linear, request.angular, extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata
|
|
74
|
+
)
|
|
75
|
+
response = SetPowerResponse()
|
|
76
|
+
await stream.send_message(response)
|
|
77
|
+
|
|
78
|
+
async def SetVelocity(self, stream: Stream[SetVelocityRequest, SetVelocityResponse]) -> None:
|
|
79
|
+
request = await stream.recv_message()
|
|
80
|
+
assert request is not None
|
|
81
|
+
name = request.name
|
|
82
|
+
base = self.get_resource(name)
|
|
83
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
84
|
+
await base.set_velocity(
|
|
85
|
+
request.linear, request.angular, extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata
|
|
86
|
+
)
|
|
87
|
+
await stream.send_message(SetVelocityResponse())
|
|
88
|
+
|
|
89
|
+
async def Stop(self, stream: Stream[StopRequest, StopResponse]) -> None:
|
|
90
|
+
request = await stream.recv_message()
|
|
91
|
+
assert request is not None
|
|
92
|
+
name = request.name
|
|
93
|
+
base = self.get_resource(name)
|
|
94
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
95
|
+
await base.stop(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
|
|
96
|
+
response = StopResponse()
|
|
97
|
+
await stream.send_message(response)
|
|
98
|
+
|
|
99
|
+
async def IsMoving(self, stream: Stream[IsMovingRequest, IsMovingResponse]) -> None:
|
|
100
|
+
request = await stream.recv_message()
|
|
101
|
+
assert request is not None
|
|
102
|
+
name = request.name
|
|
103
|
+
base = self.get_resource(name)
|
|
104
|
+
is_moving = await base.is_moving()
|
|
105
|
+
response = IsMovingResponse(is_moving=is_moving)
|
|
106
|
+
await stream.send_message(response)
|
|
107
|
+
|
|
108
|
+
async def GetProperties(self, stream: Stream[GetPropertiesRequest, GetPropertiesResponse]) -> None:
|
|
109
|
+
request = await stream.recv_message()
|
|
110
|
+
assert request is not None
|
|
111
|
+
name = request.name
|
|
112
|
+
base = self.get_resource(name)
|
|
113
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
114
|
+
properties = await base.get_properties(timeout=timeout, metadata=stream.metadata)
|
|
115
|
+
response = GetPropertiesResponse(
|
|
116
|
+
width_meters=properties.width_meters,
|
|
117
|
+
turning_radius_meters=properties.turning_radius_meters,
|
|
118
|
+
wheel_circumference_meters=properties.wheel_circumference_meters,
|
|
119
|
+
)
|
|
120
|
+
await stream.send_message(response)
|
|
121
|
+
|
|
122
|
+
async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None:
|
|
123
|
+
request = await stream.recv_message()
|
|
124
|
+
assert request is not None
|
|
125
|
+
base = self.get_resource(request.name)
|
|
126
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
127
|
+
result = await base.do_command(command=struct_to_dict(request.command), timeout=timeout, metadata=stream.metadata)
|
|
128
|
+
response = DoCommandResponse(result=dict_to_struct(result))
|
|
129
|
+
await stream.send_message(response)
|
|
130
|
+
|
|
131
|
+
async def GetGeometries(self, stream: Stream[GetGeometriesRequest, GetGeometriesResponse]) -> None:
|
|
132
|
+
request = await stream.recv_message()
|
|
133
|
+
assert request is not None
|
|
134
|
+
base = self.get_resource(request.name)
|
|
135
|
+
timeout = stream.deadline.time_remaining() if stream.deadline else None
|
|
136
|
+
geometries = await base.get_geometries(extra=struct_to_dict(request.extra), timeout=timeout)
|
|
137
|
+
response = GetGeometriesResponse(geometries=geometries)
|
|
138
|
+
await stream.send_message(response)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from viam.resource.registry import Registry, ResourceRegistration
|
|
2
|
+
|
|
3
|
+
from .board import Board, Tick, TickStream
|
|
4
|
+
from .client import BoardClient
|
|
5
|
+
from .service import BoardRPCService
|
|
6
|
+
|
|
7
|
+
__all__ = ["Board", "Tick", "TickStream"]
|
|
8
|
+
|
|
9
|
+
Registry.register_api(ResourceRegistration(Board, BoardRPCService, lambda name, channel: BoardClient(name, channel)))
|