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.

Files changed (476) hide show
  1. viam/__init__.py +71 -0
  2. viam/app/__init__.py +0 -0
  3. viam/app/_logs.py +34 -0
  4. viam/app/app_client.py +2525 -0
  5. viam/app/billing_client.py +143 -0
  6. viam/app/data_client.py +1715 -0
  7. viam/app/ml_training_client.py +251 -0
  8. viam/app/provisioning_client.py +95 -0
  9. viam/app/viam_client.py +260 -0
  10. viam/components/__init__.py +0 -0
  11. viam/components/arm/__init__.py +16 -0
  12. viam/components/arm/arm.py +223 -0
  13. viam/components/arm/client.py +124 -0
  14. viam/components/arm/service.py +123 -0
  15. viam/components/audio_input/__init__.py +18 -0
  16. viam/components/audio_input/audio_input.py +81 -0
  17. viam/components/audio_input/client.py +70 -0
  18. viam/components/audio_input/service.py +114 -0
  19. viam/components/base/__init__.py +13 -0
  20. viam/components/base/base.py +260 -0
  21. viam/components/base/client.py +153 -0
  22. viam/components/base/service.py +138 -0
  23. viam/components/board/__init__.py +9 -0
  24. viam/components/board/board.py +414 -0
  25. viam/components/board/client.py +241 -0
  26. viam/components/board/service.py +223 -0
  27. viam/components/button/__init__.py +10 -0
  28. viam/components/button/button.py +41 -0
  29. viam/components/button/client.py +52 -0
  30. viam/components/button/service.py +46 -0
  31. viam/components/camera/__init__.py +22 -0
  32. viam/components/camera/camera.py +138 -0
  33. viam/components/camera/client.py +98 -0
  34. viam/components/camera/service.py +105 -0
  35. viam/components/component_base.py +65 -0
  36. viam/components/encoder/__init__.py +18 -0
  37. viam/components/encoder/client.py +83 -0
  38. viam/components/encoder/encoder.py +118 -0
  39. viam/components/encoder/service.py +72 -0
  40. viam/components/gantry/__init__.py +11 -0
  41. viam/components/gantry/client.py +115 -0
  42. viam/components/gantry/gantry.py +156 -0
  43. viam/components/gantry/service.py +113 -0
  44. viam/components/generic/__init__.py +18 -0
  45. viam/components/generic/client.py +62 -0
  46. viam/components/generic/generic.py +76 -0
  47. viam/components/generic/service.py +40 -0
  48. viam/components/gripper/__init__.py +11 -0
  49. viam/components/gripper/client.py +85 -0
  50. viam/components/gripper/gripper.py +114 -0
  51. viam/components/gripper/service.py +81 -0
  52. viam/components/input/__init__.py +15 -0
  53. viam/components/input/client.py +194 -0
  54. viam/components/input/input.py +297 -0
  55. viam/components/input/service.py +175 -0
  56. viam/components/motor/__init__.py +11 -0
  57. viam/components/motor/client.py +168 -0
  58. viam/components/motor/motor.py +301 -0
  59. viam/components/motor/service.py +150 -0
  60. viam/components/movement_sensor/__init__.py +21 -0
  61. viam/components/movement_sensor/client.py +161 -0
  62. viam/components/movement_sensor/movement_sensor.py +253 -0
  63. viam/components/movement_sensor/service.py +146 -0
  64. viam/components/pose_tracker/__init__.py +17 -0
  65. viam/components/pose_tracker/client.py +50 -0
  66. viam/components/pose_tracker/pose_tracker.py +40 -0
  67. viam/components/pose_tracker/service.py +45 -0
  68. viam/components/power_sensor/__init__.py +17 -0
  69. viam/components/power_sensor/client.py +86 -0
  70. viam/components/power_sensor/power_sensor.py +104 -0
  71. viam/components/power_sensor/service.py +72 -0
  72. viam/components/sensor/__init__.py +18 -0
  73. viam/components/sensor/client.py +49 -0
  74. viam/components/sensor/sensor.py +48 -0
  75. viam/components/sensor/service.py +51 -0
  76. viam/components/servo/__init__.py +11 -0
  77. viam/components/servo/client.py +86 -0
  78. viam/components/servo/service.py +80 -0
  79. viam/components/servo/servo.py +114 -0
  80. viam/components/switch/__init__.py +10 -0
  81. viam/components/switch/client.py +83 -0
  82. viam/components/switch/service.py +72 -0
  83. viam/components/switch/switch.py +95 -0
  84. viam/errors.py +105 -0
  85. viam/gen/__init__.py +0 -0
  86. viam/gen/app/__init__.py +0 -0
  87. viam/gen/app/agent/__init__.py +0 -0
  88. viam/gen/app/agent/v1/__init__.py +0 -0
  89. viam/gen/app/agent/v1/agent_grpc.py +29 -0
  90. viam/gen/app/agent/v1/agent_pb2.py +47 -0
  91. viam/gen/app/agent/v1/agent_pb2.pyi +280 -0
  92. viam/gen/app/cloudslam/__init__.py +0 -0
  93. viam/gen/app/cloudslam/v1/__init__.py +0 -0
  94. viam/gen/app/cloudslam/v1/cloud_slam_grpc.py +70 -0
  95. viam/gen/app/cloudslam/v1/cloud_slam_pb2.py +54 -0
  96. viam/gen/app/cloudslam/v1/cloud_slam_pb2.pyi +384 -0
  97. viam/gen/app/data/__init__.py +0 -0
  98. viam/gen/app/data/v1/__init__.py +0 -0
  99. viam/gen/app/data/v1/data_grpc.py +206 -0
  100. viam/gen/app/data/v1/data_pb2.py +178 -0
  101. viam/gen/app/data/v1/data_pb2.pyi +1485 -0
  102. viam/gen/app/datapipelines/__init__.py +0 -0
  103. viam/gen/app/datapipelines/v1/__init__.py +0 -0
  104. viam/gen/app/datapipelines/v1/data_pipelines_grpc.py +84 -0
  105. viam/gen/app/datapipelines/v1/data_pipelines_pb2.py +56 -0
  106. viam/gen/app/datapipelines/v1/data_pipelines_pb2.pyi +370 -0
  107. viam/gen/app/dataset/__init__.py +0 -0
  108. viam/gen/app/dataset/v1/__init__.py +0 -0
  109. viam/gen/app/dataset/v1/dataset_grpc.py +60 -0
  110. viam/gen/app/dataset/v1/dataset_pb2.py +40 -0
  111. viam/gen/app/dataset/v1/dataset_pb2.pyi +179 -0
  112. viam/gen/app/datasync/__init__.py +0 -0
  113. viam/gen/app/datasync/v1/__init__.py +0 -0
  114. viam/gen/app/datasync/v1/data_sync_grpc.py +47 -0
  115. viam/gen/app/datasync/v1/data_sync_pb2.py +70 -0
  116. viam/gen/app/datasync/v1/data_sync_pb2.pyi +425 -0
  117. viam/gen/app/mlinference/__init__.py +0 -0
  118. viam/gen/app/mlinference/v1/__init__.py +0 -0
  119. viam/gen/app/mlinference/v1/ml_inference_grpc.py +28 -0
  120. viam/gen/app/mlinference/v1/ml_inference_pb2.py +23 -0
  121. viam/gen/app/mlinference/v1/ml_inference_pb2.pyi +63 -0
  122. viam/gen/app/mltraining/__init__.py +0 -0
  123. viam/gen/app/mltraining/v1/__init__.py +0 -0
  124. viam/gen/app/mltraining/v1/ml_training_grpc.py +78 -0
  125. viam/gen/app/mltraining/v1/ml_training_pb2.py +124 -0
  126. viam/gen/app/mltraining/v1/ml_training_pb2.pyi +415 -0
  127. viam/gen/app/packages/__init__.py +0 -0
  128. viam/gen/app/packages/v1/__init__.py +0 -0
  129. viam/gen/app/packages/v1/packages_grpc.py +54 -0
  130. viam/gen/app/packages/v1/packages_pb2.py +52 -0
  131. viam/gen/app/packages/v1/packages_pb2.pyi +311 -0
  132. viam/gen/app/v1/__init__.py +0 -0
  133. viam/gen/app/v1/app_grpc.py +863 -0
  134. viam/gen/app/v1/app_pb2.py +649 -0
  135. viam/gen/app/v1/app_pb2.pyi +5279 -0
  136. viam/gen/app/v1/billing_grpc.py +76 -0
  137. viam/gen/app/v1/billing_pb2.py +92 -0
  138. viam/gen/app/v1/billing_pb2.pyi +463 -0
  139. viam/gen/app/v1/end_user_grpc.py +59 -0
  140. viam/gen/app/v1/end_user_pb2.py +55 -0
  141. viam/gen/app/v1/end_user_pb2.pyi +181 -0
  142. viam/gen/app/v1/robot_grpc.py +55 -0
  143. viam/gen/app/v1/robot_pb2.py +127 -0
  144. viam/gen/app/v1/robot_pb2.pyi +1202 -0
  145. viam/gen/common/__init__.py +0 -0
  146. viam/gen/common/v1/__init__.py +0 -0
  147. viam/gen/common/v1/common_grpc.py +0 -0
  148. viam/gen/common/v1/common_pb2.py +78 -0
  149. viam/gen/common/v1/common_pb2.pyi +687 -0
  150. viam/gen/component/__init__.py +0 -0
  151. viam/gen/component/arm/__init__.py +0 -0
  152. viam/gen/component/arm/v1/__init__.py +0 -0
  153. viam/gen/component/arm/v1/arm_grpc.py +102 -0
  154. viam/gen/component/arm/v1/arm_pb2.py +74 -0
  155. viam/gen/component/arm/v1/arm_pb2.pyi +344 -0
  156. viam/gen/component/audioinput/__init__.py +0 -0
  157. viam/gen/component/audioinput/v1/__init__.py +0 -0
  158. viam/gen/component/audioinput/v1/audioinput_grpc.py +63 -0
  159. viam/gen/component/audioinput/v1/audioinput_pb2.py +45 -0
  160. viam/gen/component/audioinput/v1/audioinput_pb2.pyi +179 -0
  161. viam/gen/component/base/__init__.py +0 -0
  162. viam/gen/component/base/v1/__init__.py +0 -0
  163. viam/gen/component/base/v1/base_grpc.py +94 -0
  164. viam/gen/component/base/v1/base_pb2.py +66 -0
  165. viam/gen/component/base/v1/base_pb2.pyi +258 -0
  166. viam/gen/component/board/__init__.py +0 -0
  167. viam/gen/component/board/v1/__init__.py +0 -0
  168. viam/gen/component/board/v1/board_grpc.py +127 -0
  169. viam/gen/component/board/v1/board_pb2.py +103 -0
  170. viam/gen/component/board/v1/board_pb2.pyi +496 -0
  171. viam/gen/component/button/__init__.py +0 -0
  172. viam/gen/component/button/v1/__init__.py +0 -0
  173. viam/gen/component/button/v1/button_grpc.py +38 -0
  174. viam/gen/component/button/v1/button_pb2.py +28 -0
  175. viam/gen/component/button/v1/button_pb2.pyi +39 -0
  176. viam/gen/component/camera/__init__.py +0 -0
  177. viam/gen/component/camera/v1/__init__.py +0 -0
  178. viam/gen/component/camera/v1/camera_grpc.py +79 -0
  179. viam/gen/component/camera/v1/camera_pb2.py +67 -0
  180. viam/gen/component/camera/v1/camera_pb2.pyi +373 -0
  181. viam/gen/component/encoder/__init__.py +0 -0
  182. viam/gen/component/encoder/v1/__init__.py +0 -0
  183. viam/gen/component/encoder/v1/encoder_grpc.py +62 -0
  184. viam/gen/component/encoder/v1/encoder_pb2.py +44 -0
  185. viam/gen/component/encoder/v1/encoder_pb2.pyi +147 -0
  186. viam/gen/component/gantry/__init__.py +0 -0
  187. viam/gen/component/gantry/v1/__init__.py +0 -0
  188. viam/gen/component/gantry/v1/gantry_grpc.py +86 -0
  189. viam/gen/component/gantry/v1/gantry_pb2.py +62 -0
  190. viam/gen/component/gantry/v1/gantry_pb2.pyi +239 -0
  191. viam/gen/component/generic/__init__.py +0 -0
  192. viam/gen/component/generic/v1/__init__.py +0 -0
  193. viam/gen/component/generic/v1/generic_grpc.py +37 -0
  194. viam/gen/component/generic/v1/generic_pb2.py +23 -0
  195. viam/gen/component/generic/v1/generic_pb2.pyi +6 -0
  196. viam/gen/component/gripper/__init__.py +0 -0
  197. viam/gen/component/gripper/v1/__init__.py +0 -0
  198. viam/gen/component/gripper/v1/gripper_grpc.py +70 -0
  199. viam/gen/component/gripper/v1/gripper_pb2.py +48 -0
  200. viam/gen/component/gripper/v1/gripper_pb2.pyi +137 -0
  201. viam/gen/component/inputcontroller/__init__.py +0 -0
  202. viam/gen/component/inputcontroller/v1/__init__.py +0 -0
  203. viam/gen/component/inputcontroller/v1/input_controller_grpc.py +71 -0
  204. viam/gen/component/inputcontroller/v1/input_controller_pb2.py +55 -0
  205. viam/gen/component/inputcontroller/v1/input_controller_pb2.pyi +243 -0
  206. viam/gen/component/motor/__init__.py +0 -0
  207. viam/gen/component/motor/v1/__init__.py +0 -0
  208. viam/gen/component/motor/v1/motor_grpc.py +118 -0
  209. viam/gen/component/motor/v1/motor_pb2.py +86 -0
  210. viam/gen/component/motor/v1/motor_pb2.pyi +368 -0
  211. viam/gen/component/movementsensor/__init__.py +0 -0
  212. viam/gen/component/movementsensor/v1/__init__.py +0 -0
  213. viam/gen/component/movementsensor/v1/movementsensor_grpc.py +110 -0
  214. viam/gen/component/movementsensor/v1/movementsensor_pb2.py +78 -0
  215. viam/gen/component/movementsensor/v1/movementsensor_pb2.pyi +384 -0
  216. viam/gen/component/posetracker/__init__.py +0 -0
  217. viam/gen/component/posetracker/v1/__init__.py +0 -0
  218. viam/gen/component/posetracker/v1/pose_tracker_grpc.py +46 -0
  219. viam/gen/component/posetracker/v1/pose_tracker_pb2.py +34 -0
  220. viam/gen/component/posetracker/v1/pose_tracker_pb2.pyi +79 -0
  221. viam/gen/component/powersensor/__init__.py +0 -0
  222. viam/gen/component/powersensor/v1/__init__.py +0 -0
  223. viam/gen/component/powersensor/v1/powersensor_grpc.py +62 -0
  224. viam/gen/component/powersensor/v1/powersensor_pb2.py +42 -0
  225. viam/gen/component/powersensor/v1/powersensor_pb2.pyi +124 -0
  226. viam/gen/component/sensor/__init__.py +0 -0
  227. viam/gen/component/sensor/v1/__init__.py +0 -0
  228. viam/gen/component/sensor/v1/sensor_grpc.py +45 -0
  229. viam/gen/component/sensor/v1/sensor_pb2.py +25 -0
  230. viam/gen/component/sensor/v1/sensor_pb2.pyi +6 -0
  231. viam/gen/component/servo/__init__.py +0 -0
  232. viam/gen/component/servo/v1/__init__.py +0 -0
  233. viam/gen/component/servo/v1/servo_grpc.py +70 -0
  234. viam/gen/component/servo/v1/servo_pb2.py +50 -0
  235. viam/gen/component/servo/v1/servo_pb2.pyi +150 -0
  236. viam/gen/component/switch/__init__.py +0 -0
  237. viam/gen/component/switch/v1/__init__.py +0 -0
  238. viam/gen/component/switch/v1/switch_grpc.py +54 -0
  239. viam/gen/component/switch/v1/switch_pb2.py +40 -0
  240. viam/gen/component/switch/v1/switch_pb2.pyi +109 -0
  241. viam/gen/component/testecho/__init__.py +0 -0
  242. viam/gen/component/testecho/v1/__init__.py +0 -0
  243. viam/gen/component/testecho/v1/testecho_grpc.py +52 -0
  244. viam/gen/component/testecho/v1/testecho_pb2.py +36 -0
  245. viam/gen/component/testecho/v1/testecho_pb2.pyi +114 -0
  246. viam/gen/module/__init__.py +0 -0
  247. viam/gen/module/v1/__init__.py +0 -0
  248. viam/gen/module/v1/module_grpc.py +61 -0
  249. viam/gen/module/v1/module_pb2.py +43 -0
  250. viam/gen/module/v1/module_pb2.pyi +211 -0
  251. viam/gen/proto/__init__.py +0 -0
  252. viam/gen/proto/rpc/__init__.py +0 -0
  253. viam/gen/proto/rpc/examples/__init__.py +0 -0
  254. viam/gen/proto/rpc/examples/echo/__init__.py +0 -0
  255. viam/gen/proto/rpc/examples/echo/v1/__init__.py +0 -0
  256. viam/gen/proto/rpc/examples/echo/v1/echo_grpc.py +44 -0
  257. viam/gen/proto/rpc/examples/echo/v1/echo_pb2.py +32 -0
  258. viam/gen/proto/rpc/examples/echo/v1/echo_pb2.pyi +87 -0
  259. viam/gen/proto/rpc/examples/echoresource/__init__.py +0 -0
  260. viam/gen/proto/rpc/examples/echoresource/v1/__init__.py +0 -0
  261. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_grpc.py +43 -0
  262. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.py +29 -0
  263. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.pyi +93 -0
  264. viam/gen/proto/rpc/v1/__init__.py +0 -0
  265. viam/gen/proto/rpc/v1/auth_grpc.py +47 -0
  266. viam/gen/proto/rpc/v1/auth_pb2.py +34 -0
  267. viam/gen/proto/rpc/v1/auth_pb2.pyi +92 -0
  268. viam/gen/proto/rpc/webrtc/__init__.py +0 -0
  269. viam/gen/proto/rpc/webrtc/v1/__init__.py +0 -0
  270. viam/gen/proto/rpc/webrtc/v1/grpc_grpc.py +0 -0
  271. viam/gen/proto/rpc/webrtc/v1/grpc_pb2.py +43 -0
  272. viam/gen/proto/rpc/webrtc/v1/grpc_pb2.pyi +304 -0
  273. viam/gen/proto/rpc/webrtc/v1/signaling_grpc.py +54 -0
  274. viam/gen/proto/rpc/webrtc/v1/signaling_pb2.py +70 -0
  275. viam/gen/proto/rpc/webrtc/v1/signaling_pb2.pyi +496 -0
  276. viam/gen/provisioning/__init__.py +0 -0
  277. viam/gen/provisioning/v1/__init__.py +0 -0
  278. viam/gen/provisioning/v1/provisioning_grpc.py +51 -0
  279. viam/gen/provisioning/v1/provisioning_pb2.py +39 -0
  280. viam/gen/provisioning/v1/provisioning_pb2.pyi +188 -0
  281. viam/gen/robot/__init__.py +0 -0
  282. viam/gen/robot/v1/__init__.py +0 -0
  283. viam/gen/robot/v1/robot_grpc.py +208 -0
  284. viam/gen/robot/v1/robot_pb2.py +188 -0
  285. viam/gen/robot/v1/robot_pb2.pyi +1020 -0
  286. viam/gen/service/__init__.py +0 -0
  287. viam/gen/service/datamanager/__init__.py +0 -0
  288. viam/gen/service/datamanager/v1/__init__.py +0 -0
  289. viam/gen/service/datamanager/v1/data_manager_grpc.py +38 -0
  290. viam/gen/service/datamanager/v1/data_manager_pb2.py +28 -0
  291. viam/gen/service/datamanager/v1/data_manager_pb2.pyi +39 -0
  292. viam/gen/service/discovery/__init__.py +0 -0
  293. viam/gen/service/discovery/v1/__init__.py +0 -0
  294. viam/gen/service/discovery/v1/discovery_grpc.py +39 -0
  295. viam/gen/service/discovery/v1/discovery_pb2.py +29 -0
  296. viam/gen/service/discovery/v1/discovery_pb2.pyi +51 -0
  297. viam/gen/service/generic/__init__.py +0 -0
  298. viam/gen/service/generic/v1/__init__.py +0 -0
  299. viam/gen/service/generic/v1/generic_grpc.py +29 -0
  300. viam/gen/service/generic/v1/generic_pb2.py +21 -0
  301. viam/gen/service/generic/v1/generic_pb2.pyi +6 -0
  302. viam/gen/service/mlmodel/__init__.py +0 -0
  303. viam/gen/service/mlmodel/v1/__init__.py +0 -0
  304. viam/gen/service/mlmodel/v1/mlmodel_grpc.py +37 -0
  305. viam/gen/service/mlmodel/v1/mlmodel_pb2.py +83 -0
  306. viam/gen/service/mlmodel/v1/mlmodel_pb2.pyi +480 -0
  307. viam/gen/service/motion/__init__.py +0 -0
  308. viam/gen/service/motion/v1/__init__.py +0 -0
  309. viam/gen/service/motion/v1/motion_grpc.py +87 -0
  310. viam/gen/service/motion/v1/motion_pb2.py +97 -0
  311. viam/gen/service/motion/v1/motion_pb2.pyi +838 -0
  312. viam/gen/service/navigation/__init__.py +0 -0
  313. viam/gen/service/navigation/v1/__init__.py +0 -0
  314. viam/gen/service/navigation/v1/navigation_grpc.py +102 -0
  315. viam/gen/service/navigation/v1/navigation_pb2.py +84 -0
  316. viam/gen/service/navigation/v1/navigation_pb2.pyi +419 -0
  317. viam/gen/service/sensors/__init__.py +0 -0
  318. viam/gen/service/sensors/v1/__init__.py +0 -0
  319. viam/gen/service/sensors/v1/sensors_grpc.py +46 -0
  320. viam/gen/service/sensors/v1/sensors_pb2.py +68 -0
  321. viam/gen/service/sensors/v1/sensors_pb2.pyi +137 -0
  322. viam/gen/service/shell/__init__.py +0 -0
  323. viam/gen/service/shell/v1/__init__.py +0 -0
  324. viam/gen/service/shell/v1/shell_grpc.py +55 -0
  325. viam/gen/service/shell/v1/shell_pb2.py +45 -0
  326. viam/gen/service/shell/v1/shell_pb2.pyi +307 -0
  327. viam/gen/service/slam/__init__.py +0 -0
  328. viam/gen/service/slam/v1/__init__.py +0 -0
  329. viam/gen/service/slam/v1/slam_grpc.py +61 -0
  330. viam/gen/service/slam/v1/slam_pb2.py +51 -0
  331. viam/gen/service/slam/v1/slam_pb2.pyi +213 -0
  332. viam/gen/service/vision/__init__.py +0 -0
  333. viam/gen/service/vision/v1/__init__.py +0 -0
  334. viam/gen/service/vision/v1/vision_grpc.py +87 -0
  335. viam/gen/service/vision/v1/vision_pb2.py +69 -0
  336. viam/gen/service/vision/v1/vision_pb2.pyi +454 -0
  337. viam/gen/stream/__init__.py +0 -0
  338. viam/gen/stream/v1/__init__.py +0 -0
  339. viam/gen/stream/v1/stream_grpc.py +59 -0
  340. viam/gen/stream/v1/stream_pb2.py +39 -0
  341. viam/gen/stream/v1/stream_pb2.pyi +161 -0
  342. viam/gen/tagger/__init__.py +0 -0
  343. viam/gen/tagger/v1/__init__.py +0 -0
  344. viam/gen/tagger/v1/tagger_grpc.py +0 -0
  345. viam/gen/tagger/v1/tagger_pb2.py +16 -0
  346. viam/gen/tagger/v1/tagger_pb2.pyi +15 -0
  347. viam/logging.py +216 -0
  348. viam/media/__init__.py +0 -0
  349. viam/media/audio.py +16 -0
  350. viam/media/utils/__init__.py +0 -0
  351. viam/media/utils/pil/__init__.py +51 -0
  352. viam/media/utils/pil/viam_rgba_plugin.py +73 -0
  353. viam/media/viam_rgba.py +10 -0
  354. viam/media/video.py +217 -0
  355. viam/module/__init__.py +5 -0
  356. viam/module/module.py +281 -0
  357. viam/module/service.py +66 -0
  358. viam/module/types.py +23 -0
  359. viam/operations.py +124 -0
  360. viam/proto/__init__.py +0 -0
  361. viam/proto/app/__init__.py +554 -0
  362. viam/proto/app/agent/__init__.py +28 -0
  363. viam/proto/app/billing.py +58 -0
  364. viam/proto/app/cloudslam/__init__.py +48 -0
  365. viam/proto/app/data/__init__.py +138 -0
  366. viam/proto/app/datapipelines/__init__.py +56 -0
  367. viam/proto/app/dataset/__init__.py +36 -0
  368. viam/proto/app/datasync/__init__.py +44 -0
  369. viam/proto/app/end_user.py +34 -0
  370. viam/proto/app/mlinference/__init__.py +15 -0
  371. viam/proto/app/mltraining/__init__.py +52 -0
  372. viam/proto/app/packages/__init__.py +38 -0
  373. viam/proto/app/robot.py +84 -0
  374. viam/proto/common/__init__.py +66 -0
  375. viam/proto/component/__init__.py +0 -0
  376. viam/proto/component/arm/__init__.py +48 -0
  377. viam/proto/component/audioinput/__init__.py +30 -0
  378. viam/proto/component/base/__init__.py +42 -0
  379. viam/proto/component/board/__init__.py +62 -0
  380. viam/proto/component/button/__init__.py +15 -0
  381. viam/proto/component/camera/__init__.py +46 -0
  382. viam/proto/component/encoder/__init__.py +28 -0
  383. viam/proto/component/gantry/__init__.py +40 -0
  384. viam/proto/component/generic/__init__.py +12 -0
  385. viam/proto/component/gripper/__init__.py +30 -0
  386. viam/proto/component/inputcontroller/__init__.py +38 -0
  387. viam/proto/component/motor/__init__.py +56 -0
  388. viam/proto/component/movementsensor/__init__.py +50 -0
  389. viam/proto/component/posetracker/__init__.py +19 -0
  390. viam/proto/component/powersensor/__init__.py +30 -0
  391. viam/proto/component/sensor/__init__.py +12 -0
  392. viam/proto/component/servo/__init__.py +32 -0
  393. viam/proto/component/switch/__init__.py +26 -0
  394. viam/proto/component/testecho/__init__.py +30 -0
  395. viam/proto/module/__init__.py +38 -0
  396. viam/proto/provisioning/__init__.py +36 -0
  397. viam/proto/robot/__init__.py +130 -0
  398. viam/proto/rpc/__init__.py +0 -0
  399. viam/proto/rpc/auth.py +34 -0
  400. viam/proto/rpc/examples/__init__.py +0 -0
  401. viam/proto/rpc/examples/echo/__init__.py +26 -0
  402. viam/proto/rpc/examples/echoresource/__init__.py +30 -0
  403. viam/proto/rpc/webrtc/__init__.py +0 -0
  404. viam/proto/rpc/webrtc/grpc.py +36 -0
  405. viam/proto/rpc/webrtc/signaling.py +58 -0
  406. viam/proto/service/__init__.py +0 -0
  407. viam/proto/service/datamanager/__init__.py +19 -0
  408. viam/proto/service/discovery/__init__.py +15 -0
  409. viam/proto/service/generic/__init__.py +12 -0
  410. viam/proto/service/mlmodel/__init__.py +54 -0
  411. viam/proto/service/motion/__init__.py +68 -0
  412. viam/proto/service/navigation/__init__.py +58 -0
  413. viam/proto/service/sensors/__init__.py +18 -0
  414. viam/proto/service/shell/__init__.py +36 -0
  415. viam/proto/service/slam/__init__.py +36 -0
  416. viam/proto/service/vision/__init__.py +46 -0
  417. viam/proto/stream/__init__.py +36 -0
  418. viam/proto/tagger/__init__.py +6 -0
  419. viam/py.typed +0 -0
  420. viam/resource/__init__.py +0 -0
  421. viam/resource/base.py +123 -0
  422. viam/resource/easy_resource.py +153 -0
  423. viam/resource/manager.py +126 -0
  424. viam/resource/registry.py +199 -0
  425. viam/resource/rpc_client_base.py +65 -0
  426. viam/resource/rpc_service_base.py +48 -0
  427. viam/resource/types.py +213 -0
  428. viam/robot/__init__.py +0 -0
  429. viam/robot/client.py +909 -0
  430. viam/robot/service.py +69 -0
  431. viam/rpc/__init__.py +0 -0
  432. viam/rpc/dial.py +420 -0
  433. viam/rpc/libviam_rust_utils.dll +0 -0
  434. viam/rpc/server.py +201 -0
  435. viam/rpc/signaling.py +29 -0
  436. viam/rpc/types.py +22 -0
  437. viam/services/__init__.py +0 -0
  438. viam/services/discovery/__init__.py +12 -0
  439. viam/services/discovery/client.py +55 -0
  440. viam/services/discovery/discovery.py +52 -0
  441. viam/services/discovery/service.py +43 -0
  442. viam/services/generic/__init__.py +18 -0
  443. viam/services/generic/client.py +58 -0
  444. viam/services/generic/generic.py +58 -0
  445. viam/services/generic/service.py +29 -0
  446. viam/services/mlmodel/__init__.py +24 -0
  447. viam/services/mlmodel/client.py +37 -0
  448. viam/services/mlmodel/mlmodel.py +78 -0
  449. viam/services/mlmodel/service.py +38 -0
  450. viam/services/mlmodel/utils.py +101 -0
  451. viam/services/motion/__init__.py +17 -0
  452. viam/services/motion/client.py +215 -0
  453. viam/services/motion/motion.py +378 -0
  454. viam/services/motion/service.py +132 -0
  455. viam/services/navigation/__init__.py +11 -0
  456. viam/services/navigation/client.py +99 -0
  457. viam/services/navigation/navigation.py +250 -0
  458. viam/services/navigation/service.py +137 -0
  459. viam/services/service_base.py +78 -0
  460. viam/services/service_client_base.py +46 -0
  461. viam/services/slam/__init__.py +17 -0
  462. viam/services/slam/client.py +62 -0
  463. viam/services/slam/service.py +75 -0
  464. viam/services/slam/slam.py +111 -0
  465. viam/services/vision/__init__.py +15 -0
  466. viam/services/vision/client.py +206 -0
  467. viam/services/vision/service.py +146 -0
  468. viam/services/vision/vision.py +315 -0
  469. viam/sessions_client.py +245 -0
  470. viam/streams.py +44 -0
  471. viam/utils.py +365 -0
  472. viam/version_metadata.py +4 -0
  473. viam_sdk-0.45.2.dist-info/METADATA +157 -0
  474. viam_sdk-0.45.2.dist-info/RECORD +476 -0
  475. viam_sdk-0.45.2.dist-info/WHEEL +4 -0
  476. 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)))