feat: MQTT bridge for iOS GPS on /saltybot/ios/gps (Issue #681) #723

Merged
sl-jetson merged 2 commits from sl-jetson/issue-681-ios-gps-bridge into main 2026-04-04 11:21:15 -04:00
Showing only changes of commit fbc88f5c2a - Show all commits

View File

@ -164,8 +164,8 @@ class MqttRos2BridgeNode(Node):
self._mqtt_connect()
self.get_logger().info(
"MQTT→ROS2 bridge started — broker=%s:%d use_phone_ts=%s",
p["mqtt_host"], p["mqtt_port"], p["use_phone_timestamp"],
f"MQTT→ROS2 bridge started — broker={p['mqtt_host']}:{p['mqtt_port']}"
f" use_phone_ts={p['use_phone_ts']}"
)
# ── Param helper ─────────────────────────────────────────────────────────
@ -197,7 +197,7 @@ class MqttRos2BridgeNode(Node):
)
self._mqtt.loop_start()
except Exception as e:
self.get_logger().warning("MQTT initial connect error: %s", str(e))
self.get_logger().warning(f"MQTT initial connect error: {e}")
def _on_mqtt_connect(self, client, userdata, flags, rc) -> None:
if rc == 0:
@ -206,17 +206,17 @@ class MqttRos2BridgeNode(Node):
for topic in (_TOPIC_IMU, _TOPIC_GPS, _TOPIC_BATTERY, _TOPIC_IOS_GPS):
client.subscribe(topic, qos=0)
self.get_logger().info(
"MQTT connected to %s:%d — subscribed to 4 phone topics",
self._p["mqtt_host"], self._p["mqtt_port"],
f"MQTT connected to {self._p['mqtt_host']}:{self._p['mqtt_port']}"
" — subscribed to 4 phone topics"
)
else:
self.get_logger().warning("MQTT connect failed rc=%d", rc)
self.get_logger().warning(f"MQTT connect failed rc={rc}")
def _on_mqtt_disconnect(self, client, userdata, rc) -> None:
self._mqtt_connected = False
if rc != 0:
self.get_logger().warning(
"MQTT disconnected (rc=%d) — paho will reconnect", rc
f"MQTT disconnected (rc={rc}) — paho will reconnect"
)
def _on_mqtt_message(self, client, userdata, message) -> None:
@ -228,7 +228,7 @@ class MqttRos2BridgeNode(Node):
try:
self._q.put_nowait((topic, message.payload))
except queue.Full:
self.get_logger().debug("MQTT queue full — dropping %s", topic)
self.get_logger().debug(f"MQTT queue full — dropping {topic}")
# ── Queue drain (ROS2 executor thread) ────────────────────────────────────
@ -248,7 +248,7 @@ class MqttRos2BridgeNode(Node):
self._err_count.get(topic, {}) # just access
if topic in self._err_count:
self._err_count[topic] += 1
self.get_logger().debug("JSON decode error on %s: %s", topic, e)
self.get_logger().debug(f"JSON decode error on {topic}: {e}")
return
try:
@ -263,7 +263,7 @@ class MqttRos2BridgeNode(Node):
except (KeyError, TypeError, ValueError) as e:
if topic in self._err_count:
self._err_count[topic] += 1
self.get_logger().debug("Payload error on %s: %s%s", topic, e, data)
self.get_logger().debug(f"Payload error on {topic}: {e}{data}")
# ── Timestamp helper ──────────────────────────────────────────────────────
@ -285,8 +285,7 @@ class MqttRos2BridgeNode(Node):
drift = abs(now_epoch - phone_ts)
if drift > self._p["warn_drift_s"]:
self.get_logger().warning(
"Phone clock drift %.2f s (frame_id=%s) — using ROS2 clock",
drift, frame_id,
f"Phone clock drift {drift:.2f} s (frame_id={frame_id}) — using ROS2 clock"
)
hdr.stamp = self.get_clock().now().to_msg()
else: