桂工自瞄文档

开发记录:

1.双装甲板通信逻辑 2.帧率控制器,插值法 补偿ros时间(陈君提出) -> (前提解决相机装配误差) 3.卡尔曼滤波器,熵权法,整车建模(最难),多运动模型观测 4.选板逻辑 5.重力补偿弹道解算(西工大(采纳),同济(未采纳),上交四阶龙格库塔(中科大)) 上交线性空气阻力模型(采纳)(存在问题目前猜测由于pnp测距不准,在较远距离空气阻力击打倾斜效果很差) 无空气阻力的模型,它的角度和距离是线性,但是在远距离的时候,它的速度是随距离指数衰减的,在距离较远的时候,一点点测距误差就会导致比较大的角度偏差 6.三层前哨战卡尔曼修改(卡尔曼参数还需调试) 7.手写脱ros坐标变换器(重点: 角点变换) -> 待整理(目前矩阵命名是相反的) -> 已整理 8.上交三分法降自由度优化yaw角(最后采用这个方案) 9.同济暴力搜索降自由度优化yaw角 (近距离存在问题) 10.识别角点优化(fitLine最小二乘法获得灯条角点 -> 优化后降自由度产生良好优化效果,0度范围角度不再跳变) 11.西工大mpc轨迹规划器(半成品) 12.约束平面求相机装配误差和完整误差补偿 -> 考虑使用RANSAC算法重构 13.弹道重现 -> 考虑后续实现弹道闭环 14.手眼标定(半成品) -> (传统手眼标定, 先进手眼标定(版本不够)) 15.火控流水打弹(500血 30转 3m 9s 70%命中率) 16.空气阻力弹道模型(存在bug未查明) 17.视觉弹频控制(旋转移动命中率到38%~50%) -> 效果不太好会影响dps -> 被废弃 18.同济mpc(未落地) -> 规划存在提前减速的效果 -> 电控和机械跟不上 但是由于: 开火时延是同济的十倍(200ms),20个时间片后的规划和预测云台做火控效果很差,双环pid跟随存在稳态误差需要添加电控时延但是20个时间片的预测效果就很差了,目前旋转移动目标,小弹丸命中率只有传统方法的一半(25%) 未来: 电控机械尽量减少开火延时 mpc规划的速度和加速度作为前馈发送给双环pid作为前馈或者考虑计算力矩控制算法(提升云台的跟随能力) 19.参考BA优化的思想优化pnp算法的测距(失败) 20.PCA主成分分析法(Principal Component Analysis, PCA)方法优化角点(哨兵没部署) 21.识别和相机采集多线程(初步编写) 22.全向感知(多相机采集调度)(仅初步学习线程池) 放弃多线程方案 -> 多进程方案已初步启动两个相机 -> 初步实现等待部署 23.ssh+自瞄网页调试 初步实现 24.修降自由度bug,修流水火控bug(调的参数好的情况下,火控有大的提升,英雄低速目标颗秒,高速静止目标100w麦轮50%命中率) -> 但是参数敏感每隔几个小时参数就会变,而且实战环境复杂,命中困难 25.迭代法求子弹飞行时间(无空气阻力) -> 有空气阻力曾经实现过未通过测试 26.多段测距的弹道硬补偿(弹道标定) 已测试 效果不错 但调参成本大 27.自瞄网页调试器 初步实现 28.自瞄Python单测(计划实现) 29.自瞄ros2重构(计划实现) 30.全向感知技术(半成品) -> (计划实现) 31.针对前哨和远距离目标的新火控(计划实现) -> 远距离(单点) 前哨(跟随上再击打) 32.给自瞄接入gazebo仿真 初步实现

目前自瞄局限性:

1.自瞄还未考虑发弹延迟 -> (解决方法: 看同济上交补偿) -> 交: 历史查询 同济: mpc提前开火 2.无法测出弹道误差和枪管装配误差 -> (解决方法: 上交弹道闭环, 自研(弹道拟合)) 3.CV模型对于平移目标缺乏良好跟随效果 -> (PID跟随效果(给差分前馈),CV模型加速度突变的过量预测,电控时延的补偿) -> (解决方法: 合理稳定的CA模型) 4.远距离pnp测距误差带来的落点偏低 -> (解决方法: 长焦 激光测距 等(没钱目前没有比较好的方法) , 双目标定(效果微弱)) pca角点优化 5.弹道解算无空气阻力模型带来的落点偏低(甚至比pnp测距还严重) -> (上交 四阶龙格库塔弹道解算) 由于测装甲板存在问题,又由于远处弹道落点受空气阻力影响指数下降,导致击打旋转目标命中率较低 6.mpc半成品 -> (同济 西工大开源 和电控协商如何调) -> 电控需实现(中科大)力控算法 7.ros图像传输延迟大极大限制自瞄帧率(采集识别处理多线程(共享内存)) 8.前哨战自瞄命中率低

调试记录:

调全向

难点: 无特殊难点,但是代码开发最开始从全向部署 花了点时间

调英雄:

难点: 最难调,断代,串口不通,自动开火不对,弹速低高俯仰角看不见目标 低弹速低弹频,自制装甲板一打就烂,打印件枪管一打就歪一打就烂,弹道极度不稳定 机械安装C板和相机倾斜角最大导致视觉坐标系不正确,偶尔卡弹,发弹延迟不稳定 对火控要求异常严格

调哨兵:

难点: 串口不同部署自瞄花了点时间 -> 可能会存在自瞄和导航串口存在冲突 弹道难调 -> 机械电控已解决

调麦轮:

代码烧上去就能跑 第一正式测试命中率 30转2Hz的弹频产生59发中50发的命中 80转的转速勉强有60%的命中率(缺陷: 自动开火和发弹延迟,还有时间戳的对齐)

卡尔曼调参手册:

卡尔曼公式:

1.预测值 2.先验误差协方差矩阵 3.卡尔曼增益 4.最优估计值 5.后验协方差矩阵 IMG_20251127_193011.jpg

卡尔曼滤波核心参数

过程噪声Q: 模型预测的不确定性 观测噪声R: 传感器测量的不确定性 状态协方差(P): 状态估计的置信度

基本原则:

响应迟缓 -> 增大Q(过程噪声)或减小R(观测噪声) 过度震荡 -> 减小Q(过程噪声)或增大R(观测噪声) (个人习惯每次调节两个参数,最开始参数10%d的范围浮动,后面5%,再后面3% ……)

Q和R的具体数值应该由过程噪声和测量噪声的外积期望决定,如果我们了解这些噪声的大小,那么可以直接把Q和R算出来,做仿真的时候这是完全可以算出来了,算出来按道理就是最优估计了,后面的就可以不用看了,但实际情况大多是噪声大小知道是什么范围,但又不是特别了解,那就选择一个心目中觉得最有可能的大小,先算出来一下Q和R,带进去,这就是是错的试错点

调参: 当Q过小时,易发散,当R过小时,误差会变大,同时如果搭配观测量同时看,R过小时滤波输出会趋于观测值 调试时可以先将Q从小往大调整,将R从大往小调整;先固定一个值去调整另外一个值,看收敛速度与波形输出

