激光雷达工作原理:
激光雷达装有一个红外激光发射器和接收器。在每一次检测中,激光发射器发射一道激光,遇到障碍物时反射被接收器接收到。通过发生和接收的时间间隔除以光速即可达到雷达和障碍物的距离。激光雷达每完成一次检测会旋转一定角度继续检测,直到转完360度即可得到雷达周围障碍物的分布
在RViz中,激光雷达数据通过添加LaserScan进行可视化。添加LaserScan显示后在里面topic下选择订阅话题/scan
激光雷达消息解读
激光雷达话题消息类型默认为sensor_msgs/laserScan
# Single scan from a planar laser range-finder
#
# If you have another ranging device with different behavior (e.g. a sonar
# array), please find or create a different message, since applications
# will make fairly laser-specific assumptions about this data
Header header # timestamp in the header is the acquisition time of
# the first ray in the scan.
#
# in frame frame_id, angles are measured around
# the positive Z axis (counterclockwise, if Z is up)
# with zero angle being forward along the x axis
float32 angle_min # start angle of the scan [rad]
float32 angle_max # end angle of the scan [rad]
float32 angle_increment # angular distance between measurements [rad]
float32 time_increment # time between measurements [seconds] - if your scanner
# is moving, this will be used in interpolating position
# of 3d points
float32 scan_time # time between scans [seconds]
float32 range_min # minimum range value [m]
float32 range_max # maximum range value [m]
float32[] ranges # range data [m] (Note: values < range_min or > range_max should be discarded)
float32[] intensities # intensity data [device-specific units]. If your
# device does not provide intensities, please leave
# the array empty.
1 Header header:时间戳,保存本轮检测中第一次收到反射光线的时间
2 float 32 angle_min
float 32 angle_max
扫描的起始角度和最终角度。如起始-π到最终π代表从-180°扫描到180°,旋转一周
3 float32 angle_increment
每两个相邻检测相距角度
4 float32 time_increment
每两个相邻检测相距时间
5 float32 scan_time
两次扫描相差时间
6 float32 range_min
float32 range_max
扫描距离下限和上限。超出距离上限和下限的数据点将不会被记入
7 float32[] ranges
数组中每一个元素代表激光雷达从起始角度到终止角度每一次扫描得到的测距。对于超出距离范围的数据点会表示为infinity。每1度旋转会保存一个数据点。如旋转360度得到的数组长度即为360。
8 float32[] intensities
激光雷达强度,代表数据的精准度,由厂商设置
python实现读取雷达信息
实现步骤:
1 创建功能包lidar_pkg
catkin_create_pkg lidar_pkg roscpp rospy sensor_msgs
注意这里我们添加依赖sensor_msgs,该库里包括laserScan等传感器消息类型
回退到上级目录,进行编译
catkin_make
2 创建节点lidar_node.py
在lidar_pkg下创建目录scripts,在scripts里创建lidar_node.py
#!/usr/bin/env python
# coding=utf-8
import rospy
from sensor_msgs.msg import LaserScan
# 订阅者回调函数
def LidarCallback(msg, ret):
dist = msg.ranges[180] # 这里我们雷达起始角度为-180,msg.ranges[180]代表0度距离
rospy.loginfo("前方距离 = %f 米", dist)
if __name__== "__main__":
# 初始化节点
rospy.init_node("lidar_node")
# 利用rospy订阅雷达话题/scan, 回调函数为LidarCallback
lidar_sub = rospy.Subscriber("/scan",LaserScan,LidarCallback,queue_size=10)
# 让节点保持运行
rospy.spin()
进入lidar_pkg/scripts目录下
chmod -x lidar_node.py
添加文件可执行权限
进入lidar_pkg/Cmakelist.txt里添加如下内容将可执行文件加入到Cmakelist中
catkin_install_python(PROGRAMS
scripts/lidar_node.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
注:如果要将该节点加入到launch文件中,可以添加如下语句。注意对于python节点launch文件声明顺序为name(节点名称), pkg(功能包名称), type(可执行文件名称), output(节点输出)。顺序和C++节点不同
<node name="lidar_node" pkg="lidar_pkg" type="lidar_node.py" output="screen"></node>
参考
https://www.bilibili.com/video/BV19g411S7uK/?spm_id_from=333.788&vd_source=ce2a14f15824e34d77a90933019c91e6