当前位置:   article > 正文

Ubuntu 20.04 安装运行clins踩坑实录_error: 鈥榗lass std::unordered_map

error: 鈥榗lass std::unordered_map >

1、介绍

这里主要记录了我在编译运行一个SLAM开源包的历程。
CLINS是浙大的一个激光雷达和imu耦合定位的开源之作。
论文:《CLINS: Continuous-Time Trajectory Estimation for LiDAR-Inertial System》
作者:Jiajun Lv1, Kewei Hu1, Jinhong Xu, Yong Liu, Xiushui Ma, Xingxing Zuo
项目:https://github.com/APRIL-ZJU/clins

2、论文阅读

这里先不作解读,暂且放一个泡泡机器人写的推文《CLINS: 基于激光-惯性系统的连续时间轨迹估计》

3、安装运行

3.1、环境配置

Ubuntu版本:20.04
Ros版本:noetic
依赖库:按照作者在使用说明里写的,需要依赖三个库,Sophus (Required by basalt-headers)、Ceres、yaml-cpp,但是实际运行还需要一个库,fmt,这也是安装Sophus所必需的库。

3.2、依赖安装

3.2.1、fmt安装

在安装sophus之前,需要安装这个库,注意,不能去github上下载,得去它的官网下载压缩包
我下载的是8.1.1,然后编译安装

cd fmt-8.1.1/
mkdir build && cd build/
cmake ..
make
sudo make install
  • 1
  • 2
  • 3
  • 4
  • 5

3.2.2、Sophus安装

这里需要使用作者提供的链接去下载对应的版本:

https://github.com/NikolausDemmel/Sophus/tree/eaf1e404992675a42892fa648d69d5bd933ff219
  • 1

下载完成后,编译安装

cd sophus/
mkdir build && cd build/
cmake ..
make
sudo make install
  • 1
  • 2
  • 3
  • 4
  • 5

3.2.3、Ceres和yaml-cpp安装

这两个我就不细说了,一般来说问题不大,网上的安装教程也很多。

3.3、clins安装

创建工作空间,把代码包下载到工作空间的/src文件夹下,然后编译

git clone https://github.com/APRIL-ZJU/clins.git
catkin_make
  • 1
  • 2

这一编译,问题它就来了。

3.3.1、警告1:XXX is deprecated: use XXX instead of XXX

比如,/src/feature/feature_extraction.cpp文件中的ProjectPointCloud函数报错如下:

warning: if (!pcl_isfinite(p.x) || !pcl_isfinite(p.y) || !pcl_isfinite(p.z)) is deprecated: use std::isfinite instead of pcl_isfinite
  • 1

解决方案:把 pcl_isfinite 换成 std::isfinite ,这虽然不影响运行,但是看着这一大串,令人烦躁。代码里还有很多都是这个警告,找到对应的地方,按照它的提示,改掉就行。

3.3.2、警告2:undefined reference to `fmt::v8::detail::error_handler::on_error(char const*。。。

这里是因为没有添加fmt的依赖,未链接到库,网上也有很多解决方案。
解决方案:在CMakeLists.txt添加以下内容,使得程序可以链接到fmt的动态链接文件,

find_package(FMT REQUIRED)
target_link_libraries(your_program_name fmt::fmt)
  • 1
  • 2

我的具体做法是:

// 在kaist_sick_map_generation节点添加
target_link_libraries(kaist_sick_map_generation fmt::fmt)

// 在clins_offline_node节点添加
target_link_libraries(clins_offline_node fmt::fmt)
  • 1
  • 2
  • 3
  • 4
  • 5

其实,我觉得可以直接在上面那个寻找包的地方加上去,就不用手动链接了,这样的话,记得在 CMakeLists.txtpackage.xml 里面都要修改。

3.3.3、错误1:/usr/include/flann/util/serialization.h:37:14: error: ‘class std::unordered_map <unsigned int, std::vector >’ has no member named ‘serialize’。。

这个报错就很难受了,啥意思???要我去修改数学库的文件嘛,这不是为难我小猪佩奇嘛。算了,百度吧。
哟呵,真找到了。说是flann和openCV的库相冲突,解决方法是:include flann before OpenCV
这话就让我这个小菜鸡给整不会了,我把所有文件都翻了一遍,就光找到其中一个文件里面有个头文件写着OpenCV,这咋整,就把这个头文件放在最后呗。运行,继续报同样的错。QAQ,要哭了,仔细看编译的日志,发现了华点:

In file included from /usr/include/flann/util/matrix.h:35,
                 from /usr/include/flann/flann.hpp:36,
                 from /usr/include/pcl-1.10/pcl/kdtree/impl/kdtree_flann.hpp:42,
                 from /home/xxx/catkin_ws/src/clins/include/trajectory/trajectory_manager.hpp:33,
                 from /home/xxx/catkin_ws/src/clins/include/odometry/lidar_odometry.hpp:28,
                 from /home/xxx/catkin_ws/src/clins/include/odometry/odometry_helper.hpp:43,
                 from /home/xxx/catkin_ws/src/clins/src/node/clins_offline_node.cpp:25:
								/usr/include/flann/util/serialization.h:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

我觉得这意思,是不是说,第一二两个都包含了flann,然后其它的又包含了它,所以等同于后面这些文件都包含了flann,立即推,把他们一个个都拿到头文件包含的顶端。于是乎,不报错了,开心撒花。但是事情肯定没有那么简单。

3.4、clins运行

运行的时候,果不其然,又报错了。。。。。

3.4.1、运行它的数据

报错如下:

trying to publish <msg_Pointcloud2>....
  • 1

节点运行了,路径信息也能接收得到,查看点云话题,发布了,但是吧,Rviz上没有点云显示,订阅点云地图的两个地方却报错,

can not tansform from map to /map
  • 1

查看发布话题的源文件 trajectory_viewer.hpp 发现上面的很多话题名称都是写的 /map,但同时固定的坐标名又是map,多个斜杠,大不相同。
解决方案:把该文件里的/map的斜杠都去掉。
再次编译运行,可以显示点云了。

3.4.1、运行自己的数据

采集的雷达:ouster的 os-128,内置了六轴imu
话题名称:os_cloud_node/points, os_cloud_node/imu
运行报错如下:

Sophus ensure failed in function 'void Sophus::SO3Base<Derived>::normalize() [with Derived = Sophus::SO3<double>]', file '/usr/local/include/sophus/so3.hpp', line 303.
Quaternion (0 0 0 0) should not be close to zero!
  • 1
  • 2

尚不清楚什么原因,未解决。。。。期待有大佬能指点我一二。

3.4.2、(2022年5月30)更新

clins代码需要的数据,跟LIO-SAM要求一致,激光雷达+九轴IMU,六轴的无法运行,这也是为什么上面我用Ouster的内置IMU无法运行。
因为Ouster雷达所得到的点云格式中,有ring这个参数,所以这个不需要手动计算,按理若是其他雷达,没有这个参数的话,可以利用Lego-loam的计算方法,给它安排上,具体操作我没试过,个位大佬自行验证;time参数的话,Ouster雷达有个t参数,应该对应的就是Velodyne的time,于是乎,我屁颠屁颠地去下载了LIO-SAM提供的数据集中的rooftop.bag来验证我的想法,好家伙,果然没让我失望,报错了!然后辗转多个博客,最后发现,LIO-SAM给了对应关系来着,(裂开.jpg)。

dst.time = src.t * 1e-9f;
  • 1

也就是说,把这个值出现的地方,都乘以这个系数。
改了之后,果然就好了,效果的话,,,,,emmmmm,感觉没有LIO-SAM好,可能是还有一些参数需要修改,就不放图了。
加油~

3.5、总结

以上就是我安装、运行CLINS的踩坑过程,给自己做个记录,也希望能帮到其他的人。
本帖仅证明在我所说的环境下可以运行这个算法包,其它版本系统是否可行,尚不清楚,欢迎留言讨论!
最后,感谢大佬的开源,送上小花花

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/465695
推荐阅读
相关标签