鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    slam_toolbox

    已定时 已固定 已锁定 已移动
    仿真
    slamtoolbox 自动加载和保存 slam地图
    4
    4
    648
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • S
      sam-zzy
      最后由 编辑

      在ROS2下怎么用launch编程才能上次建好的地图自动导入到程序,然后用async_slam_toolbox_node继续建图,并在rviz2上完整显示上次建的地图和完整的跟新地图,然后自动保存建好的地图。

      1 条回复 最后回复 回复 引用 0
      • 小伊小
        机器人小伊
        最后由 编辑

        在ROS 2中使用slam_toolbox进行自动地图加载、继续建图、在rviz2中显示以及自动保存地图,可以通过编写一个合适的launch文件来实现。以下是一个详细的步骤和示例代码,假设你已经有一个预先建好的地图文件,并且已经安装了slam_toolbox和相关的ROS 2包。

        1. 安装和准备

        确保你已经安装了slam_toolbox和cartographer_ros2(或其他你选择的SLAM后端),以及rviz2。

        2. 编写Launch文件

        以下是一个示例launch文件(假设文件名为slam_toolbox_with_map.launch.py),它加载了上次建好的地图,启动async_slam_toolbox_node继续建图,并在rviz2中显示完整的地图和更新。同时,它也配置了自动保存地图的功能。

        import os
        from ament_index_python.packages import get_package_share_directory
        from launch import LaunchDescription
        from launch_ros.actions import Node
        import launch_ros.substitutions
        import yaml
        
        def generate_launch_description():
            # 获取包路径
            slam_toolbox_dir = get_package_share_directory('slam_toolbox')
            map_server_dir = get_package_share_directory('map_server')
            nav2_dir = get_package_share_directory('navigation2')
        
            # 地图文件路径(假设地图文件名为my_map.yaml)
            map_file = os.path.join(slam_toolbox_dir, 'maps', 'my_map.yaml')
            map_directory = os.path.dirname(map_file)
        
            # 读取地图配置
            with open(map_file, 'r') as f:
                map_yaml = yaml.safe_load(f)
                map_frame = map_yaml['frame_id']
                resolution = map_yaml['resolution']
                origin = map_yaml['origin']['position']['x'], map_yaml['origin']['position']['y'], map_yaml['origin']['orientation']['w']
        
            # 配置节点参数
            slam_toolbox_params = {
                'map_server_uri': 'file://' + map_file,
                'use_odometry': True,
                'use_landmarks': False,
                'map_frame': map_frame,
                'odom_frame': 'odom',
                'base_frame': 'base_link',
                'publish_frequency': 5.0,
                'occupancy_grid_topic': 'map',
                'scan_topic': 'scan',
                'odom_topic': 'odom',
                'initial_pose_x': 0.0,
                'initial_pose_y': 0.0,
                'initial_pose_theta': 0.0,
                'save_map_on_shutdown': True,
                'save_map_directory': slam_toolbox_dir + '/maps',
                'save_map_filename': 'updated_map.yaml'
            }
        
            # 配置RViz2
            rviz_config_file = os.path.join(nav2_dir, 'launch', 'nav2_default_view.rviz')
        
            return LaunchDescription([
                # 启动Map Server
                Node(
                    package='map_server',
                    executable='map_server',
                    name='map_server',
                    output='screen',
                    parameters=[
                        {'map_directory': map_directory},
                        {'yaml_filename': 'my_map.yaml'}
                    ]
                ),
        
                # 启动Async SLAM Toolbox
                Node(
                    package='slam_toolbox',
                    executable='async_slam_toolbox_node',
                    name='async_slam_toolbox_node',
                    output='screen',
                    parameters=[slam_toolbox_params]
                ),
        
                # 启动RViz2
                Node(
                    package='rviz2',
                    executable='rviz2',
                    name='rviz2',
                    output='screen',
                    arguments=['-d', rviz_config_file]
                )
            ])
        

        3. 运行Launch文件

        在终端中运行以下命令来启动launch文件:

        ros2 launch your_package_name slam_toolbox_with_map.launch.py
        

        将your_package_name替换为包含上述launch文件的ROS 2包的名称。

        4. 配置RViz2

        • 打开RViz2后,确保添加了Grid、RobotModel、LaserScan和Odometry等显示项。
        • 配置Grid的Topic为/map。
        • 确保其他显示项(如激光扫描和里程计)的Topic也正确配置。

        5. 自动保存地图

        在slam_toolbox_params中,已经配置了save_map_on_shutdown和save_map_directory及save_map_filename参数,这样当节点关闭时,会自动保存更新后的地图到指定目录。

        注意事项

        • 确保my_map.yaml文件路径和名称正确。
        • 确保所有依赖的ROS 2包都已正确安装。
        • 根据实际情况调整节点参数和路径。

        通过这个launch文件,你应该能够实现自动加载地图、继续建图、在RViz2中显示以及自动保存地图的功能。


        以上为生成回答,仅供参考~

        我是小伊,已接入ChatGpt,所有回复,仅供参考~

        1 4 2 条回复 最后回复 回复 引用 0
        • 1
          1117 年度VIP @小伊
          最后由 编辑

          @小伊 这个slam_toolbox用到的是什么算法?

          1 条回复 最后回复 回复 引用 0
          • 4
            417356935 @小伊
            最后由 编辑

            @小伊 ros1 noetic 版本如何实现基于pgm地图文件的增量建图呢, 看源码应该是不支持直接加载pgm格式的地图文件的

            1 条回复 最后回复 回复 引用 0
            • 第一个帖子
              最后一个帖子
            皖ICP备16016415号-7
            Powered by NodeBB | 鱼香ROS