激光门控改为可配置, 本设备(无激光)置false

链路: 新增link.require_laser_valid(默认true, 有激光机型的锁定位置位粘滞兜底);
本吊舱厂商确认不含激光测距 → pod_bridge.json 置false, 并加部署配置回归测试。
文档新增§10记录设备特性(无激光/锁定位置位丢失后不复位/脱靶量无无效标志位)。
全量351条通过(新增3条激光门控用例)
This commit is contained in:
keita
2026-09-28 15:22:14 +08:00
parent 6589a5215c
commit d255d22fc9
5 changed files with 85 additions and 11 deletions
+39 -4
View File
@@ -10,7 +10,7 @@ import time
from dataclasses import replace
from pod_bridge.bridge import PodBridge
from pod_bridge.config import BridgeConfig
from pod_bridge.config import BridgeConfig, load_from_json
from pod_bridge.protocol import (ControlCode, ControlCommand, TargetGeo,
Telemetry, decode_attitude, decode_control)
from pod_bridge.px4_gateway import OwnState
@@ -79,9 +79,9 @@ def _valid_state(now_ms, lat=0.0, lon=0.0, yaw_rad=0.0, gs=0.0):
time_ms=now_ms, position_time_ms=now_ms)
def _locked_telemetry():
"""状态字节1 bit2=1(锁定)的遥测帧。"""
return Telemetry(status1=0b00000100)
def _locked_telemetry(laser=50.0):
"""状态字节1 bit2=1(锁定)的遥测帧;默认带有效激光(默认闸门要求激光有效)。"""
return Telemetry(status1=0b00000100, laser_range_m=laser)
def _bridge(px4, pod, cfg=None):
@@ -297,6 +297,41 @@ def test_lock_lost_midflight_falls_back_to_brake():
assert out2.mode.name == "BRAKE_HOVER"
# --- 激光有效性门控(锁定位置位粘滞时的兜底)-----------------------------------
def test_laser_invalid_blocks_guidance_when_required():
"""默认 require_laser_valid=True:锁定位置位但激光无效 → 目标无效 → 刹车。"""
px4 = FakePx4(_valid_state(1000))
pod = FakePod()
pod.queue(TargetGeo(latitude_deg=0.001), _locked_telemetry(laser=None))
b = _bridge(px4, pod)
out = asyncio.run(b.step(1000))
assert out.mode.name == "BRAKE_HOVER"
assert px4.velocity_calls == []
def test_laser_invalid_allowed_when_gate_disabled():
"""本设备无激光(厂商确认)→ require_laser_valid=False 时照常引导。"""
px4 = FakePx4(_valid_state(1000))
pod = FakePod()
pod.queue(TargetGeo(latitude_deg=0.001), _locked_telemetry(laser=None))
cfg = BridgeConfig()
cfg.link.require_laser_valid = False
b = _bridge(px4, pod, cfg)
out = asyncio.run(b.step(1000))
assert out.mode.name == "VELOCITY_HEADING"
def test_deployed_config_disables_laser_gate():
"""部署配置回归:本机无激光,pod_bridge.json 必须关掉激光闸门。"""
import os
path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(
os.path.abspath(__file__)))), "config", "pod_bridge.json")
cfg = load_from_json(path)
assert cfg.link.require_laser_valid is False
# --- 缺陷③:run() 异常护栏 -----------------------------------------------------
class FlakyPod(FakePod):
"""前 fail_times 次 poll 抛串口异常,之后恢复正常。"""