简单测试
This commit is contained in:
@@ -0,0 +1,82 @@
|
|||||||
|
import time
|
||||||
|
import math
|
||||||
|
from drone_controller.qgc_router import QGCMissionReceiver
|
||||||
|
|
||||||
|
def gps_to_ned(lon, lat, alt, home_lon, home_lat):
|
||||||
|
"""
|
||||||
|
仅基于经纬度计算东向(E)和北向(N),忽略高度。
|
||||||
|
home_lon, home_lat: 原点经度、纬度
|
||||||
|
lon, lat: 目标点经度、纬度
|
||||||
|
返回 (E, N) 单位:米
|
||||||
|
"""
|
||||||
|
from pyproj import Transformer
|
||||||
|
# 1. 创建 WGS84 经纬度 -> ECEF 的转换器(高度固定为0)
|
||||||
|
transformer = Transformer.from_crs(
|
||||||
|
{"proj": 'latlong', "ellps": 'WGS84', "datum": 'WGS84'},
|
||||||
|
{"proj": 'geocent', "ellps": 'WGS84', "datum": 'WGS84'},
|
||||||
|
always_xy=True
|
||||||
|
)
|
||||||
|
|
||||||
|
# 2. 目标点和 home 点的 ECEF 坐标(alt=0)
|
||||||
|
x_t, y_t, z_t = transformer.transform(lon, lat, 0)
|
||||||
|
x_h, y_h, z_h = transformer.transform(home_lon, home_lat, 0)
|
||||||
|
|
||||||
|
# 3. 差值
|
||||||
|
dx, dy, dz = x_t - x_h, y_t - y_h, z_t - z_h
|
||||||
|
|
||||||
|
# 4. 旋转到 ENU(只取 E,N)
|
||||||
|
phi = math.radians(home_lat)
|
||||||
|
lam = math.radians(home_lon)
|
||||||
|
sin_phi = math.sin(phi)
|
||||||
|
cos_phi = math.cos(phi)
|
||||||
|
sin_lam = math.sin(lam)
|
||||||
|
cos_lam = math.cos(lam)
|
||||||
|
|
||||||
|
E = -sin_lam * dx + cos_lam * dy
|
||||||
|
N = -sin_phi * cos_lam * dx - sin_phi * sin_lam * dy + cos_phi * dz
|
||||||
|
U = -alt
|
||||||
|
|
||||||
|
return E, N, U
|
||||||
|
|
||||||
|
def main():
|
||||||
|
HOME_LAT = 34
|
||||||
|
HOME_LONG = 113
|
||||||
|
|
||||||
|
# 创建一个用于存放本地局部坐标的列表
|
||||||
|
points = []
|
||||||
|
|
||||||
|
qgc_receiver = QGCMissionReceiver(connection_str="udpin:0.0.0.0:14550", home_lat=HOME_LAT, home_lon=HOME_LONG)
|
||||||
|
qgc_receiver.start()
|
||||||
|
|
||||||
|
print("\n[MainLoop] 核心控制线程(线程2)启动,等待地面站下发任务...")
|
||||||
|
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
current_mission = qgc_receiver.get_waypoints()
|
||||||
|
|
||||||
|
if not current_mission:
|
||||||
|
# 列表为空,原地挂起
|
||||||
|
print('[MainLoop] 当前无航点任务...', end='\r')
|
||||||
|
time.sleep(1.0)
|
||||||
|
continue
|
||||||
|
|
||||||
|
print(f"\n[MianLoop] 检测到新航线任务! 包含{len(current_mission)} 个航点, 准备进行香橙派自动巡点飞行控制。。。")
|
||||||
|
|
||||||
|
for wp in current_mission:
|
||||||
|
y, x, z = gps_to_ned(*wp,home_lon=HOME_LONG, home_lat=HOME_LAT)
|
||||||
|
points.append({'x': x, 'y': y, 'z': z, 'yaw':0})
|
||||||
|
print(f"--> 状态机驱动:开始前往目标航点 #{wp['seq']} -> 本地坐标 NED: X={x:.2f}米, Y={y:.2f}米, Z={z:.2f}米")
|
||||||
|
|
||||||
|
time.sleep(3.0)
|
||||||
|
print(f"--> 航点 #{wp['seq']} 任务处理完毕!")
|
||||||
|
|
||||||
|
print("[MainLoop] 航线列表中所有航点全部执行闭环,任务完毕,开始清空队列...")
|
||||||
|
print(points)
|
||||||
|
qgc_receiver.clear_waypoints()
|
||||||
|
points.clear()
|
||||||
|
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
qgc_receiver.stop()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user