新增send_control.py并给listen_pod.py加目标识别验证

send_control.py: 单帧表2-1指令下发(名字/数值均可解析, --list列全部控制码)
listen_pod.py: --detect {person,drone} 下发0x07目标识别开(参数X 0人车/1无人机)
并跟踪锁定状态变化与首次锁定时刻; 打桩验证通过(0x2B帧校验和a6与规格样例一致)
This commit is contained in:
keita
2026-09-28 10:30:53 +08:00
parent 7e43e6302d
commit 5340a5da07
2 changed files with 111 additions and 5 deletions
+70
View File
@@ -0,0 +1,70 @@
"""send_control.py —— 向吊舱下发单帧 表2-1 控制指令(台架工具,非飞行组件)。
用途:验证吊舱下行链路与各类指令动作(开目标识别/框选跟踪/归中/开电机等),
配合 listen_pod.py 观察遥测状态变化。
用法:
python utils/pod_bridge/send_control.py /dev/ttyAMA0 --code TARGET_DETECT_ON --param-x 0
python utils/pod_bridge/send_control.py /dev/ttyAMA0 --code 0x2B # 归中
python utils/pod_bridge/send_control.py --list # 列出全部控制码
控制码可用名字(ControlCode 成员名,如 TARGET_DETECT_ON)或数值(0x07 / 7)。
"""
import argparse
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1])) # utils/ 入 sys.path
from pod_bridge.pod_serial import PodSerial # noqa: E402
from pod_bridge.protocol import ControlCode, ControlCommand, encode_control # noqa: E402
def _resolve_code(text: str) -> int:
"""控制码:支持名字(TARGET_DETECT_ON)或数值(0x07 / 7)。"""
name = text.upper()
if hasattr(ControlCode, name):
return int(getattr(ControlCode, name))
try:
return int(text, 0)
except ValueError:
raise SystemExit(f"无法解析控制码: {text}(用 --list 查看可用名字)")
def main() -> int:
ap = argparse.ArgumentParser(description="下发单帧吊舱控制指令(表2-1)")
ap.add_argument("port", nargs="?", default="/dev/ttyAMA0", help="串口设备号")
ap.add_argument("--baud", type=int, default=115200)
ap.add_argument("--code", help="控制码名字或数值,如 TARGET_DETECT_ON / 0x2B")
ap.add_argument("--param-x", type=int, default=0)
ap.add_argument("--param-y", type=int, default=0)
ap.add_argument("--param3", type=int, default=0)
ap.add_argument("--param-x2", type=int, default=0)
ap.add_argument("--param-y2", type=int, default=0)
ap.add_argument("--list", action="store_true", help="列出全部控制码后退出")
args = ap.parse_args()
if args.list:
for c in ControlCode:
print(f"0x{c.value:02X} {c.name}")
return 0
if not args.code:
ap.error("需要 --code(或用 --list 查看可用控制码)")
code = _resolve_code(args.code)
cmd = ControlCommand(code=code, param_x=args.param_x, param_y=args.param_y,
param3=args.param3, param_x2=args.param_x2,
param_y2=args.param_y2)
frame = encode_control(cmd)
pod = PodSerial(args.port, args.baud)
pod.send(frame)
pod.close()
print(f"[send] {args.port} 下发 0x{code:02X} → {' '.join(f'{b:02X}' for b in frame)}")
return 0
if __name__ == "__main__":
sys.exit(main())