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,4 +1,4 @@
1
- from viam.media.video import RawImage
1
+ from viam.media.video import ViamImage
2
2
  from viam.proto.component.camera import DistortionParameters, IntrinsicParameters
3
3
  from viam.resource.registry import Registry, ResourceRegistration
4
4
 
@@ -10,10 +10,10 @@ __all__ = [
10
10
  "Camera",
11
11
  "IntrinsicParameters",
12
12
  "DistortionParameters",
13
- "RawImage",
13
+ "ViamImage",
14
14
  ]
15
15
 
16
- Registry.register_subtype(
16
+ Registry.register_api(
17
17
  ResourceRegistration(
18
18
  Camera,
19
19
  CameraRPCService,
@@ -1,12 +1,18 @@
1
1
  import abc
2
- from typing import Final, NamedTuple, Optional, Tuple, Union
2
+ import sys
3
+ from typing import Any, Dict, Final, Optional, Sequence, Tuple
3
4
 
4
- from PIL.Image import Image
5
-
6
- from viam.resource.types import RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, Subtype
5
+ from viam.media.video import NamedImage
6
+ from viam.proto.common import ResponseMetadata
7
+ from viam.proto.component.camera import GetPropertiesResponse
8
+ from viam.resource.types import API, RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT
7
9
 
8
10
  from ..component_base import ComponentBase
9
- from . import DistortionParameters, IntrinsicParameters, RawImage
11
+
12
+ if sys.version_info >= (3, 10):
13
+ from typing import TypeAlias
14
+ else:
15
+ from typing_extensions import TypeAlias
10
16
 
11
17
 
12
18
  class Camera(ComponentBase):
@@ -16,40 +22,56 @@ class Camera(ComponentBase):
16
22
  This acts as an abstract base class for any drivers representing specific
17
23
  camera implementations. This cannot be used on its own. If the ``__init__()`` function is
18
24
  overridden, it must call the ``super().__init__()`` function.
19
- """
20
25
 
21
- SUBTYPE: Final = Subtype(RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, "camera")
26
+ ::
22
27
 
23
- class Properties(NamedTuple):
24
- """The camera's supported features and settings"""
28
+ from viam.components.camera import Camera
25
29
 
26
- supports_pcd: bool
27
- """Whether the camera has a valid implementation of ``get_point_cloud``"""
30
+ For more information, see `Camera component <https://docs.viam.com/dev/reference/apis/components/camera/>`_.
31
+ """
28
32
 
29
- intrinsic_parameters: IntrinsicParameters
30
- """The properties of the camera"""
33
+ API: Final = API( # pyright: ignore [reportIncompatibleVariableOverride]
34
+ RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, "camera"
35
+ )
31
36
 
32
- distortion_parameters: DistortionParameters
33
- """The distortion parameters of the camera"""
37
+ Properties: "TypeAlias" = GetPropertiesResponse
34
38
 
35
39
  @abc.abstractmethod
36
- async def get_image(self, mime_type: str = "", *, timeout: Optional[float] = None, **kwargs) -> Union[Image, RawImage]:
37
- """Get the next image from the camera as an Image or RawImage.
38
- Be sure to close the image when finished.
40
+ async def get_images(
41
+ self,
42
+ *,
43
+ filter_source_names: Optional[Sequence[str]] = None,
44
+ extra: Optional[Dict[str, Any]] = None,
45
+ timeout: Optional[float] = None,
46
+ **kwargs,
47
+ ) -> Tuple[Sequence[NamedImage], ResponseMetadata]:
48
+ """Get simultaneous images from different imagers, along with associated metadata.
49
+ This should not be used for getting a time series of images from the same imager.
39
50
 
40
- NOTE: If the mime type is ``image/vnd.viam.dep`` you can use :func:`viam.media.video.RawImage.bytes_to_depth_array`
41
- to convert the data to a standard representation.
51
+ ::
52
+
53
+ my_camera = Camera.from_robot(robot=machine, name="my_camera")
54
+
55
+ images, metadata = await my_camera.get_images()
56
+ first_image = images[0]
57
+ timestamp = metadata.captured_at
42
58
 
43
59
  Args:
44
- mime_type (str): The desired mime type of the image. This does not guarantee output type
60
+ filter_source_names (Sequence[str]): The filter_source_names parameter can be used to filter only the images from the specified
61
+ source names. When unspecified, all images are returned.
45
62
 
46
63
  Returns:
47
- Image | RawImage: The frame
64
+ Tuple[Sequence[NamedImage], ResponseMetadata]: A tuple containing two values; the first [0] a list of images
65
+ returned from the camera system, and the second [1] the metadata associated with this response.
66
+
67
+ For more information, see `Camera component <https://docs.viam.com/dev/reference/apis/components/camera/#getimages>`_.
48
68
  """
49
69
  ...
50
70
 
51
71
  @abc.abstractmethod
52
- async def get_point_cloud(self, *, timeout: Optional[float] = None, **kwargs) -> Tuple[bytes, str]:
72
+ async def get_point_cloud(
73
+ self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs
74
+ ) -> Tuple[bytes, str]:
53
75
  """
54
76
  Get the next point cloud from the camera. This will be
55
77
  returned as bytes with a mimetype describing
@@ -58,12 +80,15 @@ class Camera(ComponentBase):
58
80
  by the mimetype.
59
81
 
60
82
  To deserialize the returned information into a numpy array, use the Open3D library.
83
+
61
84
  ::
62
85
 
63
86
  import numpy as np
64
87
  import open3d as o3d
65
88
 
66
- data, _ = await camera.get_point_cloud()
89
+ my_camera = Camera.from_robot(robot=machine, name="my_camera")
90
+
91
+ data, _ = await my_camera.get_point_cloud()
67
92
 
68
93
  # write the point cloud into a temporary file
69
94
  with open("/tmp/pointcloud_data.pcd", "wb") as f:
@@ -72,8 +97,10 @@ class Camera(ComponentBase):
72
97
  points = np.asarray(pcd.points)
73
98
 
74
99
  Returns:
75
- bytes: The pointcloud data.
76
- str: The mimetype of the pointcloud (e.g. PCD).
100
+ Tuple[bytes, str]: A tuple containing two values; the first [0] the pointcloud data,
101
+ and the second [1] the mimetype of the pointcloud (for example, PCD).
102
+
103
+ For more information, see `Camera component <https://docs.viam.com/dev/reference/apis/components/camera/#getpointcloud>`_.
77
104
  """
78
105
  ...
79
106
 
@@ -82,7 +109,15 @@ class Camera(ComponentBase):
82
109
  """
83
110
  Get the camera intrinsic parameters and camera distortion parameters
84
111
 
112
+ ::
113
+
114
+ my_camera = Camera.from_robot(robot=machine, name="my_camera")
115
+
116
+ properties = await my_camera.get_properties()
117
+
85
118
  Returns:
86
- Properties: The properties of the camera
119
+ Properties: The properties of the camera.
120
+
121
+ For more information, see `Camera component <https://docs.viam.com/dev/reference/apis/components/camera/#getproperties>`_.
87
122
  """
88
123
  ...
@@ -1,24 +1,21 @@
1
- from io import BytesIO
2
- from typing import Mapping, Optional, Tuple, Union
1
+ from typing import Any, Dict, Mapping, Optional, Sequence, Tuple
3
2
 
4
3
  from grpclib.client import Channel
5
- from PIL import Image
6
4
 
7
- from viam.media.video import LIBRARY_SUPPORTED_FORMATS, CameraMimeType
8
- from viam.proto.common import DoCommandRequest, DoCommandResponse
5
+ from viam.media.video import CameraMimeType, NamedImage
6
+ from viam.proto.common import DoCommandRequest, DoCommandResponse, Geometry, ResponseMetadata
9
7
  from viam.proto.component.camera import (
10
8
  CameraServiceStub,
11
- GetImageRequest,
12
- GetImageResponse,
9
+ GetImagesRequest,
10
+ GetImagesResponse,
13
11
  GetPointCloudRequest,
14
12
  GetPointCloudResponse,
15
13
  GetPropertiesRequest,
16
- GetPropertiesResponse,
17
14
  )
18
15
  from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
19
- from viam.utils import ValueTypes, dict_to_struct, struct_to_dict
16
+ from viam.utils import ValueTypes, dict_to_struct, get_geometries, struct_to_dict
20
17
 
21
- from . import Camera, RawImage
18
+ from . import Camera
22
19
 
23
20
 
24
21
  class CameraClient(Camera, ReconfigurableResourceRPCClientBase):
@@ -31,25 +28,60 @@ class CameraClient(Camera, ReconfigurableResourceRPCClientBase):
31
28
  self.client = CameraServiceStub(channel)
32
29
  super().__init__(name)
33
30
 
34
- async def get_image(self, mime_type: str = "", *, timeout: Optional[float] = None) -> Union[Image.Image, RawImage]:
35
- request = GetImageRequest(name=self.name, mime_type=mime_type)
36
- response: GetImageResponse = await self.client.GetImage(request, timeout=timeout)
37
- _, is_lazy = CameraMimeType.from_lazy(request.mime_type)
38
- if is_lazy or not (CameraMimeType.is_supported(response.mime_type)):
39
- image = RawImage(response.image, response.mime_type)
40
- return image
41
- return Image.open(BytesIO(response.image), formats=LIBRARY_SUPPORTED_FORMATS)
42
-
43
- async def get_point_cloud(self, *, timeout: Optional[float] = None) -> Tuple[bytes, str]:
44
- request = GetPointCloudRequest(name=self.name, mime_type=CameraMimeType.PCD)
45
- response: GetPointCloudResponse = await self.client.GetPointCloud(request, timeout=timeout)
31
+ async def get_images(
32
+ self,
33
+ *,
34
+ filter_source_names: Optional[Sequence[str]] = None,
35
+ extra: Optional[Dict[str, Any]] = None,
36
+ timeout: Optional[float] = None,
37
+ **kwargs,
38
+ ) -> Tuple[Sequence[NamedImage], ResponseMetadata]:
39
+ md = kwargs.get("metadata", self.Metadata()).proto
40
+ request = GetImagesRequest(name=self.name, extra=dict_to_struct(extra), filter_source_names=filter_source_names)
41
+ response: GetImagesResponse = await self.client.GetImages(request, timeout=timeout, metadata=md)
42
+ imgs = []
43
+ for img_data in response.images:
44
+ mime_type = CameraMimeType.from_string(img_data.mime_type)
45
+ img = NamedImage(img_data.source_name, img_data.image, mime_type)
46
+ imgs.append(img)
47
+ resp_metadata: ResponseMetadata = response.response_metadata
48
+ return imgs, resp_metadata
49
+
50
+ async def get_point_cloud(
51
+ self,
52
+ *,
53
+ extra: Optional[Dict[str, Any]] = None,
54
+ timeout: Optional[float] = None,
55
+ **kwargs,
56
+ ) -> Tuple[bytes, str]:
57
+ md = kwargs.get("metadata", self.Metadata()).proto
58
+ request = GetPointCloudRequest(name=self.name, mime_type=CameraMimeType.PCD, extra=dict_to_struct(extra))
59
+ response: GetPointCloudResponse = await self.client.GetPointCloud(request, timeout=timeout, metadata=md)
46
60
  return (response.point_cloud, response.mime_type)
47
61
 
48
- async def get_properties(self, *, timeout: Optional[float] = None) -> Camera.Properties:
49
- response: GetPropertiesResponse = await self.client.GetProperties(GetPropertiesRequest(name=self.name), timeout=timeout)
50
- return Camera.Properties(response.supports_pcd, response.intrinsic_parameters, response.distortion_parameters)
62
+ async def get_properties(
63
+ self,
64
+ *,
65
+ timeout: Optional[float] = None,
66
+ **kwargs,
67
+ ) -> Camera.Properties:
68
+ md = kwargs.get("metadata", self.Metadata()).proto
69
+ return await self.client.GetProperties(GetPropertiesRequest(name=self.name), timeout=timeout, metadata=md)
51
70
 
52
- async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Optional[float] = None) -> Mapping[str, ValueTypes]:
71
+ async def do_command(
72
+ self,
73
+ command: Mapping[str, ValueTypes],
74
+ *,
75
+ timeout: Optional[float] = None,
76
+ **kwargs,
77
+ ) -> Mapping[str, ValueTypes]:
78
+ md = kwargs.get("metadata", self.Metadata()).proto
53
79
  request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
54
- response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout)
80
+ response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
55
81
  return struct_to_dict(response.result)
82
+
83
+ async def get_geometries(
84
+ self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs
85
+ ) -> Sequence[Geometry]:
86
+ md = kwargs.get("metadata", self.Metadata())
87
+ return await get_geometries(self.client, self.name, extra, timeout, md)
@@ -1,23 +1,23 @@
1
- from google.api.httpbody_pb2 import HttpBody
1
+ # TODO: Update type checking based with RSDK-4089
2
+ # pyright: reportGeneralTypeIssues=false
2
3
  from grpclib.server import Stream
3
4
 
4
- from viam.errors import ResourceNotFoundError
5
- from viam.media.video import CameraMimeType
6
- from viam.proto.common import DoCommandRequest, DoCommandResponse
5
+ from viam.errors import NotSupportedError
6
+ from viam.proto.common import DoCommandRequest, DoCommandResponse, GetGeometriesRequest, GetGeometriesResponse
7
7
  from viam.proto.component.camera import (
8
8
  CameraServiceBase,
9
- GetImageRequest,
10
- GetImageResponse,
9
+ GetImagesRequest,
10
+ GetImagesResponse,
11
11
  GetPointCloudRequest,
12
12
  GetPointCloudResponse,
13
13
  GetPropertiesRequest,
14
14
  GetPropertiesResponse,
15
- RenderFrameRequest,
15
+ Image,
16
16
  )
17
17
  from viam.resource.rpc_service_base import ResourceRPCServiceBase
18
18
  from viam.utils import dict_to_struct, struct_to_dict
19
19
 
20
- from . import Camera, RawImage
20
+ from . import Camera
21
21
 
22
22
 
23
23
  class CameraRPCService(CameraServiceBase, ResourceRPCServiceBase[Camera]):
@@ -27,61 +27,40 @@ class CameraRPCService(CameraServiceBase, ResourceRPCServiceBase[Camera]):
27
27
 
28
28
  RESOURCE_TYPE = Camera
29
29
 
30
- async def GetImage(self, stream: Stream[GetImageRequest, GetImageResponse]) -> None:
31
- request = await stream.recv_message()
32
- assert request is not None
33
- name = request.name
34
- try:
35
- camera = self.get_resource(name)
36
- except ResourceNotFoundError as e:
37
- raise e.grpc_error
30
+ async def GetImage(self, stream: Stream) -> None:
31
+ """Deprecated: Use GetImages instead."""
32
+ raise NotSupportedError("GetImage is deprecated. Use GetImages instead.")
38
33
 
39
- timeout = stream.deadline.time_remaining() if stream.deadline else None
40
- image = await camera.get_image(request.mime_type, timeout=timeout, metadata=stream.metadata)
41
- try:
42
- mimetype, is_lazy = CameraMimeType.from_lazy(request.mime_type)
43
- if CameraMimeType.is_supported(mimetype):
44
- response_mime = mimetype
45
- else:
46
- response_mime = request.mime_type
47
- response = GetImageResponse(mime_type=response_mime)
48
- img_bytes = mimetype.encode_image(image)
49
- finally:
50
- image.close()
51
- response.image = img_bytes
52
- await stream.send_message(response)
34
+ async def RenderFrame(self, stream: Stream) -> None:
35
+ """Deprecated: Use GetImages instead."""
36
+ raise NotSupportedError("RenderFrame is deprecated. Use GetImages instead.")
53
37
 
54
- async def RenderFrame(self, stream: Stream[RenderFrameRequest, HttpBody]) -> None:
38
+ async def GetImages(self, stream: Stream[GetImagesRequest, GetImagesResponse]) -> None:
55
39
  request = await stream.recv_message()
56
40
  assert request is not None
57
- name = request.name
58
- try:
59
- camera = self.get_resource(name)
60
- except ResourceNotFoundError as e:
61
- raise e.grpc_error
62
- try:
63
- mimetype = CameraMimeType(request.mime_type)
64
- except ValueError:
65
- mimetype = CameraMimeType.JPEG
41
+ camera = self.get_resource(request.name)
42
+
66
43
  timeout = stream.deadline.time_remaining() if stream.deadline else None
67
- image = await camera.get_image(mimetype, timeout=timeout, metadata=stream.metadata)
68
- try:
69
- img = mimetype.encode_image(image)
70
- finally:
71
- image.close()
72
- response = HttpBody(data=img, content_type=image.mime_type if isinstance(image, RawImage) else mimetype)
44
+ images, metadata = await camera.get_images(
45
+ timeout=timeout,
46
+ metadata=stream.metadata,
47
+ extra=struct_to_dict(request.extra),
48
+ filter_source_names=request.filter_source_names,
49
+ )
50
+ img_bytes_lst = []
51
+ for img in images:
52
+ img_bytes = img.data
53
+ img_bytes_lst.append(Image(source_name=img.name, mime_type=img.mime_type, image=img_bytes))
54
+ response = GetImagesResponse(images=img_bytes_lst, response_metadata=metadata)
73
55
  await stream.send_message(response)
74
56
 
75
57
  async def GetPointCloud(self, stream: Stream[GetPointCloudRequest, GetPointCloudResponse]) -> None:
76
58
  request = await stream.recv_message()
77
59
  assert request is not None
78
60
  name = request.name
79
- try:
80
- camera = self.get_resource(name)
81
- except ResourceNotFoundError as e:
82
- raise e.grpc_error
61
+ camera = self.get_resource(name)
83
62
  timeout = stream.deadline.time_remaining() if stream.deadline else None
84
- pc, mimetype = await camera.get_point_cloud(timeout=timeout, metadata=stream.metadata)
63
+ pc, mimetype = await camera.get_point_cloud(timeout=timeout, extra=struct_to_dict(request.extra), metadata=stream.metadata)
85
64
  response = GetPointCloudResponse(mime_type=mimetype, point_cloud=pc)
86
65
  await stream.send_message(response)
87
66
 
@@ -89,27 +68,25 @@ class CameraRPCService(CameraServiceBase, ResourceRPCServiceBase[Camera]):
89
68
  request = await stream.recv_message()
90
69
  assert request is not None
91
70
  name = request.name
92
- try:
93
- camera = self.get_resource(name)
94
- except ResourceNotFoundError as e:
95
- raise e.grpc_error
71
+ camera = self.get_resource(name)
96
72
  timeout = stream.deadline.time_remaining() if stream.deadline else None
97
73
  properties = await camera.get_properties(timeout=timeout, metadata=stream.metadata)
98
- response = GetPropertiesResponse(
99
- supports_pcd=properties.supports_pcd,
100
- intrinsic_parameters=properties.intrinsic_parameters,
101
- distortion_parameters=properties.distortion_parameters,
102
- )
103
- await stream.send_message(response)
74
+ await stream.send_message(properties)
104
75
 
105
76
  async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None:
106
77
  request = await stream.recv_message()
107
78
  assert request is not None
108
- try:
109
- camera = self.get_resource(request.name)
110
- except ResourceNotFoundError as e:
111
- raise e.grpc_error
79
+ camera = self.get_resource(request.name)
112
80
  timeout = stream.deadline.time_remaining() if stream.deadline else None
113
81
  result = await camera.do_command(command=struct_to_dict(request.command), timeout=timeout, metadata=stream.metadata)
114
82
  response = DoCommandResponse(result=dict_to_struct(result))
115
83
  await stream.send_message(response)
84
+
85
+ async def GetGeometries(self, stream: Stream[GetGeometriesRequest, GetGeometriesResponse]) -> None:
86
+ request = await stream.recv_message()
87
+ assert request is not None
88
+ camera = self.get_resource(request.name)
89
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
90
+ geometries = await camera.get_geometries(extra=struct_to_dict(request.extra), timeout=timeout)
91
+ response = GetGeometriesResponse(geometries=geometries)
92
+ await stream.send_message(response)
@@ -1,12 +1,16 @@
1
1
  import abc
2
- from typing import TYPE_CHECKING, ClassVar, List, Mapping, Optional, SupportsBytes, SupportsFloat, Union, cast
2
+ from logging import Logger
3
+ from typing import TYPE_CHECKING, Any, ClassVar, Dict, List, Mapping, Optional, Sequence, SupportsBytes, SupportsFloat, Union, cast
3
4
 
4
5
  from typing_extensions import Self
5
6
 
7
+ from viam.errors import MethodNotImplementedError
8
+ from viam.logging import getLogger
9
+ from viam.proto.common import Geometry
6
10
  from viam.resource.base import ResourceBase
7
11
 
8
12
  if TYPE_CHECKING:
9
- from viam.resource.types import Subtype
13
+ from viam.resource.types import API
10
14
  from viam.robot.client import RobotClient
11
15
 
12
16
 
@@ -19,10 +23,11 @@ class ComponentBase(abc.ABC, ResourceBase):
19
23
  All components must inherit from this class.
20
24
  """
21
25
 
22
- SUBTYPE: ClassVar["Subtype"]
26
+ API: ClassVar["API"]
23
27
 
24
- def __init__(self, name: str):
28
+ def __init__(self, name: str, *, logger: Optional[Logger] = None):
25
29
  self.name = name
30
+ self.logger = logger if logger is not None else getLogger(f"{self.API}.{name}")
26
31
 
27
32
  @classmethod
28
33
  def from_robot(cls, robot: "RobotClient", name: str) -> Self:
@@ -36,7 +41,25 @@ class ComponentBase(abc.ABC, ResourceBase):
36
41
  Self: The component, if it exists on the robot
37
42
  """
38
43
  component = robot.get_component(cls.get_resource_name(name))
39
- return cast(cls, component)
44
+ return cast(cls, component) # type: ignore
40
45
 
41
46
  async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Optional[float] = None, **kwargs) -> Mapping[str, ValueTypes]:
