【目标跟踪】3D点云跟踪

文章目录

  • 一、前言
  • 二、代码目录
  • 三、代码解读
    • 3.1、文件描述
    • 3.2、代码框架
  • 四、关联矩阵计算
    • 4.1、ComputeLocationDistance
    • 4.2、ComputeDirectionDistance
    • 4.3、ComputeBboxSizeDistance
    • 4.4、ComputePointNumDistance
    • 4.5、ComputePointNumDistance
    • 4.6、result_distance
  • 五、结果

一、前言

  1. 前博客一直介绍的是视觉方向的跟踪。不过在如今智能驾驶领域,雷达感知仍然占据主要部分。今天来分享下点云3D跟踪。
  2. 视觉跟踪输入就是目标检测的结果。雷达跟踪输入可以是点云检测的结果,也可以是点云聚类的结果。除了一些数据结构、匹配计算,雷达跟踪算法与前面介绍视觉跟踪方法大体相同。
  3. 本篇主要探讨雷达如何进行匹配、关联计算,同时解析下代码结构。参考的是 apollo 代码,整体效果还不错。

二、代码目录

雷达跟踪所有的代码文件
在这里插入图片描述

三、代码解读

3.1、文件描述

文件跳转较多,新手读起代码可能有点吃力。最好记录下每个文件是干什么的,有个大致印象即可。

.h文件描述
object_track.hclass ObjectTrackSet class ObjectTrack
object.h(1) struct Object; (2) struct SensorObjects
tracked_object.hstruct TrackedObject 数据类型 框、点云
hm_tracker.hstruct TrckerParm 全是参数
kalman.h卡尔曼滤波 预测、状态、运动方程
hungarian_matcher.h目标匹配
track_object_distance.h计算匹配矩阵权重
geometry_util.h计算所有点质心、计算3D框、数据转化等
feature_descriptor.h计算目标的形状特征

一些补充:

barycenter 点云几何中心点(质心)

目标框 direction 朝向角 默认状态(1, 0, 0)

目标框 size 长宽高 (length, width, height)

目标状态 (x, y, z, vx, vy, vz)

状态方程 匀速 x = x + v * t

3.2、代码框架

阅读代码整体顺序如下

(1)跟踪

hm_tracker.cpp

bool HmObjectTracker::Track()

A 初始化 B 数据转化 输入 C 预测 D 匹配 E 更新 F 结果

hm_tracker.cpp 文件 Track 函数基本就是整个运算主函数了

(2)匹配

hungarian_matcher.cpp

void HungarianMatcher::Match()

A 计算关联矩阵 B 计算连接的组件 C 匹配每个子图

这里面有很多种匹配方式,这里主要运用的是A 计算关联矩阵

(3)关联矩阵计算

track_object_distance.cpp

float TrackObjectDistance::ComputeDistance()

这个函数就是我们这次的主角了。计算目标与目标的距离,然后进行匈牙利匹配。


四、关联矩阵计算

这部分是核心,我们来好好研究下。截取部分代码

double TrackObjectDistance::s_location_distance_weight_ = 0.6;
double TrackObjectDistance::s_direction_distance_weight_ = 0.2;
double TrackObjectDistance::s_bbox_size_distance_weight_ = 0.1;
double TrackObjectDistance::s_point_num_distance_weight_ = 0.1;
double TrackObjectDistance::s_histogram_distance_weight_ = 0.5;

// new_object测量 track_predict预测 
float TrackObjectDistance::ComputeDistance(
    ObjectTrackPtr track, const Eigen::VectorXf& track_predict,
    const std::shared_ptr<TrackedObject>& new_object) {
  // Compute distance for given track & object
  float location_distance = ComputeLocationDistance(track, track_predict, new_object);  // 分速度慢 速度快
  float direction_distance = ComputeDirectionDistance(track, track_predict, new_object);
  float bbox_size_distance = ComputeBboxSizeDistance(track, new_object);
  float point_num_distance = ComputePointNumDistance(track, new_object);
  float histogram_distance = ComputeHistogramDistance(track, new_object);

  float result_distance = s_location_distance_weight_ * location_distance +
                          s_direction_distance_weight_ * direction_distance +
                          s_bbox_size_distance_weight_ * bbox_size_distance +
                          s_point_num_distance_weight_ * point_num_distance +
                          s_histogram_distance_weight_ * histogram_distance;
  return result_distance;
}

