ELSDc線段橢圓提取演算法填坑路

2020-08-11 15:53:46

1 說明

實驗室復現高精度位姿估計演算法的時候,需要呼叫ELSDc演算法,當時演算法是在MAC上編譯的,而我在復現的時候用的ubuntu 16.04 ,所以進行了一輪踩坑,在半天之後搞定了演算法的復現,這裏記錄一下遇到自己填坑的過程。
ELSDc原理介紹:鏈接

2程式碼偵錯階段的問題

1 sh: 1: ./ELSDC/elsdc:Permission denied

解決辦法:
在这里插入图片描述
2 Syntax error:(unexptected
在这里插入图片描述
解決辦法:
程式碼對於標準bash而言沒有錯,因爲Ubuntu/Debian爲了加快開機速度,用dash代替了傳統的bash,是dash在搗鬼,解決方法就是取消dash。

sudo dpkg-reconfigure dash
在選擇項中選No,搞定了!

參考

3.開源專案ELSDc使用

到第二部完成,應該來說是可以使用程式碼了,但是在執行的時候報錯:
在这里插入图片描述
這個錯誤找了會錯誤原因:
應該是編譯環境不一樣導致的編譯出來的二進制檔案不同。參考
然後就是找解決辦法,倒騰了一會 學長髮來了該演算法的原始碼地址
然後在readme中找到了問題的解決辦法:
在这里插入图片描述
然後就照着流程去解決這個問題拉。
1 安裝CLAPACK/CBLAS庫
這兩個數學庫是很多linux科學計算軟體需要呼叫的,所以經常會用到。

LAPACK,其名爲Linear Algebra PACKage的縮寫,是一以Fortran程式語言寫就,用於數值計算的函式集。LAPACK提供了豐富的工具函式,可用於諸如解多元線性方程式、線性系統方程組的最小平方解、計算特徵向量、用於計算矩陣QR分解的Householder轉換、以及奇異值分解等問題。

BLAS,全稱Basic Linear AlgebraSubprograms,即基礎線性代數子程式庫,裏面擁有大量已經編寫好的關於線性代數運算的程式。

下面 下麪是安裝的過程
首先
lapack原始碼:http://www.netlib.org/lapack
BLAS原始碼:http://www.netlib.org/blas
CBLAS原始碼:http://www.netlib.org/blas/blast-forum/cblas.tgz
並且安裝gfortran編譯器

sudo apt-get install gfortran

準備工作完成後,開始編譯
1)編譯blas, 進入BLAS資料夾,執行以下幾條命令

gfortran -c -O3 *.f  # 編譯所有的 .f 檔案,生成 .o檔案 
ar rv libblas.a *.o  # 鏈接所有的 .o檔案,生成.a 檔案 
sudo cp libblas.a /usr/local/lib  #將庫檔案複製到系統庫目錄   

2)編譯cblas, 進入CBLAS資料夾,首先根據你自己的計算機平臺,將目錄下某個 Makefile.XXX複製爲 Makefile.in , XXX表示計算機的平臺,如果是Linux,那麼就將Makefile.LINUX 複製爲Makefile.in,然後執行以下命令

sudo cp ../BLAS/libblas.a testing  # 將上一步編譯成功的 libblas.a複製到 CBLAS目錄下的testing子目錄  
make # 編譯所有的目錄  
sudo cp lib/cblas_LINUX.a /usr/local/lib/libcblas.a #將庫檔案複製到系統庫目錄下  

3)編譯lapack以及lapacke,這一步比較麻煩,首先當然是進入lapack-3.2.1資料夾,然後根據平臺的特點,將INSTALL目錄下對應的make.inc.XXX複製一份到 lapack-3.2.1目錄下,並命名爲make.inc, 這裏我複製的是INSTALL/make.inc.gfortran,因爲我這裏用的是gfortran編譯器。

修改lapack-3.4.2/Makefile,因爲lapack以來於blas庫,所以需要做如下修改

#lib: lapacklib tmglib
lib: blaslib variants lapacklig tmglib
make # 編譯所有的lapack檔案 (時間比較久)
sudo cp *.a /usr/local/lib # 將生成的所有庫檔案複製到系統庫目錄 

生成的庫檔案包括:liblapack.a, liblapacke.a, librefblas.a,libtmglib.a

至此cblas和lapack就成功安裝到你的電腦上了。

參考

2 使用開原始碼生成可執行二進制檔案
比較簡單,找到makefile,然後新增lapack的路徑就好了。
在这里插入图片描述
在原始檔src下make一下
最後執行試試看,提取的效果還算不錯

./elsdc test_1.pgm

在这里插入图片描述