ros与V-rep联合使用血泪教训(ROS学习笔记四)

 
  
最近在研究用ros与V-rep配合使用,在V-rep中搭建环境与模型,在ROS中跑算法。

入坑之前听说V-rep对ros的兼容可以达到gazebo的水平,于是欢快的入了坑。

入坑之后发现神特么兼容,虽然V-rep中的环境和模型较gazebo丰富一些,但很不建议为此尝试与ros联合使用(似乎与MATLAB联合更人性化一些),如果非要联合使用,请参考下文。


一、环境配置

V-rep不像gazebo一样有ros包,所以需要在两个程序之间搭建一座桥梁:vrep_ros_bridge,其起到了将信息在ros与V-rep只间传递的作用。

参考:http://wiki.ros.org/vrep_ros_bridge

然而就是这种坑爹的桥梁,阻挡了我将近一个星期,特将血泪教训总结如下:

既然是桥梁,就需要有两端,偏偏这座桥对两端要求极端严苛:

一周内我尝试了ROS_kinetic + v-rep 3.4.0 \ v-rep 3.3.1 \ v-rep 3.2.3 均无法正常工作(此处的正常工作是指能完成后面的一些桥接任务,而不是简单的“Plugin 'RosBridge': load succeeded.”) ,同时我换至ros_indigo下继续尝试,终于在V-rep 3.3.1 EDU版上得到了成功,个中滋味难以言表。

故关于版本问题,个人认为ROS_Indigo + v-rep 3.3.1 EDU是比较好的选择,其他选择也可以实现部分功能,但感觉最完整的功能应该在我说的这个组合中。


二、安装流程

建议按照以下流程安装:

这里只给出宏观流程,具体命令官网以及其他地方已经相当详尽了。

首先下载相应版本V-rep ,在单跑无误的情况下git vrep_ros_bridge。

同时将环境变量中的$Vrep_root_path改为之前的V-rep安装地址

在工作区内catkin_make,这时候应该会有 三到四轮报错。。。

第一轮应该是 qu..._tk_...的一个包中的错误,直接cd进去 touch CATKIN_IGNORE即可,但应注意这样后未来跑控制四悬翼的demo时会无法控制

第二轮应该是找不到某个txt文件,我们进入该txt文件并将其用环境变量赋值的地址改为绝对地址,即vrep包的所在地址即可。

第三轮依然是某个include文件夹的位置问题,解决办法与2相类似

第四轮报错应该是找不到几个头文件,这时需要把vrep.../programming/include中的所有头文件复制至

“你的工作区”/src/vrep_ros_bridge-master/vrep_ros_plugin/include 文件夹下

至此大概可以catkin_make 过了。

接着按照官网的教程走,基本可以完成安装。

(在kinetic下链接第二个.so文件时会报错 “libv_repExtRos.so:undefined symbol: _ZN3ros4initERiPPcRKSsj”,这似乎没有解决办法,换ROS版本吧。。。)


三、参考资料

v-rep本身参考资料就不多,与ros配合的更少,于是常常陷入无处寻找参考资料的窘境,这里留下一些比较好的参考资料:

各种官网在这里就不多列举了,其他的如下:

1/这是一个v-rep的交流网站,很多问题会在上面讨论:

http://www.forum.coppeliarobotics.com/index.php?sid=665775084f94a27cc9b90cc4a5ec3441

2/这是油管上的一系列v-rep教学视频内,虽然和ros没多大关系,但比较适合入门

https://www.youtube.com/watch?v=xI-ZEewIzzI

3/这是一个简短的在V-rep中搭建机器人,在ros中控制的实例,比较具有代表性:

https://www.youtube.com/watch?v=nLKLu4Hw_mU

需要特别注意的是上面视频的一些函数是当时版本下Vrep的函数,一些版本已经不使用了,需要进行一番甄别,代码如下:

function callback_MotorsVelocity(msg)
    simSetJointTargetVelocity(hLeftMotor,msg.linear.x)
    simSetJointTargetVelocity(hRightMotor,msg.linear.y)
    simAddStatusbarMessage(string.format("Vl:%f Vr:%f",msg.linear.x,msg.linear.y))
end

if(sim_call_type == sim_childscriptcall_initialization) then

    hLeftMotor = simGetObjectHandle("LeftMotor")
    hRightMotor = simGetObjectHandle("RightMotor")
    hFrontUS = simGetObjectHandle("FrontUS")

    local moduleName = 0
    local moduleVersion = 0
    local index = 0
    local pluginNotFound = true

    while moduleName do
        moduleName,moduleVersion = simGetModuleName(index)
       --simAddStatusbarMessage(string.format("%s",moduleName))
        if(moduleName == 'Ros') then
                pluginNotFound = false
        end
        index = index + 1
    end

    if(pluginNotFound) then 
        simAddStatusbarMessage("the RosPlugin was not found!")
    else
        sensorPub = simExtRosInterface_advertise('/frontUS','std_msgs/Float32')
        simTimePub = simExtRosInterface_advertise('/simTime','std_msgs/Float32')
        motorsSub = simExtRosInterface_subscribe('/cmd_vel','geometry_msgs/Twist','callback_MotorsVelocity')
--上面这三行会有错误,具体的函数请参考“4”中给出的参考资料
 end

    simAddStatusbarMessage("Simulation initialized")
end

if (sim_call_type == sim_childscriptcall_actuation) then
    if notpluginNotFound then
        retult,distance = simReadProximitySensor(hFrontUS)
        if(distance~=nil) then
            simExtRosInterface_publish(sensorPub,{data=distance})
            simExtRosInterface_publish(simTimePub,{data=simGetSimulationTime()})
        end
    end
end

if(sim_call_type == sim_childscriptcall_cleanup) then
    if roInterfacePresent then
        simExtRosInterface_shutdownPublisher(sensorPub)
        simExtRosInterface_shutdownPublisher(simTimePub)
        simExtRosInterface_shutdownSubscriber(motorsSub)
    end
end


4/对于V-rep中谜一样的LUA函数,实在是接受不能,好在找到了一个对这些函数、参数解释比较详细的地方,如下:

http://www.coppeliarobotics.com/helpFiles/en/rosPublisherTypes.htm


最后希望明天能顺利搞明白更多的细节。。。。。。。。。。。。。。。。。。。。。。。。



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