Occupancy 后处理

文章目录

    • bev坐标与自车坐标转换
    • 如何创建旋转矩阵 (R_veh) 偏航
    • 3D Voxel -> 2D Grid

在这里插入图片描述
在进行占据空间(occupancy)后处理时,需要将不同感知模块的输出进行综合融合,以实现更精确的空间占据和环境感知。以下是针对您提到的几个方面的详细处理说明:

  1. 与其他感知输出的融合

    • 单目3D检测的结果(如bounding box)可以与占据网格(occupancy grid)结合,以在空间中确定物体的确切位置。
    • 高精度地图的在线矢量化方案(如maptr/vectormapnet等)输出的路线和特征点可以与占据网格融合,以提高定位和导航的准确性。
    • 语义场景补全的结果可以用来填补占据网格中由于视线遮挡或感知限制而产生的空缺。
    • 运动规划(motion planning)的结果可以帮助确定需要保留的占据空间,以规避障碍并优化路径。
  2. 保留特定类别

    • 可以根据业务需求,选择只保留某些特定类别的占据信息,例如:
      • 道路边界:类似于您提到的Tesla的占据方案中显示为绿色的部分。
      • 与人物相关的voxels:如TeslaBot示例中仅保留与行人相关的体素,这对于行人检测和交互至关重要。
  3. 保留特定高度的voxels

    • 根据实际应用场景的需要,您可能只想保留一定高度范围内的voxels。例如,对于驾驶车辆,可能只关注地面附近的voxels;而对于无人机,可能需要一个更广泛的高度范围。
  4. 获得freespace信息

    • 在处理占据网格时,除了标识占据的体素外,还需要识别和标记自由空间(freespace),这对于安全导航和避障至关重要。

bev坐标与自车坐标转换

P_bev = (X_bev, Y_bev, Z_bev) : BEV 坐标中的一个点
P_self = (X_self, Y_self, Z_self) : 自车辆坐标中的相同点
T_veh = (T_x, T_y, T_z): 在 BEV 坐标中代表车辆位置的平移矢量。
R_veh: 代表车辆方位(航向、俯仰和翻滚)的 3x3 旋转矩阵。
转换: 自车辆坐标到 BEV 坐标

平移:

X_bev = X_self - T_x
Y_bev = Y_self - T_y
Z_bev = Z_self - T_z

import numpy as np

def self_vehicle_to_bev(point_self, vehicle_position_bev, vehicle_rotation_matrix):
    """Transforms a point from self-vehicle coordinates to BEV coordinates.

    Args:
        point_self (np.array): 3D point in self-vehicle coordinates (x, y, z).
        vehicle_position_bev (np.array): 3D position of the vehicle in BEV coordinates (x, y, z).
        vehicle_rotation_matrix (np.array): 3x3 rotation matrix representing the vehicle's orientation.

    Returns:
        np.array: 3D point in BEV coordinates.
    """

    # Translation
    point_translated = point_self - vehicle_position_bev

    # Rotation
    point_bev = np.dot(vehicle_rotation_matrix, point_translated)

    return point_bev

旋转:

P_bev = R_veh * P_self
(这是矩阵乘法)

如何创建旋转矩阵 (R_veh) 偏航

旋转矩阵取决于您如何表示车辆的方向。下面是一种常见的方法,假定你有车辆的航向(偏航)角度:

