Box2d::HasOverlap()
在笛卡尔坐标系下,检查两个box是否重叠判断条件1:
dx1~dx4, dy1~dy4, 以及部分判断条件如图(以车身坐标系为例,部分几何判断过程略过)
std::abs(shift_x * cos_heading_ + shift_y * sin_heading_) <=
std::abs(dx3 * cos_heading_ + dy3 * sin_heading_) +
std::abs(dx4 * cos_heading_ + dy4 * sin_heading_) +
half_length_ &&
std::abs(shift_x * sin_heading_ - shift_y * cos_heading_) <=
std::abs(dx3 * sin_heading_ - dy3 * cos_heading_) +
std::abs(dx4 * sin_heading_ - dy4 * cos_heading_) +
half_width_
即vehicle任意一点不在obstacle对应的橙色虚线框内。
文章图片
文章图片
判断条件2:
std::abs(shift_x * box.cos_heading() + shift_y * box.sin_heading()) <=
std::abs(dx1 * box.cos_heading() + dy1 * box.sin_heading()) +
std::abs(dx2 * box.cos_heading() + dy2 * box.sin_heading()) +
box.half_length() &&
std::abs(shift_x * box.sin_heading() - shift_y * box.cos_heading()) <=
std::abs(dx1 * box.sin_heading() - dy1 * box.cos_heading()) +
std::abs(dx2 * box.sin_heading() - dy2 * box.cos_heading()) +
box.half_width()
即obstacle中的任意一点不在vehicle对应的橙色虚线框内。
文章图片
文章图片
【Apollo自动驾驶笔记|【规划】Box2d::HasOverlap() 碰撞检测接口详解】
Box2d::HasOverlap(const Box2d &box)
:bool Box2d::HasOverlap(const Box2d &box) const {
if (box.max_x() < min_x() || box.min_x() > max_x() || box.max_y() < min_y() ||
box.min_y() > max_y()) {
return false;
}const double shift_x = box.center_x() - center_.x();
const double shift_y = box.center_y() - center_.y();
const double dx1 = cos_heading_ * half_length_;
const double dy1 = sin_heading_ * half_length_;
const double dx2 = sin_heading_ * half_width_;
const double dy2 = -cos_heading_ * half_width_;
const double dx3 = box.cos_heading() * box.half_length();
const double dy3 = box.sin_heading() * box.half_length();
const double dx4 = box.sin_heading() * box.half_width();
const double dy4 = -box.cos_heading() * box.half_width();
return std::abs(shift_x * cos_heading_ + shift_y * sin_heading_) <=
std::abs(dx3 * cos_heading_ + dy3 * sin_heading_) +
std::abs(dx4 * cos_heading_ + dy4 * sin_heading_) +
half_length_ &&
std::abs(shift_x * sin_heading_ - shift_y * cos_heading_) <=
std::abs(dx3 * sin_heading_ - dy3 * cos_heading_) +
std::abs(dx4 * sin_heading_ - dy4 * cos_heading_) +
half_width_ &&
std::abs(shift_x * box.cos_heading() + shift_y * box.sin_heading()) <=
std::abs(dx1 * box.cos_heading() + dy1 * box.sin_heading()) +
std::abs(dx2 * box.cos_heading() + dy2 * box.sin_heading()) +
box.half_length() &&
std::abs(shift_x * box.sin_heading() - shift_y * box.cos_heading()) <=
std::abs(dx1 * box.sin_heading() - dy1 * box.cos_heading()) +
std::abs(dx2 * box.sin_heading() - dy2 * box.cos_heading()) +
box.half_width();
}
推荐阅读
- 机器视觉|低速自动驾驶技术(APA)
- 自动驾驶轨迹规划算法|【自动驾驶轨迹规划之RRT算法】
- 极客日报|小米自动驾驶测试车曝光;马斯克疑回应生9个孩子(帮助应对人口不足危机;亚马逊发布AI编程助手|极客头条)
- 百度|产品升级|10月产品捷报频传,解锁更多新成就!
- 百度|元宇宙中的三大“派系”
- ROS机器人操作系统开发教程|ROS机器人操作系统开发视频教程进阶-小乌龟演示(一)
- ROS|ROS机器人操作系统学习
- 深度学习|自动驾驶-YOLOV5网络训练(可能会遇到五个坑)
- 自动驾驶|自动驾驶数据服务进入2.0时代