ceres可用于非线性运算,依赖库包含eigen, gflags, glog, suitesparse(optional but strongly recommended)
为什么要写这篇博客:主要是记录一下配置过程,以免以后需要换电脑再使用ceres时忘记配置过程。配置时,参考了几篇已有的博客并依靠了师兄的帮助,在一台全新的笔记本上配置,但还是没有成功,因此直接保证了其他环境相同,使用已经CMake后的库,配置环境变量后发现可以通过helloworld的测试。
感谢windows配置ceres的作者,虽然没能用上您的配置方法……
Visual Studio 2019
Windows 10
CMake 3.17.3 (latest version, 生成器中有VS2019 x64即可)
我没能全用上,但是如果想要从头cmake并配置时需要用的下载链接
Ceres 1.14.0
http://ceres-solver.org/installation.html
Eigen 3.3.7 source code
http://eigen.tuxfamily.org/index.php?title=Main_Page
gflags 2.2.2 source code
https://github.com/gflags/gflags/releases
glogs 0.4.0 source code
https://github.com/google/glog/releases
suitesparse metis for windows 1.4.0
https://github.com/jlblancoc/suitesparse-metis-for-windows/releases
https://download.csdn.net/download/qq_40613549/12546311
再次强调,真正用到的资源是CMake后的,因此对VS版本和系统都会有限制,对一些文件位置可能也有限制,所以请保证版本与文件位置一致再使用!
eigen是最简单的,并且后续要求其生成内容在C盘中存在,所有建议自行CMake。
CMake如图选择文件夹,源文件为下载的source code,bin文件夹为自行新建的eigen-build
点击configure,选择VS2019 x64,等待
配置选项中:
1.取消所有test选项
2.CMAKE_INSTALL_PREFIX改为C:/Program Files/Eigen3 (默认是Program Files (x86)文件夹,这个文件夹没有管理员权限是写不进去的)
再次点击configure
点击generate
以管理员身份运行VS2019(开始栏搜索vs,点打开选项下的箭头,选以管理员身份运行),分别在Release x64和Debug x64下生成INSTALL(或者选择“生成-批生成-选择Release x64和Debug x64的INSTALL-点击生成”)
生成全部成功则说明eigen库安装完成,检查C:/Program Files/Eigen3是否存在(文件夹内有include和share两个文件夹)
其他的库的安装过程我参考了前文的链接,但是始终没能成功,依赖库都成功install的情况下,在CMake ceres库时生成的解决方案,其中ceres项目的属性-链接器-输入-附加依赖项中一直没有自动添加suitesparse的相关lib,而且生成ALL_BUILD和INSTALL不成功。之后,就决定将另一台笔记本上相同环境配置的文件全部复制过来,测试helloworld成功。注意,这是没有办法才出此下策,建议先尝试参考前文链接从头配置。
下载这里的压缩包,其中包含了ceres和SDK两个压缩包,全部解压。
ceres压缩包中包含了各个库CMake后的二进制文件以及生成的项目,压缩包中的ceres-build文件夹是生成ceres库的文件夹,其中./bin/Release和./bin/Debug中的helloworld.exe可以用于测试。
SDK中包含:① 在CMake过程中生成的包含目录和库目录,就是CMake每一个库时CMAKE_INSTALL_PREFIX的路径对应的文件夹,② lapack_windows,这是suitesparse的源码文件夹中的一个,需要用到它的库目录。SDK中的文件需要用于后续环境变量配置、VS属性的包含目录、库目录、附加依赖项的配置。
SDK中的所有内容放在D:/SDK文件夹内(可能存在路径的依赖,所有强烈建议放在这里,未测试不放这一文件夹的情况)
其中,eigen_build就是刚才CMake eigen库生成的C盘的Eigen3文件夹(不是自己新建的build!)
环境变量中添加如下几条,即每个库生成的二进制文件夹和lapack_windows的x64
ceres压缩包中都是CMake时选择生成的二进制文件路径,其中的VS项目用于库的安装(生成INSTALL,或同时生成ALL_BUILD和INSTALL),后续好像没有其他用途,因此保存路径不限。
属性-VC++目录-包含目录,添加下列路径,即每个库的include文件夹以及eigen的include/eigen3文件夹
D:\SDK\suitesparse\include
D:\SDK\glog\include
D:\SDK\gflags\include
D:\SDK\eigen-build\include\eigen3
D:\SDK\eigen-build\include
D:\SDK\ceres_1.14.0\include
属性-VC++目录-库目录,添加下列路径,即每个库的lib文件夹以及lapack_windows的x64文件夹(工作平台需要保证是x64)
D:\SDK\lapack_windows\x64
D:\SDK\suitesparse\lib
D:\SDK\glog\lib
D:\SDK\gflags\lib
D:\SDK\ceres_1.14.0\lib
属性-链接器-输入-附加依赖项,添加下列文件
ceres.lib
glog.lib
gflags.lib
libspqr.lib
libcholmod.lib
libccolamd.lib
libcamd.lib
libcolamd.lib
libamd.lib
liblapack.lib
libblas.lib
suitesparseconfig.lib
metis.lib
1 打开cmd,分别运行压缩包中ceres/ceres-build/bin/Release和ceres/ceres-build/bin/Debug下的helloworld.exe,看到如下结果,显示convergence,说明配置成功
2 VS2019中新建一个工程,按上节中的方法配置,新建一个源文件放入如下代码(helloworld的源码),运行,看到和测试1中相同的结果,说明VS配置成功
#include
#include
using namespace std;
using namespace ceres;
//第一部分:构建代价函数
struct CostFunctor {
template <typename T>
bool operator()(const T* const x, T* residual) const {
residual[0] = T(10.0) - x[0];
return true;
}
};
//主函数
int main(int argc, char** argv) {
google::InitGoogleLogging(argv[0]);
// 寻优参数x的初始值,为5
double initial_x = 5.0;
double x = initial_x;
// 第二部分:构建寻优问题
Problem problem;
CostFunction* cost_function =
new AutoDiffCostFunction<CostFunctor, 1, 1>(new CostFunctor); //使用自动求导,将之前的代价函数结构体传入,第一个1是输出维度,即残差的维度,第二个1是输入维度,即待寻优参数x的维度。
problem.AddResidualBlock(cost_function, NULL, &x); //向问题中添加误差项,本问题比较简单,添加一个就行。
//第三部分: 配置并运行求解器
Solver::Options options;
options.linear_solver_type = ceres::DENSE_QR; //配置增量方程的解法
options.minimizer_progress_to_stdout = true;//输出到cout
Solver::Summary summary;//优化信息
Solve(options, &problem, &summary);//求解!!!
std::cout << summary.BriefReport() << "\n";//输出优化的简要信息
//最终结果
std::cout << "x : " << initial_x
<< " -> " << x << "\n";
return 0;
}
因为配置了很多天都不成功,才用了这样取巧的方法,也算是可以用。我对于CMake也没太多理解,遇到的问题还是不太清楚为什么(生成的Ceres.sln中ceres项目的附加依赖项没有应该出现的lib文件),如果有遇到相似问题并解决的大佬可以说说咋整。
再强调,所有文件CMake过,一定要保证其他环境相同才可能成功