ros与V-rep联合使用血泪教训(ROS学习笔记四)
来源:互联网 发布:linux下网络配置文件 编辑:程序博客网 时间:2024/04/30 00:01
最近在研究用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))endif(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")endif (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 endendif(sim_call_type == sim_childscriptcall_cleanup) then if roInterfacePresent then simExtRosInterface_shutdownPublisher(sensorPub) simExtRosInterface_shutdownPublisher(simTimePub) simExtRosInterface_shutdownSubscriber(motorsSub) endend
4/对于V-rep中谜一样的LUA函数,实在是接受不能,好在找到了一个对这些函数、参数解释比较详细的地方,如下:
http://www.coppeliarobotics.com/helpFiles/en/rosPublisherTypes.htm
最后希望明天能顺利搞明白更多的细节。。。。。。。。。。。。。。。。。。。。。。。。
- ros与V-rep联合使用血泪教训(ROS学习笔记四)
- ROS with V-rep (2) (ROS学习笔记五)
- ROS with V-rep (3) 之仿真velodyne16线激光 (ROS学习笔记六)
- 机器人操作系统ROS(indigo)与三维仿真软件V-Rep(3.2.1)通信接口使用笔记
- ROS学习笔记(四):ROS主题
- ROS学习笔记 (四):使用ROS实现ARM与PC之间的通讯
- Learning ROS for Robotics Programming Second Edition学习笔记(一) indigo v-rep
- ROS学习笔记(四)
- ROS学习笔记四:理解ROS节点
- ROS学习--(四)创建ROS Package
- ROS学习笔记:tf的学习与使用(一)
- 《ROS精品入门》学习笔记四:ROS中的空间描述与变换
- ROS学习笔记(四) 先锋机器人跟随
- ROS学习笔记(二)ROS by Example 学习笔记
- ROS的学习(四)创建一个ROS包
- 【ROS学习】(四)ROS消息传递——std_msgs
- ROS学习(四)机器人的移动与矫正
- ROS学习笔记(一)
- java工厂模式
- 【Linux】mysleep函数---普通版本与规避竞态条件版本
- SDUT-1137 C/C++练习7---求某个范围内的所有素数
- 迁移学习:经典算法解析
- tf.nn.rnn_cell.BasicRNNCell函数的用法
- ros与V-rep联合使用血泪教训(ROS学习笔记四)
- LLVM & Clang
- org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read
- 2自定义View系列课程学习笔记——之Scroller和ViewDragHelper
- 其他没有转载的内容.各种小知识点
- JS使用ajax异步处理json响应数据
- js中的this指代全局对象
- python中for循环的用法
- CentOS 7:关闭firewall安装iptables并配置