Welcome to MicroROS-Pi5 repository
当製品の日本語版マニュアル資料は、こちらからご取得ください。
5. Gmapping mapping
Gmapping mapping
Note: The ROS_DOMAIN_ID of the Raspberry Pi and the microROS control board need to be consistent. You can check [MicroROS Control Board Parameter Configuration] to set the microROS control board ROS_DOMAIN_ID. Check the tutorial [Connect MicroROS Agent] to determine whether the IDs are consistent.
1、Introduction
gmapping is only suitable for points with a single frame two-dimensional laser point count less than 1440, if the number of laser points in a single frame is greater than 1440, then there will be such a problem as [mapping-4] process has died.
Gmapping is a commonly used open source SLAM algorithm based on filtering SLAM frameworks.
Based on the RBpf particle filter algorithm, Gmapping separates the real-time localization and mapping process, and locates before mapping.
Gmapping makes two major improvements to the RBpf algorithm: improved proposed distribution and selective resampling.
Advantages: Gmapping can build indoor maps in real time, which requires less computation and high accuracy in building small scene maps.
Cons: The number of particles required increases as the scene grows, as each particle carries a map, hence the memory required to build a large map
The amount of computation increases. Therefore, it is not suitable for building large scene maps. And there is no loopback detection, so it may cause a map when the loopback is closed
Dislocation, although increasing the number of particles can close the map, but at the cost of increased computation and memory.

!
2、Program function description
Connect the car to the agent and run the program. The mapping interface will be displayed in rviz. Use the keyboard or handle to control the movement of the car until the map is completed. Then run the save map command to save the map.
3、Query car information
3.1、Start and connect to the agent
After the Raspberry Pi is successfully powered on, open the terminal and enter the following command to open the agent.
sh ~/start_agent_rpi5.sh

Press the reset button on the microROS control board and wait for the car to connect to the agent. The connection is successful as shown in the figure below.

3.2、Enter the car docker
Open another terminal and enter the following command to enter docker.
xxxxxxxxxxsh ros2_humble.sh
When the following interface appears, you have successfully entered docker. Now you can control the car through commands.

4、starting program
First, start the car to process the underlying data program, and enter the following command in the terminal.
xxxxxxxxxxros2 launch yahboomcar_bringup yahboomcar_bringup_launch.py

Then enter the following command in the terminal to start rviz for visual mapping.
xxxxxxxxxxros2 launch yahboomcar_nav display_launch.py

The mapping node has not been run yet, so there is no data. Next, run the mapping node and enter the following command in the terminal
xxxxxxxxxxros2 launch yahboomcar_nav map_gmapping_launch.py

Then run handle control or keyboard control, choose one of the two, and enter the following command in the terminal.
x
#keyboardros2 run yahboomcar_ctrl yahboom_keyboard#handleros2 run yahboomcar_ctrl yahboom_joyros2 run joy joy_nodeThen control the car and slowly walk through the area that needs to be mapped. After the map is completed, enter the following command to save the map, and enter the following command on the terminal.

xxxxxxxxxxros2 launch yahboomcar_nav save_map_launch.py
A map named yahboom_map will be saved. This map is saved in .
xxxxxxxxxx/root/yahboomcar_ws/src/yahboomcar_nav/maps
Two files will be generated, one is yahboom_map.pgm and the other is yahboom_map.yaml. Take a look at the content of yaml.
xxxxxxxxxximage: yahboom_map.pgmmode: trinaryresolution: 0.05origin: [-10, -10, 0]negate: 0occupied_thresh: 0.65free_thresh: 0.25
image:The picture representing the map, that is, yahboom_map.pgm
mode:
This attribute can be one of trinary, scale, or raw, depending on the mode selected, trinary mode is the default mode
Resolution: The resolution of the map, meters per pixel
resolution:The resolution of the map, meters per pixel
origin:2D pose (x,y,yaw) in the lower left corner of the map, where yaw is rotated counterclockwise (yaw=0 means no rotation). Many parts of the system today ignore the YAW value.
negate:whether to reverse the meaning of white/black, free/occupy (the interpretation of the threshold is not affected)
occupied_thresh:Pixels with a probability of occupancy greater than this threshold are considered fully occupied.
free_thresh:Pixels with a probability of occupancy less than this threshold are considered completely free.
5、View node communication diagram
Enter the following command in the terminal
xxxxxxxxxxros2 run rqt_graph rqt_graph

