How to build a map using slam_gmapping & amcl
Hi,
I want to build a map using slamgmapping algorithm with rplidar data. Now I could generate a good map with high quality when the rplidar is static, which I mean the map with clear boundary. However, when I move the rplidar with my hand, the boundary is not that smooth. I think the reason for this is the bad result of scan register when moving the rplidar. Since AMCL could estimate the location of rplidar, I want to use this information with slamgmapping to generate a map with good quality. Is it possible to get it? If yes, how?Thanks very much! :)
Asked by rosRabbit on 2015-09-07 04:28:20 UTC
Answers
While amcl
is a part of ROS, I might suggest you look at HectorSLAM instead. This requires no odometry for SLAM. But, keep in mind, there is no such thing as a perfect map in this field.
Asked by allenh1 on 2015-09-07 08:09:38 UTC
Comments
Hi, Thanks for replying. I know that Hector_slam could generate a map without odometry information. However, I still want to use slam_gmapping for its performance. Do you know how to combine AMCL with slam_gmapping? Thanks!
Asked by rosRabbit on 2015-09-08 00:29:09 UTC
@rosRabbit as far as I know, you can only use amcl
after your map is built, not while you are building it. As gmapping
relies on the odometry of your base and you do not have it, you should use HectorSlam
, as suggested by @allenh1, which can build fairly accurate maps only with laser scans.
Asked by Procópio on 2015-09-08 02:33:49 UTC
You need to first save your map after mapping with gmapping. And next you can use AMCL for robot pose estimation. example for save your map : http://wiki.ros.org/slam_gmapping/Tutorials/MappingFromLoggedData
after that process, you can use amcl launch file as add your map (with your map name) in launch file.
BUT you need to laser_scan_matcher again with amcl for good odometry
<node name="map_server" pkg="map_server" type="map_server" args="$(find rover_map)/launch/amcl_map.yaml" />
<node pkg="amcl" type="amcl" name="amcl" output="screen">
<launch>
<arg name="use_map_topic" default="true"/>
<arg name="initial_pose_x" default="0.0"/>
<arg name="initial_pose_y" default="0.0"/>
<arg name="initial_pose_a" default="0.0"/>
<param name="odom_frame_id" value="odom_combined"/>
<param name="base_frame_id" value="base_footprint"/>
<param name="global_frame_id" value="map"/>
<param name="odom_model_type" value="diff"/>
<param name="transform_tolerance" value="0.5" />
<param name="gui_publish_rate" value="10.0"/> <!-- 5 -->
<param name="laser_max_beams" value="80"/> <!-- 30 -->
<param name="min_particles" value="100"/>
<param name="max_particles" value="4000"/>
<param name="kld_err" value="0.05"/>
<param name="kld_z" value="0.99"/>
<param name="odom_alpha1" value="0.02"/> <!-- 0.2 -->
<param name="odom_alpha2" value="0.07"/> <!-- 0.2 -->
<!-- translation std dev, m -->
<param name="odom_alpha3" value="0.08"/> <!-- 0.8 -->
<param name="odom_alpha4" value="0.02"/> <!-- 0.2 -->
<param name="laser_max_range" value="5.6"/>
<param name="laser_z_hit" value="0.95"/>
<param name="laser_z_short" value="0.1"/>
<param name="laser_z_max" value="0.05"/>
<param name="laser_z_rand" value="0.05"/>
<param name="laser_sigma_hit" value="0.2"/>
<param name="laser_lambda_short" value="0.1"/>
<param name="laser_lambda_short" value="0.1"/>
<param name="laser_model_type" value="likelihood_field"/>
<!-- <param name="laser_model_type" value="beam"/> -->
<param name="laser_likelihood_max_dist" value="2.0"/>
<param name="update_min_d" value="0.08"/> <!-- 0.2 **0.15-->
<param name="update_min_a" value="0.18"/> <!-- 0.5 **0.12-->
<param name="resample_interval" value="1"/>
<param name="transform_tolerance" value="0.1"/> <!-- 0.1 -->
<param name="recovery_alpha_slow" value="0.0"/>
<param name="recovery_alpha_fast" value="0.0"/>
<param name="initial_pose_x" value="$(arg initial_pose_x)"/>
<param name="initial_pose_y" value="$(arg initial_pose_y)"/>
<param name="initial_pose_a" value="$(arg initial_pose_a)"/>
<param name="use_map_topic" value="$(arg use_map_topic)"/>
</node>
</launch>
Asked by osmancns on 2015-09-08 02:51:59 UTC
Comments
Hi!
So AMCL is going to provide a pose? Can I use hector_slam to provide AMCL with the odometry information instead of laser_scan_matcher? Therefore it would have two separated occupancyGrid topics, one with the known map, used by AMCL and one with the map created by hector_slam. The main advance of that as compared to hector_slam alone is that my path planning algorithm can leverage on the awareness of the map for more efficiency. Thanks for your help!
Asked by quentin on 2015-11-30 21:09:31 UTC
Comments