在ubuntu 12.04环境下配置Motion Strategy Library(MSL)

    MSL是UIUC的Steve Lavalle等人用C++写的机器人运动规划仿真平台,其中给出了多种PRM算法和RRT算法的完整实现和仿真,是研究机器人运动规划的有力工具。UIUC最初提供的软件包是工作在redhat linux平台上的,后来国内的王伟博士成功将其移植到windows平台上。

    然而,毫无疑问的是,linux对于我的吸引力远胜于windows。基于本人所使用的ubuntu 12.04,我决定将编译安装MSL软件包的整个过程写下来,只为后来人能少走弯路,在运动规划的科研道路上走得更顺畅一点。

    首先,去http://msl.cs.uiuc.edu/msl/ 下载安装包。这里要注意,本人推荐下载经过牛津大学的Ian Baldwin升级的软件包。与UIUC原始的软件包相比,这个包的源码修正了很多bug。

    安装MSL,首先需要安装一些MSL所依赖的软件包或者库文件,下载MSL的页面上列出了这些包的清单:FOX、PQP以及OpenGL。这些包通常都是要亲自动手编译安装的,当然,你可以上新立得,但是我自己是分别从官网下载然后手动安装的。PQP及OpenGL的安装都比较简单,稍微复杂的FOX安装可参照我的另一篇文章http://blog.csdn.net/qtyl1988/article/details/7703648。

    解压软件包,得到目录msl-2.0.mod,进入该目录,先打开Makefile.config。看名字就知道,这是个用于编译的配置文件。你会发现如下的代码:

#FOXINC = @FOX_INC_F@
#FOXLIB = @FOX_LIB_F@ @PNG_LIB_F@ @JPEG_LIB_F@ -lFOX -ljpeg -lpng
FOXLIB = -lFOX -ljpeg -lpng
FOXFLAGS = -DTIME_WITH_SYS_TIME=1 -DHAVE_UNISTD_H=1 -DHAVE_DIRENT_H=1 -DHAVE_SYS_PARAM_H=1 -DHAVE_SYS_SELECT_H=1 -DHAVE_ZLIB_H=1 -DHAVE_JPEGLIB_H=1 -DHAVE_PNG_H=1 -DHAVE_OPENGL -DHAVE_JPEG

#########  PQP Configuration
#PQPINC = @INCPQP@
#PQPLIB = @LDPQP@ -lPQP
PQPLIB = -lPQP
PQPFLAGS =

######### X11 Configuration
XINC=-I
XLIB=-L -lX11 -lXmu -lXext -lXi

