首页 > 编程语言 >自动驾驶感知项目-基于多线激光雷达的小目标锥桶空间位置检测算法(ROS,C++,滤波)

自动驾驶感知项目-基于多线激光雷达的小目标锥桶空间位置检测算法(ROS,C++,滤波)

时间:2024-07-08 20:27:17浏览次数:13  
标签:ROS 滤波 C++ 点云 锥桶 数据 激光雷达 通滤波

一: 序言

想了解更多自动驾驶项目课程以及获取学习代码的可以参考这个链接
无人车采用纯跟踪算法跟随离线路径
感知锥桶项目中:滤波处理是进行激光雷达目标检测的常见步骤,对原始点云数据进行预处理达到减少噪声、无效点或者数据量的效果。常用的点云滤波方法包括体素滤波、法向量估计滤波和直通滤波等。锥桶环境下,自动驾驶车辆更关注的是前方障碍物的信息,并不需要处理激光雷达扫描出的所有区域数据。为了减少计算压力,采用直通滤波进行处理。

二:具体方案

直通滤波是一种简单而有效的点云滤波方法,设定范围约束来实现数据过滤。通常情况下,使用点云数据的空间坐标轴区间来定义感兴趣区域。该滤波简单且有效,并且处理速度非常快。可以在减少不必要的计算和存储开销的情况下,为后续的点云处理和应用提供更高效的数据基础。直通滤波公式见式:
在这里插入图片描述式中为滤波后点云数据结合,代表空间坐标系下三个方向,为原始数据集,为具体的滤波范围。
为了在减少计算量的同时获取有效的点云数据,本文通过对比分析试验确定使用环形区域进行直通滤波,该区域滤波公式见式:
在这里插入图片描述
具体实现代码如下:

void lidar_cluster::PassThrough(pcl::PointCloud<PointType>::Ptr& cloud_filtered,int type,double z_up,double z_down){
  pcl::PassThrough<pcl::PointXYZ> pass;
  pass.setInputCloud(cloud_filtered);
  point_clip(cloud_filtered);
  }
  

    for (size_t i = 0; i < in->points.size(); i++)
    {
        tmp_euc = euc_distance(in->points[i]);
        if ( tmp_euc<=20 && in->points[i].x>0 && tmp_euc>=0.5)
        {
            indices.indices.push_back(i);
        }
    }

滤波效果
在这里插入图片描述
图中波纹状线条为雷达检测到的地面点云,后续操作将对其进行处理,椭圆形圈起的凸起点为有效锥桶点云,图中下方中间处坐标轴为车辆可视化效果。

三:结论

多线激光雷达在默认扫描频率下,每秒可以获取数十万个点云数据,锥桶道路环境下,大部分点云数据实际上是非目标锥桶的无效点云,在考虑硬件自身运行速率和算法效率的情况下,可以先对整体点云进行滤波处理,达到减轻计算量的效果。

标签:ROS,滤波,C++,点云,锥桶,数据,激光雷达,通滤波
From: https://blog.csdn.net/m0_46699649/article/details/140277338

相关文章

  • C++数据结构底层实现算法
    1.vector底层数据结构为数组,支持快速随机访问2.list底层数据结构为双向链表,支持快速增删3.deque底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问deque是一个双端队列(double-endedqueue),也是在堆中保存内容的.每个......
  • C++ 入门02:控制结构和循环
    往期回顾:C++入门01:初识C++一、前言在上一篇文章学习中,我们了解了C++程序的基本结构、注释、数据类型、变量以及输入输出的基本用法。这一篇,我们将继续深入学习C++的控制结构和循环。二、控制结构和循环2.1、条件语句条件语句是编程中非常重要的一部分,它们允许......
  • 01day C++初入学习
    这里写目录标题1.C++区别于C的输入输出2.什么是命名空间3.namespace的定义namespace的使用(1)namespace嵌套使用(2)多⽂件中可以定义同名namespace(3)4.命名空间的使用5.C++输⼊&输出6.缺省参数7.函数重载8.引用8.1引用的特性8.3引用的使用1.C++区别于C的输入输出......
  • vbc.exe 是 Microsoft Visual Basic 编译器的命令行工具。它用于编译 Visual Basic (.
    vbc.exe是MicrosoftVisualBasic编译器的命令行工具。它用于编译VisualBasic(.NET)的源代码文件(.vb文件)到可执行文件或者库文件(例如.exe或.dll)。vbc.exe提供了一种方式来将VisualBasic源代码编译成在.NETFramework或.NETCore平台上可执行的程序。......
  • csc.exe 是 Microsoft Visual C# 编译器的命令行工具。它用于编译 C# 源代码文件 (.cs
    csc.exe是MicrosoftVisualC#编译器的命令行工具。它用于编译C#源代码文件(.cs文件)到可执行文件或者库文件(例如.exe或.dll)。具体来说,csc.exe是用来将C#源代码编译成.NETFramework或.NETCore平台上的可执行文件或者库的工具。以下是一些常见用途和特点:......
  • ROS2开发BUG记录:在将 use_sim_timer 置为 true 时,节点的 Timer_Callback 行为“异常”
    问题:在将use_sim_timer置为true时,节点Timer_Callback行为“异常”。在回调函数中,使用self.get_logger().info("xxxx")输出信息,希望通过查看Info中的时间戳(如下),测试Timer_Callback回调频率是否正常。发现该时间戳与预期回调频率不符。[target_server-7][INFO][17......
  • C++ string基础用法
    基本操作构造与初始化默认构造:创建一个空字符串 std::strings;从C风格字符串构造:std::strings="Hello";从范围构造:std::strings(begin,end);从迭代器构造:std::strings(it_begin,it_end);从字符数组构造:std::strings(arr,arr+size);从重复字符构造:std::stri......
  • c++我的世界代码(亲测有效)
    #include<iostream>#include<conio.h>#include<string>#include<map>#include<cmath>#include<windows.h>#include<time.h>#defineKEY_DOWN(VK_NONAME)((GetAsyncKeyState(VK_NONAME)&0x8000)?1:0)void......
  • 力扣常用c++操作
    数字转字符串to_string()自定义sort函数sort(intervals.begin(),intervals.end(),[](vector<int>&v1,vector<int>&v2){returnv1[0]<v2[0];});自定义二分查找autoinsertit=lower_bound(intervals.begin(),intervals.end(),newInterval[0],......
  • C++基础
    面向对象开发具有4个特性:封装(Encapsulation):封装是将数据和方法组合在一起,对外部隐藏实现细节,只公开对外提供的接口。这样可以提高安全性、可靠性和灵活性。继承(Inheritance):继承是从已有类中派生出新类,新类具有已有类的属性和方法,并且可以扩展或修改这些属性和方法。这样可以提......