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,78 @@
1
+ import abc
2
+ from logging import Logger
3
+ from typing import TYPE_CHECKING, ClassVar, Mapping, Optional, cast
4
+
5
+ from typing_extensions import Self
6
+
7
+ from viam.logging import getLogger
8
+ from viam.resource.base import ResourceBase
9
+ from viam.utils import ValueTypes
10
+
11
+ if TYPE_CHECKING:
12
+ from viam.resource.types import API
13
+ from viam.robot.client import RobotClient
14
+
15
+
16
+ class ServiceBase(abc.ABC, ResourceBase):
17
+ """This class describes the base functionality required for a Viam Service.
18
+ All services must inherit from this class.
19
+ """
20
+
21
+ API: ClassVar["API"]
22
+
23
+ def __init__(self, name: str, *, logger: Optional[Logger] = None) -> None:
24
+ self.name = name
25
+ self.logger = logger if logger is not None else getLogger(f"{self.API}.{name}")
26
+
27
+ @classmethod
28
+ def from_robot(cls, robot: "RobotClient", name: str) -> Self:
29
+ """Get the service named ``name`` from the provided robot.
30
+
31
+ ::
32
+
33
+ async def connect() -> RobotClient:
34
+ # Replace "<API-KEY>" (including brackets) with your API key and "<API-KEY-ID>" with your API key ID
35
+ options = RobotClient.Options.with_api_key("<API-KEY>", "<API-KEY-ID>")
36
+ # Replace "<MACHINE-URL>" (included brackets) with your machine's connection URL or FQDN
37
+ return await RobotClient.at_address("<MACHINE-URL>", options)
38
+
39
+ async def main():
40
+ robot = await connect()
41
+
42
+ # Can be used with any resource, using the motion service as an example
43
+ motion = MotionClient.from_robot(robot=machine, name="builtin")
44
+
45
+ robot.close()
46
+
47
+ Args:
48
+ robot (RobotClient): The robot
49
+ name (str): The name of the service
50
+
51
+ Returns:
52
+ Self: The service, if it exists on the robot
53
+ """
54
+ service = robot.get_service(cls.get_resource_name(name))
55
+ return cast(cls, service) # type: ignore
56
+
57
+ async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Optional[float] = None, **kwargs) -> Mapping[str, ValueTypes]:
58
+ """Send/receive arbitrary commands.
59
+
60
+ ::
61
+
62
+ service = SERVICE.from_robot(robot=machine, "builtin") # replace SERVICE with the appropriate class
63
+
64
+ my_command = {
65
+ "cmnd": "dosomething",
66
+ "someparameter": 52
67
+ }
68
+
69
+ # Can be used with any resource, using the motion service as an example
70
+ await service.do_command(command=my_command)
71
+
72
+ Args:
73
+ command (Dict[str, ValueTypes]): The command to execute
74
+
75
+ Returns:
76
+ Dict[str, ValueTypes]: Result of the executed command
77
+ """
78
+ raise NotImplementedError()
@@ -0,0 +1,46 @@
1
+ import abc
2
+ from typing import TYPE_CHECKING, ClassVar, Mapping, Optional
3
+
4
+ from grpclib.client import Channel
5
+ from typing_extensions import Self
6
+
7
+ from viam.errors import ResourceNotFoundError
8
+ from viam.proto.common import ResourceName
9
+ from viam.resource.base import API, ResourceBase
10
+ from viam.utils import ValueTypes
11
+
12
+ if TYPE_CHECKING:
13
+ from viam.robot.client import RobotClient
14
+
15
+
16
+ class ServiceClientBase(abc.ABC, ResourceBase):
17
+ """
18
+ Base service client.
19
+ All service clients must inherit from this class.
20
+ """
21
+
22
+ API: ClassVar[API]
23
+ channel: Channel
24
+
25
+ def __init__(self, name: str, channel: Channel):
26
+ self.name = name
27
+ self.channel = channel
28
+
29
+ @classmethod
30
+ def from_robot(cls, robot: "RobotClient", name: str = "builtin") -> Self:
31
+ """Get the service client named ``name`` from the provided robot.
32
+
33
+ Args:
34
+ robot (RobotClient): The robot
35
+ name (str): The name of the service client
36
+
37
+ Returns:
38
+ Self: The service client, if it exists on the robot
39
+ """
40
+ resource_name = ResourceName(namespace="rdk", type="service", subtype=cls.API.resource_subtype, name=name)
41
+ if resource_name not in robot.resource_names:
42
+ raise ResourceNotFoundError(resource_name.subtype, resource_name.name)
43
+ return cls(name, robot._channel)
44
+
45
+ async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Optional[float] = None, **kwargs) -> Mapping[str, ValueTypes]:
46
+ raise NotImplementedError()
@@ -0,0 +1,17 @@
1
+ from viam.proto.common import Pose
2
+ from viam.proto.service.slam import MappingMode, SensorInfo
3
+ from viam.resource.registry import Registry, ResourceRegistration
4
+
5
+ from .client import SLAMClient
6
+ from .service import SLAMRPCService
7
+ from .slam import SLAM
8
+
9
+ __all__ = [
10
+ "Pose",
11
+ "MappingMode",
12
+ "SensorInfo",
13
+ "SLAMClient",
14
+ "SLAM",
15
+ ]
16
+
17
+ Registry.register_api(ResourceRegistration(SLAM, SLAMRPCService, lambda name, channel: SLAMClient(name, channel)))
@@ -0,0 +1,62 @@
1
+ from typing import List, Mapping, Optional
2
+
3
+ from grpclib.client import Channel
4
+
5
+ from viam.proto.common import DoCommandRequest, DoCommandResponse
6
+ from viam.proto.service.slam import (
7
+ GetInternalStateRequest,
8
+ GetInternalStateResponse,
9
+ GetPointCloudMapRequest,
10
+ GetPointCloudMapResponse,
11
+ GetPositionRequest,
12
+ GetPositionResponse,
13
+ GetPropertiesRequest,
14
+ SLAMServiceStub,
15
+ )
16
+ from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
17
+ from viam.utils import ValueTypes, dict_to_struct, struct_to_dict
18
+
19
+ from . import Pose
20
+ from .slam import SLAM
21
+
22
+
23
+ class SLAMClient(SLAM, ReconfigurableResourceRPCClientBase):
24
+ """
25
+ Connect to the SLAMService, which allows the robot to create a map of its surroundings and find its location in that map.
26
+ """
27
+
28
+ client: SLAMServiceStub
29
+
30
+ def __init__(self, name: str, channel: Channel):
31
+ self.channel = channel
32
+ self.client = SLAMServiceStub(channel)
33
+ super().__init__(name)
34
+
35
+ async def get_position(self, *, timeout: Optional[float] = None, **kwargs) -> Pose:
36
+ md = kwargs.get("metadata", self.Metadata()).proto
37
+ request = GetPositionRequest(name=self.name)
38
+ response: GetPositionResponse = await self.client.GetPosition(request, timeout=timeout, metadata=md)
39
+ return response.pose
40
+
41
+ async def get_point_cloud_map(self, return_edited_map: bool = False, *, timeout: Optional[float] = None, **kwargs) -> List[bytes]:
42
+ md = kwargs.get("metadata", self.Metadata()).proto
43
+ request = GetPointCloudMapRequest(name=self.name, return_edited_map=return_edited_map)
44
+ response: List[GetPointCloudMapResponse] = await self.client.GetPointCloudMap(request, timeout=timeout, metadata=md)
45
+ return [r.point_cloud_pcd_chunk for r in response]
46
+
47
+ async def get_internal_state(self, *, timeout: Optional[float] = None, **kwargs) -> List[bytes]:
48
+ md = kwargs.get("metadata", self.Metadata()).proto
49
+ request = GetInternalStateRequest(name=self.name)
50
+ response: List[GetInternalStateResponse] = await self.client.GetInternalState(request, timeout=timeout, metadata=md)
51
+ return [r.internal_state_chunk for r in response]
52
+
53
+ async def get_properties(self, *, timeout: Optional[float] = None, **kwargs) -> SLAM.Properties:
54
+ md = kwargs.get("metadata", self.Metadata()).proto
55
+ request = GetPropertiesRequest(name=self.name)
56
+ return await self.client.GetProperties(request, timeout=timeout, metadata=md)
57
+
58
+ async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Optional[float] = None, **kwargs) -> Mapping[str, ValueTypes]:
59
+ md = kwargs.get("metadata", self.Metadata()).proto
60
+ request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
61
+ response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
62
+ return struct_to_dict(response.result)
@@ -0,0 +1,75 @@
1
+ from grpclib.server import Stream
2
+
3
+ from viam.proto.common import DoCommandRequest, DoCommandResponse
4
+ from viam.proto.service.slam import (
5
+ GetInternalStateRequest,
6
+ GetInternalStateResponse,
7
+ GetPointCloudMapRequest,
8
+ GetPointCloudMapResponse,
9
+ GetPositionRequest,
10
+ GetPositionResponse,
11
+ GetPropertiesRequest,
12
+ GetPropertiesResponse,
13
+ SLAMServiceBase,
14
+ )
15
+ from viam.resource.rpc_service_base import ResourceRPCServiceBase
16
+ from viam.utils import dict_to_struct, struct_to_dict
17
+
18
+ from .slam import SLAM
19
+
20
+
21
+ class SLAMRPCService(SLAMServiceBase, ResourceRPCServiceBase):
22
+ """
23
+ gRPC Service for a SLAM service
24
+ """
25
+
26
+ RESOURCE_TYPE = SLAM
27
+
28
+ async def GetInternalState(self, stream: Stream[GetInternalStateRequest, GetInternalStateResponse]) -> None:
29
+ request = await stream.recv_message()
30
+ assert request is not None
31
+ name = request.name
32
+ slam = self.get_resource(name)
33
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
34
+ chunks = await slam.get_internal_state(timeout=timeout)
35
+ for chunk in chunks:
36
+ response = GetInternalStateResponse(internal_state_chunk=chunk)
37
+ await stream.send_message(response)
38
+
39
+ async def GetPointCloudMap(self, stream: Stream[GetPointCloudMapRequest, GetPointCloudMapResponse]) -> None:
40
+ request = await stream.recv_message()
41
+ assert request is not None
42
+ name = request.name
43
+ slam = self.get_resource(name)
44
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
45
+ chunks = await slam.get_point_cloud_map(return_edited_map=request.return_edited_map, timeout=timeout)
46
+ for chunk in chunks:
47
+ response = GetPointCloudMapResponse(point_cloud_pcd_chunk=chunk)
48
+ await stream.send_message(response)
49
+
50
+ async def GetPosition(self, stream: Stream[GetPositionRequest, GetPositionResponse]) -> None:
51
+ request = await stream.recv_message()
52
+ assert request is not None
53
+ name = request.name
54
+ slam = self.get_resource(name)
55
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
56
+ position = await slam.get_position(timeout=timeout)
57
+ response = GetPositionResponse(pose=position)
58
+ await stream.send_message(response)
59
+
60
+ async def GetProperties(self, stream: Stream[GetPropertiesRequest, GetPropertiesResponse]) -> None:
61
+ request = await stream.recv_message()
62
+ assert request is not None
63
+ slam = self.get_resource(request.name)
64
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
65
+ properties = await slam.get_properties(timeout=timeout)
66
+ await stream.send_message(properties)
67
+
68
+ async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None:
69
+ request = await stream.recv_message()
70
+ assert request is not None
71
+ slam = self.get_resource(request.name)
72
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
73
+ result = await slam.do_command(command=struct_to_dict(request.command), timeout=timeout, metadata=stream.metadata)
74
+ response = DoCommandResponse(result=dict_to_struct(result))
75
+ await stream.send_message(response)
@@ -0,0 +1,111 @@
1
+ import abc
2
+ import sys
3
+ from typing import Final, List, Optional
4
+
5
+ from viam.proto.service.slam import GetPropertiesResponse
6
+ from viam.resource.types import API, RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_SERVICE
7
+
8
+ from ..service_base import ServiceBase
9
+ from . import Pose
10
+
11
+ if sys.version_info >= (3, 10):
12
+ from typing import TypeAlias
13
+ else:
14
+ from typing_extensions import TypeAlias
15
+
16
+
17
+ class SLAM(ServiceBase):
18
+ """
19
+ SLAM represents a SLAM service.
20
+
21
+ This acts as an abstract base class for any drivers representing specific
22
+ arm implementations. This cannot be used on its own. If the ``__init__()`` function is
23
+ overridden, it must call the ``super().__init__()`` function.
24
+
25
+ For more information, see `SLAM service <https://docs.viam.com/dev/reference/apis/services/slam/>`_.
26
+ """
27
+
28
+ API: Final = API(RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_SERVICE, "slam") # pyright: ignore [reportIncompatibleVariableOverride]
29
+
30
+ Properties: "TypeAlias" = GetPropertiesResponse
31
+
32
+ @abc.abstractmethod
33
+ async def get_internal_state(self, *, timeout: Optional[float]) -> List[bytes]:
34
+ """
35
+ Get the internal state of the SLAM algorithm required to continue mapping/localization.
36
+
37
+ ::
38
+
39
+ slam = SLAMClient.from_robot(robot=machine, name="my_slam_service")
40
+
41
+ # Get the internal state of the SLAM algorithm required to continue mapping/localization.
42
+ internal_state = await slam.get_internal_state()
43
+
44
+ Returns:
45
+ List[GetInternalStateResponse]: Chunks of the internal state of the SLAM algorithm
46
+
47
+ For more information, see `SLAM service <https://docs.viam.com/dev/reference/apis/services/slam/#getinternalstate>`_.
48
+ """
49
+ ...
50
+
51
+ @abc.abstractmethod
52
+ async def get_point_cloud_map(self, return_edited_map: bool = False, *, timeout: Optional[float]) -> List[bytes]:
53
+ """
54
+ Get the point cloud map.
55
+
56
+ ::
57
+
58
+ slam_svc = SLAMClient.from_robot(robot=machine, name="my_slam_service")
59
+
60
+ # Get the point cloud map in standard PCD format.
61
+ pcd_map = await slam_svc.get_point_cloud_map()
62
+
63
+ Args:
64
+ return_edited_map (bool): signal to the SLAM service to return an edited map, if the map package contains one and if
65
+ the SLAM service supports the feature
66
+
67
+ Returns:
68
+ List[GetPointCloudMapResponse]: Complete pointcloud in standard PCD format. Chunks of the PointCloud, concatenating all
69
+ GetPointCloudMapResponse.point_cloud_pcd_chunk values.
70
+
71
+ For more information, see `SLAM service <https://docs.viam.com/dev/reference/apis/services/slam/#getpointcloudmap>`_.
72
+ """
73
+ ...
74
+
75
+ @abc.abstractmethod
76
+ async def get_position(self, *, timeout: Optional[float]) -> Pose:
77
+ """
78
+ Get current position of the specified component in the SLAM Map.
79
+
80
+ ::
81
+
82
+ slam_svc = SLAMClient.from_robot(robot=machine, name="my_slam_service")
83
+
84
+ # Get the current position of the specified source component in the SLAM map as a Pose.
85
+ pose = await slam.get_position()
86
+
87
+ Returns:
88
+ Pose: The current position of the specified component
89
+
90
+ For more information, see `SLAM service <https://docs.viam.com/dev/reference/apis/services/slam/#getposition>`_.
91
+ """
92
+ ...
93
+
94
+ @abc.abstractmethod
95
+ async def get_properties(self, *, timeout: Optional[float]) -> Properties:
96
+ """
97
+ Get information regarding the current SLAM session.
98
+
99
+ ::
100
+
101
+ slam_svc = SLAMClient.from_robot(robot=machine, name="my_slam_service")
102
+
103
+ # Get the properties of your current SLAM session.
104
+ slam_properties = await slam_svc.get_properties()
105
+
106
+ Returns:
107
+ Properties: The properties of SLAM
108
+
109
+ For more information, see `SLAM service <https://docs.viam.com/dev/reference/apis/services/slam/#getproperties>`_.
110
+ """
111
+ ...
@@ -0,0 +1,15 @@
1
+ from viam.resource.registry import Registry, ResourceRegistration
2
+ from viam.services.vision.service import VisionRPCService
3
+
4
+ from .client import Classification, Detection, VisionClient
5
+ from .vision import CaptureAllResult, Vision
6
+
7
+ __all__ = [
8
+ "CaptureAllResult",
9
+ "Classification",
10
+ "Detection",
11
+ "VisionClient",
12
+ "Vision",
13
+ ]
14
+
15
+ Registry.register_api(ResourceRegistration(Vision, VisionRPCService, lambda name, channel: VisionClient(name, channel)))
@@ -0,0 +1,206 @@
1
+ from typing import Any, List, Mapping, Optional
2
+
3
+ from grpclib.client import Channel
4
+
5
+ from viam.errors import ViamError
6
+ from viam.media.video import CameraMimeType, ViamImage
7
+ from viam.proto.common import DoCommandRequest, DoCommandResponse, PointCloudObject
8
+ from viam.proto.service.vision import (
9
+ CaptureAllFromCameraRequest,
10
+ CaptureAllFromCameraResponse,
11
+ Classification,
12
+ Detection,
13
+ GetClassificationsFromCameraRequest,
14
+ GetClassificationsFromCameraResponse,
15
+ GetClassificationsRequest,
16
+ GetClassificationsResponse,
17
+ GetDetectionsFromCameraRequest,
18
+ GetDetectionsFromCameraResponse,
19
+ GetDetectionsRequest,
20
+ GetDetectionsResponse,
21
+ GetObjectPointCloudsRequest,
22
+ GetObjectPointCloudsResponse,
23
+ GetPropertiesRequest,
24
+ GetPropertiesResponse,
25
+ VisionServiceStub,
26
+ )
27
+ from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
28
+ from viam.utils import ValueTypes, dict_to_struct, struct_to_dict
29
+
30
+ from .vision import CaptureAllResult, Vision
31
+
32
+
33
+ class VisionClient(Vision, ReconfigurableResourceRPCClientBase):
34
+ """
35
+ Connect to the Vision service, which allows you to access various computer vision algorithms
36
+ (like detection, segmentation, tracking, etc) that usually only require a camera or image input.
37
+ """
38
+
39
+ client: VisionServiceStub
40
+
41
+ def __init__(self, name: str, channel: Channel):
42
+ super().__init__(name)
43
+ self.channel = channel
44
+ self.client = VisionServiceStub(channel)
45
+
46
+ async def capture_all_from_camera(
47
+ self,
48
+ camera_name: str,
49
+ return_image: bool = False,
50
+ return_classifications: bool = False,
51
+ return_detections: bool = False,
52
+ return_object_point_clouds: bool = False,
53
+ *,
54
+ extra: Optional[Mapping[str, Any]] = None,
55
+ timeout: Optional[float] = None,
56
+ **kwargs,
57
+ ) -> CaptureAllResult:
58
+ md = kwargs.get("metadata", self.Metadata()).proto
59
+ request = CaptureAllFromCameraRequest(
60
+ name=self.name,
61
+ camera_name=camera_name,
62
+ return_image=return_image,
63
+ return_classifications=return_classifications,
64
+ return_detections=return_detections,
65
+ return_object_point_clouds=return_object_point_clouds,
66
+ extra=dict_to_struct(extra),
67
+ )
68
+ response: CaptureAllFromCameraResponse = await self.client.CaptureAllFromCamera(request, timeout=timeout, metadata=md)
69
+ result = CaptureAllResult()
70
+ result.extra = struct_to_dict(response.extra)
71
+ if return_image:
72
+ mime_type = CameraMimeType.from_proto(response.image.format)
73
+ img = ViamImage(response.image.image, mime_type)
74
+ result.image = img
75
+ if return_classifications:
76
+ result.classifications = list(response.classifications)
77
+ if return_detections:
78
+ result.detections = list(response.detections)
79
+ if return_object_point_clouds:
80
+ result.objects = list(response.objects)
81
+ return result
82
+
83
+ async def get_detections_from_camera(
84
+ self,
85
+ camera_name: str,
86
+ *,
87
+ extra: Optional[Mapping[str, Any]] = None,
88
+ timeout: Optional[float] = None,
89
+ **kwargs,
90
+ ) -> List[Detection]:
91
+ md = kwargs.get("metadata", self.Metadata()).proto
92
+ request = GetDetectionsFromCameraRequest(name=self.name, camera_name=camera_name, extra=dict_to_struct(extra))
93
+ response: GetDetectionsFromCameraResponse = await self.client.GetDetectionsFromCamera(request, timeout=timeout, metadata=md)
94
+ return list(response.detections)
95
+
96
+ async def get_detections(
97
+ self,
98
+ image: ViamImage,
99
+ *,
100
+ extra: Optional[Mapping[str, Any]] = None,
101
+ timeout: Optional[float] = None,
102
+ **kwargs,
103
+ ) -> List[Detection]:
104
+ md = kwargs.get("metadata", self.Metadata()).proto
105
+ mime_type = CameraMimeType.JPEG
106
+
107
+ if image.width is None or image.height is None:
108
+ raise ViamError(f"image {image} needs to have a specified width and height")
109
+ else:
110
+ request = GetDetectionsRequest(
111
+ name=self.name,
112
+ image=image.data,
113
+ width=image.width,
114
+ height=image.height,
115
+ mime_type=mime_type,
116
+ extra=dict_to_struct(extra),
117
+ )
118
+ response: GetDetectionsResponse = await self.client.GetDetections(request, timeout=timeout, metadata=md)
119
+ return list(response.detections)
120
+
121
+ async def get_classifications_from_camera(
122
+ self,
123
+ camera_name: str,
124
+ count: int,
125
+ *,
126
+ extra: Optional[Mapping[str, Any]] = None,
127
+ timeout: Optional[float] = None,
128
+ **kwargs,
129
+ ) -> List[Classification]:
130
+ md = kwargs.get("metadata", self.Metadata()).proto
131
+ request = GetClassificationsFromCameraRequest(name=self.name, camera_name=camera_name, n=count, extra=dict_to_struct(extra))
132
+ response: GetClassificationsFromCameraResponse = await self.client.GetClassificationsFromCamera(
133
+ request, timeout=timeout, metadata=md
134
+ )
135
+ return list(response.classifications)
136
+
137
+ async def get_classifications(
138
+ self,
139
+ image: ViamImage,
140
+ count: int,
141
+ *,
142
+ extra: Optional[Mapping[str, Any]] = None,
143
+ timeout: Optional[float] = None,
144
+ **kwargs,
145
+ ) -> List[Classification]:
146
+ md = kwargs.get("metadata", self.Metadata()).proto
147
+
148
+ mime_type = CameraMimeType.JPEG
149
+ if image.width is None or image.height is None:
150
+ raise ViamError(f"image {image} needs to have a specified width and height")
151
+ request = GetClassificationsRequest(
152
+ name=self.name,
153
+ image=image.data,
154
+ width=image.width,
155
+ height=image.height,
156
+ mime_type=mime_type,
157
+ n=count,
158
+ extra=dict_to_struct(extra),
159
+ )
160
+ response: GetClassificationsResponse = await self.client.GetClassifications(request, timeout=timeout, metadata=md)
161
+ return list(response.classifications)
162
+
163
+ async def get_object_point_clouds(
164
+ self,
165
+ camera_name: str,
166
+ *,
167
+ extra: Optional[Mapping[str, Any]] = None,
168
+ timeout: Optional[float] = None,
169
+ **kwargs,
170
+ ) -> List[PointCloudObject]:
171
+ md = kwargs.get("metadata", self.Metadata()).proto
172
+ request = GetObjectPointCloudsRequest(
173
+ name=self.name,
174
+ camera_name=camera_name,
175
+ mime_type=CameraMimeType.PCD,
176
+ extra=dict_to_struct(extra),
177
+ )
178
+ response: GetObjectPointCloudsResponse = await self.client.GetObjectPointClouds(request, timeout=timeout, metadata=md)
179
+ return list(response.objects)
180
+
181
+ async def get_properties(
182
+ self,
183
+ *,
184
+ extra: Optional[Mapping[str, Any]] = None,
185
+ timeout: Optional[float] = None,
186
+ **kwargs,
187
+ ) -> Vision.Properties:
188
+ md = kwargs.get("metadata", self.Metadata()).proto
189
+ request = GetPropertiesRequest(
190
+ name=self.name,
191
+ extra=dict_to_struct(extra),
192
+ )
193
+ response: GetPropertiesResponse = await self.client.GetProperties(request, timeout=timeout, metadata=md)
194
+ return response
195
+
196
+ async def do_command(
197
+ self,
198
+ command: Mapping[str, ValueTypes],
199
+ *,
200
+ timeout: Optional[float] = None,
201
+ **kwargs,
202
+ ) -> Mapping[str, ValueTypes]:
203
+ md = kwargs.get("metadata", self.Metadata()).proto
204
+ request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
205
+ response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
206
+ return struct_to_dict(response.result)