激光门控改为可配置, 本设备(无激光)置false
链路: 新增link.require_laser_valid(默认true, 有激光机型的锁定位置位粘滞兜底); 本吊舱厂商确认不含激光测距 → pod_bridge.json 置false, 并加部署配置回归测试。 文档新增§10记录设备特性(无激光/锁定位置位丢失后不复位/脱靶量无无效标志位)。 全量351条通过(新增3条激光门控用例)
This commit is contained in:
@@ -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 抛串口异常,之后恢复正常。"""
|
||||
|
||||
Reference in New Issue
Block a user