2.8.2 grid mission

master
ken910606 3 weeks ago
parent 3cede3aeca
commit 4d0d1366ac

@ -277,7 +277,7 @@ class ControlStationUI(QMainWindow):
# ================================================================================ # ================================================================================
self.mission_planner = FormationPlanner( self.mission_planner = FormationPlanner(
spacing=5.0, # 5 公尺間距 spacing=5.0, # 5 公尺間距
base_altitude=10.0, # 基準高度 10 公尺 base_altitude=25.0, # 基準高度 25 公尺
altitude_diff=2.0 # 高低差 2 公尺 altitude_diff=2.0 # 高低差 2 公尺
) )
# ================================================================================ # ================================================================================
@ -1146,7 +1146,7 @@ class ControlStationUI(QMainWindow):
def handle_takeoff(self, drone_id): def handle_takeoff(self, drone_id):
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
future = self.monitor.takeoff_drone(drone_id, 10.0) future = self.monitor.takeoff_drone(drone_id, 25.0)
loop.create_task(self.handle_service_response(future, f"起飛 {drone_id}")) loop.create_task(self.handle_service_response(future, f"起飛 {drone_id}"))
def handle_setpoint_selected(self): def handle_setpoint_selected(self):
@ -1231,7 +1231,7 @@ class ControlStationUI(QMainWindow):
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
for drone_id in selected: for drone_id in selected:
future = self.monitor.takeoff_drone(drone_id, 10.0) future = self.monitor.takeoff_drone(drone_id, 25.0)
loop.create_task(self.handle_service_response(future, f"批次起飛 {drone_id}")) loop.create_task(self.handle_service_response(future, f"批次起飛 {drone_id}"))
# ================================================================================ # ================================================================================
@ -2313,7 +2313,7 @@ class ControlStationUI(QMainWindow):
_log("INFO", f"地圖點擊: {lat:.6f}, {lon:.6f} -> Group {group.group_id} ({group.mission_type})") _log("INFO", f"地圖點擊: {lat:.6f}, {lon:.6f} -> Group {group.group_id} ({group.mission_type})")
panel = self.group_panels.get(group.group_id) panel = self.group_panels.get(group.group_id)
params = panel.get_mission_params() if panel else {} params = panel.get_mission_params() if panel else {}
base_alt = params.get('base_altitude', params.get('altitude', 10.0)) base_alt = params.get('base_altitude', params.get('altitude', 25.0))
target_gps = (lat, lon, base_alt) target_gps = (lat, lon, base_alt)
self.statusBar().showMessage( self.statusBar().showMessage(
f"Group {group.group_id}: 正在規劃 {group.mission_type} ({len(selected_drones)} 台)", 2000) f"Group {group.group_id}: 正在規劃 {group.mission_type} ({len(selected_drones)} 台)", 2000)
@ -2365,7 +2365,7 @@ class ControlStationUI(QMainWindow):
panel = self.group_panels.get(group.group_id) panel = self.group_panels.get(group.group_id)
params = panel.get_mission_params() if panel else {} params = panel.get_mission_params() if panel else {}
base_alt = params.get('altitude', 10.0) base_alt = params.get('altitude', 25.0)
self.statusBar().showMessage( self.statusBar().showMessage(
f"Group {group.group_id}: 正在規劃 Grid Sweep ({len(selected_drones)} 台)", 2000) f"Group {group.group_id}: 正在規劃 Grid Sweep ({len(selected_drones)} 台)", 2000)
drone_gps_positions = self._collect_drone_gps(selected_drones) drone_gps_positions = self._collect_drone_gps(selected_drones)
@ -2426,7 +2426,7 @@ class ControlStationUI(QMainWindow):
panel = self.group_panels.get(group.group_id) panel = self.group_panels.get(group.group_id)
params = panel.get_mission_params() if panel else {} params = panel.get_mission_params() if panel else {}
base_alt = params.get('altitude', 10.0) base_alt = params.get('altitude', 25.0)
self.statusBar().showMessage( self.statusBar().showMessage(
f"Group {group.group_id}: 正在規劃跟隨模式 ({len(selected_drones)} 台)", 2000) f"Group {group.group_id}: 正在規劃跟隨模式 ({len(selected_drones)} 台)", 2000)

