ai_project_v1/middleware/entity/up_osd_info_push.py

95 lines
2.2 KiB
Python
Raw Normal View History

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())