viam-sdk 0.3.0__py3-none-linux_armv6l.whl → 0.66.0__py3-none-linux_armv6l.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 (452) hide show
  1. viam/__init__.py +29 -2
  2. viam/app/_logs.py +34 -0
  3. viam/app/app_client.py +2696 -0
  4. viam/app/billing_client.py +185 -0
  5. viam/app/data_client.py +2231 -0
  6. viam/app/ml_training_client.py +249 -0
  7. viam/app/provisioning_client.py +93 -0
  8. viam/app/viam_client.py +275 -0
  9. viam/components/arm/__init__.py +3 -26
  10. viam/components/arm/arm.py +123 -8
  11. viam/components/arm/client.py +37 -24
  12. viam/components/arm/service.py +35 -32
  13. viam/components/audio_in/__init__.py +24 -0
  14. viam/components/audio_in/audio_in.py +74 -0
  15. viam/components/audio_in/client.py +76 -0
  16. viam/components/audio_in/service.py +83 -0
  17. viam/components/audio_out/__init__.py +21 -0
  18. viam/components/audio_out/audio_out.py +72 -0
  19. viam/components/audio_out/client.py +67 -0
  20. viam/components/audio_out/service.py +63 -0
  21. viam/components/base/__init__.py +6 -11
  22. viam/components/base/base.py +134 -8
  23. viam/components/base/client.py +51 -23
  24. viam/components/base/service.py +33 -30
  25. viam/components/board/__init__.py +3 -12
  26. viam/components/board/board.py +247 -91
  27. viam/components/board/client.py +149 -83
  28. viam/components/board/service.py +63 -33
  29. viam/components/button/__init__.py +10 -0
  30. viam/components/button/button.py +41 -0
  31. viam/components/button/client.py +52 -0
  32. viam/components/button/service.py +46 -0
  33. viam/components/camera/__init__.py +3 -3
  34. viam/components/camera/camera.py +62 -27
  35. viam/components/camera/client.py +59 -27
  36. viam/components/camera/service.py +42 -65
  37. viam/components/component_base.py +28 -5
  38. viam/components/encoder/__init__.py +1 -1
  39. viam/components/encoder/client.py +25 -14
  40. viam/components/encoder/encoder.py +48 -10
  41. viam/components/encoder/service.py +14 -18
  42. viam/components/gantry/__init__.py +1 -13
  43. viam/components/gantry/client.py +80 -25
  44. viam/components/gantry/gantry.py +123 -9
  45. viam/components/gantry/service.py +51 -29
  46. viam/components/generic/__init__.py +1 -1
  47. viam/components/generic/client.py +21 -8
  48. viam/components/generic/generic.py +10 -2
  49. viam/components/generic/service.py +12 -7
  50. viam/components/gripper/__init__.py +3 -13
  51. viam/components/gripper/client.py +69 -21
  52. viam/components/gripper/gripper.py +123 -3
  53. viam/components/gripper/service.py +44 -22
  54. viam/components/input/__init__.py +1 -14
  55. viam/components/input/client.py +55 -23
  56. viam/components/input/input.py +106 -3
  57. viam/components/input/service.py +16 -21
  58. viam/components/motor/__init__.py +1 -21
  59. viam/components/motor/client.py +56 -33
  60. viam/components/motor/motor.py +127 -4
  61. viam/components/motor/service.py +33 -44
  62. viam/components/movement_sensor/__init__.py +1 -1
  63. viam/components/movement_sensor/client.py +102 -45
  64. viam/components/movement_sensor/movement_sensor.py +130 -61
  65. viam/components/movement_sensor/service.py +38 -41
  66. viam/components/pose_tracker/__init__.py +1 -1
  67. viam/components/pose_tracker/client.py +18 -7
  68. viam/components/pose_tracker/pose_tracker.py +4 -2
  69. viam/components/pose_tracker/service.py +12 -10
  70. viam/components/power_sensor/__init__.py +17 -0
  71. viam/components/power_sensor/client.py +86 -0
  72. viam/components/power_sensor/power_sensor.py +104 -0
  73. viam/components/power_sensor/service.py +72 -0
  74. viam/components/sensor/__init__.py +2 -1
  75. viam/components/sensor/client.py +26 -10
  76. viam/components/sensor/sensor.py +22 -4
  77. viam/components/sensor/service.py +20 -11
  78. viam/components/servo/__init__.py +1 -13
  79. viam/components/servo/client.py +47 -21
  80. viam/components/servo/service.py +15 -22
  81. viam/components/servo/servo.py +61 -2
  82. viam/components/switch/__init__.py +10 -0
  83. viam/components/switch/client.py +83 -0
  84. viam/components/switch/service.py +72 -0
  85. viam/components/switch/switch.py +98 -0
  86. viam/errors.py +10 -0
  87. viam/gen/app/agent/v1/agent_grpc.py +29 -0
  88. viam/gen/app/agent/v1/agent_pb2.py +47 -0
  89. viam/gen/app/agent/v1/agent_pb2.pyi +280 -0
  90. viam/gen/app/cloudslam/v1/__init__.py +0 -0
  91. viam/gen/app/cloudslam/v1/cloud_slam_grpc.py +70 -0
  92. viam/gen/app/cloudslam/v1/cloud_slam_pb2.py +54 -0
  93. viam/gen/app/cloudslam/v1/cloud_slam_pb2.pyi +384 -0
  94. viam/gen/app/data/v1/data_grpc.py +197 -8
  95. viam/gen/app/data/v1/data_pb2.py +238 -99
  96. viam/gen/app/data/v1/data_pb2.pyi +1222 -259
  97. viam/gen/app/datapipelines/__init__.py +0 -0
  98. viam/gen/app/datapipelines/v1/__init__.py +0 -0
  99. viam/gen/app/datapipelines/v1/data_pipelines_grpc.py +84 -0
  100. viam/gen/app/datapipelines/v1/data_pipelines_pb2.py +57 -0
  101. viam/gen/app/datapipelines/v1/data_pipelines_pb2.pyi +387 -0
  102. viam/gen/app/dataset/__init__.py +0 -0
  103. viam/gen/app/dataset/v1/__init__.py +0 -0
  104. viam/gen/app/dataset/v1/dataset_grpc.py +68 -0
  105. viam/gen/app/dataset/v1/dataset_pb2.py +44 -0
  106. viam/gen/app/dataset/v1/dataset_pb2.pyi +214 -0
  107. viam/gen/app/datasync/v1/data_sync_grpc.py +21 -4
  108. viam/gen/app/datasync/v1/data_sync_pb2.py +62 -128
  109. viam/gen/app/datasync/v1/data_sync_pb2.pyi +156 -199
  110. viam/gen/app/mlinference/__init__.py +0 -0
  111. viam/gen/app/mlinference/v1/__init__.py +0 -0
  112. viam/gen/app/mlinference/v1/ml_inference_grpc.py +28 -0
  113. viam/gen/app/mlinference/v1/ml_inference_pb2.py +23 -0
  114. viam/gen/app/mlinference/v1/ml_inference_pb2.pyi +63 -0
  115. viam/gen/app/mltraining/v1/ml_training_grpc.py +51 -3
  116. viam/gen/app/mltraining/v1/ml_training_pb2.py +135 -58
  117. viam/gen/app/mltraining/v1/ml_training_pb2.pyi +328 -39
  118. viam/gen/app/packages/v1/packages_grpc.py +15 -1
  119. viam/gen/app/packages/v1/packages_pb2.py +44 -64
  120. viam/gen/app/packages/v1/packages_pb2.pyi +75 -85
  121. viam/gen/app/v1/app_grpc.py +644 -3
  122. viam/gen/app/v1/app_pb2.py +695 -295
  123. viam/gen/app/v1/app_pb2.pyi +4488 -635
  124. viam/gen/app/v1/billing_grpc.py +53 -11
  125. viam/gen/app/v1/billing_pb2.py +94 -39
  126. viam/gen/app/v1/billing_pb2.pyi +391 -191
  127. viam/gen/app/v1/end_user_grpc.py +59 -0
  128. viam/gen/app/v1/end_user_pb2.py +55 -0
  129. viam/gen/app/v1/end_user_pb2.pyi +181 -0
  130. viam/gen/app/v1/robot_grpc.py +16 -1
  131. viam/gen/app/v1/robot_pb2.py +122 -94
  132. viam/gen/app/v1/robot_pb2.pyi +463 -123
  133. viam/gen/common/v1/common_pb2.py +87 -58
  134. viam/gen/common/v1/common_pb2.pyi +456 -149
  135. viam/gen/component/arm/v1/arm_grpc.py +58 -2
  136. viam/gen/component/arm/v1/arm_pb2.py +68 -51
  137. viam/gen/component/arm/v1/arm_pb2.pyi +108 -42
  138. viam/gen/component/audioin/__init__.py +0 -0
  139. viam/gen/component/audioin/v1/__init__.py +0 -0
  140. viam/gen/component/audioin/v1/audioin_grpc.py +54 -0
  141. viam/gen/component/audioin/v1/audioin_pb2.py +34 -0
  142. viam/gen/component/audioin/v1/audioin_pb2.pyi +94 -0
  143. viam/gen/component/audioinput/v1/audioinput_grpc.py +25 -2
  144. viam/gen/component/audioinput/v1/audioinput_pb2.py +36 -31
  145. viam/gen/component/audioinput/v1/audioinput_pb2.pyi +22 -22
  146. viam/gen/component/audioout/__init__.py +0 -0
  147. viam/gen/component/audioout/v1/__init__.py +0 -0
  148. viam/gen/component/audioout/v1/audioout_grpc.py +54 -0
  149. viam/gen/component/audioout/v1/audioout_pb2.py +32 -0
  150. viam/gen/component/audioout/v1/audioout_pb2.pyi +47 -0
  151. viam/gen/component/base/v1/base_grpc.py +42 -2
  152. viam/gen/component/base/v1/base_pb2.py +58 -47
  153. viam/gen/component/base/v1/base_pb2.pyi +65 -30
  154. viam/gen/component/board/v1/board_grpc.py +59 -7
  155. viam/gen/component/board/v1/board_pb2.py +94 -73
  156. viam/gen/component/board/v1/board_pb2.pyi +165 -68
  157. viam/gen/component/button/__init__.py +0 -0
  158. viam/gen/component/button/v1/__init__.py +0 -0
  159. viam/gen/component/button/v1/button_grpc.py +38 -0
  160. viam/gen/component/button/v1/button_pb2.py +28 -0
  161. viam/gen/component/button/v1/button_pb2.pyi +39 -0
  162. viam/gen/component/camera/v1/camera_grpc.py +38 -2
  163. viam/gen/component/camera/v1/camera_pb2.py +60 -43
  164. viam/gen/component/camera/v1/camera_pb2.pyi +191 -37
  165. viam/gen/component/encoder/v1/encoder_grpc.py +25 -2
  166. viam/gen/component/encoder/v1/encoder_pb2.py +36 -31
  167. viam/gen/component/encoder/v1/encoder_pb2.pyi +15 -15
  168. viam/gen/component/gantry/v1/gantry_grpc.py +47 -2
  169. viam/gen/component/gantry/v1/gantry_pb2.py +56 -43
  170. viam/gen/component/gantry/v1/gantry_pb2.pyi +67 -31
  171. viam/gen/component/generic/v1/generic_grpc.py +16 -2
  172. viam/gen/component/generic/v1/generic_pb2.py +16 -11
  173. viam/gen/component/gripper/v1/gripper_grpc.py +44 -2
  174. viam/gen/component/gripper/v1/gripper_pb2.py +48 -35
  175. viam/gen/component/gripper/v1/gripper_pb2.pyi +62 -24
  176. viam/gen/component/inputcontroller/v1/input_controller_grpc.py +28 -2
  177. viam/gen/component/inputcontroller/v1/input_controller_pb2.py +46 -41
  178. viam/gen/component/inputcontroller/v1/input_controller_pb2.pyi +32 -36
  179. viam/gen/component/motor/v1/motor_grpc.py +51 -2
  180. viam/gen/component/motor/v1/motor_pb2.py +78 -67
  181. viam/gen/component/motor/v1/motor_pb2.pyi +75 -46
  182. viam/gen/component/movementsensor/v1/movementsensor_grpc.py +48 -2
  183. viam/gen/component/movementsensor/v1/movementsensor_pb2.py +70 -63
  184. viam/gen/component/movementsensor/v1/movementsensor_pb2.pyi +84 -57
  185. viam/gen/component/posetracker/v1/pose_tracker_grpc.py +19 -2
  186. viam/gen/component/posetracker/v1/pose_tracker_pb2.py +26 -21
  187. viam/gen/component/posetracker/v1/pose_tracker_pb2.pyi +9 -13
  188. viam/gen/component/powersensor/__init__.py +0 -0
  189. viam/gen/component/powersensor/v1/__init__.py +0 -0
  190. viam/gen/component/powersensor/v1/powersensor_grpc.py +62 -0
  191. viam/gen/component/powersensor/v1/powersensor_pb2.py +42 -0
  192. viam/gen/component/powersensor/v1/powersensor_pb2.pyi +124 -0
  193. viam/gen/component/sensor/v1/sensor_grpc.py +21 -5
  194. viam/gen/component/sensor/v1/sensor_pb2.py +18 -22
  195. viam/gen/component/sensor/v1/sensor_pb2.pyi +1 -69
  196. viam/gen/component/servo/v1/servo_grpc.py +28 -2
  197. viam/gen/component/servo/v1/servo_pb2.py +42 -37
  198. viam/gen/component/servo/v1/servo_pb2.pyi +22 -26
  199. viam/gen/component/switch/__init__.py +0 -0
  200. viam/gen/component/switch/v1/__init__.py +0 -0
  201. viam/gen/component/switch/v1/switch_grpc.py +54 -0
  202. viam/gen/component/switch/v1/switch_pb2.py +40 -0
  203. viam/gen/component/switch/v1/switch_pb2.pyi +116 -0
  204. viam/gen/component/testecho/v1/testecho_grpc.py +15 -0
  205. viam/gen/component/testecho/v1/testecho_pb2.py +29 -26
  206. viam/gen/component/testecho/v1/testecho_pb2.pyi +16 -20
  207. viam/gen/module/v1/module_grpc.py +18 -0
  208. viam/gen/module/v1/module_pb2.py +36 -33
  209. viam/gen/module/v1/module_pb2.pyi +39 -34
  210. viam/gen/opentelemetry/__init__.py +0 -0
  211. viam/gen/opentelemetry/proto/__init__.py +0 -0
  212. viam/gen/opentelemetry/proto/common/__init__.py +0 -0
  213. viam/gen/opentelemetry/proto/common/v1/__init__.py +0 -0
  214. viam/gen/opentelemetry/proto/common/v1/common_grpc.py +0 -0
  215. viam/gen/opentelemetry/proto/common/v1/common_pb2.py +27 -0
  216. viam/gen/opentelemetry/proto/common/v1/common_pb2.pyi +208 -0
  217. viam/gen/opentelemetry/proto/resource/__init__.py +0 -0
  218. viam/gen/opentelemetry/proto/resource/v1/__init__.py +0 -0
  219. viam/gen/opentelemetry/proto/resource/v1/resource_grpc.py +0 -0
  220. viam/gen/opentelemetry/proto/resource/v1/resource_pb2.py +18 -0
  221. viam/gen/opentelemetry/proto/resource/v1/resource_pb2.pyi +59 -0
  222. viam/gen/opentelemetry/proto/trace/__init__.py +0 -0
  223. viam/gen/opentelemetry/proto/trace/v1/__init__.py +0 -0
  224. viam/gen/opentelemetry/proto/trace/v1/trace_grpc.py +0 -0
  225. viam/gen/opentelemetry/proto/trace/v1/trace_pb2.py +37 -0
  226. viam/gen/opentelemetry/proto/trace/v1/trace_pb2.pyi +402 -0
  227. viam/gen/proto/rpc/examples/echo/v1/echo_grpc.py +12 -0
  228. viam/gen/proto/rpc/examples/echo/v1/echo_pb2.py +25 -22
  229. viam/gen/proto/rpc/examples/echo/v1/echo_pb2.pyi +13 -17
  230. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_grpc.py +12 -0
  231. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.py +23 -20
  232. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.pyi +13 -17
  233. viam/gen/proto/rpc/v1/auth_grpc.py +11 -0
  234. viam/gen/proto/rpc/v1/auth_pb2.py +27 -24
  235. viam/gen/proto/rpc/v1/auth_pb2.pyi +12 -16
  236. viam/gen/proto/rpc/webrtc/v1/grpc_pb2.py +35 -32
  237. viam/gen/proto/rpc/webrtc/v1/grpc_pb2.pyi +37 -41
  238. viam/gen/proto/rpc/webrtc/v1/signaling_grpc.py +15 -0
  239. viam/gen/proto/rpc/webrtc/v1/signaling_pb2.py +62 -57
  240. viam/gen/proto/rpc/webrtc/v1/signaling_pb2.pyi +78 -69
  241. viam/gen/provisioning/__init__.py +0 -0
  242. viam/gen/provisioning/v1/__init__.py +0 -0
  243. viam/gen/provisioning/v1/provisioning_grpc.py +59 -0
  244. viam/gen/provisioning/v1/provisioning_pb2.py +45 -0
  245. viam/gen/provisioning/v1/provisioning_pb2.pyi +229 -0
  246. viam/gen/robot/v1/robot_grpc.py +144 -15
  247. viam/gen/robot/v1/robot_pb2.py +193 -119
  248. viam/gen/robot/v1/robot_pb2.pyi +565 -137
  249. viam/gen/service/datamanager/v1/data_manager_grpc.py +20 -2
  250. viam/gen/service/datamanager/v1/data_manager_pb2.py +27 -17
  251. viam/gen/service/datamanager/v1/data_manager_pb2.pyi +52 -10
  252. viam/gen/service/discovery/__init__.py +0 -0
  253. viam/gen/service/discovery/v1/__init__.py +0 -0
  254. viam/gen/service/discovery/v1/discovery_grpc.py +39 -0
  255. viam/gen/service/discovery/v1/discovery_pb2.py +29 -0
  256. viam/gen/service/discovery/v1/discovery_pb2.pyi +51 -0
  257. viam/gen/service/generic/__init__.py +0 -0
  258. viam/gen/service/generic/v1/__init__.py +0 -0
  259. viam/gen/service/generic/v1/generic_grpc.py +29 -0
  260. viam/gen/service/generic/v1/generic_pb2.py +21 -0
  261. viam/gen/service/generic/v1/generic_pb2.pyi +6 -0
  262. viam/gen/service/mlmodel/v1/mlmodel_grpc.py +9 -0
  263. viam/gen/service/mlmodel/v1/mlmodel_pb2.py +76 -29
  264. viam/gen/service/mlmodel/v1/mlmodel_pb2.pyi +307 -28
  265. viam/gen/service/motion/v1/motion_grpc.py +42 -4
  266. viam/gen/service/motion/v1/motion_pb2.py +119 -51
  267. viam/gen/service/motion/v1/motion_pb2.pyi +595 -120
  268. viam/gen/service/navigation/v1/navigation_grpc.py +49 -1
  269. viam/gen/service/navigation/v1/navigation_pb2.py +76 -51
  270. viam/gen/service/navigation/v1/navigation_pb2.pyi +188 -33
  271. viam/gen/service/sensors/v1/sensors_grpc.py +12 -0
  272. viam/gen/service/sensors/v1/sensors_pb2.py +60 -29
  273. viam/gen/service/sensors/v1/sensors_pb2.pyi +18 -21
  274. viam/gen/service/shell/v1/shell_grpc.py +27 -1
  275. viam/gen/service/shell/v1/shell_pb2.py +37 -15
  276. viam/gen/service/shell/v1/shell_pb2.pyi +260 -7
  277. viam/gen/service/slam/v1/slam_grpc.py +24 -2
  278. viam/gen/service/slam/v1/slam_pb2.py +44 -30
  279. viam/gen/service/slam/v1/slam_pb2.pyi +128 -27
  280. viam/gen/service/video/__init__.py +0 -0
  281. viam/gen/service/video/v1/__init__.py +0 -0
  282. viam/gen/service/video/v1/video_grpc.py +39 -0
  283. viam/gen/service/video/v1/video_pb2.py +29 -0
  284. viam/gen/service/video/v1/video_pb2.pyi +72 -0
  285. viam/gen/service/vision/v1/vision_grpc.py +39 -1
  286. viam/gen/service/vision/v1/vision_pb2.py +61 -45
  287. viam/gen/service/vision/v1/vision_pb2.pyi +180 -41
  288. viam/gen/service/worldstatestore/__init__.py +0 -0
  289. viam/gen/service/worldstatestore/v1/__init__.py +0 -0
  290. viam/gen/service/worldstatestore/v1/world_state_store_grpc.py +55 -0
  291. viam/gen/service/worldstatestore/v1/world_state_store_pb2.py +39 -0
  292. viam/gen/service/worldstatestore/v1/world_state_store_pb2.pyi +171 -0
  293. viam/gen/stream/__init__.py +0 -0
  294. viam/gen/stream/v1/__init__.py +0 -0
  295. viam/gen/stream/v1/stream_grpc.py +59 -0
  296. viam/gen/stream/v1/stream_pb2.py +39 -0
  297. viam/gen/stream/v1/stream_pb2.pyi +161 -0
  298. viam/gen/tagger/v1/tagger_pb2.py +9 -8
  299. viam/logging.py +160 -17
  300. viam/media/__init__.py +0 -9
  301. viam/media/audio.py +22 -10
  302. viam/media/utils/__init__.py +0 -0
  303. viam/media/utils/pil/__init__.py +55 -0
  304. viam/media/{viam_rgba_plugin.py → utils/pil/viam_rgba_plugin.py} +10 -16
  305. viam/media/viam_rgba.py +10 -0
  306. viam/media/video.py +197 -73
  307. viam/module/module.py +191 -44
  308. viam/module/resource_data_consumer.py +41 -0
  309. viam/module/service.py +9 -1
  310. viam/module/types.py +4 -5
  311. viam/operations.py +4 -3
  312. viam/proto/app/__init__.py +361 -5
  313. viam/proto/app/agent/__init__.py +28 -0
  314. viam/proto/app/billing.py +51 -27
  315. viam/proto/app/cloudslam/__init__.py +48 -0
  316. viam/proto/app/data/__init__.py +103 -17
  317. viam/proto/app/datapipelines/__init__.py +56 -0
  318. viam/proto/app/dataset/__init__.py +40 -0
  319. viam/proto/app/datasync/__init__.py +11 -5
  320. viam/proto/app/end_user.py +34 -0
  321. viam/proto/app/mlinference/__init__.py +15 -0
  322. viam/proto/app/mltraining/__init__.py +25 -1
  323. viam/proto/app/packages/__init__.py +3 -3
  324. viam/proto/app/robot.py +19 -1
  325. viam/proto/common/__init__.py +35 -8
  326. viam/proto/component/arm/__init__.py +9 -1
  327. viam/proto/component/audioin/__init__.py +16 -0
  328. viam/proto/component/audioinput/__init__.py +3 -1
  329. viam/proto/component/audioout/__init__.py +15 -0
  330. viam/proto/component/base/__init__.py +7 -1
  331. viam/proto/component/board/__init__.py +13 -5
  332. viam/proto/component/button/__init__.py +15 -0
  333. viam/proto/component/camera/__init__.py +9 -1
  334. viam/proto/component/encoder/__init__.py +3 -1
  335. viam/proto/component/gantry/__init__.py +7 -1
  336. viam/proto/component/generic/__init__.py +3 -1
  337. viam/proto/component/gripper/__init__.py +7 -1
  338. viam/proto/component/inputcontroller/__init__.py +7 -1
  339. viam/proto/component/motor/__init__.py +7 -1
  340. viam/proto/component/movementsensor/__init__.py +7 -1
  341. viam/proto/component/posetracker/__init__.py +7 -1
  342. viam/proto/component/powersensor/__init__.py +30 -0
  343. viam/proto/component/sensor/__init__.py +3 -4
  344. viam/proto/component/servo/__init__.py +3 -1
  345. viam/proto/component/switch/__init__.py +26 -0
  346. viam/proto/component/testecho/__init__.py +3 -1
  347. viam/proto/module/__init__.py +3 -1
  348. viam/proto/opentelemetry/__init__.py +0 -0
  349. viam/proto/opentelemetry/proto/__init__.py +0 -0
  350. viam/proto/opentelemetry/proto/common/__init__.py +15 -0
  351. viam/proto/opentelemetry/proto/resource/__init__.py +10 -0
  352. viam/proto/opentelemetry/proto/trace/__init__.py +15 -0
  353. viam/proto/provisioning/__init__.py +42 -0
  354. viam/proto/robot/__init__.py +57 -9
  355. viam/proto/rpc/auth.py +11 -1
  356. viam/proto/rpc/examples/echo/__init__.py +3 -1
  357. viam/proto/rpc/examples/echoresource/__init__.py +7 -1
  358. viam/proto/rpc/webrtc/grpc.py +3 -1
  359. viam/proto/rpc/webrtc/signaling.py +5 -1
  360. viam/proto/service/datamanager/__init__.py +15 -2
  361. viam/proto/service/discovery/__init__.py +15 -0
  362. viam/proto/service/generic/__init__.py +12 -0
  363. viam/proto/service/mlmodel/__init__.py +27 -1
  364. viam/proto/service/motion/__init__.py +35 -5
  365. viam/proto/service/navigation/__init__.py +19 -1
  366. viam/proto/service/sensors/__init__.py +3 -1
  367. viam/proto/service/shell/__init__.py +25 -2
  368. viam/proto/service/slam/__init__.py +13 -1
  369. viam/proto/service/video/__init__.py +15 -0
  370. viam/proto/service/vision/__init__.py +11 -1
  371. viam/proto/service/worldstatestore/__init__.py +32 -0
  372. viam/proto/stream/__init__.py +36 -0
  373. viam/py.typed +0 -0
  374. viam/resource/base.py +45 -8
  375. viam/resource/easy_resource.py +149 -0
  376. viam/resource/manager.py +35 -14
  377. viam/resource/registry.py +40 -52
  378. viam/resource/rpc_client_base.py +33 -1
  379. viam/resource/rpc_service_base.py +15 -8
  380. viam/resource/types.py +39 -26
  381. viam/robot/client.py +458 -91
  382. viam/robot/service.py +13 -107
  383. viam/rpc/dial.py +133 -15
  384. viam/rpc/libviam_rust_utils.so +0 -0
  385. viam/rpc/server.py +59 -15
  386. viam/rpc/types.py +2 -4
  387. viam/services/discovery/__init__.py +12 -0
  388. viam/services/discovery/client.py +55 -0
  389. viam/services/discovery/discovery.py +52 -0
  390. viam/services/discovery/service.py +43 -0
  391. viam/services/generic/__init__.py +18 -0
  392. viam/services/generic/client.py +58 -0
  393. viam/services/generic/generic.py +58 -0
  394. viam/services/generic/service.py +29 -0
  395. viam/services/mlmodel/__init__.py +15 -1
  396. viam/services/mlmodel/client.py +20 -15
  397. viam/services/mlmodel/mlmodel.py +44 -7
  398. viam/services/mlmodel/service.py +9 -13
  399. viam/services/mlmodel/utils.py +101 -0
  400. viam/services/motion/__init__.py +15 -3
  401. viam/services/motion/client.py +109 -150
  402. viam/services/motion/motion.py +380 -0
  403. viam/services/motion/service.py +132 -0
  404. viam/services/navigation/__init__.py +11 -0
  405. viam/services/navigation/client.py +99 -0
  406. viam/services/navigation/navigation.py +250 -0
  407. viam/services/navigation/service.py +137 -0
  408. viam/services/service_base.py +43 -4
  409. viam/services/service_client_base.py +4 -4
  410. viam/services/slam/__init__.py +4 -1
  411. viam/services/slam/client.py +21 -11
  412. viam/services/slam/service.py +16 -19
  413. viam/services/slam/slam.py +66 -5
  414. viam/services/vision/__init__.py +8 -0
  415. viam/services/vision/client.py +115 -111
  416. viam/services/vision/service.py +143 -0
  417. viam/services/vision/vision.py +317 -0
  418. viam/services/worldstatestore/__init__.py +18 -0
  419. viam/services/worldstatestore/client.py +94 -0
  420. viam/services/worldstatestore/service.py +55 -0
  421. viam/services/worldstatestore/worldstatestore.py +90 -0
  422. viam/sessions_client.py +254 -0
  423. viam/streams.py +44 -0
  424. viam/utils.py +143 -15
  425. viam/version_metadata.py +4 -0
  426. viam_sdk-0.66.0.dist-info/METADATA +157 -0
  427. viam_sdk-0.66.0.dist-info/RECORD +531 -0
  428. {viam_sdk-0.3.0.dist-info → viam_sdk-0.66.0.dist-info}/WHEEL +1 -1
  429. viam/components/audio_input/__init__.py +0 -18
  430. viam/components/audio_input/audio_input.py +0 -79
  431. viam/components/audio_input/client.py +0 -60
  432. viam/components/audio_input/service.py +0 -118
  433. viam/components/types.py +0 -5
  434. viam/gen/app/model/v1/model_grpc.py +0 -39
  435. viam/gen/app/model/v1/model_pb2.py +0 -71
  436. viam/gen/app/model/v1/model_pb2.pyi +0 -285
  437. viam/gen/proto/rpc/examples/fileupload/v1/fileupload_grpc.py +0 -21
  438. viam/gen/proto/rpc/examples/fileupload/v1/fileupload_pb2.py +0 -18
  439. viam/gen/proto/rpc/examples/fileupload/v1/fileupload_pb2.pyi +0 -49
  440. viam/media/media.py +0 -53
  441. viam/proto/app/model/__init__.py +0 -40
  442. viam/proto/rpc/examples/fileupload/__init__.py +0 -13
  443. viam/services/sensors/__init__.py +0 -5
  444. viam/services/sensors/client.py +0 -63
  445. viam_sdk-0.3.0.dist-info/LICENSE +0 -202
  446. viam_sdk-0.3.0.dist-info/METADATA +0 -122
  447. viam_sdk-0.3.0.dist-info/RECORD +0 -372
  448. /viam/{gen/app/model → app}/__init__.py +0 -0
  449. /viam/gen/app/{model/v1 → agent}/__init__.py +0 -0
  450. /viam/gen/{proto/rpc/examples/fileupload → app/agent/v1}/__init__.py +0 -0
  451. /viam/gen/{proto/rpc/examples/fileupload/v1 → app/cloudslam}/__init__.py +0 -0
  452. /LICENSE → /viam_sdk-0.66.0.dist-info/licenses/LICENSE +0 -0