4.1、ComputeLocationDistance

计算中心点距离差 取值范围[0, + ∞ +\infty +

当current_object 中 V <= 2m/s 欧式距离

在这里插入图片描述

当current_object 中 V > 2m/s 根据速度方向分解 以速度方向与垂直速度方向建立坐标系。投影速度方向的偏差为1/2倍距离偏差, 投影垂直速度方向的偏差为2倍距离偏差。平方开方求最终偏差。

在这里插入图片描述

可以简单理解为:当目标高速行驶时,在速度方向上的位移偏差会稍大,为了补偿这部分偏差,采取降低方向上的位移权重计算最终位移偏差(我是这么理解的)。

4.2、ComputeDirectionDistance

计算方向上的距离 取值范围[0,2]

计算位移在速度方向上的余弦值cos_theta 最终return 1- cos_theta

在这里插入图片描述

这个也比较好理解。当物体与检测物体位移差方向与预测速度方向相近时,此时更相信是同一个目标。cos值为1时,说明位移偏差与预测速度同方向,则认为这两物体更容易匹配。

当位移偏差为0时,这里有设定默认cos值为0.994。

4.3、ComputeBboxSizeDistance

取值范围[0,1]

这个稍微有点复杂,待我娓娓道来

old_dir 当前目标的方向,默认偏航为0时 默认值为(1, 0, 0)

new_idr 检测目标的方向

old_size 当前目标的尺寸 (bbox.length, bbox.width, bbox.height)

new_size 检测目标的尺寸

在这里插入图片描述
nter&pos_id=img-506WdR2l-1706774251770)

计算dot_00, dot_01。dot_00 可以理解为两目标方向夹角,dot_01理解为目标与另一目标垂直方向夹角。这里不考虑超过90度的夹角,因为目标方向可以是alpha 或 180 - alpha。

在这里插入图片描述

为什么两种情况?可以理解为把目标长与宽对齐(我们事先并不知道目标对应的长宽),先根据目标角度的状态判定。当角度小于45°时,目标长与另一目标的长对齐。否则目标长与另一个目标宽对齐,最终计算长或者宽差值的比例,取最小值当做最终值。

4.4、ComputePointNumDistance

取值范围[0,1]

这个公式比较简单

在这里插入图片描述

这个很容易理解,点云个数越相近,越容易匹配上。

4.5、ComputePointNumDistance

取值范围[0,3]

直方图距离 把目标所有点云以当个坐标轴分为10个区间 再以xyz三轴共分为30个区间。

如果点云都是均匀排布那么目标形状特征 shape_features = [0.1] * 30

shape_features具体计算过程。以x轴为例,y轴、z轴同理。

计算目标点云 x轴最值,把区间划分为10等分。记录所有点在10个区间点云个数。

如果完全均匀排布则结果为

shape_feature_x = [0.1]*10

shape_features = shape_feature_x + shape_feature_y + shape_feature_z

知道了目标形状特征的定义,可得

在这里插入图片描述

4.6、result_distance

最终距离为上述计算的5个距离量乘以对应系数和

在这里插入图片描述

五、结果

由于 rviz 无法显示点云跟踪结果,那我们把雷达跟踪结果 topic 录制下来,然后再可视化。当然也可以在过程中保存图片。

在这里插入图片描述

整体跟踪效果不错。赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/363041.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系统分析师-21年-下午答案

系统分析师-21年-下午答案 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答&#xff0c;二、三、四、五题中任选两题作答 试题一 (25分) 说明 某软件企业拟开发一套基于移动互联网的在线运动器材销售系统&#xff0c;项目组决定采用FAST 开发方法进行系统分…