@ -24,10 +24,10 @@ GROUP_COLORS = [
DEFAULT_MISSION_PARAM_VALUES = { DEFAULT_MISSION_PARAM_VALUES = {
'spacing': '5.0', 'spacing': '5.0',
'base_altitude': '10.0', 'base_altitude': '25.0',
'altitude_diff': '2.0', 'altitude_diff': '2.0',
'radius': '10.0', 'radius': '10.0',
'altitude': '10.0', 'altitude': '25.0',
'start_angle': '0', 'start_angle': '0',
'lateral_offset': '3.0', 'lateral_offset': '3.0',
'longitudinal_spacing': '5.0', 'longitudinal_spacing': '5.0',
@ -249,8 +249,8 @@ class GroupPanel(QWidget):
takeoff_row.setSpacing(3) takeoff_row.setSpacing(3)
self.alt_input = QComboBox() self.alt_input = QComboBox()
self.alt_input.setEditable(True) self.alt_input.setEditable(True)
self.alt_input.addItems(["5", "10", "15", "20"]) self.alt_input.addItems(["5", "10", "15", "20", "25"])
self.alt_input.setCurrentText("10") self.alt_input.setCurrentText("25")
self.alt_input.setStyleSheet(COMBO) self.alt_input.setStyleSheet(COMBO)
alt_lbl = QLabel("m") alt_lbl = QLabel("m")
alt_lbl.setStyleSheet(LBL) alt_lbl.setStyleSheet(LBL)
@ -679,5 +679,5 @@ class GroupPanel(QWidget):
try: try:
alt = float(self.alt_input.currentText()) alt = float(self.alt_input.currentText())
except ValueError: except ValueError:
alt = 10.0 alt = 25.0
self.takeoff_requested.emit(self.group.group_id, alt) self.takeoff_requested.emit(self.group.group_id, alt)

@ -67,7 +67,7 @@ DEFAULT_REPLAN_CAP_SEC = 1.0 # 重算週期上限 (s)
DEFAULT_CIRCLE_RADIUS = 10.0 # 包圍半徑 (m) DEFAULT_CIRCLE_RADIUS = 10.0 # 包圍半徑 (m)
DEFAULT_LON_SPACING = 5.0 # 隊形縱向間距 (m) DEFAULT_LON_SPACING = 5.0 # 隊形縱向間距 (m)
DEFAULT_LAT_OFFSET = 3.0 # 隊形橫向錯開 (m) DEFAULT_LAT_OFFSET = 3.0 # 隊形橫向錯開 (m)
DEFAULT_FORMATION_ALT = 10.0 # 隊形基準高度 (m相對 home) DEFAULT_FORMATION_ALT = 25.0 # 隊形基準高度 (m相對 home)
DEFAULT_ALT_LAYER_GAP = 6.0 # A/B 上下層垂直間隔 (m)A=基準+gap/2、B=基準-gap/2 DEFAULT_ALT_LAYER_GAP = 6.0 # A/B 上下層垂直間隔 (m)A=基準+gap/2、B=基準-gap/2
DEFAULT_MIN_ALT_FLOOR = 5.0 # 相對 home 的最低安全高度 (m)B 下層不得低於此值 DEFAULT_MIN_ALT_FLOOR = 5.0 # 相對 home 的最低安全高度 (m)B 下層不得低於此值
DEFAULT_LEAD_TIME_CAP = 4.0 # 前置攔截 lead_time 上限 (s) DEFAULT_LEAD_TIME_CAP = 4.0 # 前置攔截 lead_time 上限 (s)

@ -58,7 +58,7 @@ class FormationPlanner:
"""隊形規劃器""" """隊形規劃器"""
def __init__(self, spacing: float = 5.0, def __init__(self, spacing: float = 5.0,
base_altitude: float = 10.0, base_altitude: float = 25.0,
altitude_diff: float = 2.0): altitude_diff: float = 2.0):
self.spacing = spacing self.spacing = spacing
self.base_altitude = base_altitude self.base_altitude = base_altitude
@ -179,7 +179,7 @@ class FormationPlanner:
params = params or {} params = params or {}
N = len(drone_positions) N = len(drone_positions)
radius = params.get('radius', 10.0) radius = params.get('radius', 10.0)
altitude = params.get('altitude', 10.0) altitude = params.get('altitude', 25.0)
start_angle = params.get('start_angle', 0.0) start_angle = params.get('start_angle', 0.0)
center_x, center_y, center_z = target_point center_x, center_y, center_z = target_point

Loading…
Cancel
Save