No description
  • C++ 62.5%
  • C 30.9%
  • Python 5.3%
  • CMake 1.2%
  • Shell 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-09-10 18:26:29 +08:00
SHtech_auto_aim Add camera-relative auto-aim prediction 2026-09-10 18:26:29 +08:00
.gitignore Import current development-board project as baseline 2026-09-05 20:39:23 +08:00
README.md Configure UART debugging at 115200 8N1 2026-09-09 15:50:17 +08:00

AUTOAIMRoboMaster 视觉自瞄调试项目

面向 RoboMaster 大学生机器人大赛,基于 SHtech_auto_aim 的开发板源码快照,主要使用 AX650 + 海康 USB 相机 + 串口下位机。这里保留开发板适配修改,采用独立 Git 历史,并非上游完整历史的克隆。

首次上手先用视频和模拟串口。默认 launch.cfg 是相机输入、/dev/ttyS1 真实串口,不能当作离线配置直接运行。下位机必须适配新协议后才能联机。

当前状态

  • 处理流程:图像输入 → 装甲板检测 → 位姿解算与跟踪 → 瞄准规划 → 串口或 TXT 输出。
  • 下行协议已精简为五字段,命令字 0x050414 字节数据区、23 字节整帧。
  • 开发板完整编译通过封包、CRC、解包回读及坏包拒绝测试通过。新协议尚未完成真实下位机联调。
  • MVS 5.0.2 / 相机 SDK 4.8.1.2 独立取图测试通过MV-CS016-10UC 在当时 USB 2.0 链路下采集 1440 × 1080约 23 FPS。取图速度不等于整套算法速度。

目录导航

所有工程代码位于 SHtech_auto_aim/CMake 命令也在该目录执行。

位置 用途
main.cppmain.hpp 初始化和流水线编排
launch.cfg 输入源、串口、模型和调试配置
sensor/detect/ 相机/视频输入、检测和角点精修
predict/planner/ 目标选择、运动预测、瞄准与射击请求
timedserial/ 串口、模拟驱动和协议结构体
asset/ 模型及相机、规划参数
tools/test_protocol_v2.cpp 不访问物理串口的封包测试

仓库不含系统镜像、AXCL 运行库、MVS 安装包、RMCVSerial 源码包、测试视频、编译产物和运行日志。之前打包的 RMCVSerial 及 offline-check/ 材料只在本机保存,不随 Git 克隆。

1. 准备环境

已配置好的开发板

当前使用 SD 卡上的 Debian chroot

内容 开发板宿主路径 chroot 内路径
运行环境 /mnt/autoaim/rootfs /
工程 /mnt/autoaim/rootfs/root/auto-aim /root/auto-aim
海康 SDK /mnt/autoaim/rootfs/opt/MVS /opt/MVS
RMCVSerial 源码 /mnt/autoaim/rootfs/opt/rmcv_serial /opt/rmcv_serial

SSH 登录后,以 root 执行。先确认 SD 卡挂载,避免写入宿主系统空间:

mountpoint /mnt/autoaim || exit 1
for part in dev proc sys; do
  mountpoint -q /mnt/autoaim/rootfs/$part ||
    mount --bind /$part /mnt/autoaim/rootfs/$part
done
chroot /mnt/autoaim/rootfs /bin/bash

进入后设置环境变量,后续编译和运行均在此环境执行:

export MVS_PATH=/opt/MVS/lib/aarch64
export MVCAM_COMMON_RUNENV=/opt/MVS/lib
export LD_LIBRARY_PATH=/soc/lib:/usr/local/lib:/opt/MVS/lib/aarch64
cd /root/auto-aim

/soc 必须已有相应 AX650 头文件和运行库;挂载设备目录不会自动安装它们。

新设备或首次克隆

git clone https://github.com/0bCyan/AUTOAIM.git
cd AUTOAIM/SHtech_auto_aim

私有仓库需要 GitHub 访问权限。克隆只获取源码,新环境还需支持 C++20 的编译器、CMake、OpenCV、Eigen3、Boost、RMCVSerial、AX650 运行环境和 MVS SDK。

普通 x86 电脑不能直接运行 AX650 后端。其他后端验证不充分;INFERENCE_BACKEND=ONNX 使用 MIGraphX/ROCm不是通用 ONNX Runtime。新板可参考上游环境项目,但不要在现有 SD 卡环境盲目重跑安装脚本,以免覆盖已更新的 SDK。

2. 编译

在工程目录执行:

cmake -S . -B build -DINFERENCE_BACKEND=AXCL -DUSE_HIKCAM=ON
cmake --build build -j1

已有构建目录时通常只需第二条。开发板内存有限,建议 -j1;暂不要使用旧 build.shmake -j6。Release 链接优化可能耗时数分钟。

3. 第一次运行:视频 + TXT

程序读取当前工作目录里的 launch.cfg。先执行 cp -n launch.cfg launch.cfg.local-backup 备份,再编辑已有配置中的以下字段,其他字段保留:

source=/root/auto-aim/test.avi
port=None
model=asset/models/SKD250526.axmodel
camera_para=asset/camParam/cam_param_hik1_.yml
planner_para=asset/plannerParam/planner_param_sentry.yml
timed_serial_log_text=true

