ROS激光雷达数据过滤

尝试使用一下Markdown编辑器,html编辑器用到爆炸

目录

  • ROS激光雷达数据过滤

    • 目录
    • ROS与激光雷达
    • 获取激光雷达数据
    • 过滤激光雷达数据并重新发布
    • 通过laser_filters进行过滤
      • InterpolationFilter
      • LaserScanIntensityFilter
      • LaserScanRangeFilter
      • LaserScanAngularBoundsFilter
      • 其他参数
    • 结语

ROS与激光雷达

激光雷达是避障与SLAM常用的装备,ROS中也对激光雷达做出了相应的支持,各个厂家也有不少提供了自己的ROS库供开发者使用,使得无论是初学者还是大神们都能轻松愉快的使用激光雷达为自己的机器人导航。
ROS中的sensor_msgs/LaserScan提供了最基础的针对一线激光雷达消息格式:

# 一线激光雷达的一次扫描Header header            # timestamp是扫描中第一束激光的获取时间# 角度环绕Z轴(Z轴为激光雷达正上方),逆时钟方向增加,0度角指向X轴
float32 angle_min        # 扫描的起始角度 [rad]
float32 angle_max        # 扫描的结束角度 [rad]
float32 angle_increment  # 每次测量间的角度差 [rad]float32 time_increment   # 每次测量间的时间差 [seconds] # 这个数值会用来生成点云(而不是scan_time)
float32 scan_time        # 每次扫描的时间差 [seconds] # 这个时间差是每次激光发射的时间差,上面那个是每次接收(测量)的时间差float32 range_min        # 距离最小值 [m]
float32 range_max        # 距离最大值 [m]float32[] ranges         # 距离数据 [m]
float32[] intensities    # 强度数据 [单位视设备标定] #如果设备不产生强度数据,则该数据为空

通过这个消息提供的信息,就可以开始进行数据的

获取激光雷达数据

首先要根据使用的激光雷达设备,启动相应的驱动节点来进行扫描和测量。数据一般来说会发布到scan这个主题里,只要订阅一下就可以获取到激光雷达的数据了

#!/usr/bin/env pythonimport rospy
from sensor_msgs.msg import LaserScandef callback(scan):#LaserScan消息的格式#std_msgs/Header header#float32 angle_min#float32 angle_max#float32 angle_increment#float32 time_increment#float32 scan_time#float32 range_min#float32 range_max#float32[] ranges#float32[] intensitiesrospy.loginfo(scan.header)def listener():rospy.init_node('laser_listener', anonymous=False)rospy.Subscriber('scan', LaserScan, callback)rospy.spin()if __name__ == '__main__':listener()

过滤激光雷达数据并重新发布

通过对激光雷达节点传过来的数据包进行过滤,从而获取某一扇区的雷达数据

#!/usr/bin/env pythonfrom __future__ import print_function
import sys
import rospy
from sensor_msgs.msg import LaserScan
from std_msgs.msg import Stringclass DoFilter:def __init__(self):self.sub = rospy.Subscriber("scan", LaserScan, self.callback)self.pub = rospy.Publisher("filteredscan", LaserScan, queue_size=10)def callback(self, data):newdata = data#从消息中读取的距离和强度数据是tuple,需要转成list以便操作newdata.ranges = list(data.ranges)newdata.intensities = list(data.intensities)#通过清除不需要的扇区的数据来保留有效的数据for x in range(120,240):newdata.ranges[x]=0newdata.intensities[x]=0#前方180°的扇区#for x in range(90,270):#    newdata.ranges[x]=0#    newdata.intensities[x]=0#正前方60°的扇区#for x in range(30,330):#    newdata.ranges[x]=0#    newdata.intensities[x]=0self.pub.publish(newdata)rospy.loginfo(data)if __name__ == '__main__':# Initializerospy.init_node('LidarFilter', anonymous=False)lidar = DoFilter()rospy.spin()

通过laser_filters进行过滤

除了上面比较关爱我这水平的战5渣的方法外,还有比较高端的laser_filters进行激光雷达数据过滤的方法,详情请参见:

laser_filters的wiki页
龟机3跟人应用的激光雷达过滤器

