PCL学习之:将超声数据按照PCL点云方式发布出去
前言:基于2D激光雷达的机器人,想让它跑自动导航,众所周知有2个比较明显的缺陷,1,那就是普通的激光雷达无法对玻璃或是镜面物体有反映; 2,机器人避障时只能对某一个平面的物体有反映,超过或者低于这个平面就不行,类似桌面等悬空的物体就无法检测。
基于这个缺陷,大部分的做法是使用廉价的超声雷达来辅助激光雷达,达到改善这个缺陷的目地。而且超声波模块很便宜,大部分在5~15元之间。测距误差在<3cm,用于机器人效果上还是不错的。之前的做法是,直接读取超声然后判断障碍物是否在安全距离,在安全距离以内就急停,这种做法有一个缺陷,那就是无法让机器人对障碍物进行绕行,所有把超声的数据安装PCL点云的方式发布出去,然后塞到局部动态地图里面,这样就可以达到使得机器人可以向激光雷达一样,做绕行的动作。废话少说,直接上代码:
class TestPcl():
def __init__(self):
rospy.init_node('talk_sonar_pcl', anonymous=True)
pub_cloud = rospy.Publisher("sonar_pcl", PointCloud2)
self.sonar_pub = rospy.Publisher('sonar', Range, queue_size=5)
rospy.Subscriber("stm_pub_ultrasonic1", Int16, self.sonarCallback)
self.sonar_value = 0
while not rospy.is_shutdown():
now = rospy.Time.now()
sonar_range = Range()
sonar_range.header.stamp = now
sonar_range.header.frame_id = "/sonar"
sonar_range.radiation_type = Range.ULTRASOUND
sonar_range.field_of_view = 0.3
sonar_range.min_range = 0.04
sonar_range.max_range = 0.8
sonar_range.range = self.sonar_value/1000.0
self.sonar_pub.publish(sonar_range)
pcloud = PointCloud2()
# make point cloud
cloud = [[1,5,1],[1.1,5,1],[1.2,5,1]]
cloud[0][1] = sonar_range.range
cloud[1][1] = sonar_range.range
cloud[2][1] = sonar_range.range
pcloud.header.frame_id="/base_footprint"
pcloud = pc2.create_cloud_xyz32(pcloud.header, cloud)
pub_cloud.publish(pcloud)
rospy.loginfo(pcloud)
rospy.sleep(1.0)
def sonarCallback(self,seq):
self.sonar_value = seq.data
代码很简单,我就不解释了。
运行rviz,添加pointcloud2,topic主题为sonar_pcl就可以看到点云随着超声数据变化:
PCL学习之:将超声数据按照PCL点云方式发布出去的更多相关文章
- PCL学习八叉树
建立空间索引在点云数据处理中有着广泛的应用,常见的空间索引一般 是自顶而下逐级划分空间的各种空间索引结构,比较有代表性的包括BSP树,KD树,KDB树,R树,四叉树,八叉树等索引结构,而这些结构中,K ...
- PCL学习笔记1
先贴一段代码,从别处抄来的 #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_type ...
- PCL读取PCD文件的数据
1.pcd文件——rabbit.pcd 链接:https://pan.baidu.com/s/1v6mjPjwd7fIqUSjlIGTIGQ提取码:zspx 新建项目pcl rabbit.pcd 和p ...
- PCL学习(三) SAC-IA 估记object pose
SAC-IA是基于RANSAC算法的对齐算法 通过降采样提高法向计算.FPFH特征的计算 最后通过SAC-IA计算得到对齐的旋转和平移 #include <Eigen/Core> #inc ...
- PCL学习(二)三维模型转点云 obj转pcd----PCL实现
#include <pcl/io/io.h> #include <pcl/io/pcd_io.h> #include <pcl/io/obj_io.h> #incl ...
- ios网络学习------6 json格式数据的请求处理
ios网络学习------6 json格式数据的请求处理 分类: IOS2014-06-30 20:33 471人阅读 评论(3) 收藏 举报 #import "MainViewContro ...
- Java学习-028-JSON 之二 -- 数据读取
JSON数据由 JSONObject.JSONArray.key_value 组合而成.通常来说,JSONObject 可以包含 JSONObject.JSONArray.key_value:JSON ...
- Node.js学习之TCP/IP数据通讯
Node.js学习之TCP/IP数据通讯 1.使用net模块实现基于TCP的数据通讯 提供了一个net模块,专用于实现TCP服务器与TCP客户端之间的通信 1.1创建TCP服务器 在Node.js利用 ...
- PCL—关键点检测(Harris)低层次点云处理
博客转载自:http://www.cnblogs.com/ironstark/p/5064848.html 除去NARF这种和特征检测联系比较紧密的方法外,一般来说特征检测都会对曲率变化比较剧烈的点更 ...
随机推荐
- 【Linux命令】id,usermod用户管理命令(包括/etc/passwd、shadow、group、gshadow文件)
一.id命令 可以用来查看用户的UID.GID和附加组信息 id会显示用户以及所属群组的实际与有效ID.若两个ID相同,则仅显示实际ID.若仅指定用户名称,则显示目前用户的ID. 1.格式 id [O ...
- selenium元素定位方法之轴定位
一.轴运算名称 ancestor:祖先结点(包括父结点) parent:父结点 preceding:当前元素节点标签之前的所有结点(html页面先后顺序) preceding-sibling:当前元素 ...
- linux检测远程端口是否打开
常用telnet ip port 方式(如telnet 172.17.193.18 5902)测试远程主机端口是否打开,或者用于测试当前环境与远程主机的端口之间的防火墙开通与否. telnet [ro ...
- Java开发桌面程序学习(五)——文件选择器和目录选择器的使用
选择器的使用 DirectoryChooser目录选择器官方文档 FileChooser文件选择器官方文档 文件选择器的使用 JavaFx中有个FileChoser,可以打开一个对话框来选择文件 Fi ...
- MSSQL查询当前登录进程以及执行状态
--当前连接进程declare @tempTable table (SPID INT,Status VARCHAR(255), Login VARCHAR(255),HostName VARCHAR( ...
- C# Task ContinueWith
static void Main(string[] args) { Task firstTask = Task.Run(() => { PrintPlus(); }); Task secondT ...
- Z从壹开始前后端分离【 .NET Core2.0/3.0 +Vue2.0 】框架之四 || Swagger的使用 3.2
本文梯子 本文3.0版本文章 前言 一.swagger的一般用法 0.设置swagger页面为首页——开发环境 1.设置默认直接首页访问 —— 生产环境 2.为接口添加注释 3.对 Model 也添加 ...
- 易优CMS:小白学代码之notempty
[基础用法] 名称:notempty 功能:判断某个变量是否为空,可以嵌套到任何标签里面使用,比如:channel.type等 语法: {eyou:notempty name='$eyou.field ...
- JS中new操作符源码实现
首先我们来看一下实例化一个对象做了浏览器做了什么事情 new的四步操作: 1. 创建一个空对象 2. 设置空对象的__proto__属性继承构造函数的prototype属性,也就是继承构造函数的原型对 ...
- 【JavaScript】JavaScript基础
JavaScript简介 JavaScript历史 在上世纪1995年,著名的互联网公司网景公司希望能在静态HTML页面上添加一些动态效果,于是叫Brendan Eich这哥们在两周之内设计出了Jav ...