ROS with V-rep (3) 之仿真velodyne16线激光 (ROS学习笔记六)

昨天与前天的工作解决了ROS与V-rep通讯的问题,今天主要利用V-rep研究了仿真velodyne16线激光的问题,并将数据发送至rviz中,将点云地图画了出来。

一、环境问题

这里的环境为

ubuntu 14.04 + ROS indigo + V-rep 3.3.1 EDU

因为仿真中的函数、桥接等问题对环境很敏感,所以建议使用以上版本进行仿真,同时因为V-rep仿真16线激光时对计算量要求很高,建议使用GPU较高端的电脑进行仿真。否则帧率会非常低,我的老旧笔记本帧率差至0.4fps。


二、步骤

依照其他教程与之前的工作,我们可以得到一个可以与ROS进行通讯并受ROS控制的小车底盘,从V-rep的自带元件库中找到velodyne VPL16,利用jiont连接至小车上,即完成了初步的搭建工作。同时可以对周围环境进行一些修饰,插入一些标志物,如下图即为运行时的场景:

ROS with V-rep (3) 之仿真velodyne16线激光 (ROS学习笔记六)_第1张图片


但是做到上一步只是实现了在V-rep中插入激光雷达,并不能将数据导出到ROS中,以便仿真我们自己的算法,这时其实只需要修改一下Rendar的LUA脚本即可,因为源文件在另一个笔记本上,这里只能给出修改思路。

打开LUA脚本可以发现,其实这个16线激光雷达是分别由4个VisionHandle组成的,其实每个Handle 对应坐标系的90度,组合在一起就是整个360度的空间了。我们需要做的其实就是把这四个visionhandle的点云数据pub出来。

在if(...sensing) then对应的循环中,加入四个publisher其实就可以完成这个任务,pub的函数与上篇文章所用的函数一致,只是数据类型变成“simros_strmcmd_get_depth_sensor_data”,即只要把visionhandle[1]~visionhandle[4]的内容,通过pub的形式,在每个循环中pub出来其实就完成了我们的工作,顺利完成后效果如下:

ROS with V-rep (3) 之仿真velodyne16线激光 (ROS学习笔记六)_第2张图片

对照上一个V-rep中的图,可以更直观的看出点云的对应信息。

其实只是在rviz中接收是无法正常看到上图显示的,这里需要调用一下神奇的tf矩阵,即

rosrun tf static_transform_publisher 0 0 0 1.57 0 1.57 map velodyneVPL_16_sensor1 10

rosrun tf static_transform_publisher 0 0 0 3.14 0 1.57 map velodyneVPL_16_sensor2 10

rosrun tf static_transform_publisher 0 0 0 -1.57 0 1.57 map velodyneVPL_16_sensor3 10

rosrun tf static_transform_publisher 0 0 0 0 0 1.57 map velodyneVPL_16_sensor4 10

以上的旋转矩阵实际是将四个激光雷达的信息分别像拼积木一样凑成了360度,其实仔细看上图还是可以发现四个雷达的拼接处形成的隐约的分界线,这是因为3.14与pi之间有少许差距,导致了拼接的缝隙,可以通过哦进一步精确小数位数来弥补。

但其实此时的帧率已经低到了令人发指的地步,强烈建议选用高配电脑来实现!!


三、进一步工作

既然可以用Rviz收到点云信息,用subscriber去接收也是同理,但应注意,点云数据一般非常大,我测试30s的点云,用txt保存就达到了8G的大小,所以一般不建议直接保存,或者可以尝试提取关键帧类似的想法来尝试。同时,可以通过自己写ROS中的controller来将激光点云作为输入信息,利用自己的算法最终输出对小车的控制信息,以此来验证自己算法的性能~例如rqt图如下:

ROS with V-rep (3) 之仿真velodyne16线激光 (ROS学习笔记六)_第3张图片

其中depth_1~4为激光点云数据,controller为我们自己写的控制算法,至此可以愉快的用vrep仿真激光小车了~


其实还有一种思路,结合V-rep中的path_planning模块,同时将激光点云与控制方法pub出去,作为数据送入神经网络中训练,以得到一个可以根据激光点云输入给出控制方式的网络。

当然,帧率和数据量依旧是个大问题。。。明天来解决这个问题吧~

你可能感兴趣的:(ROS;V-rep;仿真)