感知融合(三):目标关联之旋转矩形相交检测

一、前言

在自动驾驶场景中,我们常用“矩形框”来描述道路上的车辆、行人等障碍物,并会根据矩形框之间是否有相交,以及相交区域面积占比(IOU)等信息,来进行目标的关联及跟踪,因此矩形的相交判断十分重要。

矩形框有2种表达方式,一种是没有航向角的Axis Aligned Bounding Box(AABB),从名称中大致能理解其中意思:沿着轴的包围盒子。也就是将物体用方形的盒子包围,这个方形的盒子的四条边都是和坐标轴平行的。

另一种是带航向角信息的Oriented Bounding Box (OBB),就是找一个最小的包围物体的方形。

下面分别给出相交判断的方法。

二、AABB矩形相交判断

在这里插入图片描述

两个不带航向角的矩形判断十分简单,只需要判断:两个矩形的重心距离在x轴y轴上都小于两个矩形长或宽的一半之和。

就是判断:

重心距离在x轴上的投影长度<两个矩形的在x轴的长度之和/2
重心距离在y轴上的投影长度<两个矩形在y轴上的宽度之和/2

代码如下:

bool intersects(Object r1,Object r2){
	if( fabs(r1.x-r2.x)<(r1.length+r2.length)/2 && fabs(r1.y-r2.y)<(r1.width+r2.width)/2 )
		return true;
		
	return false;
}

三、OBB旋转矩形相交判断

带航向角的旋转矩形相交判断较为复杂,这里需要使用一个定理:

分离轴定律SAT(Separating Axis Theorem):两个凸多边形物体,如果我们能找到一个轴,使得两个在物体在该轴上的投影互不重叠,则这两个物体之间没有碰撞发生,该轴为Separating Axis。也就是说两个多边形在所有轴上的投影都发生重叠,则判定为碰撞;否则,没有发生碰撞。

在这里插入图片描述
矩形有4条边,那么就有4条轴,由于矩形的对边是平行的,所以有两条轴是重复的,我们仅需要检查相邻的两个轴,那么两个矩形就需要检查4个轴。

检查投影有两种方法:
第一种,把每个矩形的4个顶点投影到一个轴上,这样算出4个顶点最长的连线距离,以后同样对待第二个矩形,最后判断2个矩形投影距离是否重叠。
第二种,把2个矩形的半径距离投影到轴上,以后把2个矩形的中心点连线投影到轴上,以后判断2个矩形的中心连线投影,和2个矩形的半径投影之和的大小。

代码如下:

#ifndef _OBBRECT_H_
#define _OBBRECT_H_

#include <math.h>

class OBBRect {
public:
    OBBRect(float x, float y, float length, float width, float rotation = 0.0f)
        : _x(x), _y(y), _length(length), _width(width), _rotation(rotation) {
        resetVector();
    }

    bool intersects(OBBRect& other) {
        float distanceVector[2] = {
            other._x - _x,
            other._y - _y
        };

        for (int i = 0; i < 2; ++i) {
            if (getProjectionRadius(_vectors[i]) + other.getProjectionRadius(_vectors[i])
                <= dot(distanceVector, _vectors[i])) {
                return false;
            }
            if (getProjectionRadius(other._vectors[i]) + other.getProjectionRadius(other._vectors[i])
                <= dot(distanceVector, other._vectors[i])) {
                return false;
            }
        }

        return true;
    }

private:
    void resetVector() {
        _vectors[0][0] = cos(_rotation);
        _vectors[0][1] = sin(_rotation);
        _vectors[1][0] = -_vectors[0][1];
        _vectors[1][1] = _vectors[0][0];
    }

    float dot(float a[2], float b[2]) {
        return abs(a[0] * b[0] + a[1] * b[1]);
    }

    float getProjectionRadius(float vector[2]) {
        return (_length * dot(_vectors[0], vector) / 2 
            + _width * dot(_vectors[1], vector) / 2);
    }

    float _x;
    float _y;
    float _length;
    float _width;
    float _rotation;
    float _vectors[2][2];
};

#endif // _OBBRECT_H_
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 激光雷达相机融合技术是近年来人工智能与自动驾驶行业的热点技术之一。该技术主要通过将激光雷达和相机的数据进行融合,实现对3D目标检测、跟踪和识别,从而实现自动驾驶等领域中的精准定位和判断。 在国内,随着自动驾驶技术的不断发展,激光雷达相机融合技术也得到了广泛应用。例如,无人驾驶汽车企业旷视科技就在其自主研发的海思芯片上应用了该技术,实现了实时感知和识别,初步实现了智能驾驶。 在国外,激光雷达相机融合技术的应用也比较普遍。例如,美国自动驾驶企业Waymo采用了该技术,能够实现对行人和路标的快速识别和准确定位,为自动驾驶汽车的精细控制提供了基础支持。 总体而言,目前激光雷达相机融合技术已经开始成为自动驾驶领域中不可或缺的关键技术之一。随着科技的持续进步和应用范围的不断扩大,相信激光雷达相机融合技术的应用会越来越广泛,带来更多的技术创新和商业机会。 ### 回答2: 近年来,随着自动驾驶技术的不断发展,激光雷达相机融合3D目标检测技术已成为自动驾驶汽车中的重要技术之一,通过将激光雷达和相机的数据融合,可以获得更全面、更精确的环境信息,从而提高车辆的识别能力和安全性。目前,国内外在激光雷达相机融合3D目标检测技术方面取得了一定的进展。 在国外,激光雷达相机融合3D目标检测技术已经得到广泛应用,在自动驾驶汽车、智能巡航导航等领域取得了良好的效果。例如,美国的Tesla、谷歌、Uber等公司都在自动驾驶技术上采用了该技术,并取得了重要的突破。 在国内,也有不少企业和研究机构在激光雷达相机融合3D目标检测技术上进行了探索和研究。例如,百度、腾讯、阿里等企业都在自动驾驶领域探索激光雷达相机融合3D目标检测技术,并取得了一定的成果。此外,国内的一些高校和研究机构也在该领域进行了一些有益的研究和探索。 总体来看,激光雷达相机融合3D目标检测技术在国内外都得到越来越多企业和研究机构的关注和投入,未来随着技术不断发展和完善,相信该技术在自动驾驶、智能交通等领域的应用会越来越广泛。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JayLee719

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值