目录
9.找不到/usr/lib/x86_64-linux-gnu/libopencv_calib3d.so.4.2.0
10.关于找不到libopencv_xxx_.so.4.2.0(或者.4.2)
一、编译篇
按官方github步骤安装(GitHub - AutonomousFieldRoboticsLab/SVIn: Underwater Navigation with tightly coupled fusion of Visual Inertial Sonar and Depth Information,有个老版本的svin2不维护了,编译那个会遇到很多编译问题,后来看见人家的声明了,去用了在维护的版本),安装过程仍出现以下问题:
1.ceres版本问题报错
按官方github操作,安装1.14即可
2.opencv版本问题,我这里是4.2
看报错,程序作者应该是用的4.5.5
安装opencv4.5.5,并切换版本,参考:Ubuntu下多版本OpenCV共存和切换_ubuntu 多个opencv版本-CSDN博客
按这个操作完之后还是报错,我索性把原来的4.2卸载了,安装4.5.5,安装教程参考了这个里面安装opencv那部分:
ubuntu 20.04+ORB_SLAM3 安装并行全记录(无坑版)(一)_ubuntu20 orbslam3-CSDN博客
安装完opencv4.5.5之前安装的其他需要opencv的软件也需要重新编译(作者编译以前编译过的其他软件的时候咔咔报错,一朝回到解放前的感觉)
好,先不管以前的软件了,我先把svin安好:
重新编译svin,好,不报之前那个错了,报新错:
这里应该是原程序默认我们把opencv安装在/usr/include/opencv4下,但是实际opencv默认安装在/usr/local/include/opencv4下,加一个软连接:
sudo ln -s /usr/local/include/opencv4 /usr/include/opencv4
好的,opencv问题到这应该是解决了(这块真裂开了,之后学学用docker吧,好像是说可以解决各种版本不兼容问题)
3.ceres报错:
给我整迷糊了,官方不是自己要让装1.14吗?
行吧,我再装回来,这里博主之前装的是2.2,直接在原来2.2的build下重新编译一套就能覆盖老版本(因为都是用的默认安装路径):
cmake ..
make
sudo make install
好了,解决,我们来看新的报错:)
4.cuda报错
这个应该是安装完显卡,环境没有配好的问题,之前在catkin_ws里配置code_utils的时候就遇到过类似的,找不到cuda相关库,我库库整了好几天也没调好,就逃课了,还是逃不过。
看了一下cuda版本
我之前安装zed相机sdk时被默认安装过12.1,这里NVIDIA smi显示要求12.4(可能是这个意思吧),怀疑可能是cuda版本太老了,下一个12.4试试
然后跟着这个配置了一下环境:
我再catkin make一下,可以了!不知道具体是cuda版本不对还是我当时在bashrc里的路径配置的不对,反正跟着佬整了一遍不报错了doge
好了,我们来看新报错:
5.getCallbackQueue函数报错
好像是声呐驱动的问题,之前按官网git clone会报错:
就自己去这个github地址下载了一个,可能是下错版本了还是咋的,我按他的来试试。
gpt了一下,说是:如果您没有该仓库的访问权限,或者您使用的是错误的SSH密钥,您就会遇到这个错误。此外,如果仓库是公开的,您应该使用HTTPS URL来克隆,而不是SSH URL。
指令改成:(后来发现这样下载的是错误版本。。。。)
git clone https://github.com/AutonomousFieldRoboticsLab/sonar_rviz_plugin.git
git clone成功
我再试一下,记得先catkin_make clean,
然后再重新catkin_make
好,同样的报错,不是这个问题,仔细看看,rviz的问题,怀疑安装新opencv后得重新装ros,我试试小乌龟,果然,失败了,好,我重新安装ros,要了老命,参考:
详细介绍如何在ubuntu20.04中安装ROS系统,超快完成安装(最新版教程)_ubuntu安装ros-CSDN博客
后面我的zed-ros和驱动啥的也得重新安装,沃日了,换opencv之后太麻烦了,很多软件都得重装,所以我准备去学学那个docker,这种重装opencv的方法太窒息了。
好了,ros安装完了,我试试,报新错了找不到tf2,跟着github再走一遍
sudo apt install ros-noetic-tf2-sensor-msgs
解决,下一个报错:
6.怎么又是cuda那个,绝了
在okvis_ros的cmakelist里加上find_package(CUDA REQUIRED),不报错了,又来这个:
getcallbackqueue()
问了问同学,发现是我下载错版本了,记得切换版本(别gitclone,去github手动下载,左上角调整版本,默认下载的是main版,我的Ubuntu是20.04,所以手动改成noetic版)
解决,来看下一个报错:
7.还是cuda的/usr/bin/ld: cannot find -lCUDA::cublas
/usr/bin/ld: cannot find -lCUDA::cudart
/usr/bin/ld: cannot find -lCUDA::cusolver
/usr/bin/ld: cannot find -lCUDA::cusparse
(1)参考其他博主,加软连接试试:
sudo ln -s /usr/local/cuda-12.4/lib64/libcublas.so /usr/lib/libcublas.so
sudo ln -s /usr/local/cuda-12.4/lib64/libcudart.so /usr/lib/libcudart.so
sudo ln -s /usr/local/cuda-12.4/lib64/libcusolver.so /usr/lib/libcusolver.so
sudo ln -s /usr/local/cuda-12.4/lib64/libcusparse.so /usr/lib/libcusparse.so
不行,还是报错
(2)设置一下路径然后更新一下:
在 .bashrc 添加:
export LIBRARY_PATH=/usr/local/cuda/lib64:$LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
还是不行
(3)安装新的cmake
考虑到cuda库里有libcublas.so这类文件但是没有CUDA::cublas这个形式的,查了查,结合gpt以及有的博主说肯可能是cmake版本过低,我查了一下我的是3.16,抱着试试的心态,我更新了camke到3.27,参考:
ubuntu重新安装cmake(没有bootstrap文件)_ubuntu找不到bootstrap.sh-CSDN博客
注意,装完新的cmake后,你之前所有用cmake安装的软件(包括opencv、ros、ceres等)都需要重新安装一遍,特别注意,由于catkin是基于cmake的,所以你更新cmake后,你之前catkin_make过的工作区要想使用新的cmake版本,需要删掉这个workspace重新构建并catkin_make,否则还是用之前的cmake标准
编译
cuda问题解决,卡在这好久了,果然就是cmake版本太老了!(虽然又有新报错了。。。。):
8.ceres
额,好像是ceres版本问题,我再切回1.14。。。。又仰卧起坐
好了,这个也解决了,好的,新报错:(我已经麻了,对新的报错表示peace)
9.找不到/usr/lib/x86_64-linux-gnu/libopencv_calib3d.so.4.2.0
参考这个老哥:OpenCV4踩坑总结_error: /usr/local/lib/libopencv*: no such file or -CSDN博客
说是ros的cv_bridge链接的库默认是这个路径,但可能我的opencv之前卸载重新安装过,不在那里
改到对应目录下:
sudo chmod 755 cv_bridgeConfig.cmake
sudo gedit cv_bridgeConfig.cmake
然后把/usr/lib/x86_64-linux-gnu/全都换成了我的opencv安装路径/usr/local/lib/
删掉svin_ws,创建,然后catkin_make
报错发生了变化:
额,这是只要opencv4.2.0???不兼容吗???
我再把库都替换成4.5.5试试,
set(libraries "cv_bridge;/usr/local/lib/libopencv_calib3d.so.4.5.5;/usr/local/lib/libopencv_dnn.so.4.5.5;/usr/local/lib/libopencv_features2d.so.4.5.5;/usr/local/lib/libopencv_flann.so.4.5.5;/usr/local/lib/libopencv_highgui.so.4.5.5;/usr/local/lib/libopencv_ml.so.4.5.5;/usr/local/lib/libopencv_objdetect.so.4.5.5;/usr/local/lib/libopencv_photo.so.4.5.5;/usr/local/lib/libopencv_stitching.so.4.5.5;/usr/local/lib/libopencv_video.so.4.5.5;/usr/local/lib/libopencv_videoio.so.4.5.5;/usr/local/lib/libopencv_aruco.so.4.5.5;/usr/local/lib/libopencv_bgsegm.so.4.5.5;/usr/local/lib/libopencv_bioinspired.so.4.5.5;/usr/local/lib/libopencv_ccalib.so.4.5.5;/usr/local/lib/libopencv_datasets.so.4.5.5;/usr/local/lib/libopencv_dnn_objdetect.so.4.5.5;/usr/local/lib/libopencv_dnn_superres.so.4.5.5;/usr/local/lib/libopencv_dpm.so.4.5.5;/usr/local/lib/libopencv_face.so.4.5.5;/usr/local/lib/libopencv_freetype.so.4.5.5;/usr/local/lib/libopencv_fuzzy.so.4.5.5;/usr/local/lib/libopencv_hdf.so.4.5.5;/usr/local/lib/libopencv_hfs.so.4.5.5;/usr/local/lib/libopencv_img_hash.so.4.5.5;/usr/local/lib/libopencv_line_descriptor.so.4.5.5;/usr/local/lib/libopencv_optflow.so.4.5.5;/usr/local/lib/libopencv_phase_unwrapping.so.4.5.5;/usr/local/lib/libopencv_plot.so.4.5.5;/usr/local/lib/libopencv_quality.so.4.5.5;/usr/local/lib/libopencv_reg.so.4.5.5;/usr/local/lib/libopencv_rgbd.so.4.5.5;/usr/local/lib/libopencv_saliency.so.4.5.5;/usr/local/lib/libopencv_shape.so.4.5.5;/usr/local/lib/libopencv_stereo.so.4.5.5;/usr/local/lib/libopencv_structured_light.so.4.5.5;/usr/local/lib/libopencv_superres.so.4.5.5;/usr/local/lib/libopencv_surface_matching.so.4.5.5;/usr/local/lib/libopencv_text.so.4.5.5;/usr/local/lib/libopencv_tracking.so.4.5.5;/usr/local/lib/libopencv_videostab.so.4.5.5;/usr/local/lib/libopencv_viz.so.4.5.5;/usr/local/lib/libopencv_ximgproc.so.4.5.5;/usr/local/lib/libopencv_xobjdetect.so.4.5.5;/usr/local/lib/libopencv_xphoto.so.4.5.5;/usr/local/lib/libopencv_core.so.4.5.5;/usr/local/lib/libopencv_imgproc.so.4.5.5;/usr/local/lib/libopencv_imgcodecs.so.4.5.5")
出现这个报错
这应该是4.5.5没有这个,只有4.2有,我直接改后缀改错了。
参考这个佬
解决cv_bridge和opencv之间版本匹配问题 - 知乎
然后在svin_ws/src/cmakelists开头加了
set(cv_bridge_DIR /usr/local/share/cv_bridge/cmake) //在find_package前面
编译后
又回到了之前的报错。。。。。
尝试从别的电脑复制了所有OpenCV的so.4.2.0到目标路径下,不报这个错了
下一个报错是找不到一些OpenCV contrib项,去官网下载安装即可
加上路径即可编译成功,但是运行程序时仍报关于OpenCV的so相关错误,猜想复制的so文件最终并不能连接到库,重装OpenCV4.5.5吧,先卸载干净,参考:
Ubuntu20.04安装OpenCV4.5.5和OpenCV_Contrib4.5.5_opencv 4.5 ubuntu-CSDN博客
然后我又去usr文件夹下删除了OpenCV相关文件。
10.关于找不到libopencv_xxx_.so.4.2.0(或者.4.2)
创建软连接即可:
sudo ln -s /usr/local/include/opencv4 /usr/include/opencv4
编译后老朋友依然报错:
我看别人电脑安装完新版本opencv后x86文件夹里还是有.so.4.2文件的
现在怀疑之前卸载opencv4.2的时候删的太干净,把这个文件夹下的.4.2文件误删了,因为ros的cv bridge默认去这里找4.2版本的so文件。
现在尝试把4.2文件装回来,4.2版本是当初使用下面指令默认安装的:
sudo apt install libsuitesparse-dev libopencv-dev
也只有这个能把so文件安装回x86文件夹
因此,先卸载4.5.5,借鉴:
Ubuntu20.04安装OpenCV4.5.5和OpenCV_Contrib4.5.5_opencv 4.5 ubuntu-CSDN博客
运行上面指令提示零更新,应该是没有卸干净:
运行:
sudo apt-get purge libopencv*
sudo apt-get autoremove
(之前更新版本的时候可能就是用这个误删的,大家更新opencv千万不要用这个,直接用默认指令安装,就可以直接覆盖老版本了,当然如果之前安装到特定路径下,需要在特定路径重新安装覆盖)
这之后opencv算是卸载干净了,可以运行上面的指令,安装opencv4.2
下面就按照官网指令,默认路径下安装4.5.5
然后重装ros、pangolin
之后重新编译svin_ws
终于跑通了,nice,命途多舛啊
二、运行篇
1.运行前需要修改launch文件
默认的launch文件直接运行会找不到yaml文件,导致程序中断报错或者最终轨迹无法保存
以v1为例,找到/home/zql/svin_ws/src/SVIn/okvis_ros/launch下的launch文件:
修改第四行和第七行中的yaml为对应的文件,比如v1改成下面这样即可
2.在本文件夹下运行以下指令
source ~/svin_ws/devel/setup.bash
roslaunch okvis_ros svin_stereorig_v1.launch
3.播放rosbag
最终生成的轨迹文件保存在/home/zql/svin_ws/src/SVIn/pose_graph/svin_results下
OK,svin2的编译运行就到这,下面可以学学源码和框架了。