from dataclasses import dataclass import json from typing import Optional import asyncio @dataclass class OSDInfo: attitude_head: float elevation: float gimbal_pitch: float gimbal_roll: float gimbal_yaw: float height: float home_distance: float horizontal_speed: float latitude: float longitude: float speed_x: float speed_y: float speed_z: float ultrasonic_height: float vertical_speed: float wind_direction: float wind_speed: float @dataclass class OSDMessage: data: OSDInfo method: str seq: int timestamp: int def parse_osd_message(json_str: Optional[str]) -> Optional[OSDMessage]: if not json_str: return None try: data=json_str osd_info = OSDInfo(**data["data"]) return OSDMessage( data=osd_info, method=data["method"], seq=data["seq"], timestamp=data["timestamp"] ) except Exception as e: print(f"Error parsing OSD message: {e}") return None async def main(): # 这里应该是获取latest_osd_info的实际逻辑 latest_osd_info = '''{ "data": { "attitude_head": -31.6, "elevation": 100.5, "gimbal_pitch": -46.9, "gimbal_roll": 0, "gimbal_yaw": -31.507293194051584, "height": 581.8057861328125, "home_distance": 0.045968499034643173, "horizontal_speed": 0, "latitude": 30.762902409980541, "longitude": 103.99185861184533, "speed_x": 0, "speed_y": 0, "speed_z": 0, "ultrasonic_height": -1, "vertical_speed": -0, "wind_direction": 5, "wind_speed": 33 }, "method": "osd_info_push", "seq": 257050, "timestamp": 1754910838301 }''' message = parse_osd_message(latest_osd_info) if message: print(f"Latitude: {message.data.latitude}") else: print("Failed to parse OSD message") if __name__ == '__main__': # 设置Windows兼容事件循环(如果需要) try: asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) except: pass asyncio.run(main())