def create_rotation_matrix(yaw_angle)"""根据偏航角(围绕 Z 轴)创建一个 3x3 旋转矩阵。
    cos_yaw = np.cos(yaw_angle)
    sin_yaw = np.sin(yaw_angle)

    return np.array([
        [cos_yaw, -sin_yaw, 0][sin_yaw, cos_yaw, 0][0, 0, 1] 
    ])

参考:
https://en.wikipedia.org/wiki/Rotation_matrix
中文

3D Voxel -> 2D Grid

假设3D的voxel volume的尺寸是(x, y, z), 投影到的平面BEV的尺寸就是(x, y)
将三维体素表示转换为二维网格需要选择特定的投影方向,然后将体素占位信息映射到所选的二维平面上。下面是这一过程的详细说明、公式和示例:

解释:

投影平面: 您需要选择一个投影平面。常见的选择包括

XY 平面(鸟瞰图): 将体素投影到地平面上(X 轴:向前,Y 轴:向左)。
XZ 平面(侧视图): 将体素投影到侧视平面上(X 轴:向前,Z 轴:向上)。
YZ 平面(正视图): 将体素投射到前平面上(Y 轴:左,Z 轴:上)。
体素占位: 每个体素都有一个值,表示它是被占用(1)还是空的(0)。

映射: 投影过程包括确定每个体素在二维平面中属于哪个网格单元。这取决于所选的投影平面和体素大小。

公式:

具体公式因所选投影平面而异。下面以鸟瞰图(XY 平面)投影为例:

设 voxel_origin 为体素左下角的(X、Y、Z)坐标。
设 voxel_size 为体素在每个维度上的大小(假设为立方体)。
设 grid_width 和 grid_height 为输出二维网格的尺寸。
体素对应的网格单元坐标计算公式如下

grid_X = int(floor(voxel_origin[0] / voxel_size))
grid_Y =int(floor(voxel_origin[1] / voxel_size)) 注:floor
函数确保我们得到体素左下角所在网格单元的整数索引。

def project_voxel_to_grid_bev(voxel_origin, voxel_size, grid_width, grid_height):
  """
  Projects a 3D voxel onto a 2D grid (Bird's Eye View).

  Args:
      voxel_origin (tuple): (X, Y, Z) coordinates of the voxel's bottom-left corner.
      voxel_size (float): Size of a voxel along each dimension.
      grid_width (int): Width of the output 2D grid.
      grid_height (int): Height of the output 2D grid.

  Returns:
      tuple: (grid_X, grid_Y) coordinates of the corresponding grid cell.
  """

  grid_X = int(np.floor(voxel_origin[0] / voxel_size))
  grid_Y = int(np.floor(voxel_origin[1] / voxel_size))

  # Handle edge cases (voxel goes beyond grid boundaries)
  grid_X = max(0, min(grid_X, grid_width - 1))
  grid_Y = max(0, min(grid_Y, grid_height - 1))

  return grid_X, grid_Y

# Example usage
voxel_origin = (2.5, 1.0, 0.5)  # (X, Y, Z) coordinates
voxel_size = 0.5
grid_width = 100
grid_height = 50

grid_cell = project_voxel_to_grid_bev(voxel_origin, voxel_size, grid_width, grid_height)
print(f"Voxel projects to grid cell: ({grid_cell[0]}, {grid_cell[1]})")

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

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

相关文章

Java代码基础算法练习-求一个三位数的各位数字之和-2024.03.27

任务描述&#xff1a; 输入一个正整数n&#xff08;取值范围&#xff1a;100<n<1000&#xff09;&#xff0c;然后输出每位数字之和 任务要求&#xff1a; 代码示例&#xff1a; package M0317_0331;import java.util.Scanner;public class m240327 {public static voi…

LangChain入门:2.OpenAPI调用ChatGPT模型

引言 在本文中&#xff0c;我们将带您深入探索如何通过OpenAPI与ChatGPT模型进行高效交互&#xff0c;实现智能文本问答功能。通过LangChain库的实践&#xff0c;您将学习构建一个能够与用户进行自然语言对话的系统的关键步骤。 准备步骤 在动手编码之前&#xff0c;请确保您…

Linux之进程控制进程终止进程等待进程的程序替换替换函数实现简易shell

文章目录 一、进程创建1.1 fork的使用 二、进程终止2.1 终止是在做什么&#xff1f;2.2 终止的3种情况&&退出码的理解2.3 进程常见退出方法 三、进程等待3.1 为什么要进行进程等待&#xff1f;3.2 取子进程退出信息status3.3 宏WIFEXITED和WEXITSTATUS&#xff08;获取…

从零开始的软件开发实战:互联网医院APP搭建详解

今天&#xff0c;笔者将以“从零开始的软件开发实战&#xff1a;互联网医院APP搭建详解”为主题&#xff0c;深入探讨互联网医院APP的开发过程和关键技术。 第一步&#xff1a;需求分析和规划 互联网医院APP的主要功能包括在线挂号、医生预约、医疗咨询、健康档案管理等。我们…

2024河北煤炭装备展览会|河北采煤装备展会|河北煤博会

2024中国&#xff08;石家庄&#xff09;国际煤炭装备及矿山设备博览会 时间&#xff1a;2024年7月4-6日 地点&#xff1a;石家庄国际会展中心.正定在快速发展的科技时代&#xff0c;能源行业始终是国家发展的重要支柱。作为传统的能源巨头&#xff0c;煤炭产业在面临转型升…

jdk8中的Arrays.sort

jdk8中Arrays.sort 这里可以看到根据传入数组类型的不同&#xff0c;排序的算法是由区别的。 拆分解析 我们在平时引用的时候&#xff0c;一般只会传入一个数组&#xff0c;但是真正调用的时候&#xff0c;参数会进行补全。 public static void sort(int[] a) {DualPivotQui…

获奖喜讯 | 思迈特软件蝉联双奖,品牌及产品实力再获认可

近期&#xff0c;思迈特软件又传来获奖捷报&#xff0c;凭借出色的产品力及品牌实力&#xff0c;思迈特软件Smartbi一站式大数据分析平台荣登2023ToB头条影响力价值榜“创新力产品TOP50”榜单&#xff0c;又获广东省云计算应用协会“2023年度大数据创新企业奖”。 荣登“ToB行业…

贪心算法--最大数

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 本题链接https://leetcode.cn/problems/largest-number/description/ class Solution { public:bool static compare(int a, int b){return (to_string(a) to_string(b)) > (to_string(b) to_string(a));}bool operato…

爱思助手验机不靠谱?

1.骗子只能骗的一种人就是有点懂 因为完全不懂的不会感兴趣 骗不到 太懂的人 基本属于猴精的人 你骗不到 2. 3.基本做的是翻新机 维修过的 4。转载 爱思助手验机不靠谱&#xff1f;“报告全绿”已成奸商的阴谋 - 知乎

Windows无法安装torch==1.4.0

在conda中&#xff0c;每创建一个虚拟环境&#xff0c;就要重新配置其中的pytorch 这次我创建的虚拟环境需要torch1.4.0的版本。 torch网址&#xff1a;https://pytorch.org/get-started/previous-versions/ 解决办法 按以下代码进行安装&#xff1a; pip install torch0.4.0…

短视频账号矩阵系统/开发 -- -- -- 蒙太奇算法上线

短视频账号矩阵系统&#xff0c;短视频矩阵系统开发3年技术之路&#xff0c;目前已经在技术竞品出沉淀出来&#xff0c;近期技术迭代的新的功能同步喽&#xff1a; php7.4版本&#xff0c;自研框架&#xff0c;有开发文档&#xff0c;类laravel框架 近期剪辑迭代的技术算法&am…

【Pytorch入门】小土堆PyTorch入门教程完整学习笔记(详细笔记并附练习代码 ipynb文件)

小土堆PyTorch入门教程笔记 最近在观看PyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】顺便做点笔记&#xff0c;方便回看&#xff0c;同时也希望记录的笔记能够帮助到更多在入门的小伙伴~ 【注】仅记录个人觉得重要的知识&#xff0c…

【米粉福音】小米SU7引领智能汽车新时代

2024年3月28日&#xff0c;小米公司正式发布旗下全新智能汽车产品——小米SU7。这一发布不仅是小米品牌向汽车领域的重大跨界进军&#xff0c;更是对智能科技与汽车行业融合发展的一次里程碑式的尝试。 小米SU7的发布&#xff0c;意味着小米公司与合作伙伴达成的三年之约的成功…

python--字符串和常见的方法

1.字符串对象 字符串 " 字符串 " """ 字符串 """ 字符串 str() #全局函数&#xff0c;将一个类型转化为字符串 len(字符串) #获取字符串长度 while 和 for 循环&#xff0c;遍历字符串 案例一&#xff1a;查看字…

Java开发过程中如何进行进制换换

最近由于工作上的需要&#xff0c;遇到进制转换的问题。涉及到的进制主要是十进制、十六进制、二进制转换。 1、十进制转十六进制、二进制 调用java自带的api,测试十进制转16进制、2进制 package com.kangning.common.utils.reflect;/*** 十进制 转 十六进制* 十进制 转 二进…

蓝牙耳机哪个品牌的好?2024年精选硬核机型推荐

​随着时代的进步和潮流的演进&#xff0c;人们对蓝牙耳机的需求已不再局限于音质&#xff0c;舒适度也成为了关键考量。下面&#xff0c;我将为你推荐五款既舒适又性能出色的蓝牙耳机。 一、如何挑选蓝牙耳机&#xff1f;&#xff08;重点码住&#xff09; 1.选择知名大品牌&…

Win10或Win11系统下西门子TIA博途运行时卡顿缓慢的解决办法总结

Win10或Win11系统下西门子TIA博途运行时卡顿缓慢的解决办法总结 首先,可以看下TIA PORTAL V19的安装条件: 处理器:Intel i5-8400H,2.5-4.2GHZ,4核以上+超线程技术,智能缓存; 内存:至少16GB,大型项目需要32GB 硬盘:必须SSD固态硬盘,至少50GB的可用空间 图形分辨率:1…

win11蓝牙图标点击变灰,修复过程

问题发现 有一天突然心血来潮想着连接蓝牙音响放歌来听,才发现win11系统右下角菜单里的蓝牙开关有问题。 打开蓝牙设置,可以正常直接连上并播放声音,点击右下角菜单里的蓝牙开关按钮后,蓝牙设备也能正常断开,但是按钮直接变深灰色,无法再点击打开。 重启电脑,蓝牙开关显…

[AIGC] MySQL存储引擎详解

MySQL 是一种颇受欢迎的开源关系型数据库系统&#xff0c;它的强大功能、灵活性和开放性赢得了用户们的广泛赞誉。在 MySQL 中&#xff0c;有一项特别重要的技术就是存储引擎。在本文中&#xff0c;我们将详细介绍什么是存储引擎&#xff0c;以及MySQL中常见的一些存储引擎。 文…

实验报告学习——gdb的使用

gdb的使用: l查看源码和行号 p a或main::a&#xff08;main函数中a)打印变量a的值 要打印单个寄存器的值&#xff0c;可以使用“i registers eax”或者“p $eax” 设置断点b 5&#xff08;根据行数&#xff09;/main&#xff08;根据函数&#xff09;/*0x40059b&#xff0…