参考:

(1)https://blog.csdn.net/hehedadaq/article/details/82772571rospy订阅激光雷达数据并可视化处理

(2)https://blog.csdn.net/qq_37082966/article/details/93098721   ROS简单实现订阅/scan激光雷达的距离信息

(3)https://www.ncnynl.com/archives/201703/1431.html   ROS与激光雷达入门教程-ROS中使用激光雷达(Hokuyo网口)

前提:

  • 启动你的雷达,至少rostopic list的时候,有雷达的话题
  • 然后你把下面的程序写好,直接python name.py就行了,python文件还是很方便的,根本不需要编译什么的。

程序1   来自参考(1)

import rospy
import cv2
import numpy as np
import mathfrom sensor_msgs.msg import LaserScandef callback(data):# 设置画布为600*600像素frame = np.zeros((600, 600,3), np.uint8)angle = data.angle_minfor r in data.ranges:#change infinite values to 0#如果r的值是正负无穷大,归零if math.isinf(r) == True:r = 0#convert angle and radius to cartesian coordinates#这里就是将极坐标的信息转为直角坐标信息,只是像素的转化,不对应具体值#如果x中的90是正的,则顺时针显示,如果是负的,则逆时针显示。x = math.trunc((r * 50.0)*math.cos(angle + (-90.0*3.1416/180.0)))y = math.trunc((r * 50.0)*math.sin(angle + (-90.0*3.1416/180.0)))#set the borders (all values outside the defined area should be 0)#设置限度,基本上不设置也没关系了if y > 600 or y < -600 or x<-600 or x>600:x=0y=0# print "xy:",x,y# 用CV2画线,位置在(300,300),和目标点,颜色是(255,0,0),线宽2cv2.line(frame,(300, 300),(x+300,y+300),(255,0,0),2)# 角度得增加angle= angle + data.angle_increment # 画个中心圆 cv2.circle(frame, (300, 300), 2, (255, 255, 0))cv2.imshow('frame',frame)cv2.waitKey(1)# 话题监听函数,其实主要是一个初始化过程
# 初始化节点,'laser_listener' 挺重要的,是节点(node)名称,一个py文件只能有一个。
# 代表开启一个进程!匿名参数也默认是这个
# 订阅的语句。先是你需要订阅的话题要对,然后是数据类型,然后是回调函数名字
# 最后的队列很重要,不管发布还是订阅,都有queue_size参数;
# 如果默认的话,发布的频率远高于你处理图片的速度,因此根本无法实时的显示
# 所以需要换为1,只接收最新的一个消息,其他的都丢了不管~
def laser_listener():rospy.init_node('laser_listener', anonymous=True)rospy.Subscriber("lidar/scan", LaserScan,callback,queue_size = 1)rospy.spin()if __name__ == '__main__':laser_listener()

程序2来自参考2

import rospy
from sensor_msgs.msg import LaserScan
from geometry_msgs.msg import Twistclass Obstacle():def __init__(self):self.LIDAR_ERR = 0.05self._cmd_pub = rospy.Publisher('cmd_vel', Twist, queue_size=1)self.obstacle()def get_scan(self):msg = rospy.wait_for_message("scan", LaserScan)self.scan_filter = []for i in range(360):if i <= 15 or i > 335:if msg.ranges[i] >= self.LIDAR_ERR:self.scan_filter.append(msg.ranges[i])def obstacle(self):self.twist = Twist()while not rospy.is_shutdown():self.get_scan()if min(self.scan_filter) < 0.5:self.twist.linear.x = 0.0self.twist.angular.z = 0.0self._cmd_pub.publish(self.twist)rospy.loginfo('Stop!')else:self.twist.linear.x = 0.0self.twist.angular.z = 0.0rospy.loginfo('distance of the obstacle : %f', min(self.scan_filter))self._cmd_pub.publish(self.twist)def main():rospy.init_node('turtlebot_scan')try:obstacle = Obstacle()except rospy.ROSInterruptException:passif __name__ == '__main__':main()

程序3 结合上面程序进行修改

from sensor_msgs.msg import LaserScan
import cv2
import math
import rospy
import numpy as np
def get_scan():msg = rospy.wait_for_message("scan_front",LaserScan)frame = np.zeros((600,600,3),np.uint8)angle = msg.angle_minfor r in msg.ranges:if math.isinf(r) == True:r = 0x = math.trunc((r*50.0)*math.cos(angle + (-90.0*3.1416/180.0)))y = math.trunc((r*50.0)*math.sin(angle+(-90.0*3.1416/180.0)))if y>600 or y<-600 or x<-600 or x>600:x=0y=0cv2.line(frame,(300, 300),(x+300,y+300),(255,0,0),2)angle = angle + msg.angle_incrementcv2.circle(frame, (300, 300), 2, (255, 255, 0))cv2.imshow('frame',frame)cv2.waitKey(1)def laser_li():rospy.init_node("lidar_scan")get_scan()if __name__ == "__main__":laser_li()

激光雷达数据解释