协方差具体调参:

(协方差矩阵,是通过过程噪声Q和观测噪声R动态计算的)

协方差发散 (P矩阵值持续增大) : 现象: 估计不确定性增加,跟踪不稳定 措施: 减小过程噪声Q或增大观测噪声R

协方差过小 (P矩阵快速收敛到零) : 现象: 滤波器过于自信,不响应新的观测数据

协方差初始化: 初始化为很小的值

协方差健康指标: P.trace(): 应该稳定在合理的范围,不是持续增大或减小到零 P.diagonal: 对角线元素应该反映各状态量的不确定 P的收敛速度: 应该在几十个周期内稳定收敛


Tracker: COMMAND_TIMESPAN: 0.11 local_gravity_: 9.80665 eTime: 0.002 begin_radius_: 0.26 trackTime: 0.7 frame_time: 0.02 pitch_compensation: 0.004 yaw_compensation: -0.020 FA: 1.0 rotate_time_max: 0.5 rotate_count_max: 13 score_tolerance: 1.0 switch_threshold: 15 aim_angle_tolerance: 40 aim_pose_tolerance: 0.05 aim_center_angle_tolerance: 1 switch_trackmode_threshold: 1.2 aim_center_palstance_threshold: 6.5

ModelObserver:

参数调整原则

过程噪声调大: 滤波器更信任测量值,响应块但可能更震荡

过程噪声调小:滤波器更信任预测值,相应更平滑但可能滞后

观测噪声调大: 滤波器更信任预测值,对测量误差不敏感

观测噪声调小: 滤波器更信任测量值,对状态变化更敏感

响应迟缓增大Q减小R,过度震荡减小Q增大R

dt: 0.03 # 这个参数的值是固定的,由帧率控制器决定(帧数稳定,协方差矩阵变化小,计算量小,运算速度更快且不会中途改变卡尔曼的数值,卡尔曼更稳定)

Standard: # 初始化半径 init_radius: 0.2

# 动态调整距离观测噪声的角度依赖性
# 角度大 + 距离跳动 -> 增大gain 
# 角度大 + 距离滞后 -> 较小gain
# 先调基础参数,再调增益参数

# 大角度距离跳动
# 现象: 目标侧对时距离估计上下跳动+-0.2m
# 诊断: 距离噪声角度依赖性不足 -> 增大增益

# 大角度响应滞后 
# 现象: 目标转向时距离跟踪明显滞后
# 诊断: 距离噪声角度依赖性过强

# 0角度测量噪声大
# 现象: 角度测量本身不准, gain放大噪声
# 诊断: 需要改善角度测量或调整策略
 


gain: 25

# 过程噪声(表示模型的不确定性)Q
process_noise:
  # 位移的高阶差分噪声.控制位置和速度变化的不确定性,值越大滤波器对新测量的相应越慢
  displace_high_diff: 1.653         # 中等位移噪声,推荐调参范围:()
  # 角度的高阶差分噪声.控制角度和角速度变化的不确定性
  anglar_high_diff: 20.0            # 中等角度噪声,推荐调参范围:()
  # 高度噪声.机器人高度变化的不确定性
  height: 0.0001                    # 较小高度噪声,推荐调参范围:()
  # 旋转半径噪声.机器人旋转半径变化的不确定性
  radius: 0.0002                    # 较小半径噪声,推荐调参范围:()

# 观测噪声系数 R
measure_noise:
  # 位置观测噪声,视觉测量位置的不确定性
  pose: 0.001995
  # 距离观测噪声,测距的不确定性
  distance: 0.01235
  # 角度观测网噪声,角度怎两的不确定性
  angle: 0.008

Balance: # 初始半径 init_radius: 0.2 # 测距噪声关于角度的增益的函数 gain: 30

# 状态转移噪声系数
process_noise: 
  # 更小的位移噪声,因为平衡步兵运动模型更可预测
  displace_high_diff: 0.2
  # 较大的角度噪声,因为平衡步兵旋转更频繁
  anglar_high_diff: 10
  # 更小的高度噪声,高度变化较小
  height: 0.0001
  # 更小的半径噪声,旋转半径更稳定
  radius: 0.00001

# 观测噪声系数
measure_noise: 
  # 更小的位置噪声,假设视觉检测更准确
  pose: 0.002
  # 更小的距离噪声,测距更准确
  distance: 0.01
  # 较大的角度噪声,因为平衡步兵角度变化大
  angle: 0.5

Outpost: # 很高的增益,因为前哨战固定,距离测量噪声角度变化影响大 gain: 100

# 状态转移噪声系数
process_noise:
  # 极小的位移噪声,因为前哨战基本不动
  displace_high_diff: 0.0001
  # 较小的角度噪声,前哨战有小幅度固定的旋转
  anglar_high_diff: 0.4
  # 极小的高度噪声,高度固定不变
  height: 0.000001

# 观测噪声系数
measure_noise:
  # 很小的位置噪声,固定目标检测准确
  pose: 0.002
  # 中等距离噪声
  distance: 0.04
  # 较小的角度噪声,角度测量相对准确
  angle: 0.1

pose(位置观测噪声): 控制装甲板在x,y平面位置的噪声 在观测噪声矩阵中对应前两个对角线元素 影响因素: 1.视觉检测的2D定位精度 2.相机标定误差 3.图像分辨率和检测算法稳定性

distance(距离观测噪声): 控制装甲板高度z轴的观测噪声 在代码中实际对应的是深度方向的观测不确定性 影响因素: 视觉检测的2D定位精度 相机标定误差 相机俯仰角标定误差

先调pose再调distance再联合调

重投影调参:

1.预测点抖动 -> 观测噪声过小或过程噪声过大 2.移动过快乱跳 -> 动态响应能力不足 3.高频抖动 -> 滤波器对观测噪声过于敏感 4.快速移动发散 -> 过程噪声不足以描述动态特性

验证标准:

1.新息应为零均值白噪声 2.协方差矩阵稳定收敛 3.重投影误差在可接受范围内 4.实际跟踪效果良好

调试输出分析:

新息分析: 新息过大: 模型不匹配需增大Q或R 新息过小: 滤波器过于保守,需减小R 新息有差: 系统模型有偏差

协方差矩阵分析: P快速收敛: 可能过于拟合 P发散: 模型不稳定,需减小Q或R P震荡: 需平衡Q和R的比值

注意

1.每次只调节1~2个参数,观察效果后再继续 2.调节一个参数可能影响其他状态量的: (这里需要看代码研究,还没有仔细研究过) :

3.代码中有已经实现好的卡尔曼滤波器参数的打印函数,和rqt赋值打印的函数,它们被注释了,如果有需要的话再使用

自瞄核心算法

卡尔曼滤波器理论推导

第一张 23c9b9379c95f215de0b457f7c19c2d.jpg

第二张 54a1a7ab4834b143b787bbf638a246e.jpg

第三张 b4e335a86add53ecd136d70faaf13a9.jpg

第四张 ef674c0bd697f58fe8a2ab2e9c97b81.jpg