If it is not displayed at first, select [Nodes/Topics(all)], and then click the refresh button in the upper left corner
6、View TF tree
Enter the following command in the terminal.
xxxxxxxxxxros2 run tf2_tools view_frames

After the operation is completed, two files will be generated in the terminal directory, namely .gv and .pdf files. The pdf file is the TF tree.

7、Code analysis
Here we only describe map_gmapping_launch.py for mapping. The path to this file is as follows.
xxxxxxxxxx/root/yahboomcar_ws/src/yahboomcar_nav/launch
map_gmapping_launch.py
xfrom launch import LaunchDescriptionfrom launch_ros.actions import Nodeimport osfrom launch.actions import IncludeLaunchDescriptionfrom launch.launch_description_sources import PythonLaunchDescriptionSourcefrom ament_index_python.packages import get_package_share_directorydef generate_launch_description():slam_gmapping_launch = IncludeLaunchDescription(PythonLaunchDescriptionSource([os.path.join(get_package_share_directory('slam_gmapping'), 'launch'),'/slam_gmapping.launch.py']))base_link_to_laser_tf_node = Node(package='tf2_ros',executable='static_transform_publisher',name='base_link_to_base_laser',arguments=['-0.0046412', '0' , '0.094079','0','0','0','base_link','laser_frame'])return LaunchDescription([slam_gmapping_launch,base_link_to_laser_tf_node])
A launch file-slam_gmapping_launch and a node for publishing static transformation-base_link_to_laser_tf_node are started here. The slam_gmapping_launch file is as follows, you can go into the system to view the code
xxxxxxxxxx/root/gmapping_ws/src/slam_gmapping/launch
slam_gmapping.launch.py,
xxxxxxxxxxfrom launch import LaunchDescriptionfrom launch.substitutions import EnvironmentVariableimport launch.actionsimport launch_ros.actionsimport osfrom ament_index_python.packages import get_package_share_directorydef generate_launch_description():return LaunchDescription([launch_ros.actions.Node(package='slam_gmapping',executable='slam_gmapping',output='screen',parameters=[os.path.join(get_package_share_directory("slam_gmapping"), "params", "slam_gmapping.yaml")]),])
The slam_gmapping node is started here, and the slam_gmapping.yaml parameter file is loaded. The file is located (taking the supporting virtual machine as an example).
xxxxxxxxxx/root/gmapping_ws/src/slam_gmapping/params
slam_gmapping.yaml
xxxxxxxxxx/slam_gmapping: ros__parameters: angularUpdate: 0.5 astep: 0.05 base_frame: base_footprint map_frame: map odom_frame: odom delta: 0.05 iterations: 5 kernelSize: 1 lasamplerange: 0.005 lasamplestep: 0.005 linearUpdate: 1.0 llsamplerange: 0.01 llsamplestep: 0.01 lsigma: 0.075 lskip: 0 lstep: 0.05 map_update_interval: 5.0 maxRange: 6.0 maxUrange: 4.0 minimum_score: 0.0 occ_thresh: 0.25 ogain: 3.0 particles: 30 qos_overrides: /parameter_events: publisher: depth: 1000 durability: volatile history: keep_all reliability: reliable /tf: publisher: depth: 1000 durability: volatile history: keep_last reliability: reliable resampleThreshold: 0.5 sigma: 0.05 srr: 0.1 srt: 0.2 str: 0.1 stt: 0.2 temporalUpdate: 1.0 transform_publish_period: 0.05 use_sim_time: false xmax: 10.0 xmin: -10.0 ymax: 10.0 ymin: -10.0