1 概述
2 安装
1
| sudo apt install ros-jazzy-slam-toolbox -y
|
2.2 安装 nav2
1 2 3
| sudo apt install ros-jazzy-nav2-map-server sudo apt install ros-jazzy-navigation2 sudo apt install ros-jazzy-nav2-bringup
|
3 使用
3.1 建图
Terminal 1 使用.
1 2
| ros2 launch robot_pkg robot.launch.py
|
Terminal 2 使用.
1
| ros2 launch slam_toolbox online_async_launch.py
|
Terminal 3 使用.
之后在地图中移动机器人进行建图.
Terminal 4 使用.
然后创建新的功能包, 这里命名为 robot_nav2 保存地图, 在其目录下创建 maps 目录, 进入目录.
1 2
| ros2 run nav2_map_server map_saver_cli -f room
|
之后生成了
其中 .pgm.

其中 .yaml.
room.yaml 字段说明
1 2 3 4 5 6 7
| image: room.pgm mode: trinary resolution: 0.05 origin: [-5.97, -4.95, 0] negate: 0 occupied_thresh: 0.65 free_thresh: 0.25
|
| 字段 |
示例值 |
含义 |
备注/常见取值 |
image |
room.pgm |
地图灰度图文件名 |
黑=占用,白=空闲,灰=未知 |
mode |
trinary |
地图读写模式 |
常见:trinary / scale / raw |
resolution |
0.05 |
分辨率(米/像素) |
每像素 0.05 m(5 cm/px) |
origin |
[-5.97, -4.95, 0] |
像素 (0,0) 的世界位姿 (x,y,yaw) |
(0,0) 在图像左下角;yaw 单位:弧度 |
negate |
0 |
是否反转黑白 |
0:黑占用/白空闲;1:相反 |
occupied_thresh |
0.65 |
判定为“占用”的阈值 |
主要影响非三值图(mode≠trinary) |
free_thresh |
0.25 |
判定为“空闲”的阈值 |
同上 |
附:常用公式(可选)
| 场景 |
公式/说明 |
灰度→占用概率(negate=0) |
p_occ = (255 - 灰度) / 255 |
| 占用/空闲判定 |
p_occ ≥ 0.65 占用;p_occ ≤ 0.25 空闲;介于两者为未知 |
地图覆盖范围(PGM 尺寸 W×H 像素) |
x ∈ [origin.x, origin.x + W*resolution];y ∈ [origin.y, origin.y + H*resolution] |
3.2 模拟导航
在功能包 robot_nav2 下创建 config 目录, 进入目录.
1
| cp /opt/ros/jazzy/share/nav2_bringup/params/nav2_params.yaml .
|
然后根据需要修改参数, 这里我们目前主要关注 robot_radius, inflation_radius, xy_goal_tolerance, yaw_goal_tolerance.
之后在 launch 目录下, 写入 launch 脚本.
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
| import os import launch import launch_ros from ament_index_python.packages import get_package_share_directory from launch.launch_description_sources import PythonLaunchDescriptionSource
def generate_launch_description(): robot_navigation2_dir = get_package_share_directory( 'robot_nav2') nav2_bringup_dir = get_package_share_directory('nav2_bringup') rviz_config_dir = os.path.join( nav2_bringup_dir, 'rviz', 'nav2_default_view.rviz') use_sim_time = launch.substitutions.LaunchConfiguration( 'use_sim_time', default='true') map_yaml_path = launch.substitutions.LaunchConfiguration( 'map', default=os.path.join(robot_navigation2_dir, 'maps', 'room.yaml')) nav2_param_path = launch.substitutions.LaunchConfiguration( 'params_file', default=os.path.join(robot_navigation2_dir, 'config', 'nav2_params.yaml'))
return launch.LaunchDescription([ launch.actions.DeclareLaunchArgument('use_sim_time', default_value=use_sim_time, description='Use simulation (Gazebo) clock if true'), launch.actions.DeclareLaunchArgument('map', default_value=map_yaml_path, description='Full path to map file to load'), launch.actions.DeclareLaunchArgument('params_file', default_value=nav2_param_path, description='Full path to param file to load'),
launch.actions.IncludeLaunchDescription( PythonLaunchDescriptionSource( [nav2_bringup_dir, '/launch', '/bringup_launch.py']), launch_arguments={ 'map': map_yaml_path, 'use_sim_time': use_sim_time, 'params_file': nav2_param_path}.items(), ), launch_ros.actions.Node( package='rviz2', executable='rviz2', name='rviz2', arguments=['-d', rviz_config_dir], parameters=[{'use_sim_time': use_sim_time}], output='screen'), ])
|
先启动机器人, 再启动该脚本.
单点导航.

多点导航.

3.3 导航应用开发
在 nav2 中, 机器人的位置信息是由 amcl 节点计算的.
我们可以查看节点的相关信息.
通过对 /initialpose 话题进行发布则可以设置机器人的初始位置.
通过对 navigate_to_pose 动作服务进行处理就可以控制机器人的单点导航.
通过对 follow_waypoints 动作服务进行处理就可以控制机器人的路点导航.
4 References