4.4.2 定位节点基本操作

1.准备工作

请先调用如下指令在工作空间的src目录下创建一个功能包:

ros2 pkg create mycar_localization --dependencies nav2_amcl mycar_map_server

2.编写launch文件与参数文件

在功能包下,新建launch和params文件夹,在launch目录下新建名为mycar_loca.launch.py的文件,并输入如下内容:

import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource

def generate_launch_description():
    amcl_yaml = os.path.join(get_package_share_directory('mycar_localization'),
        'params', 'amcl.yaml')
    amcl_node = Node(
        package='nav2_amcl',
        executable='amcl',
        name='amcl',
        output='screen',
        parameters=[amcl_yaml]
    )
    manager_localization_node = Node(
        package='nav2_lifecycle_manager',
        executable='lifecycle_manager',
        name='lifecycle_manager_localization',
        output='screen',
        parameters=[{'use_sim_time': True},
            {'autostart': True},
            {'node_names': ['amcl']}]
    )
    map_server_launch = IncludeLaunchDescription(
        launch_description_source=PythonLaunchDescriptionSource(
            launch_file_path=([get_package_share_directory("mycar_map_server"),"/launch/map_server.launch.py"])
        )
    )
    return LaunchDescription([amcl_node,manager_localization_node,map_server_launch])

在上述代码中,创建了amcl节点,并从params目录加载了名为amcl.yaml的配置文件,且由于amcl也是拥有生命周期的节点,所以将其添加进了生命周期管理器。最后,定位必须依赖于地图信息,因此又包含了 4.3.6 地图读取基本操作中的launch文件,以加载地图。

在params目录下新建名为amcl.yaml的文件,并输入如下内容:

/**:
  ros__parameters:
    use_sim_time: True
    alpha1: 0.2
    alpha2: 0.2
    alpha3: 0.2
    alpha4: 0.2
    alpha5: 0.2
    base_frame_id: "base_link"
    beam_skip_distance: 0.5
    beam_skip_error_threshold: 0.9
    beam_skip_threshold: 0.3
    do_beamskip: false
    global_frame_id: "map"
    lambda_short: 0.1
    laser_likelihood_max_dist: 2.0
    laser_max_range: 100.0
    laser_min_range: -1.0
    laser_model_type: "likelihood_field"
    max_beams: 60
    max_particles: 2000
    min_particles: 500
    odom_frame_id: "odom"
    pf_err: 0.05
    pf_z: 0.99
    recovery_alpha_fast: 0.0
    recovery_alpha_slow: 0.0
    resample_interval: 1
    robot_model_type: "nav2_amcl::DifferentialMotionModel"
    save_pose_rate: 0.5
    sigma_hit: 0.2
    tf_broadcast: true
    transform_tolerance: 2.0
    update_min_a: 0.2
    update_min_d: 0.25
    z_hit: 0.5
    z_max: 0.05
    z_rand: 0.5
    z_short: 0.05
    scan_topic: scan
    set_initial_pose: false

关于参数的具体含义,可以参考4.4.1 定位节点说明中参数相关内容。

3.编辑配置文件

打开CMakeLists.txt 并输入如下内容:

install(DIRECTORY launch params
  DESTINATION share/${PROJECT_NAME}
)

4.编译

终端中进入当前工作空间,编译功能包:

colcon build --packages-select mycar_local

5.执行

(1)请先调用如下指令启动仿真环境:

. install/setup.bash
ros2 launch stage_ros2 my_house.launch.py

(2)然后在终端下进入当前工作空间,输入如下指令:

. install/setup.bash
ros2 launch mycar_localization mycar_loca.launch.py

(3)启动键盘控制节点以作备用:

ros2 run teleop_twist_keyboard teleop_twist_keyboard

(4)在rviz2中,将Fixed Frme设置为map,添加TF插件,按照 4.3.6 地图读取基本操作 添加并显示地图。

接下来,点击rviz2菜单栏的2D Pose Estimate在地图中为机器人设置一个初始位姿。

再添加ParticleCloud插件,将话题设置为/particle_cloud,并将话题下Reliability Policy设置为Best Effort,最后使用键盘控制机器人运动时,会发现,机器人周边会出现点云,并且随着机器人的运动,点云会出现不同程度的收敛或发散。

results matching ""

    No results matching ""