第五张 6071defc362061fca6e391b11014127.jpg

第六张 7b688e4a3fe2b5e0d14799f0a1e6043.jpg

补充: 一.初始状态x0的设置 有先验信息的情况 已知初始状态: 如果有确切测量或已知系统启动状态,直接适应该值 部分已知: 已知部分状态分量,未知分量设为0或合理估计值 无先验信息的情况 使用第一次观测值: 如果观测与状态直接相关 设为0或中性值: 对无偏系统,可初始化为0

二.初始误差协方差的设置 p0的意义: 表示对初始状态估计的不确定性 对角线元素: 各状态分量的方差 非对角线元素: 状态分量间的协方差

基本原则: 不确定性越大,值设得越大

坐标变换

后续补充

yaw角优化(降自由度)

后续补充新降自由度 -> 以及对降自由度重投影代价函数的一些理解

角点坐标定义重大注意点: IMG_20251130_211216.jpg

上海交通大学角点坐标变换开源阅读推导草稿: 687962de7ce238c2908b16d6b143c99.jpg

同济大学角点坐标变换: (和pnp相同) 7e0897896b0dbba1a4f83d5a91b0fbb.jpg

MPC轨迹规划器

AI说的 b129ecdb7f60c1ad79a494c3cd92616.jpg

mpc理论推导 第一张 72adb7199447b60a39ec59a5c5b7eed.jpg

第二张 2b5c17208d0bf44560b9d750d9acd41.jpg

第三张 ef674c0bd697f58fe8a2ab2e9c97b81.jpg

西工大轨迹规划器文档 edee712b741620207236090167be7ce.png

调参

MPC: debug: 0 # 预测步长 # step太小: 优点: 计算快,响应迅速 缺点: 目光短浅,长时优化差 # step适中: 平衡性能与计算,需要合理调参 # step太大: 优点: 前瞻性好,稳定 缺点: 计算量大,易发散 step: 5

# 过程误差权重
# Q代表对预测时间段内误差的重视程度
# Q0较大 -> 非常在意pitch角度误差,会快速调整
# Q0较小 -> 可以容忍一定的pitch角度误差
process_error_weight:
    # pitch角误差权重
    # 控制云台在俯仰角方向上的瞄准精度
    Q0: 10000
    # yaw角度误差权重
    Q1: 10000
    # pitch角速度误差权重
    # 控制俯仰方向的速度平滑性
    Q2: 1
    # yaw角速度误差权重
    # 控制偏航方向的速度平滑性
    Q3: 1
# 控制权重
# R代表对预测时间段控制量的重视程度
# R0较大 -> MPC会尽量使用小的控制量,更平滑但响应慢
# R0较小 -> 允许使用更大的控制量,响应块但可能震荡
process_control_weight:
    # pitch控制量(角加速度)权重
    # 惩罚pitch方向的控制努力 -> 避免发送过大的pitch加速度指令
    R0: 10
    # yaw控制量(角加速度)权重
    R1: 1
# 终端误差权重
# F表示对预测时间段后的这一时刻的误差量的重视程度
target_error_weight:
    F0: 10000
    F1: 10000
    F2: 1
    F3: 1
# 终端权重对控制行为的影响
# F太大:
  # 行为: MPC变得急功近利
  # 表现: 一开始猛打方向盘,试图快速到达终端状态
  # 问题: 过程中剧烈震荡 
# F太小:
  # 行为: MPC变得"目光短浅"
  # 表现: 只关心眼前误差,不计划长远
  # 问题: 终端时刻误差大,打不中移动目标
# F合适:
  # 行为: MPC"眼光长远,脚踏实地"
  # 表现: 平衡过程跟踪和终端精度
  # 结果: 平衡跟踪,最终准确命中

零参考轨迹MPC: 目标: 将系统状态调节到零点 特点: 参考轨迹恒为零 应用: 姿态稳定,平衡控制 损失函数形式

J = Σ [x(k+i)^T Q x(k+i) + u(k+i)^T R u(k+i)]

带参考轨迹MPC: 目标: 跟踪时变的参考轨迹 特点: 参考轨迹是随时间变化的,即x_ref是时变的 应用: 轨迹跟踪,路径跟随 损失函数形式:

J = Σ [e(k+i)^T Q e(k+i) + u(k+i)^T R u(k+i)] 其中 e(k+i) = x(k+i) - x_ref(k+i)

MPC不仅有位置模式,还有速度位置模式

同济mpc: 08405ad115ad4c90e84a64e4dc1174e.jpg

d9c7c0c23d26734d2ab93246017d3f6.jpg

梯度下降法:

后续补充

共轭梯度法:

共轭梯度法是一种迭代优化算法,专门用于求解: 1.线性方程组: Ax = b (A对称正定) 2.二次规划问题: min1/2xTHx + fTx

普通梯度下降法在复杂地形中会"之字形"前进 问题: 每次只考虑当前梯度方向,可能重复探索相同方向,收敛慢

共轭梯度法: 共轭梯度法通过构造一组共轭方向 每个方向只探索一次 在这些方向上达到最优 关键思想: 当前搜索方向与之前所有搜索方向关于H共轭

fitLine最小二乘法获得灯条角点

e8094fbc42cfb0eb32076ed89f1a994.jpg

最小二乘法(Least Squares Method): 最小二乘法是一种数学优化技术,通过最小化误差的平方和来寻找数据的最佳函数匹配 简单来说: 找到一条线(或曲线), 使得所有数据点到这条线(或曲线)的垂直距离的平方和最小

光束平差法: 在SFM和SLAM中,通过最小化重投影误差优化相机参数和3D点

PnP算法与PnP问题

PnP(Perspective-n-Points)问题: 给定n个已知3D空间点和它们在2D图像上的投影点,以及相机的内参,求解相机的位姿 image.png

命名由来: Perspective: 透视关系(不是正交投影) n: 已知3D-2D对应点对数量 Point: 点对应关系

不同n值的情况: n = 3 P3P 最少点数,有解析解 最多4个解 n = 4 P4P 通常有唯一解 1个或有限个 n >= 4 PnP 最小二乘解 通常唯一 最小点数: 理论上,n>=3即可求解,但实际中n>=4 实际工程中为什么多用4个点: 提高稳定性,减少歧义

相机安装误差测定逻辑

由于观测存在噪声,该方案已废弃 -> 目前已更换为经验调参 -> 详情见下方 电控视觉(机械硬件)联调测试手册

IMG_20251206_195538.jpg

相机结构:

光圈 -> 控制曝光

镜头的相对光圈值 F(相对值): 数值越小代表实际的物理光圈越大,数值越大代表实际的物理光圈值越小 image.png

入瞳径 (很大程度由光圈决定): 可以理解为从镜头前看向其内部的视觉开孔直径,它并不是真实的光圈叶片所控制的物理孔径,很多大光圈镜头前镜组采用高曲率或高折射率的镜片

光圈F值与成像面照度是近似平方反比的关系: image.png

光圈 -> 景深:

(光圈和被摄物体与相机的距离都会影响景深) -> 距离的改变影响了光线的角度