test.avi 不在 Git 仓库内,先准备视频并填写实际路径。上面的目录适用于现有开发板,新克隆环境应按实际目录调整。无显示器时保留所有 *_show_image=false

确认 port=None 后运行:

test -f /root/auto-aim/test.avi || exit 1
unset AUTOAIM_MOCK_TX_PORT
export AUTOAIM_MOCK_ENEMY_COLOR=1
export AUTOAIM_MOCK_OUTPUT="$PWD/robot-output-v2.txt"
timeout -s INT -k 5s 15s ./build/auto-aim

AUTOAIM_MOCK_ENEMY_COLOR=1 选择蓝色目标取消该变量则默认红色应与视频对应。模拟状态使用水平姿态、28 m/s 射速,并非真实测量。

TXT 第一行是说明,第二行是列名,后续数据以制表符分隔:

elapsed_ms  yaw_deg  pitch_deg  distance  shoot  target_id

时间戳不进入串口协议。每次启动会覆盖指定 TXT要保留历史请换文件名。视频结束后程序可能持续报取帧失败因此这里限时运行达到 timeout 时退出码通常为 124不等于算法崩溃。

4. 相机与实机运行

先只改 source=0,保持 port=None,并取消 AUTOAIM_MOCK_TX_PORT。这样使用真实相机、模拟机器人状态,不向物理串口发送;目标颜色仍由模拟环境变量指定。

实机联调前,再把 port 改为已确认引脚映射的设备路径。当前配置为 /dev/ttyS1,已确认是启用的非控制台 UART并能设置 921600、8E1/dev/ttyS4 在当前设备树中未启用。用户确认排针采用树莓派布局(物理 8=TX、10=RX、9=GND/dev/ttyS1 到这组排针的物理连接仍需回环或下位机测试,不能把软件打开成功视为引脚验证通过。相机内外参必须对应实际镜头和安装方式。

开发板以前部署过 /mnt/autoaim/run-auto-aim,这是板端脚本,不在仓库中,使用 /root/auto-aim/launch.cfg 运行。新克隆不会获得该脚本。初次调试推荐在正确目录前台运行 ./build/auto-aim,用 Ctrl+C 停止,不急于开机自启。

AUTOAIM_MOCK_TX_PORT 可以让模拟驱动向真实串口发送,仅设置 port=None 不足以保证没有物理输出。AUTOAIM_DEBUG_NO_SHOOT 仅作用于 MockDriver不是所有模式的总禁射开关。旧 install_service.py 生成的脚本包含异常退出后重启设备的逻辑,启用前需单独审阅。

5. 串口协议速查

115200、8N1无校验、无流控USB-TTL 联调配置,原为 921600、8E1命令字 0x0504,数据区 14 字节,整帧 23 字节,小端序。

字段 类型 含义
yaw float32 相对水平修正量,度,顺时针为正
pitch float32 相对俯仰修正量,度,向上为负
distance float32 目标距离,米
shoot uint8 0 禁止1 允许连发2 下位机判断3 单发请求
target_id uint8 目标编号0 表示无目标
A5 | 数据长度(2) | 序号(1) | CRC8(1) | 命令字(2) | 数据(14) | CRC16(2)

没有固定帧尾,末尾是 CRC16。序号当前固定为 0不能用于单发去重。yaw/pitch 不是绝对角度不能把重复收到的修正量不断累加。MCU 需同步更新解析、校验及超时禁射逻辑,其固件不在仓库内。

完整字节偏移、CRC 和示例帧见串口 V2 协议。入站 IMU 0x1021 和裁判信息 0x1022 未修改。实机路径仍用临时固定射速 24.5 m/s 覆盖入站射速,正式使用前需确认。

不访问串口的封包自测:

g++ -std=c++17 -I. tools/test_protocol_v2.cpp -lRMCVSerial -o /tmp/test-protocol-v2
LD_LIBRARY_PATH=/usr/local/lib /tmp/test-protocol-v2

末尾应输出 PASS。测试故意损坏一帧验证拒包,出现一次 CRC16 error 是预期现象。

6. 常见问题

现象 优先检查
not defined env: MVS_PATH 编译前设置 MVS_PATH=/opt/MVS/lib/aarch64
找不到 .so chroot、LD_LIBRARY_PATH、依赖是否齐全
lsusb 有相机SDK 枚举 0 台 SDK、初始化、USB 挂载、线材和供电USB 2.0 不必然导致枚举失败
相机帧率约 24 FPS lsusb -t 链路速度、Hub、曝光和带宽限制
画面偏暗 镜头盖、光圈、曝光、增益;取帧成功不等于成像正常
没有目标输出 颜色、视频路径、模型、标定参数及目标可见性
下位机无法解包 115200、8N1、0x0504、14 字节数据区、CRC、小端序不能沿用旧布局
克隆后没有启动脚本或视频 属于板端或本机部署材料,未提交到 Git

进一步阅读

已知历史问题包括装甲板切换时间窗口的整数截断等,详见模块 README。本项目不是“克隆后即可直接用于比赛”的整机交付包标定、下位机、引脚映射和实机验证需要分别完成。