@@ -1,10 +1,10 @@
1
1
  import abc
2
- from typing import Any, Dict, Final, Optional
2
+ from typing import Any, Dict, Final, Optional, Tuple
3
3
 
4
- from viam.resource.types import RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, Subtype
4
+ from viam.resource.types import API, RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT
5
5
 
6
6
  from ..component_base import ComponentBase
7
- from . import JointPositions, Pose
7
+ from . import JointPositions, KinematicsFileFormat, Pose
8
8
 
9
9
 
10
10
  class Arm(ComponentBase):
@@ -14,9 +14,19 @@ class Arm(ComponentBase):
14
14
  This acts as an abstract base class for any drivers representing specific
15
15
  arm implementations. This cannot be used on its own. If the ``__init__()`` function is
16
16
  overridden, it must call the ``super().__init__()`` function.
17
+
18
+ ::
19
+
20
+ from viam.components.arm import Arm
21
+ # To use move_to_position:
22
+ from viam.proto.common import Pose
23
+ # To use move_to_joint_positions:
24
+ from viam.proto.component.arm import JointPositions
25
+
26
+ For more information, see `Arm component <https://docs.viam.com/dev/reference/apis/components/arm/>`_.
17
27
  """
18
28
 
19
- SUBTYPE: Final = Subtype(RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, "arm")
29
+ API: Final = API(RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, "arm") # pyright: ignore [reportIncompatibleVariableOverride]
20
30
 
21
31
  @abc.abstractmethod
22
32
  async def get_end_position(
@@ -27,10 +37,22 @@ class Arm(ComponentBase):
27
37
  **kwargs,
28
38
  ) -> Pose:
29
39
  """
30
- Get the current position of the end of the arm expressed as a Pose.
40
+ Get the current position of the end of the arm expressed as a ``Pose``.
41
+
42
+ ::
43
+
44
+ my_arm = Arm.from_robot(robot=machine, name="my_arm")
45
+
46
+ # Get the end position of the arm as a Pose.
47
+ pos = await my_arm.get_end_position()
31
48
 
32
49
  Returns:
33
- Pose: The location and orientation of the arm described as a Pose.
50
+ Pose: A representation of the arm's current position as a 6 DOF (six degrees of freedom) pose.
51
+ The ``Pose`` is composed of values for location and orientation with respect to the origin.
52
+ Location is expressed as distance, which is represented by x, y, and z coordinate values.
53
+ Orientation is expressed as an orientation vector, which is represented by o_x, o_y, o_z, and theta values.
54
+
55
+ For more information, see `Arm component <https://docs.viam.com/dev/reference/apis/components/arm/#getendposition>`_.
34
56
  """
35
57
  ...
36
58
 
@@ -46,8 +68,23 @@ class Arm(ComponentBase):
46
68
  """
47
69
  Move the end of the arm to the Pose specified in ``pose``.
48
70
 
71
+ ::
72
+
73
+ my_arm = Arm.from_robot(robot=machine, name="my_arm")
74
+
75
+ # Create a Pose for the arm.
76
+ examplePose = Pose(x=5, y=5, z=5, o_x=5, o_y=5, o_z=5, theta=20)
77
+
78
+ # Move your arm to the Pose.
79
+ await my_arm.move_to_position(pose=examplePose)
80
+
49
81
  Args:
