流下没技术的眼泪之gazebo actor collision解决过程

      近期在搞深度强化学习,是让机器人在人群中导航的.众所周知,强化学习非常依赖仿真环境,由于是机器人,所以用的是ROS,顺带着就是用gazebo来搭建训练环境了.实际上,用gazebo仿真坑特别多...,但没办法,自己找到的行人仿真模拟器就那么几个,本来是想用无人驾驶的那些模拟器来做的,但发现和ROS的机器人模型兼容不是很好,有几个是能和ROS通讯,但就是不能直接把机器人模型加载进去,而且都是室外的,自己还得费一般功夫建个室内.

      但gazebo确实也不是很好,对行人的仿真太粗糙了...,真的是权衡许久才选它.后面还是要花点功夫研究如何把机器人加载进Carla、AirSim.毕竟网络还是需要输入视觉特征的.

      选了gazebo就开搞了,不得不说,gazebo和ROS就像亲兄弟一样好,蹭蹭蹭就把仿真环境里的机器人跑起来了.不过发现一个问题,怎么模拟一群人在走路,在github上找了港科大的邰磊师兄的用了social force 项目.catkin build 跑起来后,一群假人走得像模像样的.但事情怎么可能会这么顺利呢! GG,雷达探测不到行人,而且行人就像空气一样,可以穿墙,如同幽灵,这还搞毛...

      赶紧Google,发现是gazebo的actor是没有collision属性的,得自己写插件,一听要自己写,暗的一惊.. 好在自己遇到的,别人也都遇到过了,而且还大部分都解决了.自己在gazebo源码社区找到了几个答案.一开始以为很简单,结果其实是巨坑的开始而已...

      自己一直用的是ROS自带的Gazebo7,邰磊师兄的代码得是8的,而那些插件是在9里面写的(后来才知道7,8都可以).而且,为了能编译这些插件,还的用源码安装gazebo,所以自己只好把刚装好的gazebo8卸载了,下载gazebo9的源码来编译安装.

      这里需要注意的是gazebo源码有好多个分支,所以得下载个包含了行人碰撞插件的分支.下载好后,按官方的教程安装,得先装好几个依赖,也是源码...特别费事,虽然都有教程.需要注意依赖的版本要和gazebo9对应.

      巨坑的在于对libtiff4.0的依赖(对‘TIFFSetDirectory@LIBTIFF_4.0’未定义的引用),这真是烦...自己搜了好久,别人都是在安装opencv时出现的问题,但人家只需要在cmake时把libtiff的依赖关掉就可以了,或者源码安装(源码上传了)而gazebo编译时没有提供这个选项,无奈,自己只要一步一步来,一开始,万般尝试安装libtiff4,可惜一直不行,因为Ubuntu16已经摒弃了libtiff4.0,只有5的.自己找到了libtiff4.0的源,把他添加进去,终于可以提供apt-get install安装了,结果安装成功后还是提示对libtiff4.0未定义的引用.真是坑爹.自己源码安装libtiff4也不行,编译一直失败....

       自己于是看看是谁引用了libtiff,然后源码安装它,并且是选一个不引用libtiff4.0的版本.自己之所以这么想是因为gazebo没人出现我这个问题,说明是可以去掉对libtiff4.0的依赖的.自己的电脑上是poppler出现了对libtiff的引用,OK,下载poppler源码.

       这时又出现新的问题,源码编译出来的链接库版本和源码版本不对应,这导致我无法确定到底是哪个版本才能编译出来自己Google了也没找到答案...无奈,只好一个个尝试呗.但这TM如同瞎搞,而且源码版本和链接库版本的对应关系还是没有规律的...自己试了5遍才试出来,那时真是悲喜交加.其实试出来的时候,自己还是隐约有种担心的,就是其它引用到poppler的是否能接受新安装的这个版本,到时是不是又会因为版本问题产生关于poppler的未定义引用...

       幸好,这样多米诺的效应没有发生,gazebo9最后终于编译通过了,看着那个绿色的100%,内心真是万般感慨啊,自己真是太菜了,解决问题一点严格的有效的思路都没有,都TM 是瞎试...

       弄完了赶紧试一下,进到作者的plugin源码里make 编译,这时自己才突然想到,我好像就不需要重新源码编译安装gazebo的...直接下载plugin的源码编译生成***.so不就得了嘛....太SB了啊啊啊...(自己把插件源码打包上传了)

        算了,还是继续测试,gazebo test.world加载作者的world,发现没用???行人依然还是会穿墙??? 那时真是万念俱灰,合着搞这么多全白费了?? 自己忽然想到之前看到的一个教写gazebo 插件的,看了一下,因为怀疑gazebo没有加载这个插件,所以在刚才的plugin源码类的析构函数里加了一句打印F****k的,再次编译,gazebo test.world GG结果还是一样没有看见熟悉的F****k.... 继续看博客,原来是自己没有告诉gazebo插件的.so文件在那,export刚刚生成的.so到gazebo的路径,Duang,看到F****k,就知道这次终于成了.Oh yeah!!! 行人确实会与球发生碰撞了.

(有看到这些橘黄色的矩形体就说明加载了插件)

       最后,顺带说一个关于gazebo里面雷达穿墙的问题,就是因为机器人加载的雷达插件是gpu_ray.so的,但你的显卡可能不工作(比如驱动不对,或者是在虚拟机) 输入nvidia-smi就知道了,所以这时候就得换回cpu版的so,

从 <sensor type="gpu_ray"

<plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_gpu_laser.so">

改为 

<sensor type="ray"
<plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_laser.so">

 

      不过CPU版本的雷达无法检测到行人,所以得换回GPU版的雷达.

 

引用:

https://bitbucket.org/osrf/gazebo/pull-requests/2875/example-plugin-that-enables-collisions/diff#chg-gazebo/physics/Actor.cc(actor 插件)

http://gazebosim.org/tutorials?tut=ros_gzplugins(gazebo laser知识)

https://poppler.freedesktop.org/releases.html(poppler 源码)      

https://blog.csdn.net/u011361393/article/details/83210824(对‘TIFFReadDirectory@LIBTIFF_4.0’未定义的引用)

https://www.bbsmax.com/A/o75NrbwW5W/(对‘TIFFReadDirectory@LIBTIFF_4.0’未定义的引用-------------- 解决办法)

https://github.com/onlytailei/gym_ped_sim(邰磊师兄项目)

https://bitbucket.org/osrf/gazebo/pull-requests/2875/example-plugin-that-enables-collisions/diff(碰撞插件)

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值