diff --git a/examples/server/v1/components.py b/examples/server/v1/components.py index 31ff41234..7647dff08 100644 --- a/examples/server/v1/components.py +++ b/examples/server/v1/components.py @@ -513,17 +513,28 @@ class ExampleGripper(Gripper): def __init__(self, name: str): self.opened = False self.is_stopped = True + self.holding_something = False self.kinematics = (KinematicsFileFormat.KINEMATICS_FILE_FORMAT_SVA, b"\x00\x01\x02") super().__init__(name) async def open(self, extra: Optional[Dict[str, Any]] = None, **kwargs): self.opened = True self.is_stopped = False + self.holding_something = False async def grab(self, extra: Optional[Dict[str, Any]] = None, **kwargs) -> bool: self.opened = False self.is_stopped = False - return random.choice([True, False]) + self.holding_something = random.choice([True, False]) + return self.holding_something + + async def is_holding_something( + self, + *, + extra: Optional[Dict[str, Any]] = None, + **kwargs + ) -> Gripper.HoldingStatus: + return Gripper.HoldingStatus(self.holding_something) async def stop(self, extra: Optional[Dict[str, Any]] = None, **kwargs): self.is_stopped = True diff --git a/src/viam/components/gripper/client.py b/src/viam/components/gripper/client.py index 844c76626..a8a26ea70 100644 --- a/src/viam/components/gripper/client.py +++ b/src/viam/components/gripper/client.py @@ -11,6 +11,8 @@ IsMovingResponse, OpenRequest, StopRequest, + IsHoldingSomethingRequest, + IsHoldingSomethingResponse ) from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase from viam.utils import ValueTypes, dict_to_struct, get_geometries, struct_to_dict @@ -63,6 +65,18 @@ async def stop( request = StopRequest(name=self.name, extra=dict_to_struct(extra)) await self.client.Stop(request, timeout=timeout, metadata=md) + async def is_holding_something( + self, + *, + extra: Optional[Dict[str, Any]] = None, + timeout: Optional[float] = None, + **kwargs + ) -> Gripper.HoldingStatus: + md = kwargs.get("metadata", self.Metadata()).proto + request = IsHoldingSomethingRequest(name=self.name, extra=dict_to_struct(extra)) + response: IsHoldingSomethingResponse = await self.client.IsHoldingSomething(request, timeout=timeout, metadata=md) + return Gripper.HoldingStatus(response.is_holding_something, meta=struct_to_dict(response.meta)) + async def is_moving(self, *, timeout: Optional[float] = None, **kwargs) -> bool: md = kwargs.get("metadata", self.Metadata()).proto request = IsMovingRequest(name=self.name) diff --git a/src/viam/components/gripper/gripper.py b/src/viam/components/gripper/gripper.py index 153cc8e2b..45b62df09 100644 --- a/src/viam/components/gripper/gripper.py +++ b/src/viam/components/gripper/gripper.py @@ -1,4 +1,5 @@ import abc +from dataclasses import dataclass from typing import Any, Dict, Final, Optional, Tuple from viam.components.component_base import ComponentBase @@ -6,7 +7,6 @@ from . import KinematicsFileFormat - class Gripper(ComponentBase): """ Gripper represents a physical robotic gripper. @@ -26,6 +26,16 @@ class Gripper(ComponentBase): RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, "gripper" ) + @dataclass + class HoldingStatus: + """ + HoldingStatus represents whether the gripper is currently holding onto an object. The + additional ``meta`` attribute contains other optional contextual information (i.e. confidence + interval, pressure, etc.) + """ + is_holding_something: bool + meta: Optional[Dict[str, Any]] = None + @abc.abstractmethod async def open( self, @@ -73,6 +83,33 @@ async def grab( """ ... + @abc.abstractmethod + async def is_holding_something( + self, + *, + extra: Optional[Dict[str, Any]] = None, + timeout: Optional[float] = None, + **kwargs, + ) -> HoldingStatus: + """ + Get information about whether the gripper is currently holding onto an object. + + :: + + my_gripper = Gripper.from_robot(robot=machine, name="my_gripper") + + # Grab with the gripper. + holding_status = await my_gripper.is_holding_something() + # get the boolean result + is_holding_something = holding_status.is_holding_something + + Returns: + HoldingStatus: see documentation on `HoldingStatus` for more information + + For more information, see `Gripper component `_. + + """ + @abc.abstractmethod async def stop( self, diff --git a/src/viam/components/gripper/service.py b/src/viam/components/gripper/service.py index ea5cef42d..71283e300 100644 --- a/src/viam/components/gripper/service.py +++ b/src/viam/components/gripper/service.py @@ -18,6 +18,8 @@ OpenResponse, StopRequest, StopResponse, + IsHoldingSomethingRequest, + IsHoldingSomethingResponse ) from viam.resource.rpc_service_base import ResourceRPCServiceBase from viam.utils import dict_to_struct, struct_to_dict @@ -69,6 +71,16 @@ async def IsMoving(self, stream: Stream[IsMovingRequest, IsMovingResponse]) -> N response = IsMovingResponse(is_moving=is_moving) await stream.send_message(response) + async def IsHoldingSomething(self, stream: Stream[IsHoldingSomethingRequest, IsHoldingSomethingResponse]) -> None: + request = await stream.recv_message() + assert request is not None + name = request.name + gripper = self.get_resource(name) + holding_status = await gripper.is_holding_something() + response = IsHoldingSomethingResponse( + is_holding_something=holding_status.is_holding_something, meta=dict_to_struct(holding_status.meta)) + await stream.send_message(response) + async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None: request = await stream.recv_message() assert request is not None diff --git a/src/viam/gen/component/gripper/v1/gripper_grpc.py b/src/viam/gen/component/gripper/v1/gripper_grpc.py index c49c58775..186a26df2 100644 --- a/src/viam/gen/component/gripper/v1/gripper_grpc.py +++ b/src/viam/gen/component/gripper/v1/gripper_grpc.py @@ -28,6 +28,10 @@ async def Stop(self, stream: 'grpclib.server.Stream[component.gripper.v1.gripper async def IsMoving(self, stream: 'grpclib.server.Stream[component.gripper.v1.gripper_pb2.IsMovingRequest, component.gripper.v1.gripper_pb2.IsMovingResponse]') -> None: pass + @abc.abstractmethod + async def IsHoldingSomething(self, stream: 'grpclib.server.Stream[component.gripper.v1.gripper_pb2.IsHoldingSomethingRequest, component.gripper.v1.gripper_pb2.IsHoldingSomethingResponse]') -> None: + pass + @abc.abstractmethod async def DoCommand(self, stream: 'grpclib.server.Stream[common.v1.common_pb2.DoCommandRequest, common.v1.common_pb2.DoCommandResponse]') -> None: pass @@ -41,7 +45,7 @@ async def GetKinematics(self, stream: 'grpclib.server.Stream[common.v1.common_pb pass def __mapping__(self) -> typing.Dict[str, grpclib.const.Handler]: - return {'/viam.component.gripper.v1.GripperService/Open': grpclib.const.Handler(self.Open, grpclib.const.Cardinality.UNARY_UNARY, component.gripper.v1.gripper_pb2.OpenRequest, component.gripper.v1.gripper_pb2.OpenResponse), '/viam.component.gripper.v1.GripperService/Grab': grpclib.const.Handler(self.Grab, grpclib.const.Cardinality.UNARY_UNARY, component.gripper.v1.gripper_pb2.GrabRequest, component.gripper.v1.gripper_pb2.GrabResponse), '/viam.component.gripper.v1.GripperService/Stop': grpclib.const.Handler(self.Stop, grpclib.const.Cardinality.UNARY_UNARY, component.gripper.v1.gripper_pb2.StopRequest, component.gripper.v1.gripper_pb2.StopResponse), '/viam.component.gripper.v1.GripperService/IsMoving': grpclib.const.Handler(self.IsMoving, grpclib.const.Cardinality.UNARY_UNARY, component.gripper.v1.gripper_pb2.IsMovingRequest, component.gripper.v1.gripper_pb2.IsMovingResponse), '/viam.component.gripper.v1.GripperService/DoCommand': grpclib.const.Handler(self.DoCommand, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.DoCommandRequest, common.v1.common_pb2.DoCommandResponse), '/viam.component.gripper.v1.GripperService/GetGeometries': grpclib.const.Handler(self.GetGeometries, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.GetGeometriesRequest, common.v1.common_pb2.GetGeometriesResponse), '/viam.component.gripper.v1.GripperService/GetKinematics': grpclib.const.Handler(self.GetKinematics, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.GetKinematicsRequest, common.v1.common_pb2.GetKinematicsResponse)} + return {'/viam.component.gripper.v1.GripperService/Open': grpclib.const.Handler(self.Open, grpclib.const.Cardinality.UNARY_UNARY, component.gripper.v1.gripper_pb2.OpenRequest, component.gripper.v1.gripper_pb2.OpenResponse), '/viam.component.gripper.v1.GripperService/Grab': grpclib.const.Handler(self.Grab, grpclib.const.Cardinality.UNARY_UNARY, component.gripper.v1.gripper_pb2.GrabRequest, component.gripper.v1.gripper_pb2.GrabResponse), '/viam.component.gripper.v1.GripperService/Stop': grpclib.const.Handler(self.Stop, grpclib.const.Cardinality.UNARY_UNARY, component.gripper.v1.gripper_pb2.StopRequest, component.gripper.v1.gripper_pb2.StopResponse), '/viam.component.gripper.v1.GripperService/IsMoving': grpclib.const.Handler(self.IsMoving, grpclib.const.Cardinality.UNARY_UNARY, component.gripper.v1.gripper_pb2.IsMovingRequest, component.gripper.v1.gripper_pb2.IsMovingResponse), '/viam.component.gripper.v1.GripperService/IsHoldingSomething': grpclib.const.Handler(self.IsHoldingSomething, grpclib.const.Cardinality.UNARY_UNARY, component.gripper.v1.gripper_pb2.IsHoldingSomethingRequest, component.gripper.v1.gripper_pb2.IsHoldingSomethingResponse), '/viam.component.gripper.v1.GripperService/DoCommand': grpclib.const.Handler(self.DoCommand, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.DoCommandRequest, common.v1.common_pb2.DoCommandResponse), '/viam.component.gripper.v1.GripperService/GetGeometries': grpclib.const.Handler(self.GetGeometries, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.GetGeometriesRequest, common.v1.common_pb2.GetGeometriesResponse), '/viam.component.gripper.v1.GripperService/GetKinematics': grpclib.const.Handler(self.GetKinematics, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.GetKinematicsRequest, common.v1.common_pb2.GetKinematicsResponse)} class UnimplementedGripperServiceBase(GripperServiceBase): @@ -57,6 +61,9 @@ async def Stop(self, stream: 'grpclib.server.Stream[component.gripper.v1.gripper async def IsMoving(self, stream: 'grpclib.server.Stream[component.gripper.v1.gripper_pb2.IsMovingRequest, component.gripper.v1.gripper_pb2.IsMovingResponse]') -> None: raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def IsHoldingSomething(self, stream: 'grpclib.server.Stream[component.gripper.v1.gripper_pb2.IsHoldingSomethingRequest, component.gripper.v1.gripper_pb2.IsHoldingSomethingResponse]') -> None: + raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def DoCommand(self, stream: 'grpclib.server.Stream[common.v1.common_pb2.DoCommandRequest, common.v1.common_pb2.DoCommandResponse]') -> None: raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED) @@ -73,6 +80,7 @@ def __init__(self, channel: grpclib.client.Channel) -> None: self.Grab = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.gripper.v1.GripperService/Grab', component.gripper.v1.gripper_pb2.GrabRequest, component.gripper.v1.gripper_pb2.GrabResponse) self.Stop = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.gripper.v1.GripperService/Stop', component.gripper.v1.gripper_pb2.StopRequest, component.gripper.v1.gripper_pb2.StopResponse) self.IsMoving = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.gripper.v1.GripperService/IsMoving', component.gripper.v1.gripper_pb2.IsMovingRequest, component.gripper.v1.gripper_pb2.IsMovingResponse) + self.IsHoldingSomething = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.gripper.v1.GripperService/IsHoldingSomething', component.gripper.v1.gripper_pb2.IsHoldingSomethingRequest, component.gripper.v1.gripper_pb2.IsHoldingSomethingResponse) self.DoCommand = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.gripper.v1.GripperService/DoCommand', common.v1.common_pb2.DoCommandRequest, common.v1.common_pb2.DoCommandResponse) self.GetGeometries = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.gripper.v1.GripperService/GetGeometries', common.v1.common_pb2.GetGeometriesRequest, common.v1.common_pb2.GetGeometriesResponse) self.GetKinematics = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.gripper.v1.GripperService/GetKinematics', common.v1.common_pb2.GetKinematicsRequest, common.v1.common_pb2.GetKinematicsResponse) \ No newline at end of file diff --git a/src/viam/gen/component/gripper/v1/gripper_pb2.py b/src/viam/gen/component/gripper/v1/gripper_pb2.py index 3e6e9b0aa..208e61079 100644 --- a/src/viam/gen/component/gripper/v1/gripper_pb2.py +++ b/src/viam/gen/component/gripper/v1/gripper_pb2.py @@ -9,7 +9,7 @@ from ....common.v1 import common_pb2 as common_dot_v1_dot_common__pb2 from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n"component/gripper/v1/gripper.proto\x12\x19viam.component.gripper.v1\x1a\x16common/v1/common.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1cgoogle/protobuf/struct.proto"P\n\x0bOpenRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"\x0e\n\x0cOpenResponse"P\n\x0bGrabRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"W\n\x0cGrabResponse\x12\x18\n\x07success\x18\x01 \x01(\x08R\x07success\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"P\n\x0bStopRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"\x0e\n\x0cStopResponse"%\n\x0fIsMovingRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name"/\n\x10IsMovingResponse\x12\x1b\n\tis_moving\x18\x01 \x01(\x08R\x08isMoving2\xa0\x08\n\x0eGripperService\x12\x8f\x01\n\x04Open\x12&.viam.component.gripper.v1.OpenRequest\x1a\'.viam.component.gripper.v1.OpenResponse"6\xa0\x92)\x01\x82\xd3\xe4\x93\x02,\x1a*/viam/api/v1/component/gripper/{name}/open\x12\x8f\x01\n\x04Grab\x12&.viam.component.gripper.v1.GrabRequest\x1a\'.viam.component.gripper.v1.GrabResponse"6\xa0\x92)\x01\x82\xd3\xe4\x93\x02,\x1a*/viam/api/v1/component/gripper/{name}/grab\x12\x8b\x01\n\x04Stop\x12&.viam.component.gripper.v1.StopRequest\x1a\'.viam.component.gripper.v1.StopResponse"2\x82\xd3\xe4\x93\x02,"*/viam/api/v1/component/gripper/{name}/stop\x12\x9c\x01\n\x08IsMoving\x12*.viam.component.gripper.v1.IsMovingRequest\x1a+.viam.component.gripper.v1.IsMovingResponse"7\x82\xd3\xe4\x93\x021\x12//viam/api/v1/component/gripper/{name}/is_moving\x12\x8a\x01\n\tDoCommand\x12 .viam.common.v1.DoCommandRequest\x1a!.viam.common.v1.DoCommandResponse"8\x82\xd3\xe4\x93\x022"0/viam/api/v1/component/gripper/{name}/do_command\x12\x96\x01\n\rGetGeometries\x12$.viam.common.v1.GetGeometriesRequest\x1a%.viam.common.v1.GetGeometriesResponse"8\x82\xd3\xe4\x93\x022\x120/viam/api/v1/component/gripper/{name}/geometries\x12\x96\x01\n\rGetKinematics\x12$.viam.common.v1.GetKinematicsRequest\x1a%.viam.common.v1.GetKinematicsResponse"8\x82\xd3\xe4\x93\x022\x120/viam/api/v1/component/gripper/{name}/kinematicsBE\n\x1dcom.viam.component.gripper.v1Z$go.viam.com/api/component/gripper/v1b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n"component/gripper/v1/gripper.proto\x12\x19viam.component.gripper.v1\x1a\x16common/v1/common.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1cgoogle/protobuf/struct.proto"P\n\x0bOpenRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"\x0e\n\x0cOpenResponse"P\n\x0bGrabRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"W\n\x0cGrabResponse\x12\x18\n\x07success\x18\x01 \x01(\x08R\x07success\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"P\n\x0bStopRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"\x0e\n\x0cStopResponse"%\n\x0fIsMovingRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name"/\n\x10IsMovingResponse\x12\x1b\n\tis_moving\x18\x01 \x01(\x08R\x08isMoving"^\n\x19IsHoldingSomethingRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"{\n\x1aIsHoldingSomethingResponse\x120\n\x14is_holding_something\x18\x01 \x01(\x08R\x12isHoldingSomething\x12+\n\x04meta\x18c \x01(\x0b2\x17.google.protobuf.StructR\x04meta2\xe8\t\n\x0eGripperService\x12\x8f\x01\n\x04Open\x12&.viam.component.gripper.v1.OpenRequest\x1a\'.viam.component.gripper.v1.OpenResponse"6\xa0\x92)\x01\x82\xd3\xe4\x93\x02,\x1a*/viam/api/v1/component/gripper/{name}/open\x12\x8f\x01\n\x04Grab\x12&.viam.component.gripper.v1.GrabRequest\x1a\'.viam.component.gripper.v1.GrabResponse"6\xa0\x92)\x01\x82\xd3\xe4\x93\x02,\x1a*/viam/api/v1/component/gripper/{name}/grab\x12\x8b\x01\n\x04Stop\x12&.viam.component.gripper.v1.StopRequest\x1a\'.viam.component.gripper.v1.StopResponse"2\x82\xd3\xe4\x93\x02,"*/viam/api/v1/component/gripper/{name}/stop\x12\x9c\x01\n\x08IsMoving\x12*.viam.component.gripper.v1.IsMovingRequest\x1a+.viam.component.gripper.v1.IsMovingResponse"7\x82\xd3\xe4\x93\x021\x12//viam/api/v1/component/gripper/{name}/is_moving\x12\xc5\x01\n\x12IsHoldingSomething\x124.viam.component.gripper.v1.IsHoldingSomethingRequest\x1a5.viam.component.gripper.v1.IsHoldingSomethingResponse"B\x82\xd3\xe4\x93\x02<\x12:/viam/api/v1/component/gripper/{name}/is_holding_something\x12\x8a\x01\n\tDoCommand\x12 .viam.common.v1.DoCommandRequest\x1a!.viam.common.v1.DoCommandResponse"8\x82\xd3\xe4\x93\x022"0/viam/api/v1/component/gripper/{name}/do_command\x12\x96\x01\n\rGetGeometries\x12$.viam.common.v1.GetGeometriesRequest\x1a%.viam.common.v1.GetGeometriesResponse"8\x82\xd3\xe4\x93\x022\x120/viam/api/v1/component/gripper/{name}/geometries\x12\x96\x01\n\rGetKinematics\x12$.viam.common.v1.GetKinematicsRequest\x1a%.viam.common.v1.GetKinematicsResponse"8\x82\xd3\xe4\x93\x022\x120/viam/api/v1/component/gripper/{name}/kinematicsBE\n\x1dcom.viam.component.gripper.v1Z$go.viam.com/api/component/gripper/v1b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'component.gripper.v1.gripper_pb2', _globals) @@ -24,6 +24,8 @@ _globals['_GRIPPERSERVICE'].methods_by_name['Stop']._serialized_options = b'\x82\xd3\xe4\x93\x02,"*/viam/api/v1/component/gripper/{name}/stop' _globals['_GRIPPERSERVICE'].methods_by_name['IsMoving']._loaded_options = None _globals['_GRIPPERSERVICE'].methods_by_name['IsMoving']._serialized_options = b'\x82\xd3\xe4\x93\x021\x12//viam/api/v1/component/gripper/{name}/is_moving' + _globals['_GRIPPERSERVICE'].methods_by_name['IsHoldingSomething']._loaded_options = None + _globals['_GRIPPERSERVICE'].methods_by_name['IsHoldingSomething']._serialized_options = b'\x82\xd3\xe4\x93\x02<\x12:/viam/api/v1/component/gripper/{name}/is_holding_something' _globals['_GRIPPERSERVICE'].methods_by_name['DoCommand']._loaded_options = None _globals['_GRIPPERSERVICE'].methods_by_name['DoCommand']._serialized_options = b'\x82\xd3\xe4\x93\x022"0/viam/api/v1/component/gripper/{name}/do_command' _globals['_GRIPPERSERVICE'].methods_by_name['GetGeometries']._loaded_options = None @@ -46,5 +48,9 @@ _globals['_ISMOVINGREQUEST']._serialized_end = 553 _globals['_ISMOVINGRESPONSE']._serialized_start = 555 _globals['_ISMOVINGRESPONSE']._serialized_end = 602 - _globals['_GRIPPERSERVICE']._serialized_start = 605 - _globals['_GRIPPERSERVICE']._serialized_end = 1661 \ No newline at end of file + _globals['_ISHOLDINGSOMETHINGREQUEST']._serialized_start = 604 + _globals['_ISHOLDINGSOMETHINGREQUEST']._serialized_end = 698 + _globals['_ISHOLDINGSOMETHINGRESPONSE']._serialized_start = 700 + _globals['_ISHOLDINGSOMETHINGRESPONSE']._serialized_end = 823 + _globals['_GRIPPERSERVICE']._serialized_start = 826 + _globals['_GRIPPERSERVICE']._serialized_end = 2082 \ No newline at end of file diff --git a/src/viam/gen/component/gripper/v1/gripper_pb2.pyi b/src/viam/gen/component/gripper/v1/gripper_pb2.pyi index 077ce8af0..897778871 100644 --- a/src/viam/gen/component/gripper/v1/gripper_pb2.pyi +++ b/src/viam/gen/component/gripper/v1/gripper_pb2.pyi @@ -134,4 +134,46 @@ class IsMovingResponse(google.protobuf.message.Message): def ClearField(self, field_name: typing.Literal['is_moving', b'is_moving']) -> None: ... -global___IsMovingResponse = IsMovingResponse \ No newline at end of file +global___IsMovingResponse = IsMovingResponse + +@typing.final +class IsHoldingSomethingRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + NAME_FIELD_NUMBER: builtins.int + EXTRA_FIELD_NUMBER: builtins.int + name: builtins.str + + @property + def extra(self) -> google.protobuf.struct_pb2.Struct: + ... + + def __init__(self, *, name: builtins.str=..., extra: google.protobuf.struct_pb2.Struct | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['extra', b'extra']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['extra', b'extra', 'name', b'name']) -> None: + ... +global___IsHoldingSomethingRequest = IsHoldingSomethingRequest + +@typing.final +class IsHoldingSomethingResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + IS_HOLDING_SOMETHING_FIELD_NUMBER: builtins.int + META_FIELD_NUMBER: builtins.int + is_holding_something: builtins.bool + + @property + def meta(self) -> google.protobuf.struct_pb2.Struct: + ... + + def __init__(self, *, is_holding_something: builtins.bool=..., meta: google.protobuf.struct_pb2.Struct | None=...) -> None: + ... + + def HasField(self, field_name: typing.Literal['meta', b'meta']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing.Literal['is_holding_something', b'is_holding_something', 'meta', b'meta']) -> None: + ... +global___IsHoldingSomethingResponse = IsHoldingSomethingResponse \ No newline at end of file diff --git a/src/viam/proto/component/gripper/__init__.py b/src/viam/proto/component/gripper/__init__.py index 16ffdceea..a13269302 100644 --- a/src/viam/proto/component/gripper/__init__.py +++ b/src/viam/proto/component/gripper/__init__.py @@ -7,6 +7,8 @@ from ....gen.component.gripper.v1.gripper_pb2 import ( GrabRequest, GrabResponse, + IsHoldingSomethingRequest, + IsHoldingSomethingResponse, IsMovingRequest, IsMovingResponse, OpenRequest, @@ -21,6 +23,8 @@ "UnimplementedGripperServiceBase", "GrabRequest", "GrabResponse", + "IsHoldingSomethingRequest", + "IsHoldingSomethingResponse", "IsMovingRequest", "IsMovingResponse", "OpenRequest", diff --git a/src/viam/version_metadata.py b/src/viam/version_metadata.py index 6cdbd830f..5fe7266c7 100644 --- a/src/viam/version_metadata.py +++ b/src/viam/version_metadata.py @@ -1,4 +1,4 @@ __version__ = "0.47.0" -API_VERSION = "v0.1.445" +API_VERSION = "v0.1.446" SDK_VERSION = __version__ diff --git a/tests/mocks/components.py b/tests/mocks/components.py index 3f03b04e7..d15fa148d 100644 --- a/tests/mocks/components.py +++ b/tests/mocks/components.py @@ -99,7 +99,7 @@ async def is_moving(self) -> bool: return not self.is_stopped async def get_kinematics( - self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None + self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs ) -> Tuple[KinematicsFileFormat.ValueType, bytes]: self.extra = extra self.timeout = timeout @@ -532,6 +532,7 @@ def __init__(self, name: str): self.opened = False self.geometries = GEOMETRIES self.kinematics = (KinematicsFileFormat.KINEMATICS_FILE_FORMAT_SVA, b"\x00\x01\x02") + self.holding_something = False self.extra = None self.is_stopped = True self.timeout: Optional[float] = None @@ -548,7 +549,18 @@ async def grab(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optiona self.is_stopped = False self.timeout = timeout self.extra = extra - return choice([True, False]) + self.holding_something = choice([True, False]) + return self.holding_something + + async def is_holding_something( + self, *, + extra: Optional[Dict[str, Any]] = None, + timeout: Optional[float] = None, + **kwargs + ) -> Gripper.HoldingStatus: + self.timeout = timeout + self.extra = extra + return Gripper.HoldingStatus(self.holding_something) async def stop(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs): self.is_stopped = True