Skip to content

Commit 75ab8e5

Browse files
RSDK-6121: Implement getAccuracy (#515)
1 parent 8523f14 commit 75ab8e5

File tree

5 files changed

+38
-17
lines changed

5 files changed

+38
-17
lines changed

src/viam/components/movement_sensor/client.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from viam.proto.common import DoCommandRequest, DoCommandResponse, Geometry, GetReadingsRequest, GetReadingsResponse
77
from viam.proto.component.movementsensor import (
88
GetAccuracyRequest,
9-
GetAccuracyResponse,
109
GetAngularVelocityRequest,
1110
GetAngularVelocityResponse,
1211
GetCompassHeadingRequest,
@@ -134,12 +133,11 @@ async def get_accuracy(
134133
extra: Optional[Dict[str, Any]] = None,
135134
timeout: Optional[float] = None,
136135
**__,
137-
) -> Mapping[str, float]:
136+
) -> MovementSensor.Accuracy:
138137
if extra is None:
139138
extra = {}
140139
request = GetAccuracyRequest(name=self.name, extra=dict_to_struct(extra))
141-
response: GetAccuracyResponse = await self.client.GetAccuracy(request, timeout=timeout)
142-
return response.accuracy
140+
return await self.client.GetAccuracy(request, timeout=timeout)
143141

144142
async def get_readings(
145143
self,

src/viam/components/movement_sensor/movement_sensor.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
import abc
22
from dataclasses import dataclass
3+
import sys
34
from typing import Any, Dict, Final, Mapping, Optional, Tuple
45

56
from typing_extensions import Self
67

78
from viam.components.component_base import ComponentBase
8-
from viam.proto.component.movementsensor import GetPropertiesResponse
9+
from viam.proto.component.movementsensor import GetPropertiesResponse, GetAccuracyResponse
910
from viam.resource.types import RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, Subtype
1011
from viam.utils import SensorReading
1112

1213
from . import GeoPoint, Orientation, Vector3
1314

15+
if sys.version_info >= (3, 10):
16+
from typing import TypeAlias
17+
else:
18+
from typing_extensions import TypeAlias
19+
1420

1521
class MovementSensor(ComponentBase):
1622
"""MovementSensor reports information about the robot's direction, position and speed.
@@ -23,6 +29,8 @@ class MovementSensor(ComponentBase):
2329
RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, "movement_sensor"
2430
)
2531

32+
Accuracy: "TypeAlias" = GetAccuracyResponse
33+
2634
@dataclass
2735
class Properties:
2836
linear_acceleration_supported: bool
@@ -124,11 +132,11 @@ async def get_properties(self, *, extra: Optional[Dict[str, Any]] = None, timeou
124132
@abc.abstractmethod
125133
async def get_accuracy(
126134
self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs
127-
) -> Mapping[str, float]:
135+
) -> Accuracy:
128136
"""Get the accuracy of the various sensors
129137
130138
Returns:
131-
Dict[str, float]: The accuracy
139+
MovementSensor.Accuracy: The accuracies of the movement sensor
132140
"""
133141
...
134142

src/viam/components/movement_sensor/service.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,7 @@ async def GetAccuracy(self, stream: Stream[GetAccuracyRequest, GetAccuracyRespon
115115
sensor = self.get_resource(name)
116116
timeout = stream.deadline.time_remaining() if stream.deadline else None
117117
accuracy = await sensor.get_accuracy(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
118-
response = GetAccuracyResponse(accuracy=accuracy)
119-
await stream.send_message(response)
118+
await stream.send_message(accuracy)
120119

121120
async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None:
122121
request = await stream.recv_message()

tests/mocks/components.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,7 @@ def __init__(
810810
heading: float,
811811
orientation: Orientation,
812812
properties: MovementSensor.Properties,
813-
accuracy: Mapping[str, float],
813+
accuracy: MovementSensor.Accuracy,
814814
readings: Mapping[str, float],
815815
):
816816
super().__init__(name)
@@ -871,7 +871,7 @@ async def get_properties(
871871

872872
async def get_accuracy(
873873
self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs
874-
) -> Mapping[str, float]:
874+
) -> MovementSensor.Accuracy:
875875
self.extra = extra
876876
self.timeout = timeout
877877
return self.accuracy

tests/test_movement_sensor.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,13 @@
5454
position_supported=True,
5555
compass_heading_supported=False,
5656
)
57-
ACCURACY = {"foo": 0.1, "bar": 2, "baz": 3.14}
57+
ACCURACY = MovementSensor.Accuracy(
58+
accuracy={"foo": 0.1, "bar": 2, "baz": 3.14},
59+
position_hdop=0.0,
60+
position_vdop=0.0,
61+
position_nmea_gga_fix=0,
62+
compass_degrees_error=0.0,
63+
)
5864
EXTRA_PARAMS = {"foo": "bar", "baz": [1, 2, 3]}
5965
READINGS = {"a": 1, "b": 2, "c": 3}
6066

@@ -143,7 +149,11 @@ async def test_get_properties(self, movement_sensor: MockMovementSensor):
143149
async def test_get_accuracy(self, movement_sensor: MockMovementSensor):
144150
assert movement_sensor.extra is None
145151
value = await movement_sensor.get_accuracy(extra=EXTRA_PARAMS)
146-
assert value == ACCURACY
152+
assert value.accuracy == pytest.approx(ACCURACY.accuracy)
153+
assert value.position_hdop == pytest.approx(ACCURACY.position_hdop)
154+
assert value.position_vdop == pytest.approx(ACCURACY.position_vdop)
155+
assert value.position_nmea_gga_fix == pytest.approx(ACCURACY.position_nmea_gga_fix)
156+
assert value.compass_degrees_error == pytest.approx(ACCURACY.compass_degrees_error)
147157
assert movement_sensor.extra == EXTRA_PARAMS
148158

149159
@pytest.mark.asyncio
@@ -280,8 +290,11 @@ async def test_get_accuracy(self, movement_sensor: MockMovementSensor, service:
280290
request = GetAccuracyRequest(name=movement_sensor.name, extra=dict_to_struct(EXTRA_PARAMS))
281291
assert movement_sensor.extra is None
282292
response: GetAccuracyResponse = await client.GetAccuracy(request, timeout=7.89)
283-
assert response.accuracy == pytest.approx(ACCURACY)
284-
assert movement_sensor.extra == EXTRA_PARAMS
293+
assert response.accuracy == pytest.approx(ACCURACY.accuracy)
294+
assert response.position_hdop == pytest.approx(ACCURACY.position_hdop)
295+
assert response.position_vdop == pytest.approx(ACCURACY.position_vdop)
296+
assert response.position_nmea_gga_fix == pytest.approx(ACCURACY.position_nmea_gga_fix)
297+
assert response.compass_degrees_error == pytest.approx(ACCURACY.compass_degrees_error)
285298
assert movement_sensor.timeout == loose_approx(7.89)
286299

287300
@pytest.mark.asyncio
@@ -392,8 +405,11 @@ async def test_get_accuracy(self, movement_sensor: MockMovementSensor, service:
392405
client = MovementSensorClient(movement_sensor.name, channel)
393406
assert movement_sensor.extra is None
394407
value = await client.get_accuracy(extra=EXTRA_PARAMS, timeout=7.89)
395-
assert value == pytest.approx(ACCURACY)
396-
assert movement_sensor.extra == EXTRA_PARAMS
408+
assert value.accuracy == pytest.approx(ACCURACY.accuracy)
409+
assert value.position_hdop == pytest.approx(ACCURACY.position_hdop)
410+
assert value.position_vdop == pytest.approx(ACCURACY.position_vdop)
411+
assert value.position_nmea_gga_fix == pytest.approx(ACCURACY.position_nmea_gga_fix)
412+
assert value.compass_degrees_error == pytest.approx(ACCURACY.compass_degrees_error)
397413
assert movement_sensor.timeout == loose_approx(7.89)
398414

399415
@pytest.mark.asyncio

0 commit comments

Comments
 (0)