Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions examples/server/v1/components.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
from viam.components.camera import Camera
from viam.components.encoder import Encoder
from viam.components.gantry import Gantry
from viam.components.gripper import Gripper
from viam.components.gripper import Gripper, HoldingStatus
from viam.components.input import Control, ControlFunction, Controller, Event, EventType
from viam.components.motor import Motor
from viam.components.movement_sensor import MovementSensor
Expand Down Expand Up @@ -513,17 +513,23 @@ 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) -> HoldingStatus:
return HoldingStatus(self.holding_something)

async def stop(self, extra: Optional[Dict[str, Any]] = None, **kwargs):
self.is_stopped = True
Expand Down
2 changes: 1 addition & 1 deletion src/viam/components/gripper/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from viam.resource.registry import Registry, ResourceRegistration

from .client import GripperClient
from .gripper import Gripper
from .gripper import Gripper, HoldingStatus
from .service import GripperRPCService

__all__ = [
Expand Down
16 changes: 15 additions & 1 deletion src/viam/components/gripper/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@
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

from . import KinematicsFileFormat
from .gripper import Gripper
from .gripper import Gripper, HoldingStatus


class GripperClient(Gripper, ReconfigurableResourceRPCClientBase):
Expand Down Expand Up @@ -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
) -> 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 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)
Expand Down
32 changes: 32 additions & 0 deletions src/viam/components/gripper/gripper.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import abc
from dataclasses import dataclass
from typing import Any, Dict, Final, Optional, Tuple

from viam.components.component_base import ComponentBase
from viam.resource.types import API, RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT

from . import KinematicsFileFormat

@dataclass
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we move this inside of Gripper? that way this class is Gripper.HoldingStatus?

I don't think this class makes sense outside the context of a gripper

class HoldingStatus:
is_holding_something: bool
meta: Optional[Dict[str, Any]] = None

class Gripper(ComponentBase):
"""
Expand Down Expand Up @@ -73,6 +78,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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(q) naively, is_holding_something is the only thing I care about here and I don't understand what the meta field does at all, so this looks to me like we're just asking for an extra step to get the relevant information. Can you clarify what the meta field in a HoldingStatus actually is?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll add a comment, but it's something eliot specifically asked for here: https://docs.google.com/document/d/1N1TRTOMww_4NUNDVbeeWg9raNpSK0Srb16kG4R2qYks/edit?disco=AAABlaa3cpE

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤷 okay fair enough!


Returns:
HoldingStatus: see documentation on `HoldingStatus` for more information

For more information, see `Gripper component <https://docs.viam.com/dev/reference/apis/components/gripper/#grab>`_.

"""

@abc.abstractmethod
async def stop(
self,
Expand Down
12 changes: 12 additions & 0 deletions src/viam/components/gripper/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
10 changes: 9 additions & 1 deletion src/viam/gen/component/gripper/v1/gripper_grpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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):

Expand All @@ -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)

Expand All @@ -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)
12 changes: 9 additions & 3 deletions src/viam/gen/component/gripper/v1/gripper_pb2.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
Expand All @@ -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
_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
Loading
Loading