在yaml文件里面定义了很多laser_filters消息的参数后,通过启动laser_filters节点完成激光雷达消息的过滤。其中scan_to_scan_filter_chain提供了从初始扫描到过滤后扫描的流程:

而scan_to_cloud_filter_chain提供了从scan消息生成过滤后的点云的流程:

这两类的示例yaml和launch都可以在上面提供的wiki页找到,很有参考价值的(基本上拷下来调调参数就能用了)
设置参数放在yaml里,消息转换和参数加载放在launch里
除了这些之外,还有必要说下一部分比较常用的参数类型:

InterpolationFilter

将扫描中出现的异常数据通过使用两侧的正常数据进行补齐,效果如下:

.....`..... => InterpolationFilter => ...........

参数设置示例:

scan_filter_chain:
- name: interpolation
  type: InterpolationFilter

LaserScanIntensityFilter

强度值过滤器,将超出范围的扫描结果中的距离结果设为最大距离+1,从而将结果标记为异常。这思路有点迷(´⊙ω⊙`)
参数有三个:

lower_threshold (double)  最小阈值
upper_threshold (double)  最大阈值
disp_histogram (int)      是否输出柱状图(°Д°)居然有这功能,牛逼

参数设置示例:

scan_filter_chain:
- name: intensity
  type: LaserScanIntensityFilterparams:lower_threshold: 8000upper_threshold: 100000disp_histogram: 0

LaserScanRangeFilter

距离值过滤器,会把超过设定范围阈值的数据改为NaN或根据设定进行更改。另外可以读取scan消息中的范围阈值信息。

lower_threshold (double) 最小阈值
upper_threshold (double) 最大阈值
use_message_range_limits (bool) 是否使用scan消息中的阈值信息,默认为false
lower_replacement_value (double) 将小于最小阈值的数据改为该值,默认NaN
upper_replacement_value (double) 将大于最大阈值的数据改为该值,默认NaN

参数设置示例:

scan_filter_chain:
- name: rangetype: LaserScanRangeFilterparams:use_message_range_limits: falselower_threshold: 0.3upper_threshold: .inflower_replacement_value: -.infupper_replacement_value: .inf

LaserScanAngularBoundsFilter

将设定的角度外的扫描数据删除

lower_angle (double) 最小角度(rad)
upper_angle (double) 最大角度(rad)

参数设置示例:

scan_filter_chain:
- name: angle
  type: LaserScanAngularBoundsFilterparams:lower_angle: -1.57upper_angle: 1.57

其他参数

其他参数还包括

LaserScanBoxFilter 无视一个区块内的数据(常用于无视机器人本体对激光雷达数据的干扰)
LaserScanAngularBoundsFilterInPlace 不会删除目标角度扇区外的数据,但会把对应扫描的距离值设为最大距离阈值+1
ScanShadowsFilter 针对物体边沿的扫描和识别
LaserArrayFilter 使用数学过滤器对距离和强度进行过滤

结语