SumGNN: 多类型药物相互作用预测 - 通过高效知识图谱概括

SumGNN: 多类型药物相互作用预测 - 通过高效知识图谱概括 在医学领域&#xff0c;准确预测药物之间的相互作用对于药物研发和治疗方案设计至关重要。为了解决这一挑战&#xff0c;我们提出了一种名为"SumGNN"的新方法&#xff0c;旨在通过高效的知识图谱概括实现多类…

PostgreSql和Oracle的事务机制区别以及对程序的影响

前言 几年前IT信息产业的一些核心技术包括架构、产品以及生态都是国外制定&#xff0c;然而自从“遥遥领先”公司被制裁后&#xff0c;国家开始大力支持信息产业“新基建”&#xff0c;自2020年开始市场上涌现出了大量的国产化软件&#xff0c;就国产化数据库而言我所在的公司…

一种轻量分表方案-MyBatis拦截器分表实践|京东零售技术实践

背景 部门内有一些亿级别核心业务表增速非常快&#xff0c;增量日均100W&#xff0c;但线上业务只依赖近一周的数据。随着数据量的迅速增长&#xff0c;慢SQL频发&#xff0c;数据库性能下降&#xff0c;系统稳定性受到严重影响。本篇文章&#xff0c;将分享如何使用MyBatis拦…

企业微信获客助手怎么实现抖音数据回传?

在数字化时代&#xff0c;企业微信获客助手和数灵通外链已经成为企业获取潜在客户的得力助手。通过在微信站外的各个渠道上捕获潜在客户&#xff0c;企业能够更好地满足客户需求并提高业务增长。而抖音作为当前最热门的短视频平台&#xff0c;也成为了企业营销的重要战场。 企业…

OTG -- ULPI接口芯片USB3318讲解(二)

目录 前沿 1 初识USB PHY芯片 2 ULPI接口与USB PHY芯片 3 USB3318简介 3.1 USB3318引脚定义 3.2 USB3318与ULPI接口时序 3.3 STM32F407 OTGHS如何驱动USB3318 3.4 USB3318原理图设计 4 总结 前沿 前面对STM32F407 OTG模块进行了简单的讲解&#xff0c;如果使用OTG_FS模…

期末成绩群发给家长

每当学期结束&#xff0c;老师们的邮箱和手机便会被成绩报告单填满。那么&#xff0c;如何高效地将成绩群发给家长呢&#xff1f; 一、邮件还是短信&#xff1f; 首先&#xff0c;选择一个合适的通讯方式是关键。邮件正式且便于附件&#xff0c;但短信更快捷。考虑到大多数家长…

项目经理如何成功接手做到一半的项目:从0到1的高效指南

最近看到很多帖子&#xff0c;吐槽自己一年到头来一直频繁被拉去救火、去接做到一半的项目。这种情况应该是很多项目经理都会遇见的&#xff0c;大多数情况是因为前任项目经理由于各种原因&#xff0c;如调岗、离职而留下的项目&#xff0c;但往往到大家手上的时候&#xff0c;…

Qt实现窗口吸附屏幕边缘 自动收缩

先看效果&#xff1a; N年前的QQ就可以吸附到屏幕边缘&#xff0c;聊天时候非常方便&#xff0c;不用点击状态栏图标即可呼出QQ界面 自己尝试做了一个糙版的屏幕吸附效果。 关键代码&#xff1a; void Widget::mouseMoveEvent(QMouseEvent *e) {int dx e->globalX() - l…

Java Chassis 3技术解密:与Spring Cloud的互操作

作者&#xff1a;刘宝 原文链接&#xff1a;Java Chassis 3技术解密&#xff1a;与Spring Cloud的互操作-云社区-华为云 Java Chassis 3一个很重要的设计原则&#xff1a;利用架构的韧性设计来解决兼容性问题。 比如通过引入微服务网关&#xff0c;来解决不同语言、不同框架、…

