Neato XV-11 激光雷达数据格式

一直对机器人感兴趣,ROS SLAM之类也看了不少, 但没有激光雷达 (Lidar) 也只有纸上谈兵. 因为这玩意真是太贵了. 像我这样的爱好者根本负担不起. 不过还是有机智的人,在youtube上看到有外国网友获取了Neato 吸尘器的激光雷达.并成功Hack连接到ROS上,实现了机器人的全自动导航.

抱着试试看的心态,发现淘宝上还真有一家有这东西(http://lidar.taobao.com) ,虽然是二手的,但价格便宜了许多用起来也没什么差别,就迫不及待的拍了一个.经过两天的漫长等待,终于到手了.

通过一天的实验,最终成功的读取了数据,并用其他开源软件画出了地图,成就感满满.

lidar

 

激光雷达总共有两组引线, 分别为马达引线和雷达引线

左侧的就是马达引线:

黑色为负极

红色为 +5V 电源 (注意不要接到Arduino的数据口上,数据口没有那么大驱动能力,容易烧坏接口)

右边一组引线负责传出雷达探测到得数据,其中两根是电源线,两根是串口的TX 和 RX,具体描述如下.

红色 +5V 电源

棕色  RX

橙色  TX

黑色 负极

连接的方式比较简单,如果与Arduino相连,激光雷达的RX 和 与Arudino TX 相接  激光雷达 TX和 Arudino RX 相接就可以了.

接好电源开始旋转后,串口就会源源不断往外发送测量到的距离信息了.

翻译一下外国朋友的资料( https://xv11hacking.wikispaces.com/LIDAR+Sensor )

具体的数据格式如下 :

串口通讯: 速率 115200 8N1

雷达每旋转一周会发送90个数据包, 每个数据包中包含4个测量点的信息.

每个数据包长度固定是22个字节

这样总共360°旋转一周共 1908个字节,相当于每度会有一个距离数据.

每个数据包的格式如下

<start> <index> <speed_L> <speed_H> [Data 0] [Data 1] [Data 2] [Data 3] <checksum_L> <checksum_H>
  • start 总是 0xFA,是固定格式表明数据包开始,可以利用这点来从数据流中分割数据包
  • index是数据包的索引号,范围从0xA0 到 0xF9 (总共89个包,每个包4个数据)
  • speedL speedH  各一个字节,共同组成转速信息,大概是低6bit表示小数部分(
  • [Data 0] 到 [Data 3] 是四组测量数据,其中每组测量数据分别由4个字节组成

`byte 0 : <distance 7:0>`  距离信息的 0-7位
`byte 1 : <“invalid data” flag> <“strength warning” flag> <distance 13:8>` 错误信息标志位 , 警告位, 距离信息13-8位
byte 2 : <signal strength 7:0>`讯号强度 0-7位
byte 3 : <signal strength 15:8>讯号强度 8-15位

距离信息的单位是mm ,整个激光雷达的测量范围大概是 15cm 到 6m, 只需要把距离信息的两个字节组装成一个整数即可(注意判断无效数据位为0,如果为1意味是无效的数据,需丢弃)

checksum 是两字节的校验码,用来校验整个数据包是否正确.下面是python的代码实现

def checksum(data):
    """Compute and return the checksum as an int."""
    # group the data by word, little-endian
    data_list = []
    for t in range(10):
        data_list.append( data[2*t] + (data[2*t+1]<<8) )
 
    # compute the checksum on 32 bits
    chk32 = 0
    for d in data_list:
        chk32 = (chk32 << 1) + d
 
    # return a value wrapped around on 15bits, and truncated to still fit into 15 bits
    checksum = (chk32 & 0x7FFF) + ( chk32 >> 15 ) # wrap around to fit into 15 bits
    checksum = checksum & 0x7FFF # truncate to 15 bits
    return int( checksum )

最终终于从雷达里得到了正确的数据,正当考虑怎么把地图数据显示出来时,突然发现已经有外国大触做到了,并且开源了代码 (  https://github.com/Xevel/NXV11  )

不方便翻墙的朋友可以直接从此处下载   (我好贴心)

这是一个python工程, 大概是作者的机器人项目, 我们只需要其中一个文件即可了.

注意程序依赖pySerial 这个组件包, 需要在Python中安装这个组件包.

只要你的python 版本大于 2.7.4, 在命令行下输入如下命令就会自动安装

pip install pyserial

XV-11_test.py 这个工程依赖VPython,所以确保先把Vpython安装好.(http://vpython.org/)

在VPython中打开 XV-11_test.py, 修改串口参数,主要就是串口号和通讯速率,通讯速率固定是115200, 串口号根据您电脑的情况设置. 因为我用的mac所以是 /dev/xxx 这种格式,对于PC,修改成  COM1 COM2 这种格式即可

lidarpython2

然后运行脚本

python4

 

之后弹出的窗口就能显示出雷达的地图了.

python3

到此我们的机器人就拥有眼睛啦,请大家努力发挥自己的创造力吧.

最后安利一下我买激光雷达的这家店, 这东西在国内真的很难找到,之前找了很久,希望大家不用像我一样浪费许多时间.

http://lidar.taobao.com 

 

 

 

 

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s