Markdown编辑器好好用ヾ(๑╹◡╹)ノ以后就用这个了
激光雷达现在手头只有一线的,据说之后会拿到16线的,关于点云的部分就到时候再说吧
毕竟想要彻底的理解和熟练掌握一个科技,还是要实际的动手去做一下比较好
这篇真的有够长的。。。写的我都饿了ψ(`∇´)ψ食堂走起!!
然而为了减肥,我决定从今天起每天中午只吃水煮青菜(麻辣烫+青菜-肉-面食=水煮青菜)

ROS激光雷达数据过滤相关推荐

  1. 实验二 读取和理解激光雷达数据

    1. 体验内容 (1)为rplidar添加USB权限 注:实验室的rplidar A2买得比较早,硬件版本可能与github程序不匹配,出现运行错误,解决方法为到 Windows 环境登录思岚科技官网 ...

  2. 从零开始搭二维激光SLAM --- 激光雷达数据效果对比

    我们知道,不同品牌的激光雷达产生的数据是不一样的,那这些不同点是如何影响建图效果的呢? 这篇文章就是来分析这个问题,将从不同光强下的点云效果,不同夹角下的点云效果,以及 1 激光雷达的技术指标 激光雷 ...

  3. 谷歌cartographer使用速腾聚创3d激光雷达数据进行三维建图

    原链接: https://community.bwbot.org/topic/523 谷歌cartographer_ros请参考这篇安装教程:http://community.bwbot.org/to ...

  4. 激光雷达数据到云cloud

    激光雷达数据到云cloud 在美国地质调查局的3D提升计划(3DEP)被激发到一个新的方式可用性宣布从3DEP仓库的访问和处理激光雷达点云数据. 3DEP一直在美国使用光检测和测距(激光)技术获取三维 ...

  5. 值得收藏!基于激光雷达数据的深度学习目标检测方法大合集(下)

    作者 | 黄浴 来源 | 转载自知乎专栏自动驾驶的挑战和发展 [导读]在近日发布的<值得收藏!基于激光雷达数据的深度学习目标检测方法大合集(上)>一文中,作者介绍了一部分各大公司和机构基于 ...

  6. R行数据过滤基于dplyr包filter函数

    R行数据过滤基于dplyr包filter函数 目录 R行数据过滤基于dplyr包filter函数 筛选等于某个值的行 使用与操作筛选行

  7. python与R行列数据过滤(row column filtering):dplyr、 isnull、isna、drop、select、iloc、loc、isin、filter

    python与R行列数据过滤(row column filtering):dplyr. isnull.isna.drop.select.iloc.loc.isin.filter 很多工程师可能刚开始的 ...

  8. Pandas常见的数据过滤方法、通过列条件筛选行数据

    Pandas常见的数据过滤方法.通过列条件筛选行数据 不废话了,直接看代码吧: 一般情况下,前面5种就覆盖了绝大多数需求 import pandas as pd import numpy as npd ...

  9. 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( JNI 传递 Bitmap | 获取位图信息 | 获取图像数据 | 图像数据过滤 | 释放资源 )

    文章目录 一.Bitmap 图像数据处理 二.Java 层 Bitmap 对象转为 JNI 层 bitmap 对象 三.获取 bitmap 中的图像数据 四.过滤 bitmap 中的图像数据 ( 获取 ...

最新文章

  1. OpenCASCADE:适用于 Android 的 OCCT AndroidQt 示例
  2. 卖萌屋算法岗面试手册上线!通往面试自由之路
  3. 需求条目化:一个让用户故事有效落地的套路
  4. LOJ #6053. 简单的函数
  5. 崚 不能被 iconv(gb2312,utf-8 ,string)
  6. ubuntu本地虚拟机搭建服务器,window配合虚拟机VMware搭建虚拟ubuntu服务器入坑集锦...
  7. android官方原生主题,原生Android可以更换系统主题吗?
  8. firefox插件使用:hackbar
  9. CHM 打开时提示 已取消到该网页的导航
  10. 博客9-16CSS 三大特性
  11. 买房贷款,“房贷20年”和“房贷30年”,哪个更划算?为什么?
  12. 影视剧作中的经典桥段部分
  13. 小米刷机OTA、 Recovery、 FASTBOOT三种方法直接的区别和联系
  14. 恢复iPhone已删除的短信
  15. 文库网站在线预览的真实html,墨涩网 - amWiki 轻文库源码+Atom网站搭建教程——墨涩网...
  16. 沪深300股票聚类可视化案例||tushare完整可运行代码逐行解释
  17. 支持向量机(SVM)之核函数
  18. 最新版申请New bing使用攻略
  19. 拼题A基础篇 10 统计字符
  20. 8843 留学生form_报税季又来啦~2019留学生最新最详细的报税指南看过来!

热门文章

  1. Google DeepMind在全球使用AI的10种方式
  2. 钉钉老版本下载3.31_钉钉5.1.36.31
  3. 美剧自动更新下载程序(需要迅雷vip会员的离线下载功能)
  4. ECRS标准工时测量软件分享:作业成本分析法如何计算?作业成本怎么分析计算
  5. 使用ORM关联关系,如何自己关联自己
  6. 免费的手游联运系统可以使用吗?
  7. 浙江大学计算机科学与技术学院院庆,院庆 | 倒计时 · 我在浙里等你!
  8. renpy action show(“screen“)传递参数
  9. java 类的继承,实例化一个类时 构造方法的调用顺序
  10. 【微软漏洞分析】MS15-023 Win32k 特权提升漏洞 - CVE-2015-0078 + 绕过(CVE-2015-2527 in MS15-097)