42
47
  raise NotImplementedError()
48
+
49
+ async def get_geometries(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None) -> Sequence[Geometry]:
50
+ """
51
+ Get all geometries associated with the component, in their current configuration, in the
52
+ `frame <https://docs.viam.com/operate/mobility/define-geometry/>`__ of the component.
53
+
54
+ ::
55
+
56
+ geometries = await component.get_geometries()
57
+
58
+ if geometries:
59
+ # Get the center of the first geometry
60
+ print(f"Pose of the first geometry's centerpoint: {geometries[0].center}")
61
+
62
+ Returns:
63
+ List[Geometry]: The geometries associated with the Component.
64
+ """
65
+ raise MethodNotImplementedError("get_geometries")
@@ -9,7 +9,7 @@ __all__ = [
9
9
  ]
10
10
 
11
11
 
12
- Registry.register_subtype(
12
+ Registry.register_api(
13
13
  ResourceRegistration(
14
14
  Encoder,
15
15
  EncoderRPCService,
@@ -1,8 +1,8 @@
1
- from typing import Any, Dict, Mapping, Optional, Tuple
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
6
6
  from viam.proto.component.encoder import (
7
7
  EncoderServiceStub,
8
8
  GetPositionRequest,
@@ -13,7 +13,7 @@ from viam.proto.component.encoder import (
13
13
  ResetPositionRequest,
14
14
  )
15
15
  from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
16
- from viam.utils import ValueTypes, dict_to_struct, struct_to_dict
16
+ from viam.utils import ValueTypes, dict_to_struct, get_geometries, struct_to_dict
17
17
 
18
18
  from .encoder import Encoder
19
19
 
@@ -33,11 +33,11 @@ class EncoderClient(Encoder, ReconfigurableResourceRPCClientBase):
33
33
  *,
34
34
  extra: Optional[Dict[str, Any]] = None,
35
35
  timeout: Optional[float] = None,
36
+ **kwargs,
36
37
  ):
37
- if extra is None:
38
- extra = {}
38
+ md = kwargs.get("metadata", self.Metadata()).proto
39
39
  request = ResetPositionRequest(name=self.name, extra=dict_to_struct(extra))
40
- await self.client.ResetPosition(request, timeout=timeout)
40
+ await self.client.ResetPosition(request, timeout=timeout, metadata=md)
41
41
 
42
42
  async def get_position(
43
43
  self,
@@ -45,11 +45,11 @@ class EncoderClient(Encoder, ReconfigurableResourceRPCClientBase):
45
45
  *,
46
46
  extra: Optional[Dict[str, Any]] = None,
47
47
  timeout: Optional[float] = None,
48
+ **kwargs,
48
49
  ) -> Tuple[float, PositionType.ValueType]:
49
- if extra is None:
50
- extra = {}
50
+ md = kwargs.get("metadata", self.Metadata()).proto
51
51
  request = GetPositionRequest(name=self.name, position_type=position_type, extra=dict_to_struct(extra))
52
- response: GetPositionResponse = await self.client.GetPosition(request, timeout=timeout)
52
+ response: GetPositionResponse = await self.client.GetPosition(request, timeout=timeout, metadata=md)
53
53
  return response.value, response.position_type
54
54
 
55
55
  async def get_properties(
@@ -57,16 +57,27 @@ class EncoderClient(Encoder, ReconfigurableResourceRPCClientBase):
57
57
  *,
58
58
  extra: Optional[Dict[str, Any]] = None,
59
59
  timeout: Optional[float] = None,
60
+ **kwargs,
60
61
  ) -> Encoder.Properties:
61
- if extra is None:
62
- extra = {}
62
+ md = kwargs.get("metadata", self.Metadata()).proto
63
63
  request = GetPropertiesRequest(name=self.name, extra=dict_to_struct(extra))
64
- response: GetPropertiesResponse = await self.client.GetProperties(request, timeout=timeout)
64
+ response: GetPropertiesResponse = await self.client.GetProperties(request, timeout=timeout, metadata=md)
65
65
  return Encoder.Properties(
66
66
  ticks_count_supported=response.ticks_count_supported, angle_degrees_supported=response.angle_degrees_supported
67
67
  )
68
68
 
69
- async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Optional[float] = None) -> Mapping[str, ValueTypes]:
69
+ async def do_command(
70
+ self,
71
+ command: Mapping[str, ValueTypes],
72
+ *,
73
+ timeout: Optional[float] = None,
74
+ **kwargs,
75
+ ) -> Mapping[str, ValueTypes]:
76
+ md = kwargs.get("metadata", self.Metadata()).proto
70
77
  request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
71
- response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout)
78
+ response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
72
79
  return struct_to_dict(response.result)
80
+
81
+ async def get_geometries(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[Geometry]:
82
+ md = kwargs.get("metadata", self.Metadata())
83
+ return await get_geometries(self.client, self.name, extra, timeout, md)