autoware.universe源码略读(3.15)--perception:object_merger

news2024/12/25 15:30:10

autoware.universe源码略读3.15--perception:object_merger

  • Overview
  • node
    • (enum)MSG_COV_IDX
    • (Class)ObjectAssociationMergerNode
    • (Func)isUnknownObjectOverlapped
    • (Func)convertListToClassMap
    • (mFunc)ObjectAssociationMergerNode::ObjectAssociationMergerNode
    • (mFunc)ObjectAssociationMergerNode::objectsCallback

Overview

这个包的目的是为了通过数据关联,来进行检测到的物体之间的融合。可以看到针对这里的算法,应该是用到上一个里面使用到的SSP算法了
在这里插入图片描述

连续最短路径算法用于解决数据关联问题(最小成本流问题)。成本由两个对象之间的距离计算得出,门函数用于重置成本,包括最大距离、最大面积和最小面积。

所以这里的data_association和multi_object_tracker中的是一样的

node

(enum)MSG_COV_IDX

这里是把所有变量之间的协方差对应的索引都列出来了

(Class)ObjectAssociationMergerNode

这里的结构相对简单不少,直接就是这么一个节点类

(Func)isUnknownObjectOverlapped

这里是对UnkownObject先进行了一个单独处理,输入一个known_object,然后计算两者之间的距离,根据距离、precisionrecall和IoU几种指标判断,是否是和已知的物体重叠的

(Func)convertListToClassMap

根据distance_threshold_list生成了一个map,把距离阈值和class_label对应了起来,比如上一个函数就需要这个东西作为输入

(mFunc)ObjectAssociationMergerNode::ObjectAssociationMergerNode

这里需要注意的是,每次只订阅了两个话题,就是每次输入的需要融合的两个物体

NameTypeDescription
input/object0autoware_auto_perception_msgs::msg::DetectedObjectsdetection objects
input/object1autoware_auto_perception_msgs::msg::DetectedObjectsdetection objects

然后加载的参数有

NameTypeDescription
can_assign_matrixdoubleAssignment table for data association
max_dist_matrixdoubleMaximum distance table for data association
max_area_matrixdoubleMaximum area table for data association
min_area_matrixdoubleMinimum area table for data association
max_rad_matrixdoubleMaximum angle table for data association
base_link_frame_iddoubleassociation frame
distance_threshold_liststd::vector<double>Distance threshold for each class used in judging overlap. The class order depends on ObjectClassification.
generalized_iou_thresholddoubleGeneralized IoU threshold

这里首先用到了sync_这样一个变量,目的应该是为了进行一个简单的同步

sync_(SyncPolicy(10), object0_sub_, object1_sub_)
// Create publishers and subscribers
using std::placeholders::_1;
using std::placeholders::_2;
sync_.registerCallback(std::bind(&ObjectAssociationMergerNode::objectsCallback, this, _1, _2));

然后里面也是实例化了一个DataAssociation

overlapped_judge_param_.distance_threshold_map =
  convertListToClassMap(declare_parameter<std::vector<double>>("distance_threshold_list"));

(mFunc)ObjectAssociationMergerNode::objectsCallback

先是把两个对象都转换到base_link下,然后直接调用数据关联

std::unordered_map<int, int> direct_assignment, reverse_assignment;
const auto & objects0 = transformed_objects0.objects;
const auto & objects1 = transformed_objects1.objects;
Eigen::MatrixXd score_matrix =
  data_association_->calcScoreMatrix(transformed_objects1, transformed_objects0);
data_association_->assign(score_matrix, direct_assignment, reverse_assignment);

接下来针对找到匹配的那些objects,根据设置的模式PriorityMode来决定输出的object

