[Unitree GO2] Map Navigation not showing map

Hi, I have a problem with navigation. After saving the map and rebuilding the workspace, I want to start navigation.
So I started three nodes, one starts the laserscan node(which also enable the robot model to be seen, the tf between robot model and map is given) in go2 platform. The second starts map_navi.launch.py in go2_navigation and the third is a rviz. However the map is not shown in the visualization. How can I be sure the correct map is choosen? As is mentioned in the maual, if the map has been named something other, the parameters needs to be updated. But how and where should it be done? Because I have found nowhere in launch file and param file. Thanks a lot in advance!

This is the launch file for the maploading

https://github.com/MYBOTSHOP/qre_go2/blob/foxy-nvidia/src/mybotshop/go2_navigation/launch/include/localization.launch.py

Okay, but I have checked the map_navi.launch.py, which contains localization and navigation.launch.py.
But I have checked localization.launch.py and its param file nav2_localization.yaml and have found nowhere to change the map file name.
I have also found that the visualization can be started instead of rviz2 by ros2 launch go2_viz view_robot.launch.py

# Copyright (c) 2018 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import os

from ament_index_python.packages import get_package_share_directory

from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument, GroupAction, SetEnvironmentVariable
from launch.conditions import IfCondition
from launch.substitutions import LaunchConfiguration, PythonExpression
from launch_ros.actions import LoadComposableNodes
from launch_ros.actions import Node
from launch_ros.descriptions import ComposableNode, ParameterFile
from nav2_common.launch import RewrittenYaml


def generate_launch_description():

    namespace = LaunchConfiguration('namespace')
    map_yaml_file = LaunchConfiguration('map')
    map_2_yaml_file = LaunchConfiguration('map_2')
    use_sim_time = LaunchConfiguration('use_sim_time')
    autostart = LaunchConfiguration('autostart')
    params_file = LaunchConfiguration('params_file')
    use_composition = LaunchConfiguration('use_composition')
    container_name = LaunchConfiguration('container_name')
    container_name_full = (namespace, '/', container_name)

    lifecycle_nodes = ['map_server', 'map_server_2', 'amcl']

    remappings = [('/diagnostics', 'diagnostics'),
                  ('/tf', 'tf'),
                  ('/tf_static', 'tf_static'),
                  ('map', 'map'),
                  ('map_metadata', 'map_metadata')]

    # Create our own temporary YAML files that include substitutions
    param_substitutions = {
        'use_sim_time': use_sim_time,
        'yaml_filename': map_yaml_file}

    configured_params = ParameterFile(
        RewrittenYaml(
            source_file=params_file,
            root_key=namespace,
            param_rewrites=param_substitutions,
            convert_types=True),
        allow_substs=True)

    remappings_2 = [('diagnostics', 'diagnostics'),
                    ('tf', 'tf_obsolete'),
                    ('tf_static', 'tf_static_obsolete'),
                    ('map', 'map_2'),
                    ('map_metadata', 'map_2_metadata')]

    param_substitutions_map2 = {
        'use_sim_time': use_sim_time,
        'yaml_filename': map_2_yaml_file}

    configured_params_2 = ParameterFile(
        RewrittenYaml(
            source_file=params_file,
            root_key=namespace,
            param_rewrites=param_substitutions_map2,
            convert_types=True),
        allow_substs=True)

    stdout_linebuf_envvar = SetEnvironmentVariable(
        'RCUTILS_LOGGING_BUFFERED_STREAM', '1')

    declare_namespace_cmd = DeclareLaunchArgument(
        'namespace',
        default_value='',
        description='Top-level namespace')

    declare_map_yaml_cmd = DeclareLaunchArgument(
        'map',
        description='Full path to map yaml file to load')

    declare_map_2_yaml_cmd = DeclareLaunchArgument(
        'map_2',
        description='Full path to map yaml file to load')

    declare_use_sim_time_cmd = DeclareLaunchArgument(
        'use_sim_time',
        default_value='false',
        description='Use simulation (Gazebo) clock if true')

    declare_params_file_cmd = DeclareLaunchArgument(
        'params_file',
        default_value=os.path.join(get_package_share_directory('b2_nav2'),
                                   'param',
                                   'nav2_map.yaml'),
        description='Full path to the ROS2 parameters file to use for all launched nodes')

    declare_autostart_cmd = DeclareLaunchArgument(
        'autostart', default_value='true',
        description='Automatically startup the nav2 stack')

    declare_use_composition_cmd = DeclareLaunchArgument(
        'use_composition', default_value='False',
        description='Use composed bringup if True')

    declare_container_name_cmd = DeclareLaunchArgument(
        'container_name', default_value='nav2_container',
        description='the name of conatiner that nodes will load in if use composition')

    declare_use_respawn_cmd = DeclareLaunchArgument(
        'use_respawn', default_value='False',
        description='Whether to respawn if a node crashes. Applied when composition is disabled.')

    declare_log_level_cmd = DeclareLaunchArgument(
        'log_level', default_value='info',
        description='log level')

    load_composable_nodes = LoadComposableNodes(
        condition=IfCondition(use_composition),
        target_container=container_name_full,
        composable_node_descriptions=[
            ComposableNode(
                package='nav2_map_server',
                plugin='nav2_map_server::MapServer',
                name='map_server',
                parameters=[configured_params],
                remappings=remappings),
            ComposableNode(
                package='nav2_map_server',
                plugin='nav2_map_server::MapServer',
                name='map_server_2',
                parameters=[configured_params_2,
                            {'yaml_filename': map_2_yaml_file}],
                remappings=remappings_2),
            ComposableNode(
                package='nav2_amcl',
                plugin='nav2_amcl::AmclNode',
                name='amcl',
                parameters=[configured_params],
                remappings=remappings),
            ComposableNode(
                package='nav2_lifecycle_manager',
                plugin='nav2_lifecycle_manager::LifecycleManager',
                name='lifecycle_manager_localization',
                parameters=[{'use_sim_time': use_sim_time,
                             'autostart': autostart,
                             'node_names': lifecycle_nodes}]),
        ],
    )

    # Create the launch description and populate
    ld = LaunchDescription()

    # Set environment variables
    ld.add_action(stdout_linebuf_envvar)

    # Declare the launch options
    ld.add_action(declare_namespace_cmd)
    ld.add_action(declare_map_yaml_cmd)
    ld.add_action(declare_map_2_yaml_cmd)
    ld.add_action(declare_use_sim_time_cmd)
    ld.add_action(declare_params_file_cmd)
    ld.add_action(declare_autostart_cmd)
    ld.add_action(declare_use_composition_cmd)
    ld.add_action(declare_container_name_cmd)
    ld.add_action(declare_use_respawn_cmd)
    ld.add_action(declare_log_level_cmd)

    # Add the actions to launch all of the localiztion nodes
    ld.add_action(load_composable_nodes)

    return ld

An example of remapping the map

Thanks for your code. I have just checked with runnning map_navi.launch or both localization and navigation.launch. They will show in RViz with the Global Costmap, which are the darker purple lines. They are also the same as the map I have saved under /maps/custom_map.
The map is also called because

    'map',
    default_value=os.path.join(bringup_dir, 'maps', 'custom_map.yaml'),
)

there.

However in topic /map there is always no map published. And also the localization is not working. As far as I know about amcl, the robot position will calculate and move in the map until it gets the correct position. But here is not.


I will check your given code and test it.

For initial pose, it has to be namespaced in the rviz2 launch file otherwise it wont relocalize.

It will come in the namespaced one and once when first time loading as it is not continuously published.