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