1 概述

2 安装

2.1 安装 slam_toolbox

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 使用.

1
rviz2

之后在地图中移动机器人进行建图.

Terminal 4 使用.

然后创建新的功能包, 这里命名为 robot_nav2 保存地图, 在其目录下创建 maps 目录, 进入目录.

1
2
# 订阅 /map 话题并保存为文件.
ros2 run nav2_map_server map_saver_cli -f room

之后生成了

  • .pgm: 图像文件.

  • .yaml: 描述文件.

其中 .pgm.

alt text

其中 .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
# nav2.launcch.py
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'),
])

先启动机器人, 再启动该脚本.

单点导航.

alt text

多点导航.

alt text

3.3 导航应用开发

在 nav2 中, 机器人的位置信息是由 amcl 节点计算的.

我们可以查看节点的相关信息.

1
ros2 node info /amcl

通过对 /initialpose 话题进行发布则可以设置机器人的初始位置.

通过对 navigate_to_pose 动作服务进行处理就可以控制机器人的单点导航.

通过对 follow_waypoints 动作服务进行处理就可以控制机器人的路点导航.

4 References