目錄
cartorgapher的編譯環境
cartorgapher的編譯
cartographer的運行
參數的詳解與調參總結
降低延遲與減小計算量
cartorgapher的編譯環境
系統環境
推薦在ubuntu16.04或者18.04上進行編譯
推薦使用剛裝好的ubuntu系統
將ubuntu的軟件源設置成清華的或者其他的中國境內的源, 更換完源之后要執行一下 sudo apt
get update
照著wiki.ros.org安裝完對應版本的ROS
并在.bashrc中的末尾添加這條句語句, 要把 <distro> 改成對應的ROS版本
source /opt/ros/<distro>/setup.bash
其中 sudo rosdep init; rosdep update 這條語句執行不成功, 不管他, 不是必須執行的
依賴庫的安裝
cartographer的依賴庫腳本完成一鍵安裝.
如下是具體步驟:
第一步: 下載安裝包
鏈接:https://pan.baidu.com/s/1q9f5aNTfrbpFpwGCwD6E4A
提取碼:slam
在網盤鏈接里 安裝包文件夾 中下載 cartographer_install-20210613.zip, 放到ubuntu系統里并解壓
第二步: 打開終端
進入到cartographer_install文件夾, 在文件夾內部空白處單擊鼠標右鍵, 打開終端
第三步 使用腳本完成依賴項的安裝
在終端中輸入 ./auto-carto-build.sh
如果提示腳本不是一個可執行的文件, 那就通過 chmod +x auto-carto-build.sh 為這個腳本添加可執
行權限即可, 之后在通過 ./auto-carto-build.sh 執行腳本
第三步 使用腳本完成依賴項的安裝
在終端中輸入 ./auto-carto-build.sh
如果提示腳本不是一個可執行的文件, 那就通過 chmod +x auto-carto-build.sh 為這個腳本添加可執
行權限即可, 之后在通過 ./auto-carto-build.sh 執行腳本.
解釋說明
腳本里進行了4個庫的編譯與安裝
cartographer的依賴庫有3個, 分別是abseil-cpp, ceres-solver, protobuf.
在腳本的最后, 也將cartographer安裝到系統里了. 安裝cartographer后, 就可以在工作空間中只對
cartographer_ros進行編譯了, 這樣修改launch和lua文件后就不需要執行一次編譯指令了.
注意: 如果之前安裝過 ceres-solver, protobuf, cartographer 的話, 執行腳本時可能會報有些函數沒
有定義的錯誤, 這是由于protobuf或者cartographer不一致版本導致的, 可以先將之前安裝的庫卸載掉,
再執行安裝依賴的腳本
一定要確保腳本執行之后沒有錯誤輸出, 否則之后編譯代碼會編譯不通過
cartorgapher的編譯
第一步: 下載注釋的代碼
講師注釋的代碼的github地址為
https://github.com/xiangli0608/cartographer_detailed_comments_ws
在某個文件夾內部空白處單擊鼠標右鍵, 打開終端, 輸入如下執行進行代碼的下載.
git clone https://github.com/xiangli0608/cartographer_detailed_comments_ws.git
注意, 一定要通過 git clone 的方式下載代碼, 因為代碼的注釋是處于更新狀態的, 要定期通過 git pull
origin master 來更新代碼.
要是在github中下載代碼的zip壓縮文件, 這樣下載的代碼里不含有.git文件夾, 就不能通過 git pull 進
行代碼的更新了.
如果執行 git clone 后沒有下載代碼, 是由于沒有連上github導致的, 可以按 ctrl c 中斷當前下載, 再
次執行 git clone , 重復幾次試試, 如果還不行, 就在群里問問吧.
第二步: cartorgapher的編譯
進入到cartographer_detailed_comments_ws內, 在文件夾內打開終端, 輸入
./catkin_make.sh
完成對cartographer與cartographer_ros的編譯.
注意: 一定要確保之前的依賴項全部安裝成功, 否則這里的編譯就會報錯
cartographer的運行
下載數據集
在網盤鏈接里 數據集文件夾 中下載數據集, 使用的數據集有3個,
rslidar-outdoor-gps.zip 這個是講師自己錄制的數據, 包括了速騰16線點云數據, 由點云數據生成的
單線雷達數據, imu, 里程計, rtk/gps, tf 與 tf_static
rslidar-outdoor-gps-notf.zip 這個與上邊的是同一個, 只不過這個將tf的話題去掉了
landmarks_demo_uncalibrated.zip 是從cartographer官網上下載的數據, 旨在展示一下如何在
cartographer中使用landmark
將bag文件放到指定的文件夾下
首先, 在用戶文件夾下新建一個文件夾, 并命名為bagfiles, 然后將下載好的3個bag文件放入bagfiles文件 夾中.
開始二維建圖
進入到cartographer_detailed_comments_ws文件夾內, 在文件夾內右鍵打開終端, 輸入
source install_isolated/setup.bash
rospack profile
roslaunch cartographer_ros lx_rs16_2d_outdoor.launch
source命令的目的
source命令是設置當前的終端 可以執行的包與節點的地址集合的, 不執行 source
install_isolated/setup.bash 這個命令, 直接啟動 roslaunch 時就會出現 找不到包或找不到節點的
錯誤提示.
為了防止每次啟動終端都要執行一次 source install_isolated/setup.bash 這個指令, 我們可以將
這個指令寫到 ~/.bashrc 文件中, 每次啟動終端時, 會自動source ~/.bashrc 這個文件, 這個文件中的所有
內容都會被 source 一遍
~ 代表用戶文件夾, 例如我自己電腦的用戶名為lx, 我自己的用戶文件夾就是 /home/lx/ , 這個文件夾地址
也可以用 ~ 來代替.
按 ctrl h 可以顯示隱藏文件, 找到 .bashrc 文件進行編輯, 在文件底部輸入
source ~/path-to-carto/cartographer_detailed_comments_ws/install_isolated/setup.bash
其中 path-to-carto 要改成自己實際的文件夾名字
rospack profile 命令的目的
新下載的包在編譯之后, 有時沒有被加載到ros的包的地址集合中,.
這時即使執行力 source 指令, 在啟動 roslaunch 時也可能會報錯, 提示找不到包或者可執行節點.
通過 rospack profile 命令可以將新下載的包加載到ros的包的地址集合, 再執行 roslaunch 時就不
會再報錯了.
保存2d軌跡,并生成ros格式的地圖
./finish_slam_2d.sh
其中map_dir是保存地圖的文件夾名字, 可以改成自己想要保存的文件夾地址.
純定位模式
roslaunch cartographer_ros lx_rs16_2d_outdoor_localization.launch
3d建圖指令
roslaunch cartographer_ros lx_rs16_3d.launch
保存3d軌跡
./finish_slam_3d.sh
使用asset生成ros格式的2d柵格地圖
roslaunch cartographer_ros assets_writer_2d.launch
使用asset生成3d點云地圖
roslaunch cartographer_ros assets_writer_3d.launch
landmark使用示例
roslaunch cartographer_ros landmark_mir_100.launch
odom坐標系發布重復
當bag或者機器人中本身存在odom坐標系, 而provide_odom_frame又設置成了true, 就會導致odom坐
標系重復發布.
會導致機器人位姿發生來回的跳動.
參數的詳解與調參總結
TRAJECTORY_BUILDER_2D.min_range = 0.3
TRAJECTORY_BUILDER_2D.max_range = 100.
TRAJECTORY_BUILDER_2D.min_z = 0.2 -- / -0.8
TRAJECTORY_BUILDER_2D.voxel_filter_size = 0.02
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.occupied_space_weight = 10.
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight = 1.
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.rotation_weight = 1.
TRAJECTORY_BUILDER_2D.submaps.num_range_data = 80.
TRAJECTORY_BUILDER_2D.submaps.grid_options_2d.resolution = 0.1 -- / 0.02
POSE_GRAPH.optimize_every_n_nodes = 160. -- 2倍的num_range_data以上
POSE_GRAPH.constraint_builder.sampling_ratio = 0.3
POSE_GRAPH.constraint_builder.max_constraint_distance = 15.
POSE_GRAPH.constraint_builder.min_score = 0.48
POSE_GRAPH.constraint_builder.global_localization_min_score = 0.60
降低延遲與減小計算量
前端部分
減小 max_range, 減小了需要處理的點數, 在雷達數據遠距離的點不準時一定要減小這個值
增大 voxel_filter_size, 相當于減小了需要處理的點數
增大 submaps.resolution, 相當于減小了匹配時的搜索量
對于自適應體素濾波 減小 min_num_points與max_range, 增大 max_length, 相當于減小了需要處
理的點數
后端部分
增大 optimize_every_n_nodes, 降低優化頻率, 減小了計算量
增大 MAP_BUILDER.num_background_threads, 增加計算速度
減小 global_sampling_ratio, 減小計算全局約束的頻率
減小 constraint_builder.sampling_ratio, 減少了約束的數量
增大 constraint_builder.min_score, 減少了約束的數量
減小分枝定界搜索窗的大小, 包括linear_xy_search_window,inear_z_search_window,
angular_search_window
增大 global_constraint_search_after_n_seconds, 減小計算全局約束的頻率
減小 max_num_iterations, 減小迭代次數
降低內存
增大子圖的分辨率 submaps.resolution
降低純定位時錯誤重定位的概率
修改 pose_graph.lua 中的如下參數
提高 optimize_every_n_nodes , 減小了優化的次數
減小 sampling_ratio, 減小了計算約束的次數
減小 max_constraint_distance, 減小了計算約束的距離
提高 min_score, 減小了計算約束的數量, 提高約束正確的概率
提高 global_localization_min_score, 減小了計算約束的數量, 提高約束正確的概率
提高 global_constraint_search_after_n_seconds , 減小了回環的次數(隔多長時間計算一次)