最近遇到一个点云处理的问题,需要将激光点云拟合出几条直线最后在rviz中显示出来。主要用到了点云数据的订阅、坐标变换、直线检测以及rviz显示其实还是挺简单的,就是需要用到的一些东西/工具需要提前了解一下.

cv::approxPolyDP

首先第一个是opencv库中的点云到直线拟合工具cv::approxPolyDP,这个工具箱还是很好用的,它的输入是点云数据,输出是拟合出来的直线的起点与终点坐标。

void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed)

该函数主要功能是把一个连续光滑曲线折线化,其中一共有四个参数:

参数详解:InputArray curve:一般是由图像的轮廓点组成的点集OutputArray approxCurve:表示输出的多边形点集double epsilon:主要表示输出的精度,就是另个轮廓点之间最大距离数,5,6,7,,8,,,,可以理解为点到直线能接受的偏离阈值,这个值越大分出的直线越细bool closed:表示输出的多边形是否封闭

通过这个函数,我们可以将点云数据输入进去,最后得到拟合后的直线信息。

visualization_msgs::Marker

visualization_msgs::Marker函数是用于rviz可视化界面的,它的参数其实挺多的,但是好像也不用每个参数都设置过去。

marker的基本格式:

//各种标志物类型的定义,每一个的具体介绍和形状可以到这里查看:http://wiki.ros.org/rviz/DisplayTypes/Marker
uint8 ARROW=0//箭头
uint8 CUBE=1//立方体
uint8 SPHERE=2//球
uint8 CYLINDER=3//圆柱体
uint8 LINE_STRIP=4//线条(点的连线)
uint8 LINE_LIST=5//线条序列
uint8 CUBE_LIST=6//立方体序列
uint8 SPHERE_LIST=7//球序列
uint8 POINTS=8//点集
uint8 TEXT_VIEW_FACING=9//显示3D的文字
uint8 MESH_RESOURCE=10//网格?
uint8 TRIANGLE_LIST=11//三角形序列
//对标记的操作
uint8 ADD=0
uint8 MODIFY=0
uint8 DELETE=2
uint8 DELETEALL=3Header header
string ns   //命名空间namespace,就是你理解的那样
int32 id    //与命名空间联合起来,形成唯一的id,这个唯一的id可以将各个标志物区分开来,使得程序可以对指定的标志物进行操作
int32 type  //类型
int32 action    //操作,是添加还是修改还是删除
geometry_msgs/Pose pose       # Pose of the object
geometry_msgs/Vector3 scale   # Scale of the object 1,1,1 means default (usually 1 meter square)
std_msgs/ColorRGBA color      # Color [0.0-1.0]
duration lifetime             # How long the object should last before being automatically deleted.  0 means forever
bool frame_locked             # If this marker should be frame-locked, i.e. retransformed into its frame every timestep#Only used if the type specified has some use for them (eg. POINTS, LINE_STRIP, ...)
geometry_msgs/Point[] points//这个是在序列、点集中才会用到,指明序列中每个点的位置
#Only used if the type specified has some use for them (eg. POINTS, LINE_STRIP, ...)
#number of colors must either be 0 or equal to the number of points
#NOTE: alpha is not yet used
std_msgs/ColorRGBA[] colors# NOTE: only used for text markers
string text# NOTE: only used for MESH_RESOURCE markers
string mesh_resource
bool mesh_use_embedded_materials

有点复杂,最后我写出来能用的是这样子:

void addLine(double x1,double y1,double x2,double y2,visualization_msgs::Marker &lines)
{    /*geometry_msgs::Point p;p.x = x1;p.y = y1;lines.points.push_back(p);p.x = x2;p.y = y2;lines.points.push_back(p);*/lines.ns = "line_extraction";                           //命名空间namespace,就是你理解的那样lines.id = 0;                                           //与命名空间联合起来,形成唯一的id,这个唯一的id可以将各个标志物区分开来,使得程序可以对指定的标志物进行操作lines.type = visualization_msgs::Marker::LINE_LIST;     //类型// Set the marker action.  Options are ADD, DELETE, and new in ROS Indigo: 3 (DELETEALL)//lines.action = visualization_msgs::Marker::ADD;lines.pose.orientation.x=0.0;lines.pose.orientation.y=0.0;lines.pose.orientation.z=0.0;lines.pose.orientation.w=1.0;lines.scale.x = 0.1;//设置线的颜色,a应该是透明度lines.color.r = 1.0;lines.color.g = 0.0;lines.color.b = 0.0;lines.color.a = 1.0;//这个是指定marker在被自动清除前可以逗留多长时间。这里 ros::Duration()表示不自动删除。如果在lifetime结束之前有新内容到达了,它就会被重置。lines.lifetime = ros::Duration(0.5);//线的初始点geometry_msgs::Point p_start;p_start.x = x1;p_start.y = y1;p_start.z = 0;    //if(lines.points.size() >= 40)//    line_strips.points.erase(line_strips.points.begin());//将直线存储到marker容器lines.points.push_back(p_start);//线的终点geometry_msgs::Point p_end;p_end.x = x2;p_end.y = y2;p_end.z = 0;//if(lines.points.size() >= 40)//    line_strips.points.erase(line_strips.points.begin());lines.points.push_back(p_end);//消息的frame_id以及时间辍lines.header.frame_id = "base_link";lines.header.stamp = ros::Time::now();
}