50
- pose (Pose): The destination Pose for the arm.
82
+ pose (Pose): The destination ``Pose`` for the arm. The ``Pose`` is composed of values for location and orientation
83
+ with respect to the origin.
84
+ Location is expressed as distance, which is represented by x, y, and z coordinate values.
85
+ Orientation is expressed as an orientation vector, which is represented by o_x, o_y, o_z, and theta values.
86
+
87
+ For more information, see `Arm component <https://docs.viam.com/dev/reference/apis/components/arm/#movetoposition>`_.
51
88
  """
52
89
  ...
53
90
 
@@ -63,8 +100,24 @@ class Arm(ComponentBase):
63
100
  """
64
101
  Move each joint on the arm to the corresponding angle specified in ``positions``.
65
102
 
103
+ ::
104
+
105
+ my_arm = Arm.from_robot(robot=machine, name="my_arm")
106
+
107
+ # Declare a list of values with your desired rotational value for each joint on
108
+ # the arm. This example is for a 5dof arm.
109
+ degrees = [0.0, 45.0, 0.0, 0.0, 0.0]
110
+
111
+ # Declare a new JointPositions with these values.
112
+ jointPos = JointPositions(values=degrees)
113
+
114
+ # Move each joint of the arm to the position these values specify.
115
+ await my_arm.move_to_joint_positions(positions=jointPos)
116
+
66
117
  Args:
67
118
  positions (JointPositions): The destination ``JointPositions`` for the arm.
119
+
120
+ For more information, see `Arm component <https://docs.viam.com/dev/reference/apis/components/arm/#movetojointpositions>`_.
68
121
  """
69
122
  ...
70
123
 
@@ -79,8 +132,19 @@ class Arm(ComponentBase):
79
132
  """
80
133
  Get the JointPositions representing the current position of the arm.
81
134
 
135
+ ::
136
+
137
+ my_arm = Arm.from_robot(robot=machine, name="my_arm")
138
+
139
+ # Get the current position of each joint on the arm as JointPositions.
140
+ pos = await my_arm.get_joint_positions()
141
+
82
142
  Returns:
83
- JointPositions: The current JointPositions for the arm.
143
+ JointPositions: The current ``JointPositions`` for the arm.
144
+ ``JointPositions`` can have one attribute, ``values``, a list of joint positions with rotational values (degrees)
145
+ and translational values (mm).
146
+
147
+ For more information, see `Arm component <https://docs.viam.com/dev/reference/apis/components/arm/#getjointpositions>`_.
84
148
  """
85
149
  ...
86
150
 
@@ -94,6 +158,15 @@ class Arm(ComponentBase):
94
158
  ):
95
159
  """
96
160
  Stop all motion of the arm. It is assumed that the arm stops immediately.
