入坑之前听说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
最后希望明天能顺利搞明白更多的细节。。。。。。。。。。。。。。。。。。。。。。。。