最后的运行结果如下,对激光数据进行了一定的角度上的限定没有把所有的直线都画出来:


具体代码在下述连接中:

https://download.csdn.net/download/YiYeZhiNian/85209939

ROS订阅激光点云数据并画直线相关推荐

  1. Ubuntu18.04 安装速腾聚创最新驱动RSLidar_SDK采集XYZIRT格式的激光点云数据 --SLAM不学无术小问题

    Ubuntu18.04 安装速腾聚创最新驱动RSLidar_SDK采集XYZIRT格式的激光点云数据 新款驱动支持RS16.RS32.RSBP.RS128.RS80.RSM1-B3.RSHELIOS等 ...

  2. 读自动驾驶激光雷达物体检测技术(Lidar Obstacle Detection)(1):Stream PCD流式载入激光点云数据

    首先贴一下大佬的github链接:https://github.com/williamhyin/SFND_Lidar_Obstacle_Detection 知乎专栏:https://www.zhihu ...

  3. matlab体素化,一种三维激光点云数据快速体素化处理方法与流程

    本发明涉及一种三维激光点云数据快速体素化处理方法. 背景技术: 目前,三维激光扫描系统快速发展,由于研究的需要,往往需要把不具有空间长度信息的点数据转为具有三维空间信息的立方体,如何使用软件进行快速. ...

  4. Python+vtk 实现激光点云数据可视化学习(2021.7.12)

    Python+VTK实现激光点云数据可视化学习 2021.7.12 1.激光点云与VTK简介 2.配置Python环境(Conda+PyCharm+Python3.6+VTK) 3.点云数据(大约60 ...

  5. ROS与PCL中点云数据之间的转换

    此为文章初稿还没有完善,应该还有一些问题,等待后面有时间再继续更新,原创文章,未经允许,请勿转载!!! 首先介绍在PCL库中经常使用的两种点云之间的转换,这里将根据工程中的经验,从代码层面举例分析如何 ...

  6. 基于激光点云数据自动化实现道路标线分类、提取及矢量化

    Automatic Road Markings Extraction Classification And Vectorization Mobile From Laser Scanning Data ...

  7. 解析las文件_Java读取解析激光点云数据(Las/Laz)

    激光点云数据格式Las/Laz目前网上流行的读取库为c++版本的LibLas,java版本的读取解析工具目前还没有找到,但是还好有大神已经为java程序员打了LibLas的JNI版本(https:// ...

  8. 什么是LIDAR(激光雷达),如何标注激光点云数据?

    自动驾驶汽车严重依赖输入的训练数据来做出驾驶决策,从逻辑上来说,数据越详细,车辆做出决策就越好,最重要的是更安全.虽然现代相机可以捕捉到非常详细的真实世界特征,但输出结果仍然是2D的,效果并不够理想, ...

  9. ROS采集激光雷达点云数据

    入手VLP-16激光雷达,想用ROS采集雷达数据,按照现有教程总有些小问题,现在把自己成功采集到数据的经过分享一下,希望能对刚入坑的有所帮助. 本人使用的Ubuntu16.04+kinetic系统 1 ...

最新文章

  1. css expressionr,CSS Expression讲解
  2. Ubuntu安装Samba实现跟windows文件共享
  3. 易语言取c盘文件夹中的文件被占用,win7系统怎么快速找出文件被什么进程占用|win7解除文件占用的方法...
  4. poj3461kmp
  5. springboot属性注入转化为对象
  6. 11 、图解2个node环境下replica shard是如何分配的
  7. 计算机网络数据链路层之扩展以太网(含以太网交换机及虚拟局域网)
  8. Getway接口签名
  9. paip.win32的internet扩展已停止工作解决大法
  10. Hadoop权威指南(第三版)笔记——MapReduce
  11. Gcode命令【转】
  12. android assets绝对路径,Android获取assets文件路径
  13. 异星工厂服务器无响应,异星工厂无法联机解决方法 异星工厂无法联机怎么办...
  14. matplotlib.pyplot 标记出曲线上最大点和最小点的位置
  15. 重置计算机后无法开机,win10重置此电脑失败怎么办_win10重置此电脑失败无法开机修复方法...
  16. 数据可视化UI设计素材资源文件sketch大屏可视化数据展示
  17. 速通C语言支线第一站 基础刷题
  18. Windows11安卓子系统安装软件方法
  19. acwing算法基础课——差分
  20. 【马修笔记】大波段顶底反转的节奏交易.

热门文章

  1. http://www.360doc.com/content/16/0711/13/2428535_574691930.shtml
  2. 讯飞语音测试软件,语音转文字软件哪个好用?讯飞听见一键转写更简单
  3. 远程桌面复制粘贴功能失效的解决办法
  4. python中两个变量的值互换
  5. 计算数组中每个数左边/右边第一个比其大/小的值
  6. 三菱m70 通信协议_三菱M70(参数表)
  7. DDPG笔记(归纳总结)
  8. table表格数据无缝循环向上滚动,hover后暂停滚动
  9. acer计算机配置,宏碁笔记本如何配置电脑将视频从HDMI输出
  10. 如何简单快速的恢复U盘误删的文件?