2.8.2 grid mission
This commit is contained in:
+6
-6
@@ -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
|
||||||
@@ -547,4 +547,4 @@ if __name__ == "__main__":
|
|||||||
)
|
)
|
||||||
print(f"\nGrid Sweep:")
|
print(f"\nGrid Sweep:")
|
||||||
for i, wp_list in enumerate(wps2):
|
for i, wp_list in enumerate(wps2):
|
||||||
print(f" Drone {i}: {len(wp_list)} waypoints")
|
print(f" Drone {i}: {len(wp_list)} waypoints")
|
||||||
|
|||||||
Reference in New Issue
Block a user