机器人编程趣味实践16-同步定位与地图构建(SLAM)

举报
zhangrelay 发表于 2021/07/14 22:37:29 2021/07/14
【摘要】 360度激光用于避障,那怎么可以,完全是大材小用啊…… 在 Gazebo 模拟器中进行 SLAM 时,可以在虚拟世界中选择或创建各种环境和机器人模型。SLAM 模拟与实际 TurtleBot3 的 SLAM 非常相似。 通过三维环境的键盘遥控和自主避障行驶,已经充分掌握基本使用,下面进入SLAM环节。 效果如下图所示: 本文不含SLAM算法细节,后续博客更新。 ...

360度激光用于避障,那怎么可以,完全是大材小用啊……

在 Gazebo 模拟器中进行 SLAM 时,可以在虚拟世界中选择或创建各种环境和机器人模型。SLAM 模拟与实际 TurtleBot3 的 SLAM 非常相似。

通过三维环境的键盘遥控和自主避障行驶,已经充分掌握基本使用,下面进入SLAM环节。

效果如下图所示:

本文不含SLAM算法细节,后续博客更新。

基于地图的更酷炫应用可以参考下文:

启动模拟世界

准备了三个 Gazebo 环境,但要使用 SLAM 创建地图,建议使用 TurtleBot3 World 或 TurtleBot3 House。
使用以下命令之一加载 Gazebo 环境。在本指令中,将使用 TurtleBot3 World。
请在 burger、waffle、waffle_pi 中为 TURTLEBOT3_MODEL 参数使用正确的关键字。

  • 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

如上二选一即可。

运行 SLAM 节点

使用 Ctrl + Alt + T 从远程 PC 打开一个新终端并运行 SLAM 节点。 默认情况下使用 Cartographer SLAM 方法。

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

运行自主避障节点

使用 Ctrl + Alt + T 从远程 PC 打开一个新终端,然后从 PC 运行drive节点。

  •  ros2 run turtlebot3_gazebo turtlebot3_drive

运行遥控操作节点

使用 Ctrl + Alt + T 从远程 PC 打开一个新终端,然后从远程 PC 运行远程操作节点。

  • ros2 run turtlebot3_teleop teleop_keyboard

保存地图

成功创建地图后,使用 Ctrl + Alt + T 从远程 PC 打开一个新终端并保存地图。

  • ros2 run nav2_map_server map_saver_cli -f ~/map

cartographer.launch


  
  1. import os
  2. from ament_index_python.packages import get_package_share_directory
  3. from launch import LaunchDescription
  4. from launch.actions import DeclareLaunchArgument
  5. from launch_ros.actions import Node
  6. from launch.substitutions import LaunchConfiguration
  7. from launch.actions import IncludeLaunchDescription
  8. from launch.launch_description_sources import PythonLaunchDescriptionSource
  9. from launch.substitutions import ThisLaunchFileDir
  10. def generate_launch_description():
  11. use_sim_time = LaunchConfiguration('use_sim_time', default='false')
  12. turtlebot3_cartographer_prefix = get_package_share_directory('turtlebot3_cartographer')
  13. cartographer_config_dir = LaunchConfiguration('cartographer_config_dir', default=os.path.join(
  14. turtlebot3_cartographer_prefix, 'config'))
  15. configuration_basename = LaunchConfiguration('configuration_basename',
  16. default='turtlebot3_lds_2d.lua')
  17. resolution = LaunchConfiguration('resolution', default='0.05')
  18. publish_period_sec = LaunchConfiguration('publish_period_sec', default='1.0')
  19. rviz_config_dir = os.path.join(get_package_share_directory('turtlebot3_cartographer'),
  20. 'rviz', 'tb3_cartographer.rviz')
  21. return LaunchDescription([
  22. DeclareLaunchArgument(
  23. 'cartographer_config_dir',
  24. default_value=cartographer_config_dir,
  25. description='Full path to config file to load'),
  26. DeclareLaunchArgument(
  27. 'configuration_basename',
  28. default_value=configuration_basename,
  29. description='Name of lua file for cartographer'),
  30. DeclareLaunchArgument(
  31. 'use_sim_time',
  32. default_value='false',
  33. description='Use simulation (Gazebo) clock if true'),
  34. Node(
  35. package='cartographer_ros',
  36. executable='cartographer_node',
  37. name='cartographer_node',
  38. output='screen',
  39. parameters=[{'use_sim_time': use_sim_time}],
  40. arguments=['-configuration_directory', cartographer_config_dir,
  41. '-configuration_basename', configuration_basename]),
  42. DeclareLaunchArgument(
  43. 'resolution',
  44. default_value=resolution,
  45. description='Resolution of a grid cell in the published occupancy grid'),
  46. DeclareLaunchArgument(
  47. 'publish_period_sec',
  48. default_value=publish_period_sec,
  49. description='OccupancyGrid publishing period'),
  50. IncludeLaunchDescription(
  51. PythonLaunchDescriptionSource([ThisLaunchFileDir(), '/occupancy_grid.launch.py']),
  52. launch_arguments={'use_sim_time': use_sim_time, 'resolution': resolution,
  53. 'publish_period_sec': publish_period_sec}.items(),
  54. ),
  55. Node(
  56. package='rviz2',
  57. executable='rviz2',
  58. name='rviz2',
  59. arguments=['-d', rviz_config_dir],
  60. parameters=[{'use_sim_time': use_sim_time}],
  61. output='screen'),
  62. ])

 配置文件lua


  
  1. include "map_builder.lua"
  2. include "trajectory_builder.lua"
  3. options = {
  4. map_builder = MAP_BUILDER,
  5. trajectory_builder = TRAJECTORY_BUILDER,
  6. map_frame = "map",
  7. tracking_frame = "imu_link",
  8. published_frame = "odom",
  9. odom_frame = "odom",
  10. provide_odom_frame = false,
  11. publish_frame_projected_to_2d = true,
  12. use_odometry = true,
  13. use_nav_sat = false,
  14. use_landmarks = false,
  15. num_laser_scans = 1,
  16. num_multi_echo_laser_scans = 0,
  17. num_subdivisions_per_laser_scan = 1,
  18. num_point_clouds = 0,
  19. lookup_transform_timeout_sec = 0.2,
  20. submap_publish_period_sec = 0.3,
  21. pose_publish_period_sec = 5e-3,
  22. trajectory_publish_period_sec = 30e-3,
  23. rangefinder_sampling_ratio = 1.,
  24. odometry_sampling_ratio = 1.,
  25. fixed_frame_pose_sampling_ratio = 1.,
  26. imu_sampling_ratio = 1.,
  27. landmarks_sampling_ratio = 1.,
  28. }
  29. MAP_BUILDER.use_trajectory_builder_2d = true
  30. TRAJECTORY_BUILDER_2D.min_range = 0.12
  31. TRAJECTORY_BUILDER_2D.max_range = 3.5
  32. TRAJECTORY_BUILDER_2D.missing_data_ray_length = 3.
  33. TRAJECTORY_BUILDER_2D.use_imu_data = false
  34. TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
  35. TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1)
  36. POSE_GRAPH.constraint_builder.min_score = 0.65
  37. POSE_GRAPH.constraint_builder.global_localization_min_score = 0.7
  38. -- POSE_GRAPH.optimize_every_n_nodes = 0
  39. return options

 

文章来源: zhangrelay.blog.csdn.net,作者:zhangrelay,版权归原作者所有,如需转载,请联系作者。

原文链接:zhangrelay.blog.csdn.net/article/details/117665058

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。