当前位置:网站首页>Interesting practice of robot programming 16 synchronous positioning and map building (SLAM)

Interesting practice of robot programming 16 synchronous positioning and map building (SLAM)

2022-07-05 01:28:00 zhangrelay


360 Laser is used to avoid obstacles , How can that be? , It's totally overqualified ……

stay Gazebo In the simulator SLAM when , Various environments and robot models can be selected or created in the virtual world .SLAM Simulation and Practice TurtleBot3 Of SLAM Very similar .

Through the three-dimensional environment of the keyboard remote control and autonomous obstacle avoidance driving , Have fully mastered the basic use of , Next entry SLAM link .

The effect is shown below :

 Interesting practice of robot programming 16- Synchronous positioning and map building (SLAM)_ Synchronous positioning and map building

This article does not contain SLAM Algorithm details , Follow up blog updates .

For more cool applications based on maps, please refer to the following :

 Interesting practice of robot programming 16- Synchronous positioning and map building (SLAM)_ Interesting practice _02

 Interesting practice of robot programming 16- Synchronous positioning and map building (SLAM)_ Interesting practice _03

Start the simulation world

There are three Gazebo Environmental Science , But to use SLAM Create map , It is recommended to use TurtleBot3 World or TurtleBot3 House.

Use one of the following commands to load Gazebo Environmental Science . In this directive , Will use TurtleBot3 World.

Please be there. burger、waffle、waffle_pi In Chinese, it means TURTLEBOT3_MODEL Parameters use the correct keywords .


  • world
  • $ export TURTLEBOT3_MODEL=burger
    $ ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
  • house
  • $ export TURTLEBOT3_MODEL=burger
    $ ros2 launch turtlebot3_gazebo turtlebot3_house.launch.py

Choose one of the two above .

function SLAM node

Use Ctrl + Alt + T From remote PC Open a new terminal and run SLAM node . By default Cartographer SLAM Method .

  • $ export TURTLEBOT3_MODEL=burger
    $ ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True

Run the autonomous obstacle avoidance node

Use Ctrl + Alt + T From remote PC Open a new terminal , And then from PC function drive node .

  •  ros2 run turtlebot3_gazebo turtlebot3_drive

 Interesting practice of robot programming 16- Synchronous positioning and map building (SLAM)_ Robot programming _04


Run the remote control operation node

Use Ctrl + Alt + T From remote PC Open a new terminal , And then from the remote PC Run the remote operation node .

  • ros2 run turtlebot3_teleop teleop_keyboard


Save the map

After successfully creating the map , Use Ctrl + Alt + T From remote PC Open a new terminal and save the map .

  • ros2 run nav2_map_server map_saver_cli -f ~/map

 Interesting practice of robot programming 16- Synchronous positioning and map building (SLAM)_ Robot programming _05

 Interesting practice of robot programming 16- Synchronous positioning and map building (SLAM)_ Synchronous positioning and map building _06

cartographer.launch

       
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch_ros.actions import Node
from launch.substitutions import LaunchConfiguration
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import ThisLaunchFileDir


def generate_launch_description():
use_sim_time = LaunchConfiguration('use_sim_time', default='false')
turtlebot3_cartographer_prefix = get_package_share_directory('turtlebot3_cartographer')
cartographer_config_dir = LaunchConfiguration('cartographer_config_dir', default=os.path.join(
turtlebot3_cartographer_prefix, 'config'))
configuration_basename = LaunchConfiguration('configuration_basename',
default='turtlebot3_lds_2d.lua')

resolution = LaunchConfiguration('resolution', default='0.05')
publish_period_sec = LaunchConfiguration('publish_period_sec', default='1.0')

rviz_config_dir = os.path.join(get_package_share_directory('turtlebot3_cartographer'),
'rviz', 'tb3_cartographer.rviz')

return LaunchDescription([
DeclareLaunchArgument(
'cartographer_config_dir',
default_value=cartographer_config_dir,
description='Full path to config file to load'),
DeclareLaunchArgument(
'configuration_basename',
default_value=configuration_basename,
description='Name of lua file for cartographer'),
DeclareLaunchArgument(
'use_sim_time',
default_value='false',
description='Use simulation (Gazebo) clock if true'),

Node(
package='cartographer_ros',
executable='cartographer_node',
name='cartographer_node',
output='screen',
parameters=[{'use_sim_time': use_sim_time}],
arguments=['-configuration_directory', cartographer_config_dir,
'-configuration_basename', configuration_basename]),

DeclareLaunchArgument(
'resolution',
default_value=resolution,
description='Resolution of a grid cell in the published occupancy grid'),

DeclareLaunchArgument(
'publish_period_sec',
default_value=publish_period_sec,
description='OccupancyGrid publishing period'),

IncludeLaunchDescription(
PythonLaunchDescriptionSource([ThisLaunchFileDir(), '/occupancy_grid.launch.py']),
launch_arguments={'use_sim_time': use_sim_time, 'resolution': resolution,
'publish_period_sec': publish_period_sec}.items(),
),

Node(
package='rviz2',
executable='rviz2',
name='rviz2',
arguments=['-d', rviz_config_dir],
parameters=[{'use_sim_time': use_sim_time}],
output='screen'),
])
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.

  The configuration file lua

       
include "map_builder.lua"
include "trajectory_builder.lua"

options = {
map_builder = MAP_BUILDER,
trajectory_builder = TRAJECTORY_BUILDER,
map_frame = "map",
tracking_frame = "imu_link",
published_frame = "odom",
odom_frame = "odom",
provide_odom_frame = false,
publish_frame_projected_to_2d = true,
use_odometry = true,
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.min_range = 0.12
TRAJECTORY_BUILDER_2D.max_range = 3.5
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 3.
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1)

POSE_GRAPH.constraint_builder.min_score = 0.65
POSE_GRAPH.constraint_builder.global_localization_min_score = 0.7

-- POSE_GRAPH.optimize_every_n_nodes = 0

return options
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.



原网站

版权声明
本文为[zhangrelay]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202141027397065.html