Amy-Tabb机器人世界手眼标定(4、Windows)
目录
导师要求在windows下运行。最大的难题其实是ceres solver。即Ceres这个迭代器的编译。
参考官网:Ceres Solver — A Large Scale Non-linear Optimization Library
Ceres Solver 1是一个开源 C++ 库,用于建模和解决大型、复杂的优化问题。它可用于解决具有边界约束和一般无约束优化问题的非线性最小二乘问题。它是一个成熟、功能丰富且性能卓越的库,自 2010 年以来一直在 Google 的生产环境中使用。
官网中有两种办法

①:用vcpkg GitHub - microsoft/vcpkg: C++ Library Manager for Windows, Linux, and MacOS来安装ceres库(vcpkg有点像pip)
②:源码构建 但是需要VS2019以上版本的编译器
---------------------------------------------------------------------------------------------------------------------------------
选用第一种办法,根据readme成功搞定vcpkg,然后
vcpkg install ceres:x64-windows
git pull的时候报错
参考网上解决办法:解除ssl验证后,再次git
git config --global http.sslVerify "false"
fatal: unable to access 'https://github.com/microsoft/vcpkg/': Failed to connect to github.com port 443 after 21078 ms: Timed out
网上兜了一圈也不知道哪里错了。。
可能是我的vs2015不配用vcpkg?
无奈卸载VS所有内容,然后重新安装下VS2022
Ubuntu系统下的各版本
记录一下跑通的时候各个版本是什么:opencv4.0.0、Eigen3.3.4、Ceres2.1.0
作者的版本
OpenCV 4.0、Ceres1.14、Eigen3.3.4,cmake版本无所谓
按照作者版本

发现cmake被我卸载了。。
cmake的安装参考https://www.jb51.net/article/238636.htm
准备工作:
新建一个文件夹Ceres,用来放各种依赖库。
Ceres大文件夹里再创建几个小文件夹,分别是glog、gflag、Eigen3、SuiteSparse
至于Ceres官网说的CXSparse,在windows下不能使用,不友好,因此先暂时不用了,只是可选内容,而且实际上SuiteSparse文件夹里也有个叫CXSparse的(虽然不知道他们俩有啥关系)
编译过程总的来说参考5、gflag
编译顺序为 gflags -> glog -> ceres,eigen 在 ceres 编译之前任意时候编译均可,那么先编译 eigen 库好了
1、SuiteSparse
把SuiteSparse编译一下。Readme写的很清楚!
先打开cmake-gui
在suitesparse解压后的文件夹里面新建build文件夹作为编译后放的目录
同样地,新建install文件夹作为CMAKE_INSTALL_PREFIX的路径
CMAKE_INSTALL_PREFIX:这个路径是install后生成的头文件和库文件存放的路径,这里我们在源码同级目录下创建一个文件夹,命名为install。

cmake configure后打开项目

选择INSTALL,在Release和Debug下都生成INSTALL。
Eigen+suitesparse for windows 安装_xiamentingtao的博客-CSDN博客_suitesparse安装
2、Eigen3
虽然官网说什么不需要安装,但是我还是用cmake进行编译。同样的办法尝试。生成Release和Debug的INSTALL。
Windows下cmake编译Eigen3.3.4_YY3Y的博客-CSDN博客_cmake eigen3 windows
具体参考这篇文章
这里在eigen-3.3.4解压后文件夹里新建build文件夹来作为cmake的build目录。

编译一次报错后修改一些设置,这里比较坑的是eigen文件夹里本来就有个叫INSTALL的文件,导致没法建文件夹install。因此我这建了Eigen3_install,用来当CMAKE_INSTALL_PREFIX的路径。
继续Configure直到没问题后Generate,open project
分别生成debug和release版本下的INSTALL
3、Gflag
因为考虑到glog编译的时候有一个With_Gflag,那我们先安装Gflag。
这里有个坑就是gflag文件夹里有个叫BUILD的文件。。。不能生成build文件夹,所以改下名字吧。。跟前面的格式不一样,自己记着点。


修改下PREFIX然后注意勾选build_shared_libs然后Generate,open project。
还有一点不同就是用Visual Studio 2022打开的时候ALL_BUILD和INSTALL全都要生成一下(为啥我也不知道)
4、glog
老规矩,生成build和install文件夹
打开cmake-gui
第一遍configure后