161
+
162
+ ::
163
+
164
+ my_arm = Arm.from_robot(robot=machine, name="my_arm")
165
+
166
+ # Stop all motion of the arm. It is assumed that the arm stops immediately.
167
+ await my_arm.stop()
168
+
169
+ For more information, see `Arm component <https://docs.viam.com/dev/reference/apis/components/arm/#stop>`_.
97
170
  """
98
171
  ...
99
172
 
@@ -102,7 +175,49 @@ class Arm(ComponentBase):
102
175
  """
103
176
  Get if the arm is currently moving.
104
177
 
178
+ ::
179
+
180
+ my_arm = Arm.from_robot(robot=machine, name="my_arm")
181
+
182
+ # Stop all motion of the arm. It is assumed that the arm stops immediately.
183
+ await my_arm.stop()
184
+
185
+ # Print if the arm is currently moving.
186
+ print(await my_arm.is_moving())
187
+
105
188
  Returns:
106
189
  bool: Whether the arm is moving.
190
+
191
+ For more information, see `Arm component <https://docs.viam.com/dev/reference/apis/components/arm/#ismoving>`_.
192
+ """
193
+ ...
194
+
195
+ @abc.abstractmethod
196
+ async def get_kinematics(
197
+ self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs
198
+ ) -> Tuple[KinematicsFileFormat.ValueType, bytes]:
199
+ """
200
+ Get the kinematics information associated with the arm.
201
+
202
+ ::
203
+
204
+ my_arm = Arm.from_robot(robot=machine, name="my_arm")
205
+
206
+ # Get the kinematics information associated with the arm.
207
+ kinematics = await my_arm.get_kinematics()
208
+
209
+ # Get the format of the kinematics file.
210
+ k_file = kinematics[0]
211
+
212
+ # Get the byte contents of the file.
213
+ k_bytes = kinematics[1]
214
+
215
+ Returns:
216
+ Tuple[KinematicsFileFormat.ValueType, bytes]: A tuple containing two values; the first [0] value represents the format of the
217
+ file, either in URDF format (``KinematicsFileFormat.KINEMATICS_FILE_FORMAT_URDF``) or
218
+ Viam's kinematic parameter format (spatial vector algebra) (``KinematicsFileFormat.KINEMATICS_FILE_FORMAT_SVA``),
219
+ and the second [1] value represents the byte contents of the file.
220
+
221
+ For more information, see `Arm component <https://docs.viam.com/dev/reference/apis/components/arm/#getkinematics>`_.
107
222
  """
108
223
  ...
@@ -1,8 +1,8 @@
1
- from typing import Any, Dict, Mapping, Optional
1
+ from typing import Any, Dict, List, Mapping, Optional, Tuple
2
2
 
3
3
  from grpclib.client import Channel
4
4
 
5
- from viam.proto.common import DoCommandRequest, DoCommandResponse
5
+ from viam.proto.common import DoCommandRequest, DoCommandResponse, Geometry, GetKinematicsRequest, GetKinematicsResponse
6
6
  from viam.proto.component.arm import (
7
7
  ArmServiceStub,
8
8
  GetEndPositionRequest,
@@ -17,9 +17,9 @@ from viam.proto.component.arm import (
17
17
  StopRequest,
18
18
  )
19
19
  from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
20
- from viam.utils import ValueTypes, dict_to_struct, struct_to_dict
20
+ from viam.utils import ValueTypes, dict_to_struct, get_geometries, struct_to_dict
21
21
 
22
- from . import Arm, Pose
22
+ from . import Arm, KinematicsFileFormat, Pose
23
23
 
24
24
 
25
25
  class ArmClient(Arm, ReconfigurableResourceRPCClientBase):
@@ -39,11 +39,11 @@ class ArmClient(Arm, ReconfigurableResourceRPCClientBase):
39
39
  *,
40
40
  extra: Optional[Dict[str, Any]] = None,
41
41
  timeout: Optional[float] = None,
42
+ **kwargs,
42
43
  ) -> Pose:
43
- if extra is None:
44
- extra = {}
44
+ md = kwargs.get("metadata", self.Metadata()).proto
45
45
  request = GetEndPositionRequest(name=self.name, extra=dict_to_struct(extra))
46
- response: GetEndPositionResponse = await self.client.GetEndPosition(request, timeout=timeout)
46
+ response: GetEndPositionResponse = await self.client.GetEndPosition(request, timeout=timeout, metadata=md)
47
47
  return response.pose
48
48
 
49
49
  async def move_to_position(
@@ -52,22 +52,22 @@ class ArmClient(Arm, ReconfigurableResourceRPCClientBase):
52
52
  *,
53
53
  extra: Optional[Dict[str, Any]] = None,
54
54
  timeout: Optional[float] = None,
55
+ **kwargs,
55
56
  ):
56
- if extra is None:
57
- extra = {}
57
+ md = kwargs.get("metadata", self.Metadata()).proto
58
58
  request = MoveToPositionRequest(name=self.name, to=pose, extra=dict_to_struct(extra))
59
- await self.client.MoveToPosition(request, timeout=timeout)
59
+ await self.client.MoveToPosition(request, timeout=timeout, metadata=md)
60
60
 
61
61
  async def get_joint_positions(
62
62
  self,
63
63
  *,
64
64
  extra: Optional[Dict[str, Any]] = None,
65
65
  timeout: Optional[float] = None,
66
+ **kwargs,
66
67
  ) -> JointPositions:
67
- if extra is None:
68
- extra = {}
68
+ md = kwargs.get("metadata", self.Metadata()).proto
69
69
  request = GetJointPositionsRequest(name=self.name, extra=dict_to_struct(extra))
70
- response: GetJointPositionsResponse = await self.client.GetJointPositions(request, timeout=timeout)
70
+ response: GetJointPositionsResponse = await self.client.GetJointPositions(request, timeout=timeout, metadata=md)
71
71
  return response.positions
72
72
 
73
73
  async def move_to_joint_positions(
@@ -76,28 +76,27 @@ class ArmClient(Arm, ReconfigurableResourceRPCClientBase):
76
76
  *,
77
77
  extra: Optional[Dict[str, Any]] = None,
78
78
  timeout: Optional[float] = None,
79
+ **kwargs,
79
80
  ):
80
- if extra is None:
81
- extra = {}
81
+ md = kwargs.get("metadata", self.Metadata()).proto
82
82
  request = MoveToJointPositionsRequest(name=self.name, positions=positions, extra=dict_to_struct(extra))
83
- await self.client.MoveToJointPositions(request, timeout=timeout)
83
+ await self.client.MoveToJointPositions(request, timeout=timeout, metadata=md)
84
84
 
85
85
  async def stop(
86
86
  self,
87
87
  *,
88
88
  extra: Optional[Dict[str, Any]] = None,
89
89
  timeout: Optional[float] = None,
90
+ **kwargs,
90
91
  ):
91
- if extra is None:
92
- extra = {}
92
+ md = kwargs.get("metadata", self.Metadata()).proto
93
93
  request = StopRequest(name=self.name, extra=dict_to_struct(extra))
94
- await self.client.Stop(request, timeout=timeout)
94
+ await self.client.Stop(request, timeout=timeout, metadata=md)
95
95
 
96
- async def is_moving(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None) -> bool:
97
- if extra is None:
98
- extra = {}
96
+ async def is_moving(self, *, timeout: Optional[float] = None, **kwargs) -> bool:
97
+ md = kwargs.get("metadata", self.Metadata()).proto
99
98
  request = IsMovingRequest(name=self.name)
100
- response: IsMovingResponse = await self.client.IsMoving(request, timeout=timeout)
99
+ response: IsMovingResponse = await self.client.IsMoving(request, timeout=timeout, metadata=md)
101
100
  return response.is_moving
102
101
 
103
102
  async def do_command(
@@ -105,7 +104,21 @@ class ArmClient(Arm, ReconfigurableResourceRPCClientBase):
105
104
  command: Mapping[str, Any],
106
105
  *,
107
106
  timeout: Optional[float] = None,
107
+ **kwargs,
108
108
  ) -> Mapping[str, ValueTypes]:
109
+ md = kwargs.get("metadata", self.Metadata()).proto
109
110
  request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
110
- response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout)
111
+ response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
111
112
  return struct_to_dict(response.result)
113
+
114
+ async def get_kinematics(
115
+ self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs
116
+ ) -> Tuple[KinematicsFileFormat.ValueType, bytes]:
117
+ md = kwargs.get("metadata", self.Metadata()).proto
118
+ request = GetKinematicsRequest(name=self.name, extra=dict_to_struct(extra))
119
+ response: GetKinematicsResponse = await self.client.GetKinematics(request, timeout=timeout, metadata=md)
120
+ return (response.format, response.kinematics_data)
121
+
122
+ async def get_geometries(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[Geometry]:
123
+ md = kwargs.get("metadata", self.Metadata())
124
+ return await get_geometries(self.client, self.name, extra, timeout, md)
@@ -1,9 +1,14 @@
1
1
  from grpclib.server import Stream
2
2
 
3
- from viam.errors import ResourceNotFoundError
4
- from viam.proto.common import DoCommandRequest, DoCommandResponse
3
+ from viam.proto.common import (
4
+ DoCommandRequest,
5
+ DoCommandResponse,
6
+ GetGeometriesRequest,
7
+ GetGeometriesResponse,
8
+ GetKinematicsRequest,
9
+ GetKinematicsResponse,
10
+ )
5
11
  from viam.proto.component.arm import (
6
- ArmServiceBase,
7
12
  GetEndPositionRequest,
8
13
  GetEndPositionResponse,
9
14
  GetJointPositionsRequest,
@@ -16,6 +21,7 @@ from viam.proto.component.arm import (
16
21
  MoveToPositionResponse,
17
22
  StopRequest,
18
23
  StopResponse,
24
+ UnimplementedArmServiceBase,
19
25
  )
20
26
  from viam.resource.rpc_service_base import ResourceRPCServiceBase
21
27
  from viam.utils import dict_to_struct, struct_to_dict
@@ -23,7 +29,7 @@ from viam.utils import dict_to_struct, struct_to_dict
23
29
  from .arm import Arm
24
30
 
25
31
 
26
- class ArmRPCService(ArmServiceBase, ResourceRPCServiceBase[Arm]):
32
+ class ArmRPCService(UnimplementedArmServiceBase, ResourceRPCServiceBase[Arm]):
27
33
  """