for (size_t object0_idx = 0; object0_idx < objects0.size(); ++object0_idx) {
  const auto & object0 = objects0.at(object0_idx);
  if (direct_assignment.find(object0_idx) != direct_assignment.end()) {  // found and merge
    const auto & object1 = objects1.at(direct_assignment.at(object0_idx));
    switch (priority_mode_) {
      case PriorityMode::Object0:
        output_msg.objects.push_back(object0);
        break;
      case PriorityMode::Object1:
        output_msg.objects.push_back(object1);
        break;
      case PriorityMode::Confidence:
        if (object1.existence_probability <= object0.existence_probability)
          output_msg.objects.push_back(object0);
        else
          output_msg.objects.push_back(object1);
        break;
    }
  } else {  // not found
    output_msg.objects.push_back(object0);
  }
}

然后再把没有匹配的情况下的objects1的对象也加到输出中

for (size_t object1_idx = 0; object1_idx < objects1.size(); ++object1_idx) {
  const auto & object1 = objects1.at(object1_idx);
  if (reverse_assignment.find(object1_idx) != reverse_assignment.end()) {  // found
  } else {                                                                 // not found
    output_msg.objects.push_back(object1);
  }
}

最后还对Unknown类型的物体进行了下处理,就是遍历用上边提到的isUnknownObjectOverlapped函数,最后把重叠的位置对象都给删除了,没什么好说的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Directory Opus 13 专业版(Windows 增强型文件管理器)值得购买?

在使用电脑时&#xff0c;总少不了和文件打交道。系统自带的 Explorer 资源管理器功能又非常有限&#xff0c;想要拥有一个多功能文件管理器吗&#xff1f; Directory Opus 是一款老牌多功能文件管理器&#xff0c;能很好地接管 Windows 资源管理器。 接管资源管理器 Directo…

【Linux系列】TEE 命令:同时输出到终端和文件

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

(leetcode学习)15. 三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1&a…

java算法day13

java算法day13 104 二叉树的最大深度111 二叉树的最小深度226 翻转二叉树101 对称二叉树100 相同的树 104 二叉树的最大深度 我最开始想到的是用层序遍历。处理每一层然后计数。思路非常的清楚。 迭代法&#xff1a; /*** Definition for a binary tree node.* public class…

Nginx入门到精通三(反向代理1)

下面内容整理自bilibili-尚硅谷-Nginx青铜到王者视频教程 Nginx相关文章 Nginx入门到精通一&#xff08;基本概念介绍&#xff09;-CSDN博客 Nginx入门到精通二&#xff08;安装配置&#xff09;-CSDN博客 Nginx入门到精通三&#xff08;Nginx实例1&#xff1a;反向代理&a…

Linux系统搭建轻量级个人博客VanBlog并一键发布公网远程访问

文章目录 前言1. Linux本地部署2. VanBlog简单使用3. 安装内网穿透4. 创建公网地址5. 创建固定公网地址 前言 今天和大家分享如何在Linux Ubuntu系统搭建一款轻量级个人博客VanBlog&#xff0c;并结合cpolar内网穿透软件生成公网地址&#xff0c;轻松实现随时随地远程访问本地…

Python与自动化脚本编写

Python与自动化脚本编写 Python因其简洁的语法和强大的库支持&#xff0c;成为了自动化脚本编写的首选语言之一。在这篇文章中&#xff0c;我们将探索如何使用Python来编写自动化脚本&#xff0c;以简化日常任务。 一、Python自动化脚本的基础 1. Python在自动化中的优势 Pyth…

内存RAS技术介绍:内存故障预测

故障预测是内存可靠性、可用性和服务性&#xff08;RAS&#xff09;领域中的一个重要方面&#xff0c;旨在提前识别潜在的不可纠正错误&#xff08;UE&#xff09;&#xff0c;以防止系统崩溃或数据丢失。 4.1 错误日志记录与预测基础 错误一般通过Linux内核模块Mcelog记录到…

1.31、基于长短记忆网络(LSTM)的发动机剩余寿命预测(matlab)

