1014 字
5 分钟
中南自瞄
装甲板检测
Detector- 成员
LightParams灯条参数min_ratio,max_ratio灯条宽高比max_angle最大倾斜角color_diff_thresh颜色阈值,用来判断颜色(通道相减)
ArmorParams装甲板参数min_light_ratio最小灯条宽高比center_distance装甲板距离max_angle最大倾斜角
binary_thres二值化阈值detect_color颜色classifier识别数字corner_corrector角点修正binary_img二值化图像rm_interfaces::msg::DebugLights debug_lightsrm_interfaces::msg::DebugArmors debug_armors发布消息gray_img_灰度图lights_armors_检测的所有灯条和装甲板
- 函数
detect检测入口preprocessImage图像预处理- 转灰度,二值化
findLights- 寻找轮廓,然后简单判断,如果点太少就跳过
- 转换成灯条
- 判断是否是灯条
- 判断颜色
- 保存
- 按横坐标排序,返回
matchLights匹配装甲板- 判断颜色,距离初步筛选
- 左右灯条配对
containLight判断灯条中间是否还有别的- 最小旋转矩形,计算尺寸
- 太宽太窄都跳过
- 判断是否有点在矩形里
isArmor判断装甲板- 灯条长度比,灯条距离,倾斜角
- 判断大小装甲板
getAllNumbersImage调试函数- 将收集的装甲板数字拼起来输出图像用于调试?
drawResults绘制结果- 画出装甲板,画出大小,数字
isLight判断灯条- 宽高比,倾斜角
- 保存调试信息
isArmor判断装甲板containLight判断灯条中间是否还有别的
- 成员
装甲板检测节点
ArmorDetectorNode- 流程
构造函数initDetector- 初始化二值化,装甲板参数,灯条参数等信息
- 初始化数字识别和角点修正
- 设置动态参数回调
- 设置参数
- 启动发布者,订阅者,服务端
imageCallback图像回调函数- 读取tf2中的消息
- 获取装甲板检测结果
- 求解位姿
- debug调试
- 发布装甲板消息
detectArmors- 读取图像
- 装甲板检测
- 调试模式
- 发布二值化图像
- 按照x坐标排序
- 发布灯条和装甲板结果
- 返回装甲板
onSetParameters- 更新参数
createDebugPublishers,destroyDebugPublishers开启和关闭调试publishMarkers发布markers信息setModeCallback模式切换
- 流程
解算
Solver构造函数- 读取参数
- 初始化各种信息
solve- 从节点获取参数(最大跟踪 yaw 速度、延时、侧角、最小切换速度等) 异常记录日志
- 读取rpy
- 读取位置,朝向,速度
- 计算弹丸飞行视角
- 生成装甲板的三维点
- 选择最优的装甲板
- 给出开火建议
isOnTarget- 判断是否瞄准成功,能否开火
getArmorPositions- 计算装甲板的三维坐标
selectBestArmor- 计算位置,旋转角速度
- 选择要击打的装甲板
trajectory_compensator_- 修正弹道
解算节点
ArmorSolverNode- 构造函数
- 节点初始化
- 输出启动信息
- 追踪器,卡尔曼滤波初始化
- 订阅和发布
- 定时器
timerCallback- 检查是否启动
- 初始化
- 检测是否有目标
- 解算
- 发布消息
initMarkers- marker调试
armorsCallback- 坐标变换
- 排除异常装甲板
- 发布消息
- 更新状态
publishMarker- 绘制信息
setModeCallback- 设置模式
- 构造函数
追踪
Tracker构造函数- 初始化参数
init- 选择最近的装甲板
- 初始化卡尔曼滤波
- 设置装甲板信息
update- 更新卡尔曼滤波的状态
- 选择最合适的装甲板
- 更新装甲板
initEKF- 初始化卡尔曼滤波
handleArmorJump- 处理快速旋转的装甲板
- 判断角度
- 修正卡尔曼
- 计算距离
- 重置卡尔曼
- 处理快速旋转的装甲板
orientationToYaw- 修正yaw角
getArmorPositionFromState- 推算位置
位姿估计
ArmorPoseEstimator构造函数- 初始化pnp,ba
extractArmorPoses- 提取位姿
rotationMatrixToRPY- 提取欧拉角
sortPnPResult- 选择正确的pnp
问题
- 只能看懂大概在干什么,里面有很多处理细节没咋细看,具体的可能需要自己动手调车才能更深理解
- 智能指针没学太多,很多地方都看不懂
- 预处理为什么没有形态学操作
- 是不是需要增加一些亮度判断
- 调试那部分似懂非懂
- 数字识别那里神经网络没学
- 感觉要学的还是太多了,下一步我该学啥
部分信息可能已经过时