95 lines
2.2 KiB
Python
95 lines
2.2 KiB
Python
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()) |