C#,洛布数(Lobb Number)的计算方法与源代码

1 洛布数&#xff08;Lobb Number&#xff09; 在组合数学中&#xff0c;洛布数&#xff08;Lobb Number&#xff09;L(m&#xff0c;n)计算nm开括号的排列方式&#xff0c;以形成一个有效的平衡括号序列的开始。 Lobb数由两个非负整数m和n参数化&#xff0c;其中n>m>0。…

计算机网络实验一

目录 实验一 使用PacketTracer组建简单局域网 1、实验目的 2、实验设备 &#xff08;1&#xff09;内容一&#xff08;组建简单局域网&#xff09;&#xff1a; &#xff08;2&#xff09;内容二&#xff08;使用交叉线直连两台机器&#xff09;&#xff1a; &#xff08…

基于SpringBoot+Vue学科竞赛管理系统

文章目录 基于SpringBootVue学科竞赛管理系统1系统概述1.3系统设计思想 2相关技术2.1 MYSQL数据库2.2 B/S结构2.3 Spring Boot框架简介2.4 Vue简介 3系统分析3.1可行性分析3.1.1技术可行性3.1.2经济可行性3.1.3操作可行性 3.2系统性能分析3.2.1 系统安全性3.2.2 数据完整性 3.4…

「数据结构」1.初识泛型

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;Java数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 初识泛型 &#x1f349;前言&#x1f349;包装类&#x1f34c;装箱&拆箱 &#x1f349;泛型&#x1f34c;擦除机制&#x1f…

拒绝单调,Focussend智能AI助阵邮件营销,让打开率大幅提升

在互联网时代&#xff0c;邮件营销成为了企业推广产品和服务的一把重要利器。但是&#xff0c;面对大量垃圾邮件和用户审美疲劳&#xff0c;如何让你的邮件脱颖而出&#xff0c;成为了每一个市场人的头疼问题。光靠无聊的标题和内容可不行&#xff0c;得有点新花样。 搜索&…

记一次某竞赛中的渗透测试(Windows Server 2003靶机漏洞)

靶机简介 Windows Server 2003是微软公司于2003年3月28日发布的服务器操作系统&#xff0c;它基于Windows XP/Windows NT 5.1进行开发&#xff0c;并在同年4月底上市。以下是关于Windows Server 2003的详细介绍&#xff1a; 系统名称与发布历程&#xff1a; 该产品最初被命名为…

linux vim 异常退出 异常处理 交换文件

交换文件 *.swp 格式 同时是隐藏的 如在vim一个文件&#xff0c; 在没有正常退出&#xff0c; 如直接断开连接 在次编辑这个文件 会出现下图的错误 解决方案&#xff1a; 直接删除这个交换文件即可 rm -fr .zen.txt.swp

经典左旋,指针面试题

今天给大家带来几道面试题&#xff01; 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 我们可以先自己自行思考&#xff0c;下面是参考答案&#xff1a; 方法一&#xff1a; #define _CRT_SEC…

人工智能网络安全挑战赛(AIxCC):超亿元大奖等你来拿!

2023年底&#xff0c;DARPA开启了一项前所未有的挑战——人工智能网络安全挑战赛&#xff08;AIxCC&#xff09;&#xff0c;旨在通过技术竞赛探索AI时代下网络安全的新格局。该赛事希望孕育出一种创新的网络安全通用人工智能&#xff08;AGI&#xff09;系统&#xff0c;该系统…

从0到1入门C++编程——06 类和对象之多态、文件操作

文章目录 多态1.多态基本概念2.多态案例——计算器3.纯虚函数和抽象类4.多态案例——制作饮品5.虚析构和纯虚析构6.多态案例——电脑组装 文件操作1.文本文件--写文件2.文本文件--读文件3.二进制文件--写文件4.二进制文件--读文件 多态 1.多态基本概念 多态是C面向对象的三大…