緒論
SLAM(同步定位和地圖繪制)在自動(dòng)駕駛、AGV 和無(wú)人機(jī)等各種應(yīng)用中引起了人們的廣泛關(guān)注。盡管目前有很多優(yōu)秀的 SLAM 項(xiàng)目可以參考,但是他們的復(fù)雜性(高性能)及依賴性(依賴于許多外部庫(kù)),使得它們無(wú)法移植到簡(jiǎn)單的平臺(tái)(例如嵌入式系統(tǒng))。
該項(xiàng)目更加重視簡(jiǎn)潔的算法和更少的依賴性。很多不開(kāi)源的庫(kù)也將被刪除。另一方面,利用FPGA加速來(lái)達(dá)到實(shí)時(shí)的處理速度。
功能
10 FPS實(shí)時(shí)運(yùn)行
閉環(huán)檢測(cè)
3D占用網(wǎng)格地圖生成
通過(guò) USB 3.0 連接進(jìn)行實(shí)時(shí)監(jiān)控
軟件和硬件的所有設(shè)計(jì)文件均開(kāi)源
GitHub
項(xiàng)目很復(fù)雜,感興趣的不會(huì)太多,提前放出代碼
bin --- 預(yù)構(gòu)建的二進(jìn)制文件
doc---相關(guān)文件
src --- 源文件
vivado --- Vivado 工程目錄
系統(tǒng)概覽
系統(tǒng)級(jí)框圖如下所示。
傳感器板
傳感器板連接到FPGA開(kāi)發(fā)板( Ultra96-V2 )以捕獲立體圖像。該板硬件是開(kāi)源的,開(kāi)源鏈接如下:
該板包含雙 CMOS 圖像傳感器和兩個(gè) mikroBUS 。
在兩個(gè)mikroBUS站點(diǎn)中的一個(gè)站點(diǎn)上安裝了一個(gè)帶有內(nèi)置LED(按鈕G點(diǎn)擊)的單按鈕開(kāi)關(guān)的模塊,用于在獨(dú)立模式下控制系統(tǒng)。IMU模塊也已安裝,但未在本項(xiàng)目中使用。
圖像格式為 640x480 ,30 FPS。然后將幀速率降低到 FPGA 內(nèi)的所需速率。
遷移到其他傳感器板
該傳感器板的設(shè)計(jì)符合 Ultra96-V2 規(guī)范。如果其他傳感器板也符合這些規(guī)范,則應(yīng)該可以遷移到其他傳感器板。圖像傳感器配置為 640x480 分辨率和 30 FPS。一個(gè)按鈕開(kāi)關(guān)和一個(gè) LED 連接到 FPGA。
FPGA
圖像傳感器連接到 FPGA(或可編程邏輯,PL端)。用于立體視覺(jué)的圖像處理,如立體校正和塊匹配(stereo rectification 和 block matching)。FPGA也被用作一些功能的硬件加速。
遠(yuǎn)程申請(qǐng)
裸機(jī)應(yīng)用程序在兩個(gè) R5 處理器之一上運(yùn)行,用來(lái)控制 FPGA。此應(yīng)用程序在本文中也稱為“遠(yuǎn)程應(yīng)用程序”。此應(yīng)用程序與 Linux 應(yīng)用程序協(xié)同工作。此應(yīng)用程序還控制 USB 3.0 連接,因此如果板卡連接到 Windows PC,此系統(tǒng)就像是具有某些立體視覺(jué)功能的 USB 網(wǎng)絡(luò)攝像頭一樣工作。
Linux應(yīng)用
Petalinux 系統(tǒng)建立在四個(gè) A53 處理器上。在該系統(tǒng)上運(yùn)行處理 SLAM 相關(guān)操作的應(yīng)用程序。該應(yīng)用程序在本文中稱為“Linux 應(yīng)用程序”。
Petalinux 系統(tǒng)以 SMP(Symmetric Multiprocessing)模式運(yùn)行。這意味著工作負(fù)載由 Linux 系統(tǒng)分配給每個(gè)處理器。
處理器間通信 (IPC)
這兩個(gè)應(yīng)用程序通過(guò)在 FPGA 中實(shí)現(xiàn)的內(nèi)存映射寄存器相互通信。這些寄存器由“消息”寄存器和“參數(shù)”寄存器組成。處理器在“消息”寄存器中寫入特定的消息 ID 以通知對(duì)方。另一個(gè) CPU 輪詢“消息”寄存器并做出適當(dāng)?shù)捻憫?yīng)。如有必要,可以發(fā)送四個(gè) 32 位參數(shù)。
調(diào)試電腦
調(diào)試電腦用于監(jiān)控板子的狀態(tài)。除了通過(guò) UART 進(jìn)行的調(diào)試功能外,還可以通過(guò) USB 3.0 連接實(shí)時(shí)查看視頻處理中的立體圖像。當(dāng)連接到 Windows PC 時(shí),此系統(tǒng)被視為 UVC(USB Video Class)設(shè)備,因此不需要特殊的設(shè)備驅(qū)動(dòng)程序。
內(nèi)存映射
FPGA開(kāi)發(fā)板上有 2GB 的物理內(nèi)存。該區(qū)域的前 3 / 4 被 Linux 系統(tǒng)使用。另一個(gè)保留給遠(yuǎn)程應(yīng)用程序。
開(kāi)發(fā)環(huán)境
主要開(kāi)發(fā)在 Windows 上執(zhí)行,但 Petalinux 開(kāi)發(fā)需要 Linux 環(huán)境。所以使用VirtualBox在Windows 10上虛擬搭建一個(gè)Linux環(huán)境。
此項(xiàng)目需要安裝兩個(gè) Vitis 。Windows 上的一個(gè)用于遠(yuǎn)程應(yīng)用程序開(kāi)發(fā),另一個(gè)用于 Linux 應(yīng)用程序。
開(kāi)發(fā)階段
嵌入式系統(tǒng)的開(kāi)發(fā)比較麻煩,所以需要?jiǎng)澐譃槿齻€(gè)階段。
第 1 階段是在 Windows上進(jìn)行純軟件解決方案開(kāi)發(fā)。這個(gè)階段對(duì)于軟件開(kāi)發(fā)是最有效的。算法的性能也在這個(gè)階段得到了驗(yàn)證。
在第 2 階段,軟件被移植到運(yùn)行在開(kāi)發(fā)板板上的 Petalinux 系統(tǒng)。在這個(gè)過(guò)渡階段,注意軟件源代碼是相同的。板載 SD 卡用于存儲(chǔ)數(shù)據(jù)。
在最后階段,一些功能被FPGA電路和控制FPGA的裸機(jī)應(yīng)用所取代。一些功能還應(yīng)用了硬件加速,以進(jìn)一步減少處理時(shí)間。
算法(傳感器數(shù)據(jù)采集)
立體校正
立體校正過(guò)程將左右圖像在同一平面上進(jìn)行變換,并使它們水平對(duì)齊。立體校正在 FPGA 內(nèi)部實(shí)時(shí)執(zhí)行,然后在存儲(chǔ)到 DDR 內(nèi)存之前進(jìn)行雙線性插值。
為了使 FPGA 電路更簡(jiǎn)單,支持信息由軟件預(yù)先生成。此信息包括要處理的數(shù)據(jù)的位置和長(zhǎng)度,并按到達(dá)時(shí)間的順序排序。
立體校正參數(shù)通過(guò) OpenCV 函數(shù)獲得,該函數(shù)使用 7x5 棋盤圖案實(shí)現(xiàn) Bouguet 算法。這些參數(shù)保存在 XML 文件中并存儲(chǔ)在 SD 卡上。
當(dāng)前的實(shí)現(xiàn)忽略了鏡頭畸變,因?yàn)槭褂玫膱D像傳感器幾乎沒(méi)有畸變,而試圖消除它們的畸變會(huì)導(dǎo)致圖像產(chǎn)生更多畸變。
X-Sobel 濾波器
X-Sobel 濾波器用作塊匹配的預(yù)處理,結(jié)果存儲(chǔ)在 DDR 內(nèi)存中。
塊匹配
塊匹配搜索立體圖像對(duì)之間的視覺(jué)對(duì)應(yīng)關(guān)系。立體校正后,左圖中的一個(gè)位置出現(xiàn)在右圖中同一行的左側(cè)。源圖像中每個(gè)像素的這些差異形成了密集的深度圖。
塊匹配是通過(guò)移植OpenCV的StereoBM功能在FPGA中實(shí)現(xiàn)的。塊匹配所需的計(jì)算量非常大,但可以通過(guò) OpenCV 中實(shí)現(xiàn)的“滑動(dòng)窗口”技術(shù)來(lái)減少。為了進(jìn)一步減少處理時(shí)間,F(xiàn)PGA 并行計(jì)算 32 個(gè)視差。
GFTT探測(cè)器
GFTT(Good Features To Track)用于檢測(cè)關(guān)鍵點(diǎn)。關(guān)鍵點(diǎn)是圖像中通常包含角的獨(dú)特部分。
該算法與OpenCV的goodFeaturesToTrack函數(shù)相同,但部分函數(shù)移植到FPGA中實(shí)現(xiàn),以減少軟件處理時(shí)間。
該功能由以下步驟組成。
應(yīng)用XY-Sobel濾波器提取邊緣
計(jì)算特征值量化角點(diǎn)的尖銳度
對(duì)特征值應(yīng)用閾值并選擇好的關(guān)鍵點(diǎn)
步驟1和步驟2需要對(duì)圖像中的每個(gè)像素都進(jìn)行計(jì)算,計(jì)算量較大,因此采用FPGA實(shí)現(xiàn)。
ORB 描述符生成器
ORB(Oriented FAST and Rotated BRIEF)特征描述符用于量化檢測(cè)到的關(guān)鍵點(diǎn)的視覺(jué)唯一性。同一物體的關(guān)鍵點(diǎn)具有相似的描述符,因此即使比例和角度略有不同,我們也可以從不同的圖像幀中搜索同一物體的關(guān)鍵點(diǎn)。
實(shí)際計(jì)算由 OpenCV 函數(shù)執(zhí)行。每個(gè) ORB 描述符都是一個(gè) 256 位的二進(jìn)制字符串。
算法(SLAM)
SLAM 算法是根據(jù)RTAB-Map中實(shí)現(xiàn)的 F2F 算法構(gòu)建的。
坐標(biāo)
該項(xiàng)目涉及兩個(gè)坐標(biāo)系。它們是圖像坐標(biāo)和world (或者 robot)坐標(biāo)。
這兩個(gè)都是右手坐標(biāo)系,所以一個(gè)簡(jiǎn)單的旋轉(zhuǎn)矩陣R就可以在它們之間進(jìn)行轉(zhuǎn)換。源圖像在圖像坐標(biāo)中捕獲。然后將計(jì)算出的相機(jī)位姿轉(zhuǎn)換為world 坐標(biāo)。
視覺(jué)里程計(jì)Visual Odometry
視覺(jué)里程計(jì)計(jì)算連續(xù)圖像幀期間相機(jī)姿勢(shì)的轉(zhuǎn)換。
該算法由以下階段組成。
1.關(guān)鍵幀選擇
實(shí)際視覺(jué)里程計(jì)是在關(guān)鍵幀和新圖像幀之間計(jì)算的。使用關(guān)鍵幀的原因是為了減少累積每一幀的測(cè)距誤差,尤其是當(dāng)相機(jī)靠近固定位置時(shí)。當(dāng)匹配的關(guān)鍵點(diǎn)數(shù)量低于閾值時(shí),關(guān)鍵幀將被更新。
2. 關(guān)鍵點(diǎn)匹配
關(guān)鍵點(diǎn)在兩個(gè)圖像幀之間匹配。通過(guò)比較關(guān)鍵點(diǎn)的 ORB 描述符來(lái)計(jì)算相似度。以前的相機(jī)姿勢(shì)(如果可用)用于縮小搜索范圍。此階段的輸出是匹配關(guān)鍵點(diǎn)的 ID 及其 2D/3D 位置。
3.運(yùn)動(dòng)估計(jì)
解決 PnP 問(wèn)題以計(jì)算相機(jī)的旋轉(zhuǎn)和平移,從而最大限度地減少兩者之間的誤差
投影到當(dāng)前圖像平面上的參考幀中關(guān)鍵點(diǎn)的 3D 位置,以及當(dāng)前幀中關(guān)鍵點(diǎn)的二維位置。
輸出是相機(jī)的相對(duì)運(yùn)動(dòng)。它在圖像坐標(biāo)中計(jì)算,然后轉(zhuǎn)換為world坐標(biāo)。
在這個(gè)項(xiàng)目中,相機(jī)姿勢(shì)是使用圖表來(lái)描述的。估計(jì)的相機(jī)姿勢(shì)和運(yùn)動(dòng)分別作為節(jié)點(diǎn)和鏈接添加到圖中。
視覺(jué)關(guān)鍵詞Visual Word Dictionary
視覺(jué)關(guān)鍵詞包含視覺(jué)詞,它們實(shí)際上是分配有唯一 ID 的 ORB 描述符。每次新的圖像幀到達(dá)時(shí),該幀中包含的 ORB 描述符都會(huì)與現(xiàn)有的視覺(jué)詞相匹配。如果它與現(xiàn)有單詞匹配,則增加該單詞的引用計(jì)數(shù)器。如果不是,則描述符被分配一個(gè)新的 ID 并成為一個(gè)新的視覺(jué)詞。
視覺(jué)詞的數(shù)量隨時(shí)間增加。與所有現(xiàn)有的視覺(jué)詞匹配實(shí)際上是這個(gè)應(yīng)用程序中最耗時(shí)的過(guò)程。為了讓軟件實(shí)時(shí)運(yùn)行,這個(gè)計(jì)算在一個(gè)單獨(dú)的線程中處理。因?yàn)殚]環(huán)檢測(cè)不一定在每一幀中運(yùn)行,所以這一操作很有效,。
閉環(huán)檢測(cè)
閉環(huán)檢測(cè)是識(shí)別先前訪問(wèn)過(guò)的場(chǎng)景并向該節(jié)點(diǎn)添加另一個(gè)鏈接。
向圖形添加閉環(huán)鏈接可以通過(guò)兩種方式減少圖形錯(cuò)誤。
添加閉環(huán)鏈接時(shí)會(huì)重建圖。在這個(gè)過(guò)程中,連接了從起始節(jié)點(diǎn)到結(jié)束節(jié)點(diǎn)的最短路徑。這將消除循環(huán)期間累積的里程計(jì)誤差。
閉環(huán)鏈接將為圖形添加額外的約束。通過(guò)最小化由此類約束引起的誤差,將提高估計(jì)姿勢(shì)的準(zhǔn)確性。
默認(rèn)情況下,閉環(huán)檢測(cè)每 5 幀運(yùn)行一次。最新的 30 幀也將被忽略。這些抽取是為了消除相鄰節(jié)點(diǎn)被接受為閉環(huán),因?yàn)樗鼈儗?duì)圖優(yōu)化幾乎沒(méi)有貢獻(xiàn)。
每當(dāng)一個(gè)新的圖像幀到達(dá)時(shí),TF-IDF(詞頻-逆文檔頻率)分?jǐn)?shù)就會(huì)通過(guò)查閱視覺(jué)詞典來(lái)計(jì)算其他圖像幀的分?jǐn)?shù)。當(dāng)更多的單詞包含在共同點(diǎn)時(shí),這個(gè)分?jǐn)?shù)會(huì)更高,并且單詞越稀有。
選擇具有最高 TF-IDF 分?jǐn)?shù)的圖像幀作為閉環(huán)的候選者。然后,在兩個(gè)圖像幀之間執(zhí)行類似于視覺(jué)里程計(jì)中的運(yùn)動(dòng)估計(jì)。當(dāng)重投影誤差低于閾值時(shí),該鏈接被接受為閉環(huán)鏈接并添加到圖中。
圖形優(yōu)化
當(dāng)閉環(huán)鏈接向圖形添加額外約束時(shí),會(huì)出現(xiàn)差異,從而導(dǎo)致圖形中出現(xiàn)錯(cuò)誤。通過(guò)最小化此類錯(cuò)誤,可以提高圖表的準(zhǔn)確性。
在這個(gè)項(xiàng)目中,只估計(jì)相機(jī)位姿。這稱為“姿態(tài)調(diào)整”,與“束調(diào)整”相對(duì),后者估計(jì)相機(jī)姿態(tài)和觀察點(diǎn)的 3D 坐標(biāo)。
這類問(wèn)題可以通過(guò)最小化這種形式的成本函數(shù) F(x) 來(lái)解決。
這里 eij 被定義為位姿 xi 和 xj 之間的誤差向量,而 zij 是它們之間的約束。Ω為信息矩陣,由重投影誤差的協(xié)方差的倒數(shù)得到。
F(x) 的一階近似值通過(guò)圍繞 x 初始值的泰勒級(jí)數(shù)展開(kāi)如下給出。
Jij 是關(guān)于 xi 和 xj 的雅可比矩陣。
F(x) 由 x 最小化,x 是通過(guò)求解以下等式獲得的,其中 λ 是傾銷因子。
將 Δx 添加到初始值以更接近最優(yōu)解。
雅可比計(jì)算遵循g2o的實(shí)現(xiàn)(https://github.com/RainerKuemmerle/g2o)。原始相機(jī)姿態(tài)包括旋轉(zhuǎn)矩陣,它們不能直接放入方程中,因?yàn)樗鼈兪且环N過(guò)度參數(shù)化的表示。在這個(gè)項(xiàng)目中,歸一化四元數(shù)的軸用作最小表示。這也遵循 g2o 的實(shí)現(xiàn),因此我們可以對(duì)雅可比矩陣使用相同的計(jì)算。因此相機(jī)姿勢(shì)將是 6 個(gè)元素的向量。
假設(shè)我們有 N 個(gè)節(jié)點(diǎn),那么 H 的大小是 6N x 6N,向量 b 是 6N。矩陣 H 可以非常大,但其元素大部分為零,因?yàn)?H 僅在對(duì)應(yīng)節(jié)點(diǎn)之間存在約束的情況下才為非零。因此,將 H 視為稀疏矩陣是有利的。構(gòu)建稀疏矩陣和求解方程由Eigen執(zhí)行,SimplicialLDLT 作為稀疏線性求解器。
占用網(wǎng)格圖
3D 占用網(wǎng)格圖是從優(yōu)化的位姿圖和密集的深度圖生成的。地圖的實(shí)際生成由Octomap執(zhí)行。結(jié)果以“二叉樹(shù)(.bt)”格式存儲(chǔ)在 SD 卡上。
表現(xiàn)
KITTI 數(shù)據(jù)集在驗(yàn)證算法時(shí)用作參考。
準(zhǔn)確性
下圖是用KITTI數(shù)據(jù)集序列00模擬時(shí)的軌跡鳥(niǎo)瞰圖。
在此仿真中,主要在 5 個(gè)區(qū)域檢測(cè)到閉環(huán),平移和旋轉(zhuǎn)誤差分別為 0.91% 和 0.0038 度/米。
請(qǐng)注意,此結(jié)果僅顯示算法的性能,因?yàn)榇朔抡嬷惺褂玫膱D像是由不同的圖像傳感器捕獲的。
3D 占用網(wǎng)格地圖
下圖是在上述模擬中生成并由octovis顯示的 3D 占用網(wǎng)格圖。密集深度圖的分辨率在兩個(gè)方向上都降低了 1 / 4,然后在通過(guò) Octomap 構(gòu)建體素圖之前通過(guò)估計(jì)的相機(jī)姿勢(shì)進(jìn)行投影。
處理時(shí)間
下圖顯示了處理圖像傳感器輸入時(shí)應(yīng)用程序和 FPGA 主線程的處理時(shí)間。
視覺(jué)關(guān)鍵詞更新和閉環(huán)檢測(cè)在應(yīng)用程序的子線程中運(yùn)行。處理時(shí)間隨著視覺(jué)詞的數(shù)量增加,如下所示。
時(shí)隙為 500 毫秒,因?yàn)樗鼈兠?5 幀運(yùn)行一次。當(dāng)處理時(shí)間超過(guò)這個(gè)時(shí)隙時(shí),下一次執(zhí)行將推遲到上一個(gè)線程完成,這樣就不會(huì)干擾視覺(jué)里程計(jì)的實(shí)時(shí)運(yùn)行。
內(nèi)存消耗
下圖顯示了在 Windows 上處理 KITTI 數(shù)據(jù)集序列 00 時(shí)的內(nèi)存消耗(僅顯示前 1700 幀)。內(nèi)存消耗隨著時(shí)間的推移而增加,其中大部分是密集的深度圖和視覺(jué)詞。當(dāng)應(yīng)用程序運(yùn)行在FPGA上時(shí),這塊內(nèi)存占用了Linux控制的內(nèi)存空間,限制了連續(xù)運(yùn)行的時(shí)間。
FPGA利用率
下表顯示了 FPGA 資源利用率。FPGA設(shè)備是 XCZU3EG-SBVA484-1-I。
如何復(fù)現(xiàn)
先決條件
Xilinx Tools 2020.2 必須安裝在兩個(gè)平臺(tái)(Ubuntu和Windows)上。
Petalinux 2020.2 必須安裝在 Ubuntu 上。
假定 Xilinx Tools 安裝到 Ubuntu 上的 [XILINX_DIR]。
假定 git 中的必要文件已復(fù)制到兩個(gè)平臺(tái)。
下載 Eigen 3.4.0 并將其放置在“slam/include”目錄下,目錄結(jié)構(gòu)如下:
?
slam ?└─include ???????└─Eigen
?
硬件
傳感器板的擴(kuò)展接口是開(kāi)漏電路,不能直接控制開(kāi)關(guān)和LED。因此,在 Button G click board 上需要進(jìn)行以下修改。
構(gòu)建 FPGA 項(xiàng)目(在 Windows 上)
git文件中已經(jīng)構(gòu)建好項(xiàng)目。
“dvp”項(xiàng)目
啟動(dòng) Vivado,并在“Tcl Console”中鍵入以下命令。
?
cd?[WORK_DIR]/U96-SLAM/vivado source?create_dvp.tcl
?
? 將創(chuàng)建名為“dvp”的項(xiàng)目。
點(diǎn)擊“工具→創(chuàng)建并打包新IP...”,打開(kāi)“創(chuàng)建并打包新IP”對(duì)話框。繼續(xù)進(jìn)行以下設(shè)置。
?
[Create?Peripheral,?Package?IP?or?Package?a?Block?Design] ??Packaging?Options:?Package?your?current?project [Package?Your?Current?Project] ??IP?location:?[WORK_DIR]/U96-SLAM/src/ip_repo/dvp
?
出現(xiàn)提示時(shí)選擇“是”,然后單擊“完成”。
將出現(xiàn)“Package IP - dvp”。
選擇“Review and Package”,點(diǎn)擊“Package IP”。
? “dvp”的 IP 源將導(dǎo)出到“ip_repo/dvp”目錄。
關(guān)閉“dvp”項(xiàng)目。
“fpga_top”項(xiàng)目
啟動(dòng) Vivado,并在“Tcl Console”中鍵入以下命令。
?
cd?[WORK_DIR]/U96-SLAM/vivado source?create_fpga_top.tcl
?
? 將創(chuàng)建名為“fpga_top”的項(xiàng)目。
雙擊“Sources”面板中的“Design Sources→design_1_wrapper→design_1_i”,打開(kāi)“design_1.bd”框圖。
如果“/dvp_0 block in this design should be upgraded.” 顯示在窗口頂部,單擊“Report IP Status”,然后單擊“Upgrade Selected”。只有當(dāng)修改了“dvp”模塊時(shí)才會(huì)發(fā)生這種情況。
單擊 Flow Navigator 中的“Generate Bitstream”。
? “design_1.bit”將在“fpga_top.runs/impl_1/”目錄中創(chuàng)建。
單擊“File→Export→Export Hardware”打開(kāi)“Export Hardware Platform”對(duì)話框。繼續(xù)進(jìn)行以下設(shè)置。
?
[Output] ??Include?bitstream:?Selected [Files] ??XSA?file?name:?design_1_wrapper ??Export?to:?[WORK_DIR]/U96-SLAM/vivado/fpga_top
?
? “design_1_wrapper.xsa”將在指定目錄中創(chuàng)建。
構(gòu)建裸機(jī)應(yīng)用程序(在 Windows 上)
只有在修改裸機(jī)應(yīng)用程序時(shí)才需要此項(xiàng)目?!癝tereoBM.elf”已經(jīng)包含在 git 存儲(chǔ)庫(kù)中。
在“[WORK_DIR]/U96-SLAM”下創(chuàng)建名為“vitis”的目錄。啟動(dòng) Vitis,將此目錄設(shè)置為 Vitis Workspace,然后單擊“Launch”。
?
[WORK_DIR]/U96-SLAM/vitis
?
單擊“Create Application Project”以打開(kāi)“新建應(yīng)用程序項(xiàng)目”對(duì)話框。繼續(xù)進(jìn)行以下設(shè)置。注意選擇R5處理器。
?
[Platform] ??Create?a?new?platform?from?hardware?(XSA) ??XSA?File:?[WORK_DIR]U96-SLAMvivadofpga_topdesign_1_wrapper.xsa ??Target?processor?to?create?FSBL:?psu_cortexr5_0 [Application?Project?Details] ??Application?project?name:?StereoBM ??Target?processor:?psu_cortexr5_0 [Domain] ??Remain?as?default [Templates] ??SW?development?templates:?Empty?Application
?
單擊“完成”。
? 將創(chuàng)建“StereoBM_system”項(xiàng)目。
在“Application Project Settings”中,單擊“Navigate to BSP Settings”。
點(diǎn)擊“Board Support Package”中的“Modify BSP Settings...”?!鞍寮?jí)支持包設(shè)置”對(duì)話框?qū)⒋蜷_(kāi)。
點(diǎn)擊“Overview→standalone”,進(jìn)行如下修改。
?
stdin:?psu_uart_1 stdout:?psu_uart_1
?
這是必要的,因?yàn)?uart_1 在 開(kāi)發(fā)板中用作標(biāo)準(zhǔn)輸入/輸出。
在“Explorer”中右鍵單擊“StereoBM_system→StereoBM→src”,然后從菜單中單擊“Import Sources...”以打開(kāi)“Import Sources”對(duì)話框。繼續(xù)進(jìn)行以下設(shè)置。
?
From?directory:?[WORK_DIR]/U96-SLAM/src/StereoBM/src Select?All:?click
?
單擊“完成”。
在資源管理器窗格中選擇“StereoBM”,然后通過(guò)單擊 Hammer 圖標(biāo)旁邊的箭頭圖標(biāo)選擇“Release”構(gòu)建。
? “StereoBM.elf”將在“Release”目錄中生成。
構(gòu)建“StereoBM_system”而不是“StereoBM”也會(huì)生成 ROM 引導(dǎo)文件。
構(gòu)建 Petalinux 系統(tǒng)(在 Ubuntu 上)
配置系統(tǒng)
獲取 Petalinux 環(huán)境。
?
source?[XILINX_DIR]/petaLinux-2020.2/bin/settings.sh
?
通過(guò)鍵入以下命令創(chuàng)建“petalinux”項(xiàng)目。
?
cd?[WORK_DIR]/U96-SLAM petalinux-create?--type?project?--template?zynqMP?--name?petalinux cd?petalinux/
?
? “petalinux”目錄將在 [WORK_DIR]/U96-SLAM/” 下創(chuàng)建。
將“design_1_wrapper.xsa”復(fù)制到“U96-SLAM/vivado”目錄。如果沒(méi)有更改 FPGA 設(shè)計(jì),則在 git 存儲(chǔ)庫(kù)的“U96-SLAM/bin”目錄中提供預(yù)構(gòu)建文件。
如下配置 Petalinux 系統(tǒng)。
以下“petalinux-xxxx”命令必須在“petalinux”目錄中發(fā)出。
?
petalinux-config?--get-hw-description?../vivado
?
“misc/config 系統(tǒng)配置”對(duì)話框?qū)⒋蜷_(kāi)。進(jìn)行以下設(shè)置,然后“退出”。
?
Subsystem?AUTO?Hardware?Settings?→?Serial?Settings?→ ??PMUFW?Serial?stdin/stdout?:?psu_uart_1 ??FSBL?Serial?stdin/stdout:?psu_uart_1 ??ATF?Serial?stdin/stdout:?psu_uart_1 ??DTG?Serial?stdin/stdout:?psu_uart_1 DTG?Settings?→?MACHINE_NAME:?avnet-ultra96-rev1 Image?Packaging?Configuration?→?Root?filesystem?type:?EXT4?(SD/eMMC/SATA/USB)
?
以下命令第一次運(yùn)行可能需要很長(zhǎng)時(shí)間。
?
petalinux-config?-c?kernel “Linux/arm64?5.4.0?內(nèi)核配置”對(duì)話框?qū)⒋蜷_(kāi)。進(jìn)行以下設(shè)置,然后“退出”。 Enable?loadable?module?support?[*]?(default) Networking?support?→?Bluetooth?subsystem?support?> Device?Drivers?→?Remoteproc?drivers?→ ??Support?for?Remote?Processor?subsystem?[*]?(default) ??ZynqMP_r5?remoteproc?support??(default) ??
?
最后,鍵入以下配置命令。
?
petalinux-config?-c?rootfs
?
“Configuration”對(duì)話框?qū)⒋蜷_(kāi)。進(jìn)行以下設(shè)置,然后“退出”。
?
Filesystem?Packages?→ ??libs?→?libmetal?→?libmetal?[*] ??misc?→?gdb?[*]?(for?debug?purpose) ???????→?sysfsutils?→?libsysfs?[*] Petalinux?Package?Groups?→ ??packagegroup-petalinux-openamp?→?packagegroup-petalinux-openamp?[*] ??packagegroup-petalinux-opencv?→?packagegroup-petalinux-opencv?[*] Image?Features?→?auto-login?[*]
?
在“[WORK_DIR]/U96-SLAM/petalinux/project-spec/meta-user/recipes-bsp/device-tree/files/”中打開(kāi)“system-user.dtsi”并復(fù)制并粘貼以下文本。
?
/include/?"system-conf.dtsi" /?{ reserved-memory?{ ????????#address-cells?=?<2>; ????????#size-cells?=?<2>; ????????ranges; ????????rproc_0_dma:?rproc@0x6ed00000?{ ????????????no-map; ????????????compatible?=?"shared-dma-pool"; ????????????reg?=?<0x0?0x6ed00000?0x0?0x00100000>; ????????}; ????????rproc_0_reserved:?rproc@0x5ed00000?{ ????????????no-map; ????????????reg?=?<0x0?0x5ed00000?0x0?0x10000000>; ????????}; ????}; ????zynqmp-rpu?{ ????????compatible?=?"xlnx,zynqmp-r5-remoteproc-1.0"; ????????#address-cells?=?<2>; ????????#size-cells?=?<2>; ????????ranges; ????????core_conf?=?"split"; ????????r5_0:?r5@0?{ ????????????#address-cells?=?<2>; ????????????#size-cells?=?<2>; ????????????ranges; ????????????memory-region?=?<&rproc_0_reserved>,?<&rproc_0_dma>; ????????????pnode-id?=?<0x7>; ????????????mboxes?=?<&ipi_mailbox_rpu0?0>,?<&ipi_mailbox_rpu0?1>; ????????????mbox-names?=?"tx",?"rx"; ????????????tcm_0_a:?tcm_0@0?{ ????????????????reg?=?<0x0?0xFFE00000?0x0?0x10000>; ????????????????pnode-id?=?<0xf>; ????????????}; ????????????tcm_0_b:?tcm_0@1?{ ????????????????reg?=?<0x0?0xFFE20000?0x0?0x10000>; ????????????????pnode-id?=?<0x10>; ????????????}; ????????}; ????}; ????zynqmp_ipi1?{ ????????compatible?=?"xlnx,zynqmp-ipi-mailbox"; ????????interrupt-parent?=?<&gic>; ????????interrupts?=?<0?29?4>; ????????xlnx,ipi-id?=?<7>; ????????#address-cells?=?<1>; ????????#size-cells?=?<1>; ????????ranges; ????????/*?APU<->RPU0?IPI?mailbox?controller?*/ ????????ipi_mailbox_rpu0:?mailbox@ff90000?{ ????????????reg?=?<0xff990600?0x20>, ??????????????????<0xff990620?0x20>, ??????????????????<0xff9900c0?0x20>, ??????????????????<0xff9900e0?0x20>; ????????????reg-names?=?"local_request_region", ????????????????????????"local_response_region", ????????????????????????"remote_request_region", ????????????????????????"remote_response_region"; ????????????#mbox-cells?=?<1>; ????????????xlnx,ipi-id?=?<1>; ????????}; ????}; ????chosen?{ ????????bootargs?=?"console=ttyPS0,115200?root=/dev/mmcblk0p2?rw?earlyprintk?rootfstype=ext4?rootwait?uio_pdrv_genirq.of_id=generic-uio?devtmpfs.mount=1?earlycon"; ????}; }; &dvp_0?{ ??compatible?=?"generic-uio"; };
?
該文件聲明使用遠(yuǎn)程處理器并保留其內(nèi)存空間。該文件還將FPGA內(nèi)部的“dvp”模塊設(shè)置為“generic-uio”設(shè)備,以便我們可以使用內(nèi)置的“generic-uio”設(shè)備驅(qū)動(dòng)程序訪問(wèn)它。
自動(dòng)運(yùn)行應(yīng)用程序
以下過(guò)程將使我們的應(yīng)用程序在系統(tǒng)啟動(dòng)時(shí)自動(dòng)運(yùn)行。
?
petalinux-create?-t?apps?--template?install?-n?myinit?--enable
?
? “myinit”目錄將在“project-spec/meta-user/recipes-apps”下創(chuàng)建。
將以下文本復(fù)制并粘貼到“myinit.bb”和“files/myinit”。
【myinit.bb】
?
# #?This?file?is?the?myapp-init?recipe. # SUMMARY?=?"Simple?myinit?application" SECTION?=?"PETALINUX/apps" LICENSE?=?"MIT" LIC_FILES_CHKSUM?=?"file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" SRC_URI?=?"file://myinit? ?" S?=?"${WORKDIR}" FILESEXTRAPATHS_prepend?:=?"${THISDIR}/files:" inherit?update-rc.d INITSCRIPT_NAME?=?"myinit" INITSCRIPT_PARAMS?=?"start?99?S?." do_install()?{ ?install?-d?${D}${sysconfdir}/init.d ?install?-m?0755?${S}/myinit?${D}${sysconfdir}/init.d/myinit } FILES_${PN}?+=?"${sysconfdir}/*"
?
【文件/myinit】
?
#!/bin/sh cd?~/home/root ./run
?
這些文件使“myinit”成為一個(gè)啟動(dòng)應(yīng)用程序,它將在“home/root”目錄中執(zhí)行“run”腳本。
構(gòu)建 Petalinux
現(xiàn)在我們可以通過(guò)以下命令構(gòu)建 Petalinux 系統(tǒng)。
“petalinux-build”命令可能需要很長(zhǎng)時(shí)間。
?
petalinux-build
?
第一次會(huì)出現(xiàn)錯(cuò)誤消息,說(shuō)明設(shè)備樹(shù)中存在錯(cuò)誤。然后,打開(kāi)以下目錄中的“pl.dtsi”,刪除mipi_csi_rx_subsyst_0和mipi_csi_rx_subsyst_1條目。
?
“[WORK_DIR]/U96-SLAM/petalinux/components/plnx_workspace/device-tree/device-tree/pl.dtsi”
?
生成的文件應(yīng)如下所示。
【pl.dtsi】
?
/?{ ?amba_pl:?amba_pl@0?{ ??#address-cells?=?<2>; ??#size-cells?=?<2>; ??compatible?=?"simple-bus"; ??ranges?; ??dvp_0:?dvp@a0000000?{ ???clock-names?=?"s00_axi_aclk",?"m00_axi_aclk"; ???clocks?=?<&zynqmp_clk?71>,?<&zynqmp_clk?71>; ???compatible?=?"xlnx,dvp-1.0"; ???interrupt-names?=?"intr"; ???interrupt-parent?=?<&gic>; ???interrupts?=?<0?89?4>; ???reg?=?<0x0?0xa0000000?0x0?0x10000>; ???xlnx,m00-axi-addr-width?=?<0x20>; ???xlnx,m00-axi-aruser-width?=?<0x0>; ???xlnx,m00-axi-awuser-width?=?<0x0>; ???xlnx,m00-axi-burst-len?=?<0x10>; ???xlnx,m00-axi-buser-width?=?<0x0>; ???xlnx,m00-axi-data-width?=?<0x20>; ???xlnx,m00-axi-id-width?=?<0x1>; ???xlnx,m00-axi-ruser-width?=?<0x0>; ???xlnx,m00-axi-target-slave-base-addr?=?<0x40000000>; ???xlnx,m00-axi-wuser-width?=?<0x0>; ??}; ??misc_clk_0:?misc_clk_0?{ ???#clock-cells?=?<0>; ???clock-frequency?=?<200000000>; ???compatible?=?"fixed-clock"; ??}; ??misc_clk_1:?misc_clk_1?{ ???#clock-cells?=?<0>; ???clock-frequency?=?<1500000000>; ???compatible?=?"fixed-clock"; ??}; ?}; };
?
CSI 接口似乎會(huì)自動(dòng)添加到設(shè)備樹(shù)中,但我們?cè)谶@里不需要它們,因?yàn)樗鼈冇陕銠C(jī)應(yīng)用程序控制。
此文件是自動(dòng)生成的,不應(yīng)手動(dòng)編輯,但我找不到其他方式解決上面的問(wèn)題。每次編輯“system-user.dtsi”時(shí),此問(wèn)題仍然存在。
然后再次構(gòu)建 Petalinux 系統(tǒng)。
?
petalinux-build
?
這次項(xiàng)目應(yīng)該構(gòu)建成功了。
創(chuàng)建SDK
鍵入以下命令為平臺(tái)項(xiàng)目創(chuàng)建 SDK。
?
petalinux-build?--sdk
?
這將在“/images/linux/”目錄中生成“sdk.sh”。
然后鍵入以下命令以在當(dāng)前位置解壓“sdk.sh”。
?
cd?images/linux petalinux-package?--sysroot
?
構(gòu)建平臺(tái)項(xiàng)目(在 Ubuntu 上)
在“petalinux/images/linux/”目錄下創(chuàng)建“l(fā)inux.bif”文件。然后復(fù)制并粘貼以下文本。
【linux.bif】
?
/*?linux?*/ the_ROM_image: { ????[fsbl_config]?a53_x64 ????[bootloader]?????[pmufw_image]? ????[destination_device=pl]? ????[destination_cpu=a53-0,?exception_level=el-3,?trustzone]? ????[destination_cpu=a53-0,?exception_level=el-2]? }
?
啟動(dòng) Vitis,并選擇“[WORK_DIR]/U96-SLAM/vitis”作為其工作區(qū)。
點(diǎn)擊“File→New→Platform Project...”打開(kāi)“New platform project”對(duì)話框。繼續(xù)進(jìn)行以下設(shè)置。
?
[Create?new?platform?project] ??Platform?project?name:?platform [Platform] ??Choose?"Create?a?new?platform?from?hardware?(XSA)". ??XSA?File:?[WORK_DIR]/U96-SLAM/vivado/fpga_top/design_1_wrapper.xsa ??Operating?system:?linux ??Processor:?psu_cortexa53 ??Architecture:?64-bit ??Generate?boot?components:?checked ??Target?processor?to?create?FSBL:?psu_cortexa53_0
?
單擊“完成”。
在左窗格中選擇“platform→psu_cortexa53→linux on psu_cortexa53”。
在“域:linux_domain”對(duì)話框中填寫以下信息。
?
Bif?File?????????????????:?[WORK_DIR]/U96-SLAM/petalinux/images/linux/linux.bif Boot?Components?Directory:?[WORK_DIR]/U96-SLAM/petalinux/images/linux/ Linux?Image?Directory????:?[WORK_DIR]/U96-SLAM/petalinux/images/linux/ Linux?Rootfs?????????????:?[WORK_DIR]/U96-SLAM/petalinux/images/linux/rootfs.tar.gz Sysroot?Directory????????:?[WORK_DIR]/U96-SLAM/petalinux/images/linux/sdk/sysroots/aarch64-xilinx-linux
?
選擇“平臺(tái)→psu_cortexa53_0→zynqmp_fsbl→板級(jí)支持包”
單擊“修改 BSP 設(shè)置...”。
選擇“Overview → standalone”,修改如下。
?
stdin?:?psu_uart_1 stdout?:?psu_uart_1
?
單擊“確定”。
通過(guò)單擊錘子圖標(biāo)構(gòu)建項(xiàng)目。
? 將在 Vitis 工作區(qū)中創(chuàng)建一個(gè)名為“platform”的項(xiàng)目。
現(xiàn)在我們準(zhǔn)備構(gòu)建一個(gè)運(yùn)行在該平臺(tái)上的 Linux 應(yīng)用程序。
構(gòu)建 SLAM 應(yīng)用程序 (Ubuntu)
啟動(dòng) Vitis,并選擇“[WORK_DIR]/U96-SLAM/vitis”作為其工作區(qū)。
點(diǎn)擊“File→New→Application Project...”打開(kāi)“New Application Projec”對(duì)話框。
繼續(xù)進(jìn)行以下設(shè)置。
?
[Platform] ??Select?a?platform?from?repository:?platform?[custom] [Application?Project?Details] ??Application?project?name:?slam [Domain] ??Remain?as?default. [Templates] ??SW?development?templates:?Empty?Application?(C++)
?
如果在 git 控制的目錄中創(chuàng)建 Vitis 工作區(qū),則可能無(wú)法識(shí)別平臺(tái)項(xiàng)目。如果發(fā)生這種情況,請(qǐng)嘗試在 git 控制的目錄之外的某個(gè)位置創(chuàng)建 Vitis 工作區(qū)。
單擊“完成”。
? 將創(chuàng)建名為“slam”的項(xiàng)目。
將 git 存儲(chǔ)庫(kù)中“vitis/slam”中的“src”和“include”目錄復(fù)制到 [WORK_DIR]/U96-SLAM/vitis/slam/”目錄。
單擊錘子圖標(biāo)旁邊的箭頭圖標(biāo)并選擇“Release”。
在“Explorer”中右擊“slam”,選擇“C/C++ Build Settings”。設(shè)置如下。
?
[ARM?v8?Linux?g++?compiler] ?├─Directories ?│??└─Include?Paths ?│?????[WORK_DIR]/U96-SLAM/petalinux/images/linux/sdk/sysroots/aarch64-xilinx-linux/usr/include ?│?????[WORK_DIR]/U96-SLAM/vitis/slam/include ?└─Miscellaneous ????-c?-fmessage-length=0?-MT"$@"?-ftemplate-backtrace-limit=0 [ARM?v8?Linux?g++?linker] ?└─Libraries ???└─Libraries ??????opencv_core ??????opencv_photo ??????opencv_video ??????opencv_videoio ??????opencv_optflow ??????opencv_tracking ??????opencv_features2d ??????opencv_imgcodecs ??????opencv_highgui ??????opencv_imgproc ??????opencv_calib3d ??????pthread
?
右鍵單擊“Explorer”中的“slam”,然后單擊“Clean Project”。
再次右鍵單擊“slam”并單擊“Build Project”。
? 將生成“Release/slam.elf”。
準(zhǔn)備 SD 卡(在Ubuntu 上)
SD 卡使用 GParted 格式化,如下圖所示。
■ 引導(dǎo)文件
如果更改了 FPGA 設(shè)計(jì),請(qǐng)將“design_1_wrapper.bit”從 Windows 復(fù)制到 Ubuntu。以下命令假定“.bit”文件位于“/vivado”目錄中。
鍵入以下命令以創(chuàng)建“BOOT.BIN”。
?
cd?[WORK_DIR]/U96-SLAM/petalinux petalinux-package?--boot?--force?--fsbl?images/linux/zynqmp_fsbl.elf?--fpga?../vivado/design_1_wrapper.bit?--u-boot
?
? “BOOT.BIN”將在“/petalinux/images/linux/”目錄中生成。
將以下3個(gè)文件復(fù)制到SD卡的BOOT目錄下。
?
[WORK_DIR]/U96-SLAM/petalinux/images/linux/boot.scr ???????????????????????????????????????????BOOT.BIN ???????????????????????????????????????????image.ub
?
■ 系統(tǒng)文件
通過(guò)以下命令將“rootfs.tar.gz”解壓到SD卡的“root”目錄下。
?
sudo?tar?xzvf?[WORK_DIR]/U96-SLAM/petalinux/imeges/linux/rootfs.tar.gz?-C?[SD_CARD_DIR]/root
?
在“[SD_CARD_DIR]/root/lib/”目錄下創(chuàng)建“firmware”目錄。
將“StereoBM.elf”和“slam.elf”復(fù)制到上述目錄。
運(yùn)行應(yīng)用程序
根據(jù)自動(dòng)運(yùn)行設(shè)置,會(huì)自動(dòng)執(zhí)行SD卡上“root/home/root/”目錄下的“run”腳本。
創(chuàng)建一個(gè)名為“run”的文件并賦予其執(zhí)行權(quán)限。
?
chmod?774?run
?
然后,復(fù)制粘貼以下內(nèi)容,將文件移動(dòng)到SD卡的“root/home/root/”目錄下。
【home/root/run】
?
rm?*.csv rm?*.bmp rm?*.png rm?*.jpg rm?*.txt rm?-rf?work echo?StereoBM.elf?>?/sys/class/remoteproc/remoteproc0/firmware echo?start?>?/sys/class/remoteproc/remoteproc0/state #/lib/firmware/slam.elf?-app?"STEREO_CAPTURE"?-lc?"calib_left.yml"?-rc?"calib_right.yml" #/lib/firmware/slam.elf?-app?"FRAME_GRABBER" #/lib/firmware/slam.elf?-app?"SLAM_BATCH"?-dir?"kitti/sequences/00"?-l?"image_0"?-r?"image_1"?-t?"times.txt"?-gt?"../../poses/00.txt"?-lc?"calib.txt"?-n?100 /lib/firmware/slam.elf?-app?"SLAM_REALTIME"?-lc?"calib_left.yml"?-rc?"calib_right.yml" shutdown?-h?now
?
“echo”命令與將在遠(yuǎn)程處理器上啟動(dòng)“StereoBM”應(yīng)用程序的 OpenAMP 相關(guān)?!癝tereoBM.elf”必須位于“l(fā)ib/firmware”中。
接下來(lái)的幾行啟動(dòng)帶有一些參數(shù)的 SLAM 應(yīng)用程序。此文件包含每種應(yīng)用程序類型的示例。取消注釋其中之一并適當(dāng)修改它。
最后一行將關(guān)閉操作系統(tǒng)。如果操作系統(tǒng)未正確關(guān)閉,則可能不會(huì)生成輸出文件。
根據(jù)應(yīng)用類型,可能還需要此目錄中的校準(zhǔn)文件和測(cè)試數(shù)據(jù)。
實(shí)用程序
git 上包含一些實(shí)用程序。
它們是為 Windows 上的 Visual C++ Express 2015 編寫的。除“slam”項(xiàng)目外,源文件位于各自的目錄中。“slam”項(xiàng)目的源文件與我們已經(jīng)構(gòu)建的 Petalinux 上的“slam”項(xiàng)目相同。創(chuàng)建 Visual C++ 項(xiàng)目并將源文件添加到項(xiàng)目中。
這里列出了成功構(gòu)建所需的其他設(shè)置。它們適用于“Release/x64”構(gòu)建。
所有這些程序都是基于OpenCV 3.x 。在本文中,假設(shè) OpenCV 3.2.0 安裝在以下目錄結(jié)構(gòu)中。
?
opencv-3.2.0 ??└─build ????├─include ????│?└─opencv2 ????└─x64 ??????└─vc14 ????????├─bin ????????│?├─opencv_world320.dll ????????│?└─opencv_world320d.dll ????????└─lib ??????????├─opencv_world320.lib ??????????└─opencv_world320d.lib
?
■ 捕獲視頻
該程序從 USB 視頻類設(shè)備捕獲圖像。
當(dāng)按下“Enter”鍵時(shí),接收到的圖像將在寫入文件之前水平分成兩半。如果與在“Frame Grabber”模式下運(yùn)行的 U96-SLAM 一起使用,該程序?qū)⑦m當(dāng)?shù)刈笥曳指顖D像。按“ESC”退出程序。
“main.cpp”中的“DEVICE_ID”決定了打開(kāi)哪個(gè)設(shè)備。這些索引由系統(tǒng)以增量順序自動(dòng)分配??赡苄枰鶕?jù)已連接到的 PC 的 UVC 設(shè)備的數(shù)量更改該值。
?
[Configuration?Properties] ??C/C++?→?General?→?Additional?Include?Directory:? ????[OPENCV_DIR]opencv-3.2.0uildinclude ??Linker?→?General?→?Additional?Library?Directories:? ????[OPENCV_DIR]opencv-3.2.0uildx64vc14lib ???????????Input?→?Additional?Dependencies:?opencv_world320.lib [Argument?parameters] ??None
?
■ stereo_calib
該程序讀取棋盤圖案的立體圖像對(duì),使用 OpenCV 函數(shù)計(jì)算立體校準(zhǔn)參數(shù),然后將它們存儲(chǔ)到文件中。
?
[Configuration?Properties] ??C/C++?→?General?→?Additional?Include?Directory:? ????[OPENCV_DIR]opencv-3.2.0uildinclude ??Linker?→?General?→?Additional?Library?Directories:? ???[OPENCV_DIR]opencv-3.2.0uildx64vc14lib ???????????Input?→?Additional?Dependencies:?opencv_world320.lib [Argument?parameters] ??-w,?-h?:?The?number?of?the?'inner'?intersections?of?the?chessboard?pattern. ??-s?:?The?size?of?the?grid?in?meters.?The?unit?of?this?parameter?is?important?as?it?determines?all?the?subsequent?units?including?the?pose?graph?output?of?SLAM?application. [Example] ??-w=7?-h=5?-s=0.03?[FILE_PATH]/dataset.xml
?
■ SLAM
這是 SLAM 應(yīng)用程序的 Windows 版本。源文件與 Petalinux 上的 SLAM 應(yīng)用程序相同。將“src”目錄下的所有文件添加到項(xiàng)目中。在 Windows 上只有沒(méi)有 FPGA 加速的批處理模式可用。
?
[Configuration?Properties] ??C/C++?→?General?→?Additional?Include?Directory:? ????[OPENCV_DIR]opencv-3.2.0uildinclude ????[WORK_DIR]U96-SLAMvcslaminclude ??????????Advanced?→?Disable?Specific?Warnings:?4996;4819 ??Linker?→?General?→?Additional?Library?Directories:? ????[OPENCV_DIR]opencv-3.2.0uildx64vc14lib ???????????Input?→?Additional?Dependencies:?opencv_world320.lib [Argument?parameters] -app????:?Application?type,?only?"SLAM_BATCH"?is?available. -dir????:?Base?directory?path.?All?the?below?paths?are?relative?to?this?directory. -l/-r???:?Image?file?paths. -lc/-rc?:?Calibration?file?paths. -t??????:?Path?to?timestamp?file. -gt?????:?Path?to?ground?truth?file. -n??????:?Number?of?files?to?be?preocessed,?negative?value?means?all?files. [Example] -app?"SLAM_BATCH"?-dir?"KITTI/odometry/dataset/sequences/00"?-l?"image_0"?-r?"image_1"?-t?"times.txt"?-gt?"../../poses/00.txt"?-lc?"calib.txt"?-n?-1
?
審核編輯:劉清
評(píng)論
查看更多