1、基于长短记忆网络(LSTM)的发动机剩余寿命预测的原理及流程 基于长短期记忆网络(LSTM)的发动机剩余寿命预测是一种常见的机器学习应用&#xff0c;用于分析和预测发动机或其他设备的剩余可用寿命。下面是LSTM用于发动机剩余寿命预测的原理和流程&#xff1a; 数据收集&#…

实践之K近邻算法实现红酒聚类

前言 K近邻算法是一种用于分类和回归的非参数统计方法&#xff0c;通过计算样本与训练样本的距离&#xff0c;找出最接近的k个样本进行投票来确定分类结果。算法的基本要素包括K值、距离度量和分类决策规则。 K值决定了邻居的影响程度&#xff0c;距离度量反映了样本间的相似度…

python条件

条件语句 if语句 if...else语句 if...elif...else语句 嵌套 is is 是一个身份运算符&#xff0c;用于比较两个对象的身份&#xff0c;即它们在内存中的地址是否相同。这与比较两个对象是否相等的 运算符不同。 运算符比较的是两个对象的值是否相等。 比较对象 比较基本数据…

npm发布的包如何快速在cnpm上使用

npm发布的包如何快速在cnpm上使用 解决方案 前往淘宝npm镜像官网 搜索插件库并点击同步 等待一分钟即可查看最新版本

C++ 类和对象 赋值运算符重载

前言&#xff1a; 在上文我们知道数据类型分为自定义类型和内置类型&#xff0c;当我想用内置类型比较大小是非常容易的但是在C中成员变量都是在类(自定义类型)里面的&#xff0c;那我想给类比较大小那该怎么办呢&#xff1f;这时候运算符重载就出现了 一 运算符重载概念&…

ts踩坑!vue3中defineEmits接收父组件向子组件传递方法,以及方法所需传的参数及类型定义!

使用说明 1、在子组件中调用defineEmits并定义要发射给父组件的方法 const emits defineEmits([‘foldchange’]) 2、使用defineEmits会返回一个方法&#xff0c;使用一个变量emits(变量名随意)去接收 3、在子组件要触发的方法中&#xff0c;调用emits并传入发射给父组件的方法…

【C语言初阶】探索编程基础:深入理解分支与循环语句的奥秘

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C语言 “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C语言入门 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀分支与循环语句 &#x1f4d2;1.…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十三)-更换无人机控制器

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

Kafka:Kafka详解

Kafka 消息中间件 区别于rabbitmq,kafka更适用于量级较大的数据(100w级),主要在大数据领域使用 Kafka介绍 一个分布式流媒体平台,类似于消息队列或企业消息传递系统 Kafak的结构如下 producer:发布消息的对象 topic:Kafak将消息分门别类,每类的消息称为一个主题(Topic) …

《0基础》学习Python——第十一讲__时间函数

一、时间函数是Python中的内置函数和模块&#xff0c;用于处理日期和时间相关的操作。以下是常用的时间函数的种类和用法&#xff1a; 1、time.time()&#xff1a;返回当前时间的时间戳。 时间戳&#xff08;timestamp&#xff09;是一种表示日期和时间的方式&#xff0c;它是一…

高频面试题基本总结回顾4(含笔试高频算法整理)

目录 一、基本面试流程回顾 二、基本高频算法题展示 三、基本面试题总结回顾 &#xff08;一&#xff09;Java高频面试题整理 &#xff08;二&#xff09;JVM相关面试问题整理 &#xff08;三&#xff09;MySQL相关面试问题整理 &#xff08;四&#xff09;Redis相关面试…

使用 SSH 通过 VS Code 连接企业服务器并拉取 Git 仓库代码的指南

文章目录 前言一、SSH 是什么&#xff1f;1.1 SSH 的主要特性和用途1.2 SSH 的工作原理 二、 为什么使用 SSH 而不是 HTTPS三、使用步骤3.1 生成 SSH 密钥3.2 配置 VS Code 远程连接3.3 通过 SSH 克隆 Git 仓库3.4 安装必要的组件 总结 前言 在现代软件开发中&#xff0c;远程…