Header header            # Header也是一个结构体,包含了seq,stamp,frame_id,其中seq指的是扫描顺序增加的id,stamp包含了开始扫描的时间和与开始扫描的时间差,frame_id是扫描的参考系名称.注意扫描是逆时针从正前方开始扫描的.float32 angle_min        # 开始扫描的角度(角度)
float32 angle_max        # 结束扫描的角度(角度)
float32 angle_increment  # 每一次扫描增加的角度(角度)float32 time_increment   # 测量的时间间隔(s)
float32 scan_time        # 扫描的时间间隔(s)float32 range_min        # 距离最小值(m)
float32 range_max        # 距离最大值(m)float32[] ranges         # 距离数组(长度360)
float32[] intensities    # 与设备有关,强度数组(长度360)

Ubuntu下激光雷达测距和获取相关推荐

  1. Ubuntu下如何获取usb相机的PID/VID并打开指定的相机

    项目需求控制和打开两个USB摄像头,并且根据相机的PID和VID来打开指定的相机,来区分主副相机,在Windows下可以通过AForge.Video.DirectShow库来实现,但是Ubuntu下没 ...

  2. Linux —— Ubuntu下C++获取CPU使用率、GPU使用率、GPU温度

      非代码      首先介绍在Ubuntu下不使用代码查看的方式来查看CPU使用率.GPU使用率.GPU温度. 查看CPU使用率:top查看GPU使用率及温度:nvidia-smi   代码     ...

  3. Linux(Ubuntu)下C++获取可用内存、当前最大内存等信息

    Linux(Ubuntu)下C++获取可用内存.当前最大内存等信息 使用sysconf函数获取当前可用内存大小 例程: /// @brief Get the available memory in M ...

  4. 三角法激光雷达测距原理

    现在对三角测距方法踩踩坑. 买了一个rplidar A2, 做工不错,挺漂亮的,更重要的是可以软件启动停止,噪声很小,而且反射检测灵敏度比较高(可以扫描到毛玻璃, 有些差的激光雷达检测不到毛玻璃上的反 ...

  5. ubuntu下使用串口调试终端minicom链接typec接口

    在windows下串口调试工具太多了.xshell,putty,不一一列举儿了.今天咱们说的在ubuntu下的串口调试工具minicom. 1.安装minicom sudo apt install m ...

  6. Linux aptget 参数,ubuntu下apt-get 命令参数大全

    Ubuntu下apt-get 命令参数大全,供大家参考. apt-cache search package  搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本 ...

  7. Ubuntu下使用Anaconda安装opencv 解决无法读取视频

    Ubuntu下使用Anaconda安装opencv 最近在Ubuntu16.04下使用Anaconda安装opencv,碰到很多坑,记录备忘. cv2.VideoCapture(filename) 返 ...

  8. Ubuntu下用matplotlib作图时显示中文

    之前在Ubuntu下用matplotlib作图的时候发现无法正常显示中文,查了一番以后发现是Ubuntu系统和matplotlib库没有共同可显示的中文字体库的原因.用此文章的方法可以解决这一问题. ...

  9. openocd调试Linux内核,Ubuntu下配置OpenOCD+FT2232

    Ubuntu下配置OpenOCD+FT2232 [1]确认调试器方案 将调试器插到电脑上,lsusb看一下: Bus 003 Device 009: ID 1457:5118 First Intern ...

最新文章

  1. GitLab首席执行官Sid Sijbrandij畅谈当前开发实践
  2. 【oracle】查看数据库服务器的ip地址的SQL
  3. IOS之学习笔记五(合成存取方法)
  4. web3@0.20.1 在依据abi创建智能合约的时候报错 TypeError: web3.eth.contract is not a function
  5. Python爬虫:该如何学习数据爬虫
  6. c语言声明第一个学生的成绩,C语言课程设计报告--学生成绩管理系统
  7. SQL 引擎如何把语句转换为一个抽象语法树?
  8. Swift开发之粒子动画的实现
  9. 银行卡号,指定字符长度分割字符串
  10. 谷歌离开中国的三大原因四大后果
  11. captura 录制出来的是黑屏_黑屏:我录制的视频播放时画面是黑的解决方案 - Bandicam(班迪录屏)...
  12. 软件质量(六大要素及其分析)
  13. 【重磅】2021年SCI影响因子滚烫式公布!各领域TOP期刊!(附下载链接)
  14. 【算法与数据结构】分治(Divid Conquer)算法——以快排,归并排序,二分查找为例
  15. python常用数学公式
  16. mini2440 的 leds的驱动程序
  17. css3 实现元素 弧线运动
  18. 用TensorFlow实现非线性支持向量机
  19. python中mainloop什么意思_Tkinter中的mainloop应该如何理解?
  20. python医疗影像_基于PyRadiomics的医疗影像纹理获取原型系统集成

热门文章

  1. HTML CSS 过渡效果
  2. QoS服务质量三DiffServ模型报文的标记及PHB
  3. iOS Push隐藏底部tabBar,Pop出现tabBar
  4. trados 有道api_Trados能自动翻译吗?怎么操作,具体点。
  5. 搭建hexo主题Butterfly部署github+个人服务器
  6. assembly的概念
  7. vue中使用高德地图自定义行政区划聚合
  8. 0604mysql基础:增删改查
  9. crx文件无法拖到谷歌浏览器的开发者页面里,附带取消文档的默认打开方式
  10. docker部署typecho