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 =
也许有人会问,既然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?
./configure --with-fox-includes=/usr/local/include/fox-1.6
MSL is now (hopefully) configured correctly for compilation.
Now you can type: 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
#include "MSL/model.h"
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
********** 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
#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"
#define PQP_H_IN_PQP_DIR
#ifdef PQP_H_IN_PQP_DIR
#include <PQP/PQP.h>
#else
#include <PQP.h>
#endif
In file included from ../include/MSL/gui.h:52:0,
from gui.C:51:
../include/MSL/../../configs/configFOX.h:7:16: 致命错误: fx.h:没有那个文件或目录
#define FOX_H_IN_INC_DIR
#ifdef FOX_H_IN_FOX_DIR
#include <fox/fx.h>
#else
#include <fx.h>
#endif
In file included from guiplanner.C:47:0:
../include/MSL/guiplanner.h:56:16: 致命错误: fx.h:没有那个文件或目录
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’在此作用域中尚未声明
恭喜你!走到这里,基本上就大功告成了!可能有的电脑还会提示错误,常见的就是一些以Xft开头的函数找不到定义,这时,你应该把-lXtf加入到Makefile.config中再make,之后就应该没什么问题了。
Enjoy your MSL!