焦点前后一段相对清晰的范围 光圈越小清晰的范围越大,一般称为深景深或大景深 反之光圈越大清晰的范围越小,称为浅景深 image.png

直接影响景深的是入瞳镜,而非物理光圈 image.png

容许弥散圆: 摄影和光学领域中一个非常关键的基础概念,它直接关系到我们对图像"清晰"与否的判断标准

容许弥散圆,焦深,景深的关系 光圈变小,入瞳径变,光线的入瞳夹角变小,原来的光锥变窄,但是容许弥散圆的直径固定不变,此时想要对应到光锥上就要把容许弥散圆向两侧延伸,焦深就变大了,对应的景深就变大了 image.png

计算景深范围的公式: image.png

光圈叶片的数量和形状 -> 影响着焦外光斑是否圆润

光圈狭小造成的衍射会对成像质量有所限制

快门 -> 控制曝光

前帘: 通常先打开让传感器感光的叫做前帘 后帘: 之后关闭结束感光的叫做后帘

当按下快门后前帘落下,相机清空CMOS中的电荷,并开始感光,之后前帘抬起,传感器(CMOS)从下至上依次接收光线,到达设定时间后后帘抬起,此时CMOS仍处在感光状态,等所有信号逐行读出完毕,后帘复位,一次拍摄完成

单幕帘 单程速度 1/250s(恒定的) 曝光时间恒定4ms image.png

所以相机通过间隔来精确控制曝光 image.png

image.png

x轴为CMOS的像素列 y轴为像素行 z轴为时间长

image.png

前后幕帘开合的间隔越大,CMOS接收光线的时间也就越长 image.png

果冻效应: 遮盖感光元件 也常称为卷帘快门效应,是使用CMOS传感器相机在拍摄高速运动的物体或快速移动镜头时,图像中出现扭曲,倾斜等变形现象的一种常见图像失真问题.

解决方法: 减少相对运动 提高读出速度

全域快门: 可以同时控制电路开启,曝光之后把电子先转移到存储单元,之后再读出数据(信号),这样就不存在曝光时间差,也就能完全避免果冻效应

由于给每一个像素增加了额外的存储单元,会降低像素接收光线的能力,进而对信噪比和画质产生影响,贵

动态模糊: 加入适当的动态模糊,可以使视频更流畅 由相对运动轨迹产生的模糊 影响因素: 1.曝光时长 2.物体运动

帧率决定了快门速度的上限 (快门速度最大也只能使帧率的倒数) image.png

快门开角: 快门开角,本身是一个传统的摄影与摄像领域专业术语,它描述的是胶片相机中旋转快门叶片开口的大小,直接影响曝光时间

频闪: 通常是因为快门速度的设定与人造光源的交流电频率不匹配而导致的

其他快门类型: 机械卷帘快门 电子前帘快门 电子卷帘快门 镜间换门: 在镜头中间光圈旁,在镜头内部,CMOS可以整体感光,不存在时间差,也不存在果冻效应

火控

状态机:

b9c22015315374afe2fb0cb16ccdcf0.jpg

测试方案:

a86070f0b1084c3b9bd86571d494c7e.jpg

自瞄目前对于开火延时的一些研究:

(当年我和我学长说的原话) 其实我突然想到,发弹延时大的问题本身并没有解决,但是如果跟随足够好的情况下,就可以保证发出发弹指令后的0.1s(也就是发弹延时的平均大小)云台和期望仍然重合,就可以保证子弹命中。即使这个发弹延时不稳定。 也就是说如果跟随足够好 什么时候开火,是否提前打弹这时候已经不重要了,因为只要开火空间无限大,任何时候开火都可以打得中

PCA角点优化

c312d390225583c3f73cb8193ceaf91.jpg

视觉组调参指南(参考别的学校的)

机械装上相机之前:

认真检查相机焦距和光圈是否已经固定住,通常将光圈调整到最大,然后将焦距调整到能清晰看到2 6m左右距离的装甲板数字(使用GalaxyView)。(超过这个范围,就算识别到,PNP解算误差也很大,而 且操作手也不会打蛋,所以不用过多纠结识别距离)。 通常上位机与下位机的接口包含串口和相机,但是由于上位机(TX2或者NUC)的USB接口在多次插拔之 后可能会导致插不紧,此时一定要给连接的USB口打上胶。不能认为平时调试时没有出现过串口断开 或者相机断开的情况就认为不存在USB口松动这个问题,即便是打过胶,也应当在强烈碰撞的条件下 测试(例如两车碰撞,飞坡等)。 注意看相机前的保护镜片是否刮花导致相机成像出问题(这个问题很容易忽略!!)

相机外参整定:

如果你熟知坐标系变换过程,那么你应该知道,唯一需要填补的参数,就是相机坐标系到枪管坐标系 的平移向量(还有一个旋转向量下面再测)。一般上在设计上相机坐标系到枪管坐标系仅仅差了一个平 移,这里就需要对两个坐标系的中心点位置作分析。相机坐标系不用说中心点一定是在镜头中心位 置,而枪管坐标系的中心点就需要分析了。因为枪管坐标系进行旋转就到了基坐标系,也就是最终的 坐标系。我们在最终的坐标系下进行了抛物线的计算,那么枪管坐标系的中心点应恰好不受到枪管的 支撑力,即在枪管出口位置。通常将x轴平移量设置为0,y轴向前,z轴向天空。y,z轴的值应当让机械 在3维图纸上测,至于值的正负,你可以改变一下符号,看最终的坐标输出自行判断。

相机内参整定:

推荐使用大恒自带的SDK,里面可以找到一个叫GalaxyView的可执行文件,打开这个可执行文件,可 以很方便地对相机的各种参数进行调节,同时可以很方便地对标定板拍照,作为标定的图片使用。可 以使用Matlab工具箱作为标定工具。至于是否需要标定出 , , ,至今还无定论,有兴趣的可以研究 一下。 p 1 p 2 k 3 相机标定通常有很多技巧,不能随便标,否则后面PNP计算误差就会更大。一个基本原则是标定板在 图片中需要占据一半以上(即使标定格清晰一点),每次拍图片时,可以动云台,也可以直接动标定板, 拍摄多个角度的标定板,标定出来的参数才有普适性。另外,图片的亮度,白平衡等也会对标定结果 产生影响,故标定前需要确保选择自动白平衡模式,图片亮度要至少能清晰看见方格的角点。 GalaxyView内可以看到相机的SN号,如果程序需要的话可以在GalaxyView中查看并且在程序的json中 修改。

识别调参:

相机识别参数整定: 相机识别参数主要需要调整的: 曝光: 曝光是相机识别参数中最为重要的一个参数,曝光的调整的优劣会直接影响你识别程序效果的好坏。调节曝光的基本原则是: 不能调节得太低,太低的曝光会导致灯条变得很暗,二值化会出问题不说,还会截掉一部分的灯条,导致PNP计算不够准确。其次,越远的物体在相机中看到的亮度越低,如果曝光调节得过低,识别距离就会远远减短,如果识别距离小于4m,那么实战中就很容易断识别 不能调节得太高,如果调节得太高的话,由于形态学对噪点的处理总是有限的。如果曝光调得很高的话,并且分类器不够给力的话,就很有可能产生误识别 总结依据,就是曝光应当在你程序支持不误识别的前提下尽可能往高调

