本文记录了这几天配置激光雷达slam实现二维建图的方法,第一次发帖,希望能帮助到大家
在进行激光slam之前需要安装诸多依赖和功能包,在安装过程中会出现依赖不足的问题,可以通过命令“sudo apt-get install xxx”来解决,但是有可能出现因为软件源过旧而导致安装出现问题,因此在apt之前可以去etc/apt/sources.list设置更新软件源,我是用的是最新的清华源,因此可以实现配置,需要用到的依赖有:
sudo apt-get install automake google-mock libatlas-base-dev libboost-all-dev libeigen3-dev libgflags-dev libgmock-dev libgoogle-glog-dev liblapack-dev liblua5.2-dev libpcl-dev libprotobuf-dev libsuitesparse-dev libwebp-dev ninja-build pcl-tools protobuf-compiler python3-sphinx ros-noetic-tf2-eigen stow
1. 安装ceres2.0.0
可以通过如下命令安装,安装在主目录即可:
git clone https://github.com/ceres-solver/ceres-solver.git
cd ceres-solver
git checkout 0ffb6db49cec52566f53ab66be7a19970ddc562b # 将下载的ceres-solver的版本回退到2.0.0
mkdir build
cd build/
cmake ..
make -j8
sudo make install
图1. Ceres
2. 安装Protobuf3.21.1
可以通过如下命令来安装,安装在主目录即可:
git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf/
git checkout e73ed1630fdec85d7fb513c166629ed49cd4eb18
./autogen.sh
./configure
make -j8
sudo make install
sudo ldconfig
图2. Protobuf
3. 安装Abseil
可以通过如下的命令来安装,安装在主目录即可:
git clone https://github.com/abseil/abseil-cpp.git
cd abseil-cpp/
git checkout 215105818dfde3174fe799600bb0f3cae233d0bf
mkdir build
cd build/
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_PREFIX=/usr/local/stow/absl ..
ninja
sudo ninja install
cd /usr/local/stow
sudo stow absl
图3. Abseil
4. 安装Cartographer
首先在喜欢的位置建立工作空间,使用如下命令即可:
mkdir -p cartographer/src
cd cartographer/src
git clone https://github.com/cartographer-project/cartographer.git
git clone https://github.com/cartographer-project/cartographer_ros.git
cd ..
catkin_make_isolated
但是在最后编译的时候会报错,通过如下声明可以避免错误出现,即:
catkin_make_isolated # -DPYTHON_EXECUTABLE=/usr/bin/python3
注意此处井号以及后面的部分应该输入到命令行中。
5. 下载pointcloud_to_laserscan包实现三维转二维
在喜欢的位置创建工作空间3dto2dslam,并且进入工作空间的src目录,使用如下命令完成安装:
git clone https://github.com/BluewhaleRobot/pointcloud_to_laserscan.git
cd ..
catkin_make
图4. Point_to_laserscan
6. 修改与配置Cartographer
接下来修改cartographer工作空间。
a. 创建rs16_lidar.lua文件
使用如下命令创建文件:
cd ~/cartographer/src/cartographer_ros/cartographer_ros/configuration_files #找到自己的路径
cp revo_lds.lua rs16_lidar.lua #复制
gedit rs16_lidar.lua #打开文件
将文件内容修改为如下:
-
include "map_builder.lua" include "trajectory_builder.lua" options = { map_builder = MAP_BUILDER, trajectory_builder = TRAJECTORY_BUILDER, map_frame = "map", tracking_frame = "rslidar", published_frame = "rslidar", odom_frame = "odom", provide_odom_frame = true, publish_frame_projected_to_2d = false, use_pose_extrapolator = true, 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
b. 创建cartographer_demo_rs16.launch文件
使用如下命令:
cd ~/cartographer/src/cartographer_ros/cartographer_ros/launch #自己的路径
cp demo_revo_lds.launch cartographer_demo_rs16.launch
接下来将修改cartographer_demo_rs16.launch文件内容:
-
<launch> <param name="/use_sim_time" value="false" /> <node name="cartographer_node" pkg="cartographer_ros" type="cartographer_node" args=" -configuration_directory $(find cartographer_ros)/configuration_files -configuration_basename rs16_lidar.lua" output="screen"> <remap from="scan" to="/scan" /> </node> <node pkg="tf" type="static_transform_publisher" name="base_to_laser" args="0.0 0.0 0.45 0 0.0 0.0 map rslidar 100" /> <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" /> </launch>
7. 运行程序并且完成建图
打开四个终端并分别为在正确的位置启动:
roscore #终端1
roscag play xxx.bag #终端2
roslaunch pointcloud_to_laserscan point_to_scan #在3dto2dslam工作空间下,别忘了source,终端3
roslaunch cartographer_ros cartographer_demo_rs16.launch#在cartographer工作空间,别忘了source,终端4
图5. 运行完成的结果
下面是参考资料:
https://blog.csdn.net/QQ3545325613/article/details/136688341
https://blog.csdn.net/TJZH0318/article/details/136458527