关键俩个参数
①是BUILD_SHARED_LIBS,这个选项我们要勾上,因为我们需要动态库。
②是CMAKE_INSTALL_PREFIX,这个路径是install后生成的头文件和库文件存放的路径,这里我们在源码同级目录下创建一个文件夹,命名为install。
此外,build_testing取消勾选
最后按照下图这样配置

之后分别点击Configure和Generate,生成完成后没有红色选项
也是对ALL_BUILD和INSTALL都生成一下。
6、Ceres编译
准备工作完成,重头戏开始!
网上下载了ceres1.14.0
GitHub - ceres-solver/ceres-solver at 1.14.0
这里还是有个坑的BUILD文件。
于是还是新建ceres_build
配置一条条改

一条条改
①、BUILD_SHARED_LIBS勾选
②、BUILD_TESTING取消
③、BUILD_EXAMPLE取消
④、参照gflags_DIR默认设置把glog_DIR添加上
⑤、GLOG_INCLUDE_DIR添加为D:\ceres\glog-master\src\windows
⑥、CXSparse勾选,目录选suitesparse里的同名文件夹
⑦、XX_LIBRARY没找到的话去对应install/lib里面找。加d的是debug版本 我这里统一用的release版本
⑧:Eigen3_DIR改成D:/Ceres/Eigen3/eigen-3.3.4/build
⑨:EIGNE_INCLUDE_DIR改为D:/Ceres/Eigen3/eigen-3.3.4/Eigen3_install/include
我这里configure完成后

报错1:
Failed to find Eigen - Could not find file:
D:/Ceres/include/eigen3/Eigen/src/Core/util/Macros.h containing version
information in Eigen install located at: D:/Ceres/include/eigen3.
这里很坑的是EIGEN_INCLUDE_DIR无法修改,只能把把eigen3里面文件夹复制下去,参考报错完成他的搜索。
然后又报错
glog_DIR not find。
这个简单 修改成D:/Ceres/glog/glog-master/build
生成完ALL_BUILD和INSTALL的Release和Debug版本了。
分别对SuiteSparse的include_dir和library做修改。
include在对应的install/include文件夹
library选择
D:/Ceres/SuiteSparse/suitesparse-metis-for-windows-master/install/lib/suitesparseconfig.lib
因为这里是release版本
7、工程搭配目录

可以看到工程首先没有include那些东西
windows下编译、配置ceres库(保姆级教程)_江湖 路人的博客-CSDN博客_ceres 库
参考这个文章搞定了。缺什么就include什么
然后弹出缺少源文件“dirent.h”
dirent.h是一个能够遍历文件和目录的API,通常unix系统会提供这个文件,但是VS缺少这个API。需要自己安装一下这个文件
解决方法:
1、Visual studio 2019 报错没有“dirent.h”文件_zyrant丶的博客-CSDN博客
2、将dirent.h文件放入Microsoft Visual Studio的include文件夹内,如:

完成后,编译报错
问题1:
错误 C1189 #error: ERROR macro is defined. Define GLOG_NO_ABBREVIATED_SEVERITIES before including logging.h. See the document for detail. testHelloworld E:\3Dparty\Ceres\3DpartyLib\Ceres\Include\glog\log_severity.h 66
解决方案
预处理器中增加宏定义:GLOG_NO_ABBREVIATED_SEVERITIES
---------------------------------------------------------------------------------------------------------------------------------
几个注意的点:
1、Solve函数用ceres/solver.h文件里的函数,不要用eigen里的同名函数
2、dirent.h去github里面找,然后随便放在任意包含库的路径下。
3、选择新建项目,把cpp后缀的放在源文件里,hpp后缀放在头文件里,然后进行编译
4、编译项目前看下Cmakelist.txt(这个项目其实CostFunction1_2.cpp和CostFunction1_2.hpp是没用的,不需要加到项目里去。)
5、编译没有bug,能生成.exe文件。但是debug或者运行的时候发现报错:没有XXXXX.dll或者应用程序运行错误 0x0000007什么的:说明动态库有问题,看下是哪个动态库,如果缺少的话百度一下,如果是系统的动态库那就网上下载,如果是前面说的比如suitesparse里的动态库,不要去网上下,去github下载源码自己编译然后把生成的.dll文件放在包含目录下(一般放在C:windows/sys32文件夹或者工程生成的.exe同级文件夹里就行)
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)