親測可行。
1.安裝
#Install wstool and rosdep.
sudo apt-get update
sudo apt-get install -y python-wstool python-rosdep ninja-build
#Create a new workspace in ‘catkin_google_ws’.
mkdir catkin_google_ws
cd catkin_google_ws
wstool init src
#Merge the cartographer_ros.rosinstall file and fetch code for dependencies.
wstool merge -t src https://raw.githubusercontent.com/googlecartographer/cartographer_ros/master/cartographer_ros.rosinstall
wstool update -t src
*在這一步可能會顯示無法下載cere-solver
*解決辦法:手動下載cere-solver 然後放到src中
*下載鏈接:https://ceres-solver.googlesource.com/ceres-solver.git/+/1.13.0點擊頁面中的tgz可以下載,下載後解壓到src中
*注意下載時需要FQ
#Install proto3.
src/cartographer/scripts/install_proto3.sh
#Install deb dependencies.
#The command ‘sudo rosdep init’ will print an error if you have already
#executed it since installing ROS. This error can be ignored.
sudo rosdep init
rosdep update
rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y
*這裏要修改ROS_DISTRO爲自己的ros版本如kinetic或者indigo
#Build and install.
catkin_make_isolated --install --use-ninja
source install_isolated/setup.bash
×(如果你用的是zsh不是bash上面的那句改爲下面這樣)
source install_isolated/setup.zsh
編譯會有幾分鐘完全可以去喝杯茶
2.測試
這裏部分代碼需要修改具體如下:
在/home/zhaoekexeu/catkin_google_ws/src/cartographer_ros/cartographer_ros/launch下修改 demo_revo_lds.launch
2.1 刪除運行bag的node節點,如下
<launch>
<param name="/use_sim_time" value="true" />
<node name="cartographer_node" pkg="cartographer_ros"
type="cartographer_node" args="
-configuration_directory $(find cartographer_ros)/configuration_files
-configuration_basename revo_lds.lua"
output="screen">
<remap from="scan" to="scan" />
</node>
<node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"
type="cartographer_occupancy_grid_node" args="-resolution 0.05" />
<node name="rviz" pkg="rviz" type="rviz" required="true"
args="-d $(find cartographer_ros)/configuration_files/demo_2d.rviz" />
<!--已經將運行bag的node刪掉-->
</launch>
2.2 修改frame 這個很重要
在/home/zhaoekexeu/catkin_google_ws/src/cartographer_ros/cartographer_ros/configuration_files下修改 revo_lds.lua
主要修改:
map_frame = “map”,
tracking_frame = “horizontal_laser_link”,
published_frame = “horizontal_laser_link”,
odom_frame = “odom”,
這裏需要查詢一下自己的tf_tree
rosrun rqt_tf_tree rqt_tf_tree
顯示如下圖片(我這裏是運行正確之後的frames ,你可以根據錯誤的信息進行更改上面四行代碼)
修改後的代碼
include "map_builder.lua"
include "trajectory_builder.lua"
options = {
map_builder = MAP_BUILDER,
trajectory_builder = TRAJECTORY_BUILDER,
map_frame = "map",
tracking_frame = "base_footprint",
published_frame = "base_footprint",
odom_frame = "odom",
provide_odom_frame = true,
publish_frame_projected_to_2d = false,
use_odometry = false,
use_nav_sat = false,
use_landmarks = false,
num_laser_scans = 1,
num_multi_echo_laser_scans = 0,
num_subdivisions_per_laser_scan = 1,
num_point_clouds = 0,
lookup_transform_timeout_sec = 0.2,
submap_publish_period_sec = 0.3,
pose_publish_period_sec = 5e-3,
trajectory_publish_period_sec = 30e-3,
rangefinder_sampling_ratio = 1.,
odometry_sampling_ratio = 1.,
fixed_frame_pose_sampling_ratio = 1.,
imu_sampling_ratio = 1.,
landmarks_sampling_ratio = 1.,
}
MAP_BUILDER.use_trajectory_builder_2d = true
TRAJECTORY_BUILDER_2D.submaps.num_range_data = 35
TRAJECTORY_BUILDER_2D.min_range = 0.3
TRAJECTORY_BUILDER_2D.max_range = 8.
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 1.
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.linear_search_window = 0.1
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.translation_delta_cost_weight = 10.
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.rotation_delta_cost_weight = 1e-1
POSE_GRAPH.optimization_problem.huber_scale = 1e2
POSE_GRAPH.optimize_every_n_nodes = 35
POSE_GRAPH.constraint_builder.min_score = 0.65
return options
這樣就修改OK了。
開始準備測試
(這裏是按照我自己做的機器人進行描述的,可供參考)
- 首先在主機(這裏就是指自己的筆記本)啓動master
roscore
- 主機端鏈接樹莓派(前提是你已經進行了分佈式配置)
ssh [email protected]
- 機器人上電之後,樹莓派端打開端口權限,然後啓動機器人
sudo chmod 666 /dev/ttyUSB0
sudo chmod 777 /dev/ttyACM0
roslaunch mbot_bringup mbot_with_laser.launch
- 主機端 開始準備執行cartographer的node
cd catkin_google_ws
catkin_make_isolated --install --use-ninja //編譯
source install_isolated/setup.zsh //刷新環境 在此之前也可以重新編譯一下
roslaunch cartographer_ros demo_revo_lds.launch //執行demo_revo_lds.launch
- 主機端運行鍵盤控制節點
roslaunch mbot_bringup mbot_with_laser.launch //這樣就可以控制機器人進行建圖了。
3.保存地圖
方式1
1.當使用cartographer在線建圖時,cartographer不知道什麼時候結束,所以要先調用服務來關閉傳感器數據的接收。
rosservice call /finish_trajectory 0
2.將當前地圖信息的快照保存爲後綴名爲.pbstream。
# Ask Cartographer to serialize its current state.
# (press tab to quickly expand the parameter syntax)
rosservice call /write_state "{filename: '<絕對路徑存放地圖信息>/<地圖保存的名字>.pbstream', include_unfinished_submaps: 'true'}"
3.通過cartographer提供的ros包,將後綴名爲.pbstream的地圖信息,轉化成ros地圖信息。
rosrun cartographer_ros cartographer_pbstream_to_ros_map -map_filestem=<保存地圖的絕對路徑>/<地圖命名> -pbstream_filename=<存放pbstream地圖快照信息的絕對地址>/<filename>.pbstream -resolution=0.05
warning:上面的方法是網上各大博主的方法,我測試沒有通過,會報下面的錯誤,暫時沒有解決,如果您解決了,希望給我分享一下
方式2
這裏需要修改map_server
如果想將GMapping中生成的地圖保存下來,可以
rosrun map_server map_saver -f ~/robot_ws/map/gmapping
main函數中定義了一個MapGenerator類對象,該類初始化之後訂閱map話題。在訂閱的回調函數中,將訂閱得到的map按照一定格式保存到當地的.pgm文件,同時將地圖信息保存到對應的.yaml文件中。
需要注意的是,如果你是想保存Cartographer生成的地圖,是需要對源代碼做一些修改的。因爲Cartographer的map格式跟GMapping中的格式不太一樣。具體不一樣如下:
我按照這個不同對map_server包做了一些修改,詳情看github:https://github.com/HaoQChen/map_server 。如果覺得有用,記得star一下哦。
完成修改之後
可以使用如下格式的代碼進行地圖保存(根據自己的情況進行修改)
rosrun map_server map_saver map:=/<your map topic> -f <map_name>
局部參考:
https://blog.csdn.net/weixin_40712763/article/details/82292087
https://blog.csdn.net/m0_37672916/article/details/77198261
https://blog.csdn.net/u014493244/article/details/84101374
https://blog.csdn.net/SimileciWH/article/details/84846416
https://blog.csdn.net/u013834525/article/details/84622496
希望可以幫到您哦,水平有限,如果有錯誤之處,希望指正,謝謝。