Skip to content

Commit 7c7dd12

Browse files
committed
Add support for publishing telemetry
1 parent cb4610b commit 7c7dd12

File tree

2 files changed

+60
-1
lines changed

2 files changed

+60
-1
lines changed

src/isar_turtlebot/robotinterface.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import os
22
from pathlib import Path
3-
from typing import Sequence
3+
from queue import Queue
4+
from threading import Thread
5+
from typing import List, Sequence
46

57
from alitra import MapAlignment, Transform, align_maps
68
from robot_interface.models.initialize import InitializeParams
79
from robot_interface.models.inspection.inspection import Inspection
810
from robot_interface.models.mission import InspectionStep, Step, StepStatus
911
from robot_interface.robot_interface import RobotInterface
12+
from robot_interface.telemetry.mqtt_client import MqttTelemetryPublisher
1013

1114
from isar_turtlebot.ros_bridge.ros_bridge import RosBridge, RosBridgeInterface
1215
from isar_turtlebot.turtlebot import Turtlebot
@@ -41,3 +44,38 @@ def get_inspections(self, step: InspectionStep) -> Sequence[Inspection]:
4144
def initialize(self, params: InitializeParams) -> None:
4245
if params.initial_pose:
4346
self.turtlebot.set_initial_pose(params.initial_pose)
47+
48+
def get_telemetry_publishers(self, queue: Queue, robot_id: str) -> List[Thread]:
49+
publisher_threads: List[Thread] = []
50+
51+
pose_publisher: MqttTelemetryPublisher = MqttTelemetryPublisher(
52+
mqtt_queue=queue,
53+
telemetry_method=self.turtlebot.get_pose_telemetry,
54+
topic=f"isar/{robot_id}/pose",
55+
interval=1,
56+
retain=True,
57+
)
58+
pose_thread: Thread = Thread(
59+
target=pose_publisher.run,
60+
args=[robot_id],
61+
name="ISAR Turtlebot Pose Publisher",
62+
daemon=True,
63+
)
64+
publisher_threads.append(pose_thread)
65+
66+
battery_publisher: MqttTelemetryPublisher = MqttTelemetryPublisher(
67+
mqtt_queue=queue,
68+
telemetry_method=self.turtlebot.get_battery_telemetry,
69+
topic=f"isar/{robot_id}/battery",
70+
interval=1,
71+
retain=True,
72+
)
73+
battery_thread: Thread = Thread(
74+
target=battery_publisher.run,
75+
args=[robot_id],
76+
name="ISAR Turtlebot Battery Publisher",
77+
daemon=True,
78+
)
79+
publisher_threads.append(battery_thread)
80+
81+
return publisher_threads

src/isar_turtlebot/turtlebot/turtlebot.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import json
12
import logging
3+
from datetime import datetime
24
from logging import Logger
35
from pathlib import Path
46
from typing import Optional, Sequence
@@ -11,6 +13,11 @@
1113
)
1214
from robot_interface.models.inspection.inspection import Inspection
1315
from robot_interface.models.mission import InspectionStep, Step, StepStatus
16+
from robot_interface.telemetry.payloads import (
17+
TelemetryBatteryPayload,
18+
TelemetryPosePayload,
19+
)
20+
from robot_interface.utilities.json_service import EnhancedJSONEncoder
1421

1522
from isar_turtlebot.models.turtlebot_status import Status
1623
from isar_turtlebot.ros_bridge import RosBridge
@@ -86,3 +93,17 @@ def _read_data(self, inspection_id: UUID) -> bytes:
8693

8794
def set_initial_pose(self, pose: Pose) -> None:
8895
self.bridge.initial_pose.publish(encode_initial_pose(pose=pose))
96+
97+
def get_pose_telemetry(self, robot_id: str) -> str:
98+
pose_payload: TelemetryPosePayload = TelemetryPosePayload(
99+
pose=self.bridge.pose.get_value(),
100+
robot_id=robot_id,
101+
timestamp=datetime.utcnow(),
102+
)
103+
return json.dumps(pose_payload, cls=EnhancedJSONEncoder)
104+
105+
def get_battery_telemetry(self, robot_id: str) -> str:
106+
battery_payload: TelemetryBatteryPayload = TelemetryBatteryPayload(
107+
battery_level=95.2, robot_id=robot_id, timestamp=datetime.utcnow()
108+
)
109+
return json.dumps(battery_payload, cls=EnhancedJSONEncoder)

0 commit comments

Comments
 (0)