增益: 增益通常是在曝光满足不了的情况下调节,通常不应该调得很大.所以调节频率也比较低,至于具体效果怎样你可以具体实践体会一下.

至于相机得其它参数,一般影响不大,可以不用管。值得注意的是相机中内置自动曝光,自动增益这 些功能,这些算法(也包括你所能查到的大部分自动曝光算法)通常是以图像整体观感作为前提实现的, 而我们感兴趣的区域只有装甲板那一小部分,故这些功能都是价值不大的,不太建议去探索。 你可能不太想使用自动白平衡,而非要在赛场上用一张白纸来进行白平衡标定,虽然可能是一个可行 的办法,但我觉得自动白平衡效果已经可以了,没什么必要将调参变得这么麻烦。

识别算法参数整定:

首先聊一下识别算法,自从2021年上交四点模型横空出世,很多人认为深度学习是RM装甲板识别的最 优解。但是,今年哈工程使用传统视觉识别也展现出了惊人的鲁棒性,这值得令我们深思,是传统视 觉不行,还是我们自己本身对传统视觉的理解并不够。深度学习虽然能避免曝光的影响,但是也会使 模型不透明,导致出现一些莫名其妙的误识别(比如视觉群大佬们讨论的在前哨站附近的装甲板全部识 别为前哨站)。所以我认为,我们既要开发深度学习方向的装甲板识别,也要将这个从RM诞生至此的 传统算法彻底吃透。

图像预处理:

图像预处理算法通常可以分为四种类型 1.使用灰度图进行二值化,最后对像素判断颜色. 2.使用地方颜色的通道减去己方通道(或者绿色通道) 3.以上两者混合,即使用(灰度图或者通道相减图)然后再二值化. 4.使用HSV进行通道二值化 最后预处理的方案选择了第一种,理由是使用灰度图能够避免灯条断开的问题(如果在较高曝光或者较 高增益的情况下,灯条中心像素值较高,使灯条中心发白,如果使用通道相减或者HSV方法,可能会 导致二值化后的图形断开),虽然仅仅使用灰度图使后面对每个轮廓的颜色校验增加了一定的计算量, 而且也会导致筛选出来的灯条变多。

灯条 & 装甲板 特征筛选

为了解决预处理带来的弊端,需要对灯条的几何条件进行严格的约束。这里我感觉在上一个赛季并没 有做得很好,因为在上一个赛季中,对灯条以及装甲板特征的约束,都是给一个比较大的约束范围, 但是,这些较大的约束范围而不是合理的约束范围会使几何特征较差的"灯条"以及几何特征较差的"装 甲板"混入正确的灯条或装甲板中,如果将这些错误的装甲板都丢进分类器内的话,分类器又做不到完 全的识别准确,必然会导致最终识别的不稳定。因此,我觉得,这些几何约束参数应该认真地调整一 下!!!调整的方法也很简单,先给一个比较严格的参数约束,逐步移动目标位置(远近),或者改变装甲板 类型(大小装甲板),如果识别不到就根据输出数值再稍微扩大一点(至于这个度应该在调参过程自己感 悟)。

数字分类器

目前使用的分类器是 HOG + SVM 分类器,该分类器的优点是对光照变化有一定的鲁棒性。

预处理参数

目前将装甲板数字裁剪出来并且经过仿射变换之后,由于图像在低曝光的前提之下较暗,数字可能会 不太明显,故需要对图像进行一次gamma矫正,使图像整体变亮(当然也可以考虑直方图均衡化等预处 理方法)。gamma值越低,数字越亮,但噪点也会越多,故gamma值需要调节到一个较为合适的值,至 少肉眼能够清晰分辨数字。

卡尔曼滤波:

image.png

观看青工会: 步兵自瞄和英雄前哨视觉算法

(步兵自瞄)

1.pnp精度不够导致角度跳变问题(0度附近有几十度的跳变) image.png

解决方案: 思路一: 降自由度 image.png

image.png

2.装甲板半径计算 (1).几何半径计算 (2).ceres半径计算

3.打击目标选择 步兵追求高速打击,利用多段延迟 (-orietation_angle ~ orientation_angle)

英雄追求高命中率打击,计算orientation_angle = 0时的装甲板状态

打击衡量指标 image.png

4.打击衡量指标

5.自动弹道校正 可视化

6.延迟组成 img 相机曝光时间的中点 predict 经过神经网络,预测器预处理完成后,开始进行运动和目标解算的时间点 send 预测进程结束,准备发出信号的时间点 control 电控接受到信号后,电机开始运动的时间点 fire 信号所指示的子弹发射的时间点 hit 信号所指示的子弹击中的时间点

实测发现,control到fire确实存在几十毫秒延迟,我们无法保证电控接收到control命令时,该命令的子弹同时发射,就像发射水流一样.由于视觉总是可以让电控在control时间点达到命令的位置,我们希望control时间点发出的子弹能击中目标

7.弹道闭环 重现弹道后,识别相机弹丸,将识别到的弹丸和模拟的弹丸进行匹配,一堆匹配点采样了一个理想弹道和实际弹道的误差.将误差放入滤波器即可进行弹道校验

(英雄反前哨站视觉算法)

1.瞄准绿灯 2.测距(单点激光) (1).长焦 + PNP (2).单点激光 (3).(激光雷达 + 绿灯材质特定反射率) (4).(激光雷达建图 + 标定相机和激光雷达) (5).(激光雷达 + 点云神经网络识别前哨战/基地)