########   GL Configuration
#GLINC = @GL_INC_F@  @GLUT_INC_F@
#GLLIB = @GL_LIB_F@ @GLUT_LIB_F@ -lglut -lGLU -lGL 
GLLIB = -lglut -lGLU -lGL
GLFLAGS =

    其中给出了多个MSL必须依赖的库,包括libFOX、libjpeg、libpng、PQP碰撞检测包(可从http://gamma.cs.unc.edu/SSV/下载)libPQP、与xWindow相关的libX11、libXmu、libXext、libXi以及openGL的libglut等等。请确保以上所有库文件都在你的电脑里,不然在后面编译时你会遇到各种麻烦。

    也许有人会问,既然PQP和FOX都是自己动手编译安装的,那么他们的lib和include目录都在哪里呢?Good question! 在ubuntu 12.04下,FOX的include被安装在/usr/local/include下,而起lib则位于/usr/local/lib下。PQP则更加简单一些,你下载PQP软件包并解压,得到目录pqp-1.3,在这个目录里面有include目录和lib目录,编译PQP之后,lib目录下就自动生成了libPQP.a这一静态库文件。这里,为了和FOX保持一致,你最好在/usr/local/include下面建一个与fox-1.6目录平级的PQP目录,然后把解压的到的pqp-1.3目录下include目录里的文件全部复制到/usr/local/include/PQP,并将lib目录里的文件全部复制到/usr/local/lib。

    然后就是./configure了,看看会出现什么情况。。。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
I did not find fx.h
Download and compile FOX http://www.fox-toolkit.org
or tell me where is it with --with-fox-includes=DIR
------------------------------------------------------------
configure: error: Where is FOX?

    找不到FOX的include目录?没关系,用下面的命令告诉它!
./configure --with-fox-includes=/usr/local/include/fox-1.6

   运行之后,立刻提示
MSL is now (hopefully) configured correctly for compilation.
Now you can type:  make

    make一下,出现如下提示:
********** Making the MSL library and executables
cd src ; make all
make[1]: 正在进入目录 `/media/d/MyCourses/MotionPlanning/Simulation/msl-2.0.mod/src'
g++ -g -Wall -DTIME_WITH_SYS_TIME=1 -DHAVE_UNISTD_H=1 -DHAVE_DIRENT_H=1 -DHAVE_SYS_PARAM_H=1 -DHAVE_SYS_SELECT_H=1 -DHAVE_ZLIB_H=1 -DHAVE_JPEGLIB_H=1 -DHAVE_PNG_H=1 -DHAVE_OPENGL -DHAVE_JPEG  -c model.C  -I  -I../include
model.C:50:23: 致命错误: MSL/model.h:没有那个文件或目录
编译中断。
make[1]: *** [model.o] 错误 1
make[1]:正在离开目录 `/media/d/MyCourses/MotionPlanning/Simulation/msl-2.0.mod/src'
make: *** [all] 错误 2

    错误就是编译model.C的时候找不到MSL/model.h这个文件。然而,当你查看model.C源码的时候,会发现在文件的开头有如下代码:


#include "MSL/model.h"

    而且model.h文件就在msl-2.0.mod目录下的include/MSL目录中。这一令人费解的错误困扰了我好久好久。偶然间发现提示信息中g++那一行的最后一小段是这样的:-I -I../include。有没有感觉前面的那个-I是多余的?这正是问题所在,因为前面的那个-I直接把后面的-I../include屏蔽了。好吧,打开Makefile.config,看看此时的它变成了什么样子:
C++FLAGS = -g -Wall
LDFLAGS =
CPPFLAGS =  -I/usr/local/include/fox-1.6


######### FOX Configuration
#FOXINC = @FOX_INC_F@
#FOXLIB = @FOX_LIB_F@ @PNG_LIB_F@ @JPEG_LIB_F@ -lFOX -ljpeg -lpng
FOXLIB = -lFOX -ljpeg -lpng
FOXFLAGS = -DTIME_WITH_SYS_TIME=1 -DHAVE_UNISTD_H=1 -DHAVE_DIRENT_H=1 -DHAVE_SYS_PARAM_H=1 -DHAVE_SYS_SELECT_H=1 -DHAVE_ZLIB_H=1 -DHAVE_JPEGLIB_H=1 -DHAVE_PNG_H=1 -DHAVE_OPENGL -DHAVE_JPEG

#########  PQP Configuration
#PQPINC = @INCPQP@
#PQPLIB = @LDPQP@ -lPQP
PQPLIB = -lPQP
PQPFLAGS =

######### X11 Configuration
XINC=-I
XLIB=-L -lX11 -lXmu -lXext -lXi

    看看XINC后面那个猥琐的-I吧!请毅然绝然地删了它!继续make,出现以下提示:
********** Making the MSL library and executables
cd src ; make all
make[1]: 正在进入目录 `/media/d/MyCourses/MotionPlanning/Simulation/msl-2.0.mod/src'
g++ -g -Wall -DTIME_WITH_SYS_TIME=1 -DHAVE_UNISTD_H=1 -DHAVE_DIRENT_H=1 -DHAVE_SYS_PARAM_H=1 -DHAVE_SYS_SELECT_H=1 -DHAVE_ZLIB_H=1 -DHAVE_JPEGLIB_H=1 -DHAVE_PNG_H=1 -DHAVE_OPENGL -DHAVE_JPEG  -c model.C    -I../include
g++ -g -Wall -DTIME_WITH_SYS_TIME=1 -DHAVE_UNISTD_H=1 -DHAVE_DIRENT_H=1 -DHAVE_SYS_PARAM_H=1 -DHAVE_SYS_SELECT_H=1 -DHAVE_ZLIB_H=1 -DHAVE_JPEGLIB_H=1 -DHAVE_PNG_H=1 -DHAVE_OPENGL -DHAVE_JPEG  -c modelmisc.C    -I../include
modelmisc.C: 在构造函数‘ModelLinear::ModelLinear(std::string)’中:
modelmisc.C:138:3: 错误: ‘exit’在此作用域中尚未声明
modelmisc.C:139:3: 错误: ‘exit’在此作用域中尚未声明
make[1]: *** [modelmisc.o] 错误 1
make[1]:正在离开目录 `/media/d/MyCourses/MotionPlanning/Simulation/msl-2.0.mod/src'
make: *** [all] 错误 2

    好吧,竟然是exit未声明。难道UIUC的教授写出来的代码应该是这样的吗?我们只好为这些文件一个一个地加上#include<cstdlib>。这里也有可取巧之处。因为即时你在modelmisc.C包含了cstdlib,再make,又会发现错误提示说在model2d.C中也没法用exit。这时,发现这两个c文件都包含了同意个头文件:#include "MSL/defs.h",于是我们直接在defs.h文件中包含cstdlib即可。之后再make,又出现如下错误:

In file included from geomPQP.C:52:0:
../include/MSL/geomPQP.h:57:17: 致命错误: PQP.h:没有那个文件或目录
编译中断。
make[1]: *** [geomPQP.o] 错误 1
make[1]:正在离开目录 `/media/d/MyCourses/MotionPlanning/Simulation/msl-2.0.mod/src'
make: *** [all] 错误 2

    打开geomPQP.C,发现包含了geomPQP.h,然后再打开geomPQP.h,发现如下代码:
#ifndef MSL_GEOMPQP_H
#define MSL_GEOMPQP_H

#undef max
#undef min

#include <list>
#include <vector>

//#include "../../configs/configPQP.h"
#include <PQP.h>

#include <cstdlib>
#include <cstdio>

#include <string.h>

#include "defs.h"
#include "geom.h"
#include "point.h"  // This includes the MSLPolygon class
#include "triangle.h"

    再打开configs目录下的configPQP.h看看:
#define PQP_H_IN_PQP_DIR
#ifdef PQP_H_IN_PQP_DIR
#include <PQP/PQP.h>
#else
#include <PQP.h>
#endif

    这下应该明白了,找不到PQP.h的原因是,PQP.h位于/usr/local/include/PQP目录下,因而在geomPQP.h中直接写成#include <PQP.h>是找不到,正确的写法应该是#include <PQP/PQP.h>。我们可以选择将geomPQP.h中的#include <PQP.h>一行注释掉,而把它上面那一行代码,即#include "../../configs/configPQP.h"恢复。之后再make,又发现出现exit在此作用域中尚未声明的提示,同样用取巧的办法,在mslio.h中包含cstdlib。再make,出现一下错误:
In file included from ../include/MSL/gui.h:52:0,
                 from gui.C:51:
../include/MSL/../../configs/configFOX.h:7:16: 致命错误: fx.h:没有那个文件或目录

    那就打开configFOX.h看看:
#define FOX_H_IN_INC_DIR
#ifdef FOX_H_IN_FOX_DIR
#include <fox/fx.h>
#else
#include <fx.h>
#endif

    这提示我们首先去把/usr/local/include/fox-1.6做一个重命名:/usr/local/include/fox,然后为了让Makefile.config保持与实际情况一致,重新./configure一下,然后make。这时候你又需要去Makefile.config里删除-I了。继续make:
In file included from guiplanner.C:47:0:
../include/MSL/guiplanner.h:56:16: 致命错误: fx.h:没有那个文件或目录

    去把guiplanner.h里面的#include <fx.h>注释掉,并恢复它下面的那一行,即#include "../../configs/configFOX.h",继续make,出现如下错误:
g++ -g -Wall  -c renderglobj.C    -I../include
renderglobj.C: 在成员函数‘int mslGLObject::ReadModelFile(const string&, const string&)’中:
renderglobj.C:975:41: 错误: ‘strchr’在此作用域中尚未声明
renderglobj.C:982:60: 错误: ‘strlen’在此作用域中尚未声明
renderglobj.C:1079:38: 错误: ‘strchr’在此作用域中尚未声明
renderglobj.C:1083:52: 错误: ‘strchr’在此作用域中尚未声明
renderglobj.C: 在成员函数‘void mslGLObject::LoadMaterialFile(const string&, const string&)’中:
renderglobj.C:1397:51: 错误: ‘strcmp’在此作用域中尚未声明
renderglobj.C:1422:41: 错误: ‘strchr’在此作用域中尚未声明
renderglobj.C:1423:54: 错误: ‘strlen’在此作用域中尚未声明
renderglobj.C:1507:35: 错误: ‘strcpy’在此作用域中尚未声明
renderglobj.C: 在成员函数‘int mslGLObject::SetCurrentMaterialID(char*)’中:
renderglobj.C:1561:48: 错误: ‘strcmp’在此作用域中尚未声明
renderglobj.C: 在成员函数‘void mslGLObject::ParseTexture(char*, mslGLMaterial*)’中:
renderglobj.C:1646:34: 错误: ‘strcmp’在此作用域中尚未声明

    很明显,renderglobj.C需要一个string.h。加上之后再make,发现找不到libXmu和libXi,去新立得把这些库的dev安装上就是了。

    恭喜你!走到这里,基本上就大功告成了!可能有的电脑还会提示错误,常见的就是一些以Xft开头的函数找不到定义,这时,你应该把-lXtf加入到Makefile.config中再make,之后就应该没什么问题了。

    Enjoy your MSL!

你可能感兴趣的:(在ubuntu 12.04环境下配置Motion Strategy Library(MSL))