28
34
  gRPC Service for an Arm
29
35
  """
@@ -34,10 +40,7 @@ class ArmRPCService(ArmServiceBase, ResourceRPCServiceBase[Arm]):
34
40
  request = await stream.recv_message()
35
41
  assert request is not None
36
42
  name = request.name
37
- try:
38
- arm = self.get_resource(name)
39
- except ResourceNotFoundError as e:
40
- raise e.grpc_error
43
+ arm = self.get_resource(name)
41
44
  timeout = stream.deadline.time_remaining() if stream.deadline else None
42
45
  position = await arm.get_end_position(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
43
46
  response = GetEndPositionResponse(pose=position)
@@ -47,10 +50,7 @@ class ArmRPCService(ArmServiceBase, ResourceRPCServiceBase[Arm]):
47
50
  request = await stream.recv_message()
48
51
  assert request is not None
49
52
  name = request.name
50
- try:
51
- arm = self.get_resource(name)
52
- except ResourceNotFoundError as e:
53
- raise e.grpc_error
53
+ arm = self.get_resource(name)
54
54
  timeout = stream.deadline.time_remaining() if stream.deadline else None
55
55
  await arm.move_to_position(request.to, extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
56
56
  response = MoveToPositionResponse()
@@ -60,10 +60,7 @@ class ArmRPCService(ArmServiceBase, ResourceRPCServiceBase[Arm]):
60
60
  request = await stream.recv_message()
61
61
  assert request is not None
62
62
  name = request.name
63
- try:
64
- arm = self.get_resource(name)
65
- except ResourceNotFoundError as e:
66
- raise e.grpc_error
63
+ arm = self.get_resource(name)
67
64
  timeout = stream.deadline.time_remaining() if stream.deadline else None
68
65
  positions = await arm.get_joint_positions(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
69
66
  response = GetJointPositionsResponse(positions=positions)
@@ -73,10 +70,7 @@ class ArmRPCService(ArmServiceBase, ResourceRPCServiceBase[Arm]):
73
70
  request = await stream.recv_message()
74
71
  assert request is not None
75
72
  name = request.name
76
- try:
77
- arm = self.get_resource(name)
78
- except ResourceNotFoundError as e:
79
- raise e.grpc_error
73
+ arm = self.get_resource(name)
80
74
  timeout = stream.deadline.time_remaining() if stream.deadline else None
81
75
  await arm.move_to_joint_positions(request.positions, extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
82
76
  response = MoveToJointPositionsResponse()
@@ -86,10 +80,7 @@ class ArmRPCService(ArmServiceBase, ResourceRPCServiceBase[Arm]):
86
80
  request = await stream.recv_message()
87
81
  assert request is not None
88
82
  name = request.name
89
- try:
90
- arm = self.get_resource(name)
91
- except ResourceNotFoundError as e:
92
- raise e.grpc_error
83
+ arm = self.get_resource(name)
93
84
  timeout = stream.deadline.time_remaining() if stream.deadline else None
94
85
  await arm.stop(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
95
86
  response = StopResponse()
@@ -99,10 +90,7 @@ class ArmRPCService(ArmServiceBase, ResourceRPCServiceBase[Arm]):
99
90
  request = await stream.recv_message()
100
91
  assert request is not None
101
92
  name = request.name
102
- try:
103
- arm = self.get_resource(name)
104
- except ResourceNotFoundError as e:
105
- raise e.grpc_error
93
+ arm = self.get_resource(name)
106
94
  is_moving = await arm.is_moving()
107
95
  response = IsMovingResponse(is_moving=is_moving)
108
96
  await stream.send_message(response)
@@ -110,11 +98,26 @@ class ArmRPCService(ArmServiceBase, ResourceRPCServiceBase[Arm]):
110
98
  async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None:
111
99
  request = await stream.recv_message()
112
100
  assert request is not None
113
- try:
114
- arm = self.get_resource(request.name)
115
- except ResourceNotFoundError as e:
116
- raise e.grpc_error
101
+ arm = self.get_resource(request.name)
117
102
  timeout = stream.deadline.time_remaining() if stream.deadline else None
118
103
  result = await arm.do_command(command=struct_to_dict(request.command), timeout=timeout, metadata=stream.metadata)
119
104
  response = DoCommandResponse(result=dict_to_struct(result))
120
105
  await stream.send_message(response)
106
+
107
+ async def GetKinematics(self, stream: Stream[GetKinematicsRequest, GetKinematicsResponse]) -> None:
108
+ request = await stream.recv_message()
109
+ assert request is not None
110
+ arm = self.get_resource(request.name)
111
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
112
+ format, kinematics_data = await arm.get_kinematics(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
113
+ response = GetKinematicsResponse(format=format, kinematics_data=kinematics_data)
114
+ await stream.send_message(response)
115
+
116
+ async def GetGeometries(self, stream: Stream[GetGeometriesRequest, GetGeometriesResponse]) -> None:
117
+ request = await stream.recv_message()
118
+ assert request is not None
119
+ arm = self.get_resource(request.name)
120
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
121
+ geometries = await arm.get_geometries(extra=struct_to_dict(request.extra), timeout=timeout)
122
+ response = GetGeometriesResponse(geometries=geometries)
123
+ await stream.send_message(response)
@@ -0,0 +1,24 @@
1
+ from viam.media.audio import AudioCodec
2
+ from viam.proto.common import AudioInfo
3
+ from viam.resource.registry import Registry, ResourceRegistration
4
+
5
+ from .audio_in import AudioIn
6
+ from .client import AudioInClient
7
+ from .service import AudioInRPCService
8
+
9
+ AudioResponse = AudioIn.AudioResponse
10
+
11
+ __all__ = [
12
+ "AudioIn",
13
+ "AudioResponse",
14
+ "AudioInfo",
15
+ "AudioCodec",
16
+ ]
17
+
18
+ Registry.register_api(
19
+ ResourceRegistration(
20
+ AudioIn,
21
+ AudioInRPCService,
22
+ lambda name, channel: AudioInClient(name, channel),
23
+ )
24
+ )
@@ -0,0 +1,74 @@
1
+ import abc
2
+ import sys
3
+ from typing import Final, Optional
4
+
5
+ from viam.proto.common import GetPropertiesResponse
6
+ from viam.proto.component.audioin import GetAudioResponse
7
+ from viam.resource.types import API, RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT
8
+ from viam.streams import Stream
9
+
10
+ from ..component_base import ComponentBase
11
+
12
+ if sys.version_info >= (3, 10):
13
+ from typing import TypeAlias
14
+ else:
15
+ from typing_extensions import TypeAlias
16
+
17
+
18
+ class AudioIn(ComponentBase):
19
+ """AudioIn represents a component that can capture audio.
20
+
21
+ This acts as an abstract base class for any drivers representing specific
22
+ audio input implementations. This cannot be used on its own. If the ``__init__()`` function is
23
+ overridden, it must call the ``super().__init__()`` function.
24
+ """
25
+
26
+ API: Final = API( # pyright: ignore [reportIncompatibleVariableOverride]
27
+ RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, "audio_in"
28
+ )
29
+
30
+ Properties: "TypeAlias" = GetPropertiesResponse
31
+ AudioResponse: "TypeAlias" = GetAudioResponse
32
+ AudioStream = Stream[AudioResponse]
33
+
34
+ @abc.abstractmethod
35
+ async def get_audio(
36
+ self, codec: str, duration_seconds: float, previous_timestamp_ns: int, *, timeout: Optional[float] = None, **kwargs
37
+ ) -> AudioStream:
38
+ """
39
+ Get a stream of audio from the device
40
+
41
+ ::
42
+
43
+ my_audio_in = AudioIn.from_robot(robot=machine, name="my_audio_in")
44
+
45
+ stream = await my_audio_in.get_audio(
46
+ codec=AudioCodec.PCM16,
47
+ duration_seconds=10.0,
48
+ previous_timestamp_ns=0
49
+ )
50
+
51
+ Args:
52
+ codec (str): The desired codec of the returned audio data
53
+ duration_seconds (float): duration of the stream. 0 = indefinite stream
54
+ previous_timestamp_ns (int): starting timestamp in nanoseconds for recording continuity.
55
+ Set to 0 to begin recording from the current time.
56
+ Returns:
57
+ AudioStream: stream of audio chunks.
58
+ ...
59
+ """
60
+
61
+ @abc.abstractmethod
62
+ async def get_properties(self, *, timeout: Optional[float] = None, **kwargs) -> Properties:
63
+ """
64
+ Get the audio device's properties
65
+
66
+ ::
67
+
68
+ my_audio_in = AudioIn.from_robot(robot=machine, name="my_audio_in")
69
+ properties = await my_audio_in.get_properties()
70
+
71
+ Returns:
72
+ Properties: The properties of the audio in device.
73
+ ...
74
+ """
@@ -0,0 +1,76 @@
1
+ import uuid
2
+ from typing import Any, Dict, List, Mapping, Optional
3
+
4
+ from grpclib.client import Channel
5
+ from grpclib.client import Stream as ClientStream
6
+
7
+ from viam.proto.common import DoCommandRequest, DoCommandResponse, Geometry, GetPropertiesRequest
8
+ from viam.proto.component.audioin import AudioInServiceStub, GetAudioRequest, GetAudioResponse
9
+ from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
10
+ from viam.streams import StreamWithIterator
11
+ from viam.utils import ValueTypes, dict_to_struct, get_geometries, struct_to_dict
12
+
13
+ from .audio_in import AudioIn
14
+
15
+
16
+ class AudioInClient(AudioIn, ReconfigurableResourceRPCClientBase):
17
+ def __init__(self, name: str, channel: Channel) -> None:
18
+ self.channel = channel
19
+ self.client = AudioInServiceStub(channel)
20
+ super().__init__(name)
21
+
22
+ async def get_audio(
23
+ self,
24
+ codec: str,
25
+ duration_seconds: float,
26
+ previous_timestamp_ns: int,
27
+ *,
28
+ extra: Optional[Dict[str, Any]] = None,
29
+ **kwargs,
30
+ ):
31
+ request = GetAudioRequest(
32
+ name=self.name,
33
+ codec=codec,
34
+ duration_seconds=duration_seconds,
35
+ previous_timestamp_nanoseconds=previous_timestamp_ns,
36
+ request_id=str(uuid.uuid4()),
37
+ extra=dict_to_struct(extra),
38
+ )
39
+
40
+ async def read():
41
+ md = kwargs.get("metadata", self.Metadata()).proto
42
+ audio_stream: ClientStream[GetAudioRequest, GetAudioResponse]
43
+ async with self.client.GetAudio.open(metadata=md) as audio_stream:
44
+ try:
45
+ await audio_stream.send_message(request, end=True)
46
+ async for response in audio_stream:
47
+ yield response
48
+ except Exception as e:
49
+ raise (e)
50
+
51
+ return StreamWithIterator(read())
52
+
53
+ async def get_properties(
54
+ self,
55
+ *,
56
+ timeout: Optional[float] = None,
57
+ **kwargs,
58
+ ) -> AudioIn.Properties:
59
+ md = kwargs.get("metadata", self.Metadata()).proto
60
+ return await self.client.GetProperties(GetPropertiesRequest(name=self.name), timeout=timeout, metadata=md)
61
+
62
+ async def do_command(
63
+ self,
64
+ command: Mapping[str, ValueTypes],
65
+ *,
66
+ timeout: Optional[float] = None,
67
+ **kwargs,
68
+ ) -> Mapping[str, ValueTypes]:
69
+ md = kwargs.get("metadata", self.Metadata()).proto
70
+ request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
71
+ response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
72
+ return struct_to_dict(response.result)
73
+
74
+ async def get_geometries(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[Geometry]:
75
+ md = kwargs.get("metadata", self.Metadata())
76
+ return await get_geometries(self.client, self.name, extra, timeout, md)