Ros—RPLIDAR A2激光雷达安装(hector_mapping算法建图同cartographer_ros建图对比)
Ros—RPLIDAR A2激光雷达安装(hector_mapping算法建图同cartographer_ros建图对比)
因为大部分教程复杂繁琐,而且容易失败 。便整理总结了一下网上的资料,感谢
Cayla和 口袋里的超超的无私分享
前提:安装好了ubuntu系统以及ROS系统,并且USB口可是别设备。
基于ubuntu16 rplidar与主机连接
1、设备连接与数据通信
RPLIDAR A2 通讯接口采用 3.3V 电平的串口(UART)。
2、安装rplidar2
按ctrl+alt+t打开terminal,输入以下命令:
$ cd ~/catkin_ws/src
$ git clone https://github.com/robopeak/rplidar_ros.git
$ cd …
$ catkin_make
3、运行雷达
没有报错之后运行:
roslaunch rplidar_ros rplidar.launch
运行成功后如下,雷达开始旋转在terminal中输入:
$ roslaunch rplidar_ros view_rplidar.launch
情况正常的情况下可以看见激光数据如下图:成功出现以上画面之后:
按Ctrl+c结束操作
使用hector_gmapping算法建图测试
$ cd ~/catkin_ws/src
$ git clone https://github.com/tu-darmstadt-ros-pkg/hector_slam
$ cd …
$ catkin_make
成功出现如下界面表明安装成功:进入launch文件夹下,在文件夹下添加hector_mapping_demo.launch文件:
$ cd src/rplidar_ros/launch/
$ touch hector_mapping_demo.launch
$ gedit hector_mapping_demo.launch
<launch>
<node pkg="hector_mapping" type="hector_mapping" name="hector_mapping" output="screen">
<!-- Frame names -->
<param name="pub_map_odom_transform" value="true"/>
<param name="map_frame" value="map" />
<param name="base_frame" value="base_link" />
<param name="odom_frame" value="base_link" />
<!-- Tf use -->
<param name="use_tf_scan_transformation" value="true"/>
<param name="use_tf_pose_start_estimate" value="false"/>
<!-- Map size / start point -->
<param name="map_resolution" value="0.05"/>
<param name="map_size" value="2048"/>
<param name="map_start_x" value="0.5"/>
<param name="map_start_y" value="0.5" />
<param name="laser_z_min_value" value = "-1.0" />
<param name="laser_z_max_value" value = "1.0" />
<param name="map_multi_res_levels" value="2" />
<param name="map_pub_period" value="2" />
<param name="laser_min_dist" value="0.4" />
<param name="laser_max_dist" value="5.5" />
<param name="output_timing" value="false" />
<param name="pub_map_scanmatch_transform" value="true" />
<!--<param name="tf_map_scanmatch_transform_frame_name" value="scanmatcher_frame" />-->
<!-- Map update parameters -->
<param name="update_factor_free" value="0.4"/>
<param name="update_factor_occupied" value="0.7" />
<param name="map_update_distance_thresh" value="0.2"/>
<param name="map_update_angle_thresh" value="0.06" />
<!-- Advertising config -->
<param name="advertise_map_service" value="true"/>
<param name="scan_subscriber_queue_size" value="5"/>
<param name="scan_topic" value="scan"/>
</node>
<node pkg="tf" type="static_transform_publisher" name="base_to_laser_broadcaster" args="0 0 0 0 0 0 /base_link /laser 100"/>
<node pkg="rviz" type="rviz" name="rviz"
args="-d $(find hector_slam_launch)/rviz_cfg/mapping_demo.rviz"/>
</launch>
按Ctrl+s保存文件并退出,运行:
$ roslaunch rplidar_ros rplidar.launch
当雷达转起来之后。
再打开一个新的terminal,输入命令以测试Hectormapping建图:
$ roslaunch rplidar_ros hector_mapping_demo.launch
成功观察到如图所示:
使用Cartographer算法建图测试
cartographer是Google的实时室内建图项目,传感器安装在背包上面,可以生成分辨率为5cm的2D格网地图。
获得的每一帧laser scan数据,利用scan match在最佳估计位置处插入子图(submap)中,且scan matching只跟当前submap有关。在生成一个submap后,会进行一次局部的回环(loop close),利用分支定位和预先计算的网格,所有submap完成后,会进行全局的回环。
local 2D slam
A.scans
submap的构造是一个重复迭代配准scan和submap的过程。利用配准估算出pose对scan进行刚体变换,插入到submap中。
B.submaps
连续的scan用来构造submap,这里submap以概率格网的形式表现。每一个scan,在插入格网(submap)时,每一个grid有hits和miss两种情况。离scan终点最近的grid为hits,在scan原点和终点之间相交的grid为miss。之前未观察的grid分配一个概率,已观察的grid进行概率更新。
C.Ceres scan matching
把求pose的问题转换为一个求解非线性最小二乘问题,利用Ceres解决这个问题。
因为最小二乘问题是一个局部最优问题,故一个好的初值(pose初值)对求解有很大影响。因此IMU能被用来提供pose初值的旋转变量。在缺乏IMU的时候,可以用提高scan match频率或匹配精度。
closing loops
利用SPA方法优化scan和submap的pose。存储插入scan位置处对应的pose用来做回环检测。此外,当submap不在变化时,对应pose的scan和submap也被用来做回环。scan match中找到的good match其对应的pose将被用来做优化问题。
A.Optimization problem
回环优化问题构造成非线性最小二乘问题,来求解。
公式中分别为submap的pose,scan的pose,对应submap和scan的pose的相关性,及相关协方差矩阵.
Cartographer安装
-
安装全部依赖项
-
安装ceres solver
-
安装cartographer
- 安装cartographer_ros
-
安装cartographer
-
安装ceres solver
安装必要依赖项及SDK
$ sudo apt-get update
1.开始安装依赖
$ sudo apt-get install -y cmake g++ git google-mock libboost-all-dev libeigen3-dev libgflags-dev libgoogle-glog-dev liblua5.2-dev libprotobuf-dev libsuitesparse-dev libwebp-dev ninja-build protobuf-compiler python-sphinx ros-kinetic-tf2-eigen libatlas-base-dev libsuitesparse-dev liblapack-dev
2.安装ceres_solver
$cd ~/Documents
$ git clone https://github.com/BlueWhaleRobot/ceres-solver.git
$ cd ceres-solver
$ mkdir build
$ cd build
$ cmake …
$ make -j
$ sudo make install
3.安装cartographer开发工具包
$cd ~/Documents
$ git clone https://github.com/BlueWhaleRobot/cartographer.git
$ cd cartographer
$ mkdir build
$ cd build
$ cmake …
$ make -j
$ sudo make install
有的教程说需要安装prtobuf 3.0,测试不需要安装,还是贴上步骤:
4.安装prtobuf 3.0
$ cd ~/Documents
$ git clone https://github.com/google/protobuf.git
$ cd protobuf
$ git checkout 3.6.x
$ mkdir build
$ cd build
$ cmake \ -DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DCMAKE_BUILD_TYPE=Release
-Dprotobuf_BUILD_TESTS=OFF
…/cmake
$ make -j 2
$ sudo make install
全部安装完成之后,进入ros工作空间
$ sudo apt-get update
$ sudo apt-get install -y python-wstool python-rosdep ninja-build
$ cd catkin_ws (此处为你的ros工作空间)
$ wstool init src
$ cd src/
$ git clone https://github.com/hitcm/cartographer_ros.git (博主一直没能下到正确的,导致catkin_make安装失败,这个是不会报错的版本)
$ cd …
$ catkin_make
5.安装成功后,编译一下:
catkin_make_isolated --install --use-ninja
从未source过setup文件的需要添加:
$ cd
$ gedit ~/.bashrc
打开gedit窗口后在末尾添加: source ~/catkin_ws/devel/setup.bash
注意不可同时source多个路径
6.修改demo_revo_lds.launch文件
<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="rviz" pkg="rviz" type="rviz" required="true"
args="-d $(find cartographer_ros)/configuration_files/demo_2d.rviz" />
</launch>
7.修改revo_lds.lua文件:
options = {
map_builder = MAP_BUILDER,
sensor_bridge = {
horizontal_laser_min_range = 0.3,
horizontal_laser_max_range = 8,
horizontal_laser_missing_echo_ray_length = 1.2,
constant_odometry_translational_variance = 0.,
constant_odometry_rotational_variance = 0.,
},
map_frame = "map",
tracking_frame = "laser",
published_frame = "laser",
odom_frame = "odom",
provide_odom_frame = true,
use_odometry_data = false,
use_constant_odometry_variance = true,
constant_odometry_translational_variance = 1e-2,
constant_odometry_rotational_variance = 1e-1,
use_horizontal_laser = true,
use_horizontal_multi_echo_laser = false,
horizontal_laser_min_range = 0.1,
horizontal_laser_max_range = 30.,
horizontal_laser_missing_echo_ray_length = 5.,
num_lasers_3d = 0,
lookup_transform_timeout_sec = 0.2,
submap_publish_period_sec = 0.3,
pose_publish_period_sec = 5e-3,
}
MAP_BUILDER.use_trajectory_builder_2d = true
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
SPARSE_POSE_GRAPH.optimization_problem.huber_scale = 1e2
return options
修改好文件之后,重新编译一下:
$ cd
$ cd catkin_ws/
$ catkin_make_isolated --install --use-ninja
运行,测试Cartographer建图
$ roslaunch rplidar_ros rplidar.launch
$ roslaunch cartographer_ros demo_revo_lds.launch
如果出现以下报错,即为demo_revo_lds.launch文件中bag节点忘记删除:
若出现catkin_make失败即为下载的Cartographer_ros包不对。
若出现 cannot load < Cartographer Node>即需进入catkin_ws中的build文件夹中,全部删除后,重新编译
过程中出的问题很多很杂,博主这里就不截图了,有什么问题可以留言。成功运行后: