From 0f873000df90cecadf00b510df83f7e7b9514197 Mon Sep 17 00:00:00 2001 From: randhid Date: Wed, 28 Jun 2023 12:26:12 -0400 Subject: [PATCH 1/3] Add my changes --- src/viam/components/gantry/client.py | 16 +++++++++- src/viam/components/gantry/gantry.py | 12 +++++++- src/viam/components/gantry/service.py | 18 +++++++++++- tests/mocks/components.py | 11 +++++++ tests/test_gantry.py | 42 ++++++++++++++++++++++----- 5 files changed, 88 insertions(+), 11 deletions(-) diff --git a/src/viam/components/gantry/client.py b/src/viam/components/gantry/client.py index 24ecf7832..4ebeaff9f 100644 --- a/src/viam/components/gantry/client.py +++ b/src/viam/components/gantry/client.py @@ -9,6 +9,8 @@ GetLengthsResponse, GetPositionRequest, GetPositionResponse, + HomeRequest, + HomeResponse, IsMovingRequest, IsMovingResponse, MoveToPositionRequest, @@ -40,15 +42,27 @@ async def get_position(self, *, extra: Optional[Dict[str, Any]] = None, timeout: async def move_to_position( self, positions: List[float], + speeds: List[float], *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, ): if extra is None: extra = {} - request = MoveToPositionRequest(name=self.name, positions_mm=positions, extra=dict_to_struct(extra)) + request = MoveToPositionRequest( + name=self.name, + positions_mm=positions, + speeds_mm_per_sec=speeds, + extra=dict_to_struct(extra)) await self.client.MoveToPosition(request, timeout=timeout) + async def home(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None) -> bool: + if extra is None: + extra = {} + request = HomeRequest(name=self.name, extra=dict_to_struct(extra)) + response : HomeResponse = await self.client.Home(request, timeout=timeout) + return response.homed + async def get_lengths(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None) -> List[float]: if extra is None: extra = {} diff --git a/src/viam/components/gantry/gantry.py b/src/viam/components/gantry/gantry.py index b1deeb01b..2f990c991 100644 --- a/src/viam/components/gantry/gantry.py +++ b/src/viam/components/gantry/gantry.py @@ -31,13 +31,14 @@ async def get_position(self, *, extra: Optional[Dict[str, Any]] = None, timeout: async def move_to_position( self, positions: List[float], + speeds: List[float], *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs, ): """ - Move the gantry to a new position. + Move the gantry to a new position at the requested speeds. Args: positions (List[float]): List of positions for the axes to move to, @@ -45,6 +46,15 @@ async def move_to_position( """ ... + @abc.abstractmethod + async def home(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> bool: + """ + Home the gantry to find it's starting and ending positions + + Returns: + bool : whether the gantry has run the homing sequence successfully + """ + @abc.abstractmethod async def get_lengths(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[float]: """ diff --git a/src/viam/components/gantry/service.py b/src/viam/components/gantry/service.py index f4e0bbd13..9960469e0 100644 --- a/src/viam/components/gantry/service.py +++ b/src/viam/components/gantry/service.py @@ -8,6 +8,8 @@ GetLengthsResponse, GetPositionRequest, GetPositionResponse, + HomeRequest, + HomeResponse, IsMovingRequest, IsMovingResponse, MoveToPositionRequest, @@ -45,11 +47,25 @@ async def MoveToPosition(self, stream: Stream[MoveToPositionRequest, MoveToPosit gantry = self.get_resource(name) timeout = stream.deadline.time_remaining() if stream.deadline else None await gantry.move_to_position( - list(request.positions_mm), extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata + list(request.positions_mm), + list(request.speeds_mm_per_sec), + extra=struct_to_dict(request.extra), + timeout=timeout, + metadata=stream.metadata ) response = MoveToPositionResponse() await stream.send_message(response) + async def Home(self, stream: Stream[HomeRequest, HomeResponse]) -> None: + request = await stream.recv_message() + assert request is not None + name = request.name + gantry = self.get_resource(name) + timeout = stream.deadline.time_remaining() if stream.deadline else None + homed = await gantry.home(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata) + response = HomeResponse(homed=homed) + await stream.send_message(response) + async def GetLengths(self, stream: Stream[GetLengthsRequest, GetLengthsResponse]) -> None: request = await stream.recv_message() assert request is not None diff --git a/tests/mocks/components.py b/tests/mocks/components.py index ef90fc257..de8c72ff3 100644 --- a/tests/mocks/components.py +++ b/tests/mocks/components.py @@ -439,6 +439,8 @@ def __init__(self, name: str, position: List[float], lengths: List[float]): self.lengths = lengths self.is_stopped = True self.extra = None + self.homed = True + self.speeds = Optional[List[float]] self.timeout: Optional[float] = None super().__init__(name) @@ -450,16 +452,25 @@ async def get_position(self, *, extra: Optional[Dict[str, Any]] = None, timeout: async def move_to_position( self, positions: List[float], + speeds: List[float], *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs, ): self.position = positions + self.speeds = speeds self.is_stopped = False self.extra = extra self.timeout = timeout + async def home(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> bool: + self.homed = True + self.extra = extra + self.timeout = timeout + print("called home") + return self.homed + async def get_lengths(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[float]: self.extra = extra self.timeout = timeout diff --git a/tests/test_gantry.py b/tests/test_gantry.py index e84e163dc..4a54d7008 100644 --- a/tests/test_gantry.py +++ b/tests/test_gantry.py @@ -12,6 +12,8 @@ GetLengthsResponse, GetPositionRequest, GetPositionResponse, + HomeRequest, + HomeResponse, IsMovingRequest, IsMovingResponse, MoveToPositionRequest, @@ -33,7 +35,7 @@ async def test_get_position(self): @pytest.mark.asyncio async def test_move_to_position(self): - await self.gantry.move_to_position([1, 8, 2]) + await self.gantry.move_to_position([1, 8, 2], [3, 9, 12]) assert self.gantry.position == [1, 8, 2] @pytest.mark.asyncio @@ -41,6 +43,11 @@ async def test_get_lengths(self): lengths = await self.gantry.get_lengths() assert lengths == [4, 5, 6] + @pytest.mark.asyncio + async def test_home(self): + homed = await self.gantry.home() + assert homed is True + @pytest.mark.asyncio async def test_do(self): command = {"command": "args"} @@ -55,14 +62,14 @@ async def test_stop(self): @pytest.mark.asyncio async def test_is_moving(self): - await self.gantry.move_to_position([1, 8, 2]) + await self.gantry.move_to_position([1, 8, 2], [3, 9, 12]) assert await self.gantry.is_moving() await self.gantry.stop() assert not await self.gantry.is_moving() @pytest.mark.asyncio async def test_status(self): - await self.gantry.move_to_position([1, 2, 3]) + await self.gantry.move_to_position([1, 2, 3], [4, 5, 6]) status = await create_status(self.gantry) assert status.name == MockGantry.get_resource_name(self.gantry.name) assert status.status == message_to_struct(GantryStatus(lengths_mm=[4, 5, 6], positions_mm=[1, 2, 3], is_moving=True)) @@ -71,7 +78,7 @@ async def test_status(self): async def test_extra(self): assert self.gantry.extra is None or len(self.gantry.extra) == 0 extra = {"foo": "bar", "baz": [1, 2, 3]} - await self.gantry.move_to_position([1, 2, 3], extra=extra) + await self.gantry.move_to_position([1, 2, 3], [4, 5, 6], extra=extra) assert self.gantry.extra == extra @pytest.mark.asyncio @@ -81,7 +88,7 @@ async def test_timeout(self): await self.gantry.get_position(timeout=5.5) assert self.gantry.timeout == loose_approx(5.5) - await self.gantry.move_to_position([1, 2, 3], timeout=1.82) + await self.gantry.move_to_position([1, 2, 3], [4, 5, 6], timeout=1.82) assert self.gantry.timeout == loose_approx(1.82) await self.gantry.get_lengths(timeout=7.86) @@ -111,9 +118,19 @@ async def test_get_position(self): async def test_move_to_position(self): async with ChannelFor([self.service]) as channel: client = GantryServiceStub(channel) - request = MoveToPositionRequest(name=self.gantry.name, positions_mm=[1, 8, 2]) + request = MoveToPositionRequest(name=self.gantry.name, positions_mm=[1, 8, 2], speeds_mm_per_sec=[3, 9, 12]) await client.MoveToPosition(request, timeout=18.2) assert self.gantry.position == [1, 8, 2] + assert self.gantry.speeds == [3, 9, 12] + assert self.gantry.timeout == loose_approx(18.2) + + @pytest.mark.asyncio + async def test_home(self): + async with ChannelFor([self.service]) as channel: + client = GantryServiceStub(channel) + request = HomeRequest(name=self.gantry.name) + response: HomeResponse = await client.Home(request, timeout=18.2) + assert response.homed is True assert self.gantry.timeout == loose_approx(18.2) @pytest.mark.asyncio @@ -193,10 +210,19 @@ async def test_get_position(self): async def test_move_to_position(self): async with ChannelFor([self.service]) as channel: client = GantryClient(self.gantry.name, channel) - await client.move_to_position([1, 8, 2], timeout=4.4) + await client.move_to_position([1, 8, 2], [3, 9, 12], timeout=4.4) assert self.gantry.position == [1, 8, 2] + assert self.gantry.speeds == [3, 9, 12] assert self.gantry.timeout == loose_approx(4.4) + @pytest.mark.asyncio + async def test_home(self): + async with ChannelFor([self.service]) as channel: + client = GantryClient(self.gantry.name, channel) + homed = await client.home(timeout=5.5) + assert homed is True + assert self.gantry.timeout == loose_approx(5.5) + @pytest.mark.asyncio async def test_get_lengths(self): async with ChannelFor([self.service]) as channel: @@ -236,5 +262,5 @@ async def test_extra(self): assert self.gantry.extra is None or len(self.gantry.extra) == 0 client = GantryClient(self.gantry.name, channel) extra = {"foo": "bar", "baz": [1, 2, 3]} - await client.move_to_position([1, 2, 3], extra=extra) + await client.move_to_position([1, 2, 3], [4, 5, 6], extra=extra) assert self.gantry.extra == extra From 726c04aeda879ecc581749e0a6b92e6ea8aa9fb0 Mon Sep 17 00:00:00 2001 From: randhid Date: Wed, 28 Jun 2023 12:31:29 -0400 Subject: [PATCH 2/3] Fix api --- .../gen/component/gantry/v1/gantry_grpc.py | 7 ++- .../gen/component/gantry/v1/gantry_pb2.py | 48 +++++++++++-------- .../gen/component/gantry/v1/gantry_pb2.pyi | 44 ++++++++++++++++- src/viam/proto/component/gantry/__init__.py | 4 ++ 4 files changed, 79 insertions(+), 24 deletions(-) diff --git a/src/viam/gen/component/gantry/v1/gantry_grpc.py b/src/viam/gen/component/gantry/v1/gantry_grpc.py index ffec5c07b..88822366d 100644 --- a/src/viam/gen/component/gantry/v1/gantry_grpc.py +++ b/src/viam/gen/component/gantry/v1/gantry_grpc.py @@ -19,6 +19,10 @@ async def GetPosition(self, stream: 'grpclib.server.Stream[component.gantry.v1.g async def MoveToPosition(self, stream: 'grpclib.server.Stream[component.gantry.v1.gantry_pb2.MoveToPositionRequest, component.gantry.v1.gantry_pb2.MoveToPositionResponse]') -> None: pass + @abc.abstractmethod + async def Home(self, stream: 'grpclib.server.Stream[component.gantry.v1.gantry_pb2.HomeRequest, component.gantry.v1.gantry_pb2.HomeResponse]') -> None: + pass + @abc.abstractmethod async def GetLengths(self, stream: 'grpclib.server.Stream[component.gantry.v1.gantry_pb2.GetLengthsRequest, component.gantry.v1.gantry_pb2.GetLengthsResponse]') -> None: pass @@ -40,13 +44,14 @@ async def GetGeometries(self, stream: 'grpclib.server.Stream[common.v1.common_pb pass def __mapping__(self) -> typing.Dict[str, grpclib.const.Handler]: - return {'/viam.component.gantry.v1.GantryService/GetPosition': grpclib.const.Handler(self.GetPosition, grpclib.const.Cardinality.UNARY_UNARY, component.gantry.v1.gantry_pb2.GetPositionRequest, component.gantry.v1.gantry_pb2.GetPositionResponse), '/viam.component.gantry.v1.GantryService/MoveToPosition': grpclib.const.Handler(self.MoveToPosition, grpclib.const.Cardinality.UNARY_UNARY, component.gantry.v1.gantry_pb2.MoveToPositionRequest, component.gantry.v1.gantry_pb2.MoveToPositionResponse), '/viam.component.gantry.v1.GantryService/GetLengths': grpclib.const.Handler(self.GetLengths, grpclib.const.Cardinality.UNARY_UNARY, component.gantry.v1.gantry_pb2.GetLengthsRequest, component.gantry.v1.gantry_pb2.GetLengthsResponse), '/viam.component.gantry.v1.GantryService/Stop': grpclib.const.Handler(self.Stop, grpclib.const.Cardinality.UNARY_UNARY, component.gantry.v1.gantry_pb2.StopRequest, component.gantry.v1.gantry_pb2.StopResponse), '/viam.component.gantry.v1.GantryService/IsMoving': grpclib.const.Handler(self.IsMoving, grpclib.const.Cardinality.UNARY_UNARY, component.gantry.v1.gantry_pb2.IsMovingRequest, component.gantry.v1.gantry_pb2.IsMovingResponse), '/viam.component.gantry.v1.GantryService/DoCommand': grpclib.const.Handler(self.DoCommand, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.DoCommandRequest, common.v1.common_pb2.DoCommandResponse), '/viam.component.gantry.v1.GantryService/GetGeometries': grpclib.const.Handler(self.GetGeometries, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.GetGeometriesRequest, common.v1.common_pb2.GetGeometriesResponse)} + return {'/viam.component.gantry.v1.GantryService/GetPosition': grpclib.const.Handler(self.GetPosition, grpclib.const.Cardinality.UNARY_UNARY, component.gantry.v1.gantry_pb2.GetPositionRequest, component.gantry.v1.gantry_pb2.GetPositionResponse), '/viam.component.gantry.v1.GantryService/MoveToPosition': grpclib.const.Handler(self.MoveToPosition, grpclib.const.Cardinality.UNARY_UNARY, component.gantry.v1.gantry_pb2.MoveToPositionRequest, component.gantry.v1.gantry_pb2.MoveToPositionResponse), '/viam.component.gantry.v1.GantryService/Home': grpclib.const.Handler(self.Home, grpclib.const.Cardinality.UNARY_UNARY, component.gantry.v1.gantry_pb2.HomeRequest, component.gantry.v1.gantry_pb2.HomeResponse), '/viam.component.gantry.v1.GantryService/GetLengths': grpclib.const.Handler(self.GetLengths, grpclib.const.Cardinality.UNARY_UNARY, component.gantry.v1.gantry_pb2.GetLengthsRequest, component.gantry.v1.gantry_pb2.GetLengthsResponse), '/viam.component.gantry.v1.GantryService/Stop': grpclib.const.Handler(self.Stop, grpclib.const.Cardinality.UNARY_UNARY, component.gantry.v1.gantry_pb2.StopRequest, component.gantry.v1.gantry_pb2.StopResponse), '/viam.component.gantry.v1.GantryService/IsMoving': grpclib.const.Handler(self.IsMoving, grpclib.const.Cardinality.UNARY_UNARY, component.gantry.v1.gantry_pb2.IsMovingRequest, component.gantry.v1.gantry_pb2.IsMovingResponse), '/viam.component.gantry.v1.GantryService/DoCommand': grpclib.const.Handler(self.DoCommand, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.DoCommandRequest, common.v1.common_pb2.DoCommandResponse), '/viam.component.gantry.v1.GantryService/GetGeometries': grpclib.const.Handler(self.GetGeometries, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.GetGeometriesRequest, common.v1.common_pb2.GetGeometriesResponse)} class GantryServiceStub: def __init__(self, channel: grpclib.client.Channel) -> None: self.GetPosition = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.gantry.v1.GantryService/GetPosition', component.gantry.v1.gantry_pb2.GetPositionRequest, component.gantry.v1.gantry_pb2.GetPositionResponse) self.MoveToPosition = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.gantry.v1.GantryService/MoveToPosition', component.gantry.v1.gantry_pb2.MoveToPositionRequest, component.gantry.v1.gantry_pb2.MoveToPositionResponse) + self.Home = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.gantry.v1.GantryService/Home', component.gantry.v1.gantry_pb2.HomeRequest, component.gantry.v1.gantry_pb2.HomeResponse) self.GetLengths = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.gantry.v1.GantryService/GetLengths', component.gantry.v1.gantry_pb2.GetLengthsRequest, component.gantry.v1.gantry_pb2.GetLengthsResponse) self.Stop = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.gantry.v1.GantryService/Stop', component.gantry.v1.gantry_pb2.StopRequest, component.gantry.v1.gantry_pb2.StopResponse) self.IsMoving = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.gantry.v1.GantryService/IsMoving', component.gantry.v1.gantry_pb2.IsMovingRequest, component.gantry.v1.gantry_pb2.IsMovingResponse) diff --git a/src/viam/gen/component/gantry/v1/gantry_pb2.py b/src/viam/gen/component/gantry/v1/gantry_pb2.py index 1ada227c6..3b44bf320 100644 --- a/src/viam/gen/component/gantry/v1/gantry_pb2.py +++ b/src/viam/gen/component/gantry/v1/gantry_pb2.py @@ -7,7 +7,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/gantry/v1/gantry.proto\x12\x18viam.component.gantry.v1\x1a\x16common/v1/common.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1cgoogle/protobuf/struct.proto"W\n\x12GetPositionRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"8\n\x13GetPositionResponse\x12!\n\x0cpositions_mm\x18\x01 \x03(\x01R\x0bpositionsMm"}\n\x15MoveToPositionRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12!\n\x0cpositions_mm\x18\x02 \x03(\x01R\x0bpositionsMm\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"\x18\n\x16MoveToPositionResponse"V\n\x11GetLengthsRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"3\n\x12GetLengthsResponse\x12\x1d\n\nlengths_mm\x18\x01 \x03(\x01R\tlengthsMm"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"g\n\x06Status\x12!\n\x0cpositions_mm\x18\x01 \x03(\x01R\x0bpositionsMm\x12\x1d\n\nlengths_mm\x18\x02 \x03(\x01R\tlengthsMm\x12\x1b\n\tis_moving\x18\x03 \x01(\x08R\x08isMoving"%\n\x0fIsMovingRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name"/\n\x10IsMovingResponse\x12\x1b\n\tis_moving\x18\x01 \x01(\x08R\x08isMoving2\xcf\x08\n\rGantryService\x12\xa1\x01\n\x0bGetPosition\x12,.viam.component.gantry.v1.GetPositionRequest\x1a-.viam.component.gantry.v1.GetPositionResponse"5\x82\xd3\xe4\x93\x02/\x12-/viam/api/v1/component/gantry/{name}/position\x12\xae\x01\n\x0eMoveToPosition\x12/.viam.component.gantry.v1.MoveToPositionRequest\x1a0.viam.component.gantry.v1.MoveToPositionResponse"9\xa0\x92)\x01\x82\xd3\xe4\x93\x02/\x1a-/viam/api/v1/component/gantry/{name}/position\x12\x9d\x01\n\nGetLengths\x12+.viam.component.gantry.v1.GetLengthsRequest\x1a,.viam.component.gantry.v1.GetLengthsResponse"4\x82\xd3\xe4\x93\x02.\x12,/viam/api/v1/component/gantry/{name}/lengths\x12\x88\x01\n\x04Stop\x12%.viam.component.gantry.v1.StopRequest\x1a&.viam.component.gantry.v1.StopResponse"1\x82\xd3\xe4\x93\x02+")/viam/api/v1/component/gantry/{name}/stop\x12\x99\x01\n\x08IsMoving\x12).viam.component.gantry.v1.IsMovingRequest\x1a*.viam.component.gantry.v1.IsMovingResponse"6\x82\xd3\xe4\x93\x020\x12./viam/api/v1/component/gantry/{name}/is_moving\x12\x89\x01\n\tDoCommand\x12 .viam.common.v1.DoCommandRequest\x1a!.viam.common.v1.DoCommandResponse"7\x82\xd3\xe4\x93\x021"//viam/api/v1/component/gantry/{name}/do_command\x12\x95\x01\n\rGetGeometries\x12$.viam.common.v1.GetGeometriesRequest\x1a%.viam.common.v1.GetGeometriesResponse"7\x82\xd3\xe4\x93\x021\x12//viam/api/v1/component/gantry/{name}/geometriesBC\n\x1ccom.viam.component.gantry.v1Z#go.viam.com/api/component/gantry/v1b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n component/gantry/v1/gantry.proto\x12\x18viam.component.gantry.v1\x1a\x16common/v1/common.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1cgoogle/protobuf/struct.proto"W\n\x12GetPositionRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"8\n\x13GetPositionResponse\x12!\n\x0cpositions_mm\x18\x01 \x03(\x01R\x0bpositionsMm"\xa8\x01\n\x15MoveToPositionRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12!\n\x0cpositions_mm\x18\x02 \x03(\x01R\x0bpositionsMm\x12)\n\x11speeds_mm_per_sec\x18\x03 \x03(\x01R\x0espeedsMmPerSec\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"\x18\n\x16MoveToPositionResponse"P\n\x0bHomeRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"$\n\x0cHomeResponse\x12\x14\n\x05homed\x18\x01 \x01(\x08R\x05homed"V\n\x11GetLengthsRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"3\n\x12GetLengthsResponse\x12\x1d\n\nlengths_mm\x18\x01 \x03(\x01R\tlengthsMm"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"g\n\x06Status\x12!\n\x0cpositions_mm\x18\x01 \x03(\x01R\x0bpositionsMm\x12\x1d\n\nlengths_mm\x18\x02 \x03(\x01R\tlengthsMm\x12\x1b\n\tis_moving\x18\x03 \x01(\x08R\x08isMoving"%\n\x0fIsMovingRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name"/\n\x10IsMovingResponse\x12\x1b\n\tis_moving\x18\x01 \x01(\x08R\x08isMoving2\xda\t\n\rGantryService\x12\xa1\x01\n\x0bGetPosition\x12,.viam.component.gantry.v1.GetPositionRequest\x1a-.viam.component.gantry.v1.GetPositionResponse"5\x82\xd3\xe4\x93\x02/\x12-/viam/api/v1/component/gantry/{name}/position\x12\xae\x01\n\x0eMoveToPosition\x12/.viam.component.gantry.v1.MoveToPositionRequest\x1a0.viam.component.gantry.v1.MoveToPositionResponse"9\xa0\x92)\x01\x82\xd3\xe4\x93\x02/\x1a-/viam/api/v1/component/gantry/{name}/position\x12\x88\x01\n\x04Home\x12%.viam.component.gantry.v1.HomeRequest\x1a&.viam.component.gantry.v1.HomeResponse"1\x82\xd3\xe4\x93\x02+\x1a)/viam/api/v1/component/gantry/{name}/home\x12\x9d\x01\n\nGetLengths\x12+.viam.component.gantry.v1.GetLengthsRequest\x1a,.viam.component.gantry.v1.GetLengthsResponse"4\x82\xd3\xe4\x93\x02.\x12,/viam/api/v1/component/gantry/{name}/lengths\x12\x88\x01\n\x04Stop\x12%.viam.component.gantry.v1.StopRequest\x1a&.viam.component.gantry.v1.StopResponse"1\x82\xd3\xe4\x93\x02+")/viam/api/v1/component/gantry/{name}/stop\x12\x99\x01\n\x08IsMoving\x12).viam.component.gantry.v1.IsMovingRequest\x1a*.viam.component.gantry.v1.IsMovingResponse"6\x82\xd3\xe4\x93\x020\x12./viam/api/v1/component/gantry/{name}/is_moving\x12\x89\x01\n\tDoCommand\x12 .viam.common.v1.DoCommandRequest\x1a!.viam.common.v1.DoCommandResponse"7\x82\xd3\xe4\x93\x021"//viam/api/v1/component/gantry/{name}/do_command\x12\x95\x01\n\rGetGeometries\x12$.viam.common.v1.GetGeometriesRequest\x1a%.viam.common.v1.GetGeometriesResponse"7\x82\xd3\xe4\x93\x021\x12//viam/api/v1/component/gantry/{name}/geometriesBC\n\x1ccom.viam.component.gantry.v1Z#go.viam.com/api/component/gantry/v1b\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'component.gantry.v1.gantry_pb2', globals()) if _descriptor._USE_C_DESCRIPTORS == False: @@ -17,6 +17,8 @@ _GANTRYSERVICE.methods_by_name['GetPosition']._serialized_options = b'\x82\xd3\xe4\x93\x02/\x12-/viam/api/v1/component/gantry/{name}/position' _GANTRYSERVICE.methods_by_name['MoveToPosition']._options = None _GANTRYSERVICE.methods_by_name['MoveToPosition']._serialized_options = b'\xa0\x92)\x01\x82\xd3\xe4\x93\x02/\x1a-/viam/api/v1/component/gantry/{name}/position' + _GANTRYSERVICE.methods_by_name['Home']._options = None + _GANTRYSERVICE.methods_by_name['Home']._serialized_options = b'\x82\xd3\xe4\x93\x02+\x1a)/viam/api/v1/component/gantry/{name}/home' _GANTRYSERVICE.methods_by_name['GetLengths']._options = None _GANTRYSERVICE.methods_by_name['GetLengths']._serialized_options = b'\x82\xd3\xe4\x93\x02.\x12,/viam/api/v1/component/gantry/{name}/lengths' _GANTRYSERVICE.methods_by_name['Stop']._options = None @@ -31,23 +33,27 @@ _GETPOSITIONREQUEST._serialized_end = 233 _GETPOSITIONRESPONSE._serialized_start = 235 _GETPOSITIONRESPONSE._serialized_end = 291 - _MOVETOPOSITIONREQUEST._serialized_start = 293 - _MOVETOPOSITIONREQUEST._serialized_end = 418 - _MOVETOPOSITIONRESPONSE._serialized_start = 420 - _MOVETOPOSITIONRESPONSE._serialized_end = 444 - _GETLENGTHSREQUEST._serialized_start = 446 - _GETLENGTHSREQUEST._serialized_end = 532 - _GETLENGTHSRESPONSE._serialized_start = 534 - _GETLENGTHSRESPONSE._serialized_end = 585 - _STOPREQUEST._serialized_start = 587 - _STOPREQUEST._serialized_end = 667 - _STOPRESPONSE._serialized_start = 669 - _STOPRESPONSE._serialized_end = 683 - _STATUS._serialized_start = 685 - _STATUS._serialized_end = 788 - _ISMOVINGREQUEST._serialized_start = 790 - _ISMOVINGREQUEST._serialized_end = 827 - _ISMOVINGRESPONSE._serialized_start = 829 - _ISMOVINGRESPONSE._serialized_end = 876 - _GANTRYSERVICE._serialized_start = 879 - _GANTRYSERVICE._serialized_end = 1982 \ No newline at end of file + _MOVETOPOSITIONREQUEST._serialized_start = 294 + _MOVETOPOSITIONREQUEST._serialized_end = 462 + _MOVETOPOSITIONRESPONSE._serialized_start = 464 + _MOVETOPOSITIONRESPONSE._serialized_end = 488 + _HOMEREQUEST._serialized_start = 490 + _HOMEREQUEST._serialized_end = 570 + _HOMERESPONSE._serialized_start = 572 + _HOMERESPONSE._serialized_end = 608 + _GETLENGTHSREQUEST._serialized_start = 610 + _GETLENGTHSREQUEST._serialized_end = 696 + _GETLENGTHSRESPONSE._serialized_start = 698 + _GETLENGTHSRESPONSE._serialized_end = 749 + _STOPREQUEST._serialized_start = 751 + _STOPREQUEST._serialized_end = 831 + _STOPRESPONSE._serialized_start = 833 + _STOPRESPONSE._serialized_end = 847 + _STATUS._serialized_start = 849 + _STATUS._serialized_end = 952 + _ISMOVINGREQUEST._serialized_start = 954 + _ISMOVINGREQUEST._serialized_end = 991 + _ISMOVINGRESPONSE._serialized_start = 993 + _ISMOVINGRESPONSE._serialized_end = 1040 + _GANTRYSERVICE._serialized_start = 1043 + _GANTRYSERVICE._serialized_end = 2285 \ No newline at end of file diff --git a/src/viam/gen/component/gantry/v1/gantry_pb2.pyi b/src/viam/gen/component/gantry/v1/gantry_pb2.pyi index 1b99f9dc1..d5c35047e 100644 --- a/src/viam/gen/component/gantry/v1/gantry_pb2.pyi +++ b/src/viam/gen/component/gantry/v1/gantry_pb2.pyi @@ -57,6 +57,7 @@ class MoveToPositionRequest(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor NAME_FIELD_NUMBER: builtins.int POSITIONS_MM_FIELD_NUMBER: builtins.int + SPEEDS_MM_PER_SEC_FIELD_NUMBER: builtins.int EXTRA_FIELD_NUMBER: builtins.int name: builtins.str @@ -64,17 +65,21 @@ class MoveToPositionRequest(google.protobuf.message.Message): def positions_mm(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.float]: """Number of millimeters to move the gantry by respective to each axis.""" + @property + def speeds_mm_per_sec(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.float]: + """Speeds to move each gantry axis must match length and order of positions_mm.""" + @property def extra(self) -> google.protobuf.struct_pb2.Struct: """Additional arguments to the method""" - def __init__(self, *, name: builtins.str=..., positions_mm: collections.abc.Iterable[builtins.float] | None=..., extra: google.protobuf.struct_pb2.Struct | None=...) -> None: + def __init__(self, *, name: builtins.str=..., positions_mm: collections.abc.Iterable[builtins.float] | None=..., speeds_mm_per_sec: collections.abc.Iterable[builtins.float] | None=..., extra: google.protobuf.struct_pb2.Struct | None=...) -> None: ... def HasField(self, field_name: typing_extensions.Literal['extra', b'extra']) -> builtins.bool: ... - def ClearField(self, field_name: typing_extensions.Literal['extra', b'extra', 'name', b'name', 'positions_mm', b'positions_mm']) -> None: + def ClearField(self, field_name: typing_extensions.Literal['extra', b'extra', 'name', b'name', 'positions_mm', b'positions_mm', 'speeds_mm_per_sec', b'speeds_mm_per_sec']) -> None: ... global___MoveToPositionRequest = MoveToPositionRequest @@ -86,6 +91,41 @@ class MoveToPositionResponse(google.protobuf.message.Message): ... global___MoveToPositionResponse = MoveToPositionResponse +@typing_extensions.final +class HomeRequest(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: + """Additional arguments to the method""" + + def __init__(self, *, name: builtins.str=..., extra: google.protobuf.struct_pb2.Struct | None=...) -> None: + ... + + def HasField(self, field_name: typing_extensions.Literal['extra', b'extra']) -> builtins.bool: + ... + + def ClearField(self, field_name: typing_extensions.Literal['extra', b'extra', 'name', b'name']) -> None: + ... +global___HomeRequest = HomeRequest + +@typing_extensions.final +class HomeResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + HOMED_FIELD_NUMBER: builtins.int + homed: builtins.bool + 'A bool describing whether the gantry has completed homing' + + def __init__(self, *, homed: builtins.bool=...) -> None: + ... + + def ClearField(self, field_name: typing_extensions.Literal['homed', b'homed']) -> None: + ... +global___HomeResponse = HomeResponse + @typing_extensions.final class GetLengthsRequest(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/src/viam/proto/component/gantry/__init__.py b/src/viam/proto/component/gantry/__init__.py index 742c8b1cc..460886978 100644 --- a/src/viam/proto/component/gantry/__init__.py +++ b/src/viam/proto/component/gantry/__init__.py @@ -8,6 +8,8 @@ GetLengthsResponse, GetPositionRequest, GetPositionResponse, + HomeRequest, + HomeResponse, IsMovingRequest, IsMovingResponse, MoveToPositionRequest, @@ -24,6 +26,8 @@ "GetLengthsResponse", "GetPositionRequest", "GetPositionResponse", + "HomeRequest", + "HomeResponse", "IsMovingRequest", "IsMovingResponse", "MoveToPositionRequest", From d940d566c4e73b7af9c8f8a3eb30ffceced18f5b Mon Sep 17 00:00:00 2001 From: randhid Date: Wed, 28 Jun 2023 12:38:28 -0400 Subject: [PATCH 3/3] Add back example gantry --- examples/server/v1/components.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/server/v1/components.py b/examples/server/v1/components.py index 62734612a..4d7ce438f 100644 --- a/examples/server/v1/components.py +++ b/examples/server/v1/components.py @@ -472,6 +472,7 @@ async def get_position(self, extra: Optional[Dict[str, Any]] = None, **kwargs) - async def move_to_position( self, positions: List[float], + speeds: List[float], extra: Optional[Dict[str, Any]] = None, **kwargs, ): @@ -481,6 +482,9 @@ async def move_to_position( async def get_lengths(self, extra: Optional[Dict[str, Any]] = None, **kwargs) -> List[float]: return self.lengths + async def home(self, extra: Optional[Dict[str, Any]] = None, **kwargs) -> bool: + return True + async def stop(self, extra: Optional[Dict[str, Any]] = None, **kwargs): self.is_stopped = True