Ubuntu下激光雷达测距和获取
参考:
(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下激光雷达测距和获取相关推荐
- Ubuntu下如何获取usb相机的PID/VID并打开指定的相机
项目需求控制和打开两个USB摄像头,并且根据相机的PID和VID来打开指定的相机,来区分主副相机,在Windows下可以通过AForge.Video.DirectShow库来实现,但是Ubuntu下没 ...
- Linux —— Ubuntu下C++获取CPU使用率、GPU使用率、GPU温度
非代码 首先介绍在Ubuntu下不使用代码查看的方式来查看CPU使用率.GPU使用率.GPU温度. 查看CPU使用率:top查看GPU使用率及温度:nvidia-smi 代码 ...
- Linux(Ubuntu)下C++获取可用内存、当前最大内存等信息
Linux(Ubuntu)下C++获取可用内存.当前最大内存等信息 使用sysconf函数获取当前可用内存大小 例程: /// @brief Get the available memory in M ...
- 三角法激光雷达测距原理
现在对三角测距方法踩踩坑. 买了一个rplidar A2, 做工不错,挺漂亮的,更重要的是可以软件启动停止,噪声很小,而且反射检测灵敏度比较高(可以扫描到毛玻璃, 有些差的激光雷达检测不到毛玻璃上的反 ...
- ubuntu下使用串口调试终端minicom链接typec接口
在windows下串口调试工具太多了.xshell,putty,不一一列举儿了.今天咱们说的在ubuntu下的串口调试工具minicom. 1.安装minicom sudo apt install m ...
- Linux aptget 参数,ubuntu下apt-get 命令参数大全
Ubuntu下apt-get 命令参数大全,供大家参考. apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本 ...
- Ubuntu下使用Anaconda安装opencv 解决无法读取视频
Ubuntu下使用Anaconda安装opencv 最近在Ubuntu16.04下使用Anaconda安装opencv,碰到很多坑,记录备忘. cv2.VideoCapture(filename) 返 ...
- Ubuntu下用matplotlib作图时显示中文
之前在Ubuntu下用matplotlib作图的时候发现无法正常显示中文,查了一番以后发现是Ubuntu系统和matplotlib库没有共同可显示的中文字体库的原因.用此文章的方法可以解决这一问题. ...
- openocd调试Linux内核,Ubuntu下配置OpenOCD+FT2232
Ubuntu下配置OpenOCD+FT2232 [1]确认调试器方案 将调试器插到电脑上,lsusb看一下: Bus 003 Device 009: ID 1457:5118 First Intern ...
最新文章
- GitLab首席执行官Sid Sijbrandij畅谈当前开发实践
- 【oracle】查看数据库服务器的ip地址的SQL
- IOS之学习笔记五(合成存取方法)
- web3@0.20.1 在依据abi创建智能合约的时候报错 TypeError: web3.eth.contract is not a function
- Python爬虫:该如何学习数据爬虫
- c语言声明第一个学生的成绩,C语言课程设计报告--学生成绩管理系统
- SQL 引擎如何把语句转换为一个抽象语法树?
- Swift开发之粒子动画的实现
- 银行卡号,指定字符长度分割字符串
- 谷歌离开中国的三大原因四大后果
- captura 录制出来的是黑屏_黑屏:我录制的视频播放时画面是黑的解决方案 - Bandicam(班迪录屏)...
- 软件质量(六大要素及其分析)
- 【重磅】2021年SCI影响因子滚烫式公布!各领域TOP期刊!(附下载链接)
- 【算法与数据结构】分治(Divid Conquer)算法——以快排,归并排序,二分查找为例
- python常用数学公式
- mini2440 的 leds的驱动程序
- css3 实现元素 弧线运动
- 用TensorFlow实现非线性支持向量机
- python中mainloop什么意思_Tkinter中的mainloop应该如何理解?
- python医疗影像_基于PyRadiomics的医疗影像纹理获取原型系统集成