3.弹道解算 (1.一阶空气阻力模型 (2.四阶龙格-库塔弹道积分算法 image.png

4.细节修正 (1.激光–相机陀螺仪修正 (2.相机–激光安装修正 (3.机械发射修正

(视觉反旋转前哨)

背景 1.前哨转速固定,陀螺中心固定,陀螺半径固定 2.英雄的云台可能响应较慢

算法概括: image.png

image.png

image.png

image.png

(关键: 滤波器2为理想滤波器,预测仅使用0.4r/s或0.2r/s的转速)

杂谈: 该算法的前提是机械发射散度好,发射延迟稳定 该算法调参只需要调落点和dt 实际在过滤顶板时需要考虑诸多细节,例如绿灯识别结果会跳帧,装甲板识别结果会有顶,底,顶+底三种情况 有时由于各种原因,装甲板识别结果也可能会跳帧漏帧,很可能导致发不出弹,解决办法可以是在没有识别结果时也利用滤波器已经积累的数据进行与预测和发弹

电控关键保证: 散度(用复写纸来看散度分布),弹速延时(给出发弹指令和裁判系统反馈有测试数据,在这之间做一个时间查看,这时间差波动有多少) -> 通过这两个来验收标准

散度(8米有一个装甲板的散度) 延迟(正负10%) -> 机械结构没有问题一般波动不会很大

短板: 1.远距离测距不准,导致落点偏低(pnp测出来的偏近) 2.打陀螺转太快了跟不上

弹速过热 -> 自适应弹速(电控端做)

ws_glut_vison编译指南

catkin_make –pkg rm_msgs catkin_make

电控视觉(机械硬件)联调测试手册

记得应用测试代码(别测了半天发现是老代码) 测试必须一步一步来,必须保证上面的没有问题了再测试下面的

补充: 一些经验: 1.如果rviz没有上传坐标系: (1).可能是串口掉了 (2).可能是识别死了(由于存在节点重启此时rosnode list的判断其实不准可能其实是节点在不断死掉再重启) 2.如果自瞄重投影在大概率视觉是可以接收到电控的串口(但是不保证电控能接收到视觉的串口,可能是线会存在问题) -> 最新的串口线可以直接看出视觉有没有给电控发数据,电控有没有给视觉发数据

1.相机标定

标定相机(具体流程见上面) (标定完相机后和机械说千万不要动到相机的焦距和光圈(螺丝要拧紧)) 应用相机标定的参数到代码中(这段代码中需要更改两个地方) (一个在rm_tracker的yaml里面一个在rm_identify的yaml文件里面) -> 注意保证使用的是 该兵钟的yaml文件,两个文件的yaml文件相同

2.安装摄像头

安装相机 找机械要相对位置 视觉这边更改坐标变换位置 开rviz看上传tf数据和实际安装对不对 相机和C板安装会有装配误差,需要误差函数测算,或者使用手眼标定

4.部署代码

参考自瞄移植手册 -> 更名为: 自瞄赛前代码检查+备忘录

5.测试串口通信

电控先测试串口线能不能用: (如果不能用是不是线序的问题,或者线本身的问题)

先插上串口线,完整启动自瞄代码,此时相机线还没有插上,由于视觉这里代码的逻辑,此时视觉这里是单方面 只接收数据不发数据,这时候打开rviz观察有没有tf坐标上传(串口节点发给自瞄节点的回调函数,传过来坐标数据,在识别主函数上传) , 然后这时候动一下头,pitch和yaw,如果跟着动了说明接收数据没有太大问题,同时对应观察电控那里有没有发送数据过来

接着在上面的前提下(不关闭程序,不拔串口线),插上相机线,这时候,触发自瞄这边的逻辑,自瞄这边就会发送数据给电控,然后观察电控有没有接收到数据,他接收到数据后有没有发送数据过来(如果没有: 可能是发送数据到电控那里后代码在它们那边挂掉了(越界,或者优先级问题导致进程饿死了)),同时视觉这边可以

rostopic list rostopic echo auto_angle 观察自瞄节点有没有发送节点数据给自瞄串口节点(如果视觉串口节点实现没有问题应该会正常发送数据给电控)

测试视觉接收和发送电控解析出来的数据对不对,同时测试电控接收和发送视觉解析出来的数据对不对 (这步一定要做好,尤其要确定解析出来的顺序对不对,单位转换之间的协议对不对,不然可能会)

6.调串口补偿:

串口补偿(改两个地方串口的yaml文件和瞄准的yaml文件) 经验调参串口硬补偿(串口那边的yaml参数和瞄准那边的yaml参数应该相同) 前后平移装甲板,当两侧装甲板不会因为前后平移导致重构出来的装甲板往上偏或者往下偏说明参数是正确的了

7.硬补偿(瞄准yaml文件)

电控机械需保证弹速和视觉给的符合一致,弹道水平 -> 在此基础上才能调弹道 单一硬补偿: pitch补偿 减小往下 增大往上 yaw补偿 增大往左 减小往右

多段距离硬补偿: 在单一硬补偿的基础上: 根据目标距离分段施加固定的pitch,yaw补偿,用来修正解算模型,安装误差,弹道参数等带来的距离相关系统残差

在某个约定距离上,调整补偿角直到弹丸命中预定瞄准点,记录此时的附加角度 当PnP/迭代距离"不等于"真实物理距离时怎么办: 用系统自己的距离输出作为查表依据 1.标定时记录"视觉距离"而非真实距离 2.分段阈值用视觉距离来划定

微调端点时,关注区间内弹着点散布是否集中考虑: 1.给枪管清灰看看效果怎么样 -> 枪管积灰过多会导致散步变大 2.检查电控摩擦轮差速(一般是要求3转以内) 3.检查机械

提醒: 关摩擦轮时,摩擦轮会掉速会导致落点偏低,此时不要被干扰 摩擦轮打久后会导致摩擦轮温度上升,导致弹速上升(俗称打爽了)

8.调跟随(视觉预测时间(电控时延(额外发送量)) + pid跟随)

(1)调电控时延让电控听话

上交文档: 由于控制的复杂性,我们尚未专门解决非匀速运动目标的问题。我们将所有运动短期近似为匀速运动。其实考虑到打击总延迟为数量级为 100ms,大多数运动确实可以这么近似。 对于匀速目标,再作一近似,也就是电机转动也是匀角速度的,在该情况下,我们给出的yaw命令(标识视觉需要旋转的角度)是一个斜坡函数 当前的电控pid似乎不会对斜坡函数追踪到yaw命令 = 0为止,而是存在一个稳态偏差 比如对于一个角度为10度的目标,视觉持续发送命令,最终视觉的命令会停留在yaw = 2,理想情况下应该是稳定时 yaw = 0 该稳态偏差与对方的角速度yaw_v和某一时间常数有关,可描述为yaw_v * t0与电机性质和pid参数相关,因此视觉错了一个调整,我们计算目标的yaw_v (如果要细究,这是在 prediction_time 时刻的 yaw_v)并把发送给电控的 yaw 改为 yaw + t0 * yaw_v,其中 t0 通过跟踪匀速目标实验来暴力测出 实验发现,这种做法确实可以在稳态下使得视觉期望的yaw = 0,此时发送给电控的yaw 仍然时yaw + to * yaw_v, 不是0 这就意味着,如果对方是匀速运动,视觉总是可以在命令收敛后让电控在control 时间点达到命令的位置

当前双线火控存在: (1)视觉期望角 (2)视觉预测角(期望角 + 预测时间(电控时延)) (3)当前云台角

将视觉期望角,视觉预测角和当前云台角使用rqt_plot工具打印出来, 如果视觉期望角和视觉预测角只是单纯存在相位差,其他曲线形式基本一致,为合理 否则说明双线火控可能存在选板不一致的问题

变量名: COMMAND_TIMESPAN 如果视觉期望角在当前云台角左侧就增加电控时延 如果视觉期望角在当前云台角右侧就减少电控时延 可以先旋转粗调,再分别慢速旋转小陀螺精调参数 -> 该参数较为敏感,10ms命中率就会有明显差别

最终期望效果: (小陀螺跟随) -> 没有使用mpc和力控算法,该程序的上限就在这里 e36be2406aff417e8977fa7a5a487b5.jpg

(2)调程序预测时间(对齐时间戳,黑箱(经验调参))

调参前记得保证落点在装甲板正中心,否则会影响判断 车辆平移运动,自瞄击打目标, 如果子弹落点偏车运动方向的同向,说明预测时间超调,减少预测时间 如果子弹落点偏运动方向的反向,说明预测时间偏小,增加预测时间

(3)和电控调pid

先调节静止靶的目标,将云台移动到视野的边缘,然后点击自瞄(右键),打印rqt_plot的曲线,先调硬超调后再调软,最后调稳态误差 响应太慢 -> 增大P 震荡/超调 -> 减小p

最终有固定偏差 -> 增大I 超调后缓慢回调 -> 减小I

超调/震荡明显 -> 增大D 电机高频尖叫或抖动 -> 减小D

速度环(内环) 先调 云台电机转动不平滑,速度波动大,响应迟钝 典型现象: 推目标速度时电机抖动,啸叫 速度忽快忽慢 加速或急停时过冲

位置环(外环) 后调 速度环已经稳定,云台定位不准,角度超调,震荡 典型现象: 转到目标角度后过量超调再回来 在目标位置附近来回摆动 最终角度存在固定偏差(静差)

核心原则:速度环未调好之前,不要调位置环。 内环是基础,外环是上层。

9.测试完整的自瞄射击效果

打弹的时候记得叫电控和机械给被击打目标加装保护 (代码性的验证话,选择性的测试,毕竟测试内容有点多) 考虑装甲板的强度可能承受不了大弹丸的威力,打印件支架可能飞出来,电池可能被振飞

(测试击打车辆) -> (后期可以测试打击小装甲板和大装甲板的效果) 后期会出关于小装甲板和大装甲板的调节阈值,打弹时机的区别 由近到远完整的静止的车辆装甲板效果(直到测试出该弹速的子弹射程),统计命中率 由近到远完整的慢速旋转车辆装甲板的效果,统计命中率 由近到远的完整的小陀螺旋转车辆装甲板的效果,统计命中率 前后移动的旋转移动的小陀螺 左右移动的旋转移动的小陀螺 (测试前哨战) 注意事项: 前哨站比较高,近距离击打的时候俯仰角可能不够,需要 找出最近的极限击打距离 由近到远完整的静止的前哨战装甲板效果(直到测试出该弹速的子弹射程),统计命中率 -> 这里的目的主要是为了分析弹道,重补,和世界系补偿 由近到远的完整的旋转前哨战装甲板的效果,统计命中率

关于硬件对自瞄的影响 -> 微机需要硬件定期检修

1.关于串口线的问题

串口线需要安装驱动才可以使用,目前最新的串口线使用的是ch343的驱动 老的一批串口线使用的是ch340的驱动 -> 兼容ch34n

2.关于自瞄调试的问题

3.关于微机散热的问题

微机散热存在问题: 风扇转不转,有没有预留通风口 微机温度高,cpu主频下降,自瞄帧率下降

4.关于掉内存条的问题

现在微机都是两根内存条 如果掉了一根内存条: 内存带宽减半:通道数减少,数据通路变窄 加剧了CPU的搬运工角色,数据排队堵塞,DMA效率降低,CPU被迫补位

会导致海康相机节点和串口节点的cpu占用率升高 从而导致自瞄帧率下降

5.nuc震荡后关机的问题

老化的nuc受到震荡后会直接关机, 导航哨兵会转圈圈, 自瞄会直接掉

6.超电炸了后对自瞄的影响

怀疑,未确定 锁存模式 现象: 超电炸了后,会触发过流保护,一旦触发过流,保护电路会立即永久切断输出,并锁存这个保护状态 恢复条件: 即使过流故障已经移除,只要输入电源不中断,被锁存的保护状态就不会解除 必须彻底断开输入电源,等待电容放电完毕,再重新上电,才能复位保存锁存,恢复供电

打嗝模式 现象: 触发保护后切断输出,间隔一段时间后尝试重新开启,如果此时故障(如超电短路)依然存在,会再次触发保护,如此循环(打嗝)

7.哨兵掉网口的问题

哨兵掉网口会转圈圈 老哨兵微机是网口接口坏了导致的

8.供电对nuc和网口的影响

(1)降压不好的话,过颠簸一瞬间会出现欠压的情况,导致掉网口 (2)曾经有一个电控将: 降压线接入到射击模块,导致裁判端一进入比赛,没有买弹不给微机供电(导致视觉开离线怎么测试都没有测试出来) -> 多了解一些电控接线,裁判系统的知识 (3)怀疑: 超电炸了后也可能会导致微机供电出现问题

9.关于显卡欺骗器对自瞄的影响

最好插上,否则x11,nomachine,vnc,todesk等远程调试器会出现问题

10.关于布线,打热熔胶和扎带对自瞄的影响

布线方法: 用扎带固定(相机线,串口线)两端,中间留余量保证车运动的时候不会扯到线 热熔胶给两个usb口(相机和串口)和雷达的网口线打上胶 电源线不可以打胶,可能会短路

相机的两个螺丝(光圈和焦距) -> 注意不要和东西干涉,否则剧烈运动或震动后可能会导致 螺丝松了

不建议相机的两个螺丝打热熔胶 -> 打了胶反而会干涉导致焦距和光圈松了 -> 最典型的问题就是光圈和焦距松了导致自瞄识别不到目标,只能近距离才能看到甚至完全识别不到

11.微机老化接口损坏的问题

ssh+自瞄网页调试器 c口延长线

12.关于硬盘损坏导致微机死机或无法开机的问题及解决方案

硬盘损坏,存在坏点(原全向微机) -> 根文件系统出现了严重损坏,系统在启动时无法自动修复,因此被迫进入紧急模式的 BusyBox界面

解决方法: 使用fsck进行修复(自行截图询问ai)

fsck /dev/nvme0n1p2 yes reboot 或者失败了:exec /sbin/init

关于自身小陀螺导致自瞄往旋转方向瞄歪的问题 关于哨兵和自瞄串口冲突的问题 关于视觉ros节点重启的问题 发弹延时对自瞄的影响 电控时延对自瞄的影响(让电控听话) 如何火控调参

关于电控对自瞄的影响

1.pid对自瞄的影响

pid没有调好的表现: 云台转动不平滑、抖动、啸叫 → 自瞄输出角度在跳,云台也在抖,弹道散成一片 转到目标角度后过冲再回来、在目标附近来回摆、存在固定偏差(静差) → 视觉命令收敛到0了,但云台实际还差着几度,枪口没对准 斜坡函数跟随的稳态误差:匀速目标下视觉发给电控的是斜坡命令,PID跟随会存在一个 yaw_v × t0 的固定偏差,视觉端需要把这个偏差补偿回去

2.电控接线对自瞄的影响

降压线错误接入射击模块 -> 裁判端不买弹就不给微机供电 -> 导致视觉离线怎么测都测不出来原因 串口线不稳 -> 掉串口 或者相机线不稳(包括相机线和cmos的末端螺丝没拧紧 相机过度挤压) -> 都会导致掉相机 自瞄帧率下降

3.散布(摩擦轮差速)对自瞄的影响

摩擦轮差速过大(超过3转)→ 子弹旋转不一致 → 弹道左右飘,远距离尤其明显

关于机械对自瞄的影响

1.虚位对自瞄(电控 -> 自瞄)的影响

2.装配误差对自瞄的影响

齿轮/传动机构的间隙 → 视觉发令云台转2°,实际只转了1.7° → 瞄准始终有偏差 虚位大的表现:自瞄在目标附近来回小幅摆动,始终收敛不到0 排查方法: 找机械和电控,它们会告诉你有没有虚位

3.散布对自瞄的影响

影响散布的各种因素 摩擦轮差速过大(超过3转)→ 子弹旋转不一致 → 弹道左右飘,远距离尤其明显 摩擦轮打久了温度升高 → 弹速上升(俗称"打爽了")→ 落点往上飘,弹道模型失准 建议写上验收标准:8米距离打装甲板看散度分布,要求散布在一个装甲板大小范围内 枪管积灰也会增大散步,测之前记得先清枪管 -> 俗称给枪管刷牙

4.机械干涉对自瞄的影响

云台转动时相机线/串口线被拉扯 → 线松了→ 通信断 → 自瞄挂。布线原则:两端固定(扎带),中间留余量 弹舱扩容挤占微机位置 → 自瞄没地方装(升降步兵的坑) 云台极限角度时结构碰撞 → 自瞄命令到达极限位置时机械卡住 → 电机堵转 相机视场被自身结构遮挡 → 某些角度识别不到 -> 参考哨兵的相机

5.重力补偿对自瞄的影响(对电控pid的影响)

影响pitch轴pid的调试 和pitch轴自瞄的跟随 验收标准: 手抬pitch轴 不管抬到任何程度 头都不会掉下来

没调好: 重补不够 重补过了

不够: 头抬不起来 云台俯仰角越大,重力产生的力矩越大 → 同样的PID参数,平射跟得上,高角度跟不上了 表现:打高处目标(前哨站)时云台响应明显比打地面目标慢,落点偏低 本质是电控PID在不同负载下的适应性,视觉了解这个机制后就知道不是弹道的问题,是云台重力补偿的问题

过了: 头低不下去

手写笔记

自瞄耗时测试

由于采集延时和相机节点处理耗时,相机话题的最大延时可能达到了20ms,所以帧率给到了50帧也就是20ms,后续再优化 IMG_20251127_211549.jpg

识别流程

IMG_20251127_211610.jpg

上交角点坐标变换计算草稿

(算了一个下午) IMG_20251127_211619.jpg

相机内参和畸变系数的含义

IMG_20251127_211630.jpg

自瞄通信流程

(附上: 如果电控串口数据没有发送,为什么没有tf坐标上传) IMG_20251127_211643.jpg

卡尔曼滤波公式

上面有,在这里整理一下 IMG_20251127_193011.jpg

坐标变换 IMG_20251128_201317.jpg

角点变换,角点坐标定义重大区别 影响角点顺序 IMG_20251130_211216.jpg

bug 该内容仅赛季初期书写 涉及的内容很少 许多bug只记录在脑子中未在其中提及:

1.不要将任何延时放进回调函数里面

2.车在平移的时候两侧的装甲板会同时向上或者向下(并且rviz也有这个现象) -> 重投影存在问题(并且rviz也存在了相同的问题) ->世界坐标系到相机坐标系的变换存在问题 -> 相机内参和畸变系数存在问题 -> 解决方法: 重新相机标定(可能是使用相机的时候动到了相机的焦距) !!!相机一定要经常标定啊

3.测试的时候,如果是相机插上微机测试的话,那么相机一定要水平放,否侧给的相机是水平的,但是实际上相机是有倾斜角的

bebaff2ff09794b130f7e9fb0fcb5441_750.png

相机如果是斜着放的: bebaff2ff09794b130f7e9fb0fcb5441_750.png

相机斜着放的rviz: bb74d9c00101426fcbaacedf3e224930_750.png

相机如果是正着放的: 5fe30156e80be686f8cdfba9a1868522_750.png

相机正着放的rviz: IMG_20251007_214839.jpg

4.打弹不中->重力补偿不对->没有转枪管系

5.录制bag包观测装甲板tf上传数据不对,时间戳不对,因为时间是从回调函数运行的时候调用的,这时候记录的时间就不是话题的时间,而是当前系统的时间,所以应该传入话题的时间.

原因: 相机是斜着放的,世界系跟着相机系斜了,由于两侧装甲板的高度没有被更新,高度是不变的,这时候由于世界坐标系相对于建立的正的相机系是斜的, 这时候车前后移动,重投影,两侧没有更新的装甲板就会随着车的移动而错误的上下移动

参考开源

本项目在开发过程中参考和借鉴了以下开源项目的优秀方法,在此表示诚挚感谢:

学校/战队开源仓库本项目参考的核心技术
西北工业大学 WMJWMJAimerEKF + 熵权法多运动模型匹配的整车建模、MPC 轨迹规划器
上海交通大学rm.cv.fans三分法降自由度 Yaw 角优化、弹道可视化调参工具、坐标变换器设计
同济大学 SuperPowersp_vision_25暴力搜索法降自由度 Yaw 角优化、MPC 轨迹规划器
华南师范大学rm_auto_aimfitLine 灯条角点优化
中南大学 FYTFYT2024_visionPCA 灯条角点优化

具体借鉴说明

  • 整车建模:参考西工大 WMJAimer 的 EKF 多模型融合架构,实现了标准模型、平衡模型和前哨站模型的自动切换,并结合熵权法进行多运动模型的数据关联匹配
  • Yaw 角降自由度优化:参考上交的三分法和同济的暴力搜索法,在识别模块中实现了对装甲板法向量的角度拟合,将 3 自由度姿态估计降至 1 自由度
  • MPC 轨迹规划:同时集成了西工大(基于 QP 二次规划)和同济(分离 Pitch/Yaw 轴)两种 MPC 方案,用于云台控制指令的平滑规划
  • 灯条角点优化:参考华南师范的 fitLine 方法和中南大学的 PCA 方法,对灯条角点进行亚像素级矫正,提升 PNP 位姿解算精度
  • 弹道可视化:参考上交的弹道重现方案,实现了模拟子弹的实时绘制与可视化调参
  • 坐标变换器:参考上交的坐标系管理设计,实现了 Map → IMU → Camera → Gun 的级联 TF 变换系统
  • YOLOv8 模型:基于 Ultralytics 开源框架训练,使用 OpenVINO 推理引擎部署

参考学习资源

图片 1 图片 2 图片 3 图片 4 图片 5 图片 6 图片 7 图片 8 图片 9 图片 10 图片 11 图片 12 图片 13 图片 14 图片 15 图片 16 图片 17 图片 18 图片 19 图片 20 图片 21 图片 22 图片 23 图片 24 图片 25 图片 26 图片 27 图片 28 图片 29 图片 30 图片 31 图片 32 图片 33 图片 34 图片 35 图片 36 图片 37 图片 38 图片 39 图片 40 图片 41 图片 42 图片 43 图片 44 图片 45 图片 46 图片 47 图片 48 图片 49 图片 50 图片 51 图片 52 图片 53 图片 54 图片 55 图片 56 图片 57 图片 58 图片 59