本文介紹了LaserScan消息的格式以及各個參數的意義,并且在文章的最后編寫了一個subscriber用來讀取激光數據.
LaserScan是ROS定義的激光數據格式,消息定義在sensor_msgs/LaserScan.msg文件中,路徑為:/opt/ros/indigo/share/sensor_msgs/msg.
LaserScan的消息如下:
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)
了解了LaserScan的數據格式,下面將編寫一個訂閱器用來接收LaserScan消息(假設roscore和laser都已經啟動):
laser_listener.py
#!/usr/bin/env python
import rospy
from sensor_msgs.msg import LaserScan
def callback(scan):
rospy.loginfo('header: {0}'.format(scan))
def listener():
rospy.init_node('lasr_listener', anonymous=False)
rospy.Subscriber('scan', LaserScan,callback)
rospy.spin()
if __name__ == '__main__':
listener()
python laser_listener.py