前言
- (题外话):由于本人身体原因和手头上的事情导致停更了20天,这里表示抱歉,接下来将恢复正常更新~
- 往期内容:
- 本教材将贯穿nav2的全部内容,使用ROS2和C++实现一些仿真乃至实车中常见的建图和路径规划算法,例如
cartographer
,ORB-SLAM
,RRT
,hybrid-astar
。我们将注重与原理讲解和代码实现,去详细讲解每一步的配置过程和代码复现细节。 - 同理本教材默认大家有一些基础的
ROS2
和C++
的编程基础,故不对一些基础部分进行详细说明。 - 本教程使用的环境:
ROS2 humble
ubuntu 22.04 LTS
- 前两期我们讲述了在复杂仿真环境编译并配置
ROS2-ORB-SLAM3
,这一期我们就正式入手Navigation2
的学习和配置。关于如何将ROS2-ORB-SLAM3
转换为Nav2
支持的栅格地图,我们后续单独出一期来说明,我们这里优先开始Nav2
的学习。 - 本节我们将上手
Nav2
的基础导航历程,讲述其中的参数调整和原理。
0 准备工作
- 在正式开始我们的
Nav2
配置之前,我们需要做一些修正和准备工作
0-1 修复雷达问题
-
前几节我们配置的雷达仿真存在以下问题
-
打开仿真,同时打开
RVIZ2
。仔细观察,发现在车辆的正前方始终存在雷达点云,这是由于我们前节期配置的阿克曼仿真模型的方向盘导致的,雷达会扫描到方向盘。 -
关于什么是方向盘我在第二期教程里头说过了,大家可以跳转过去看看,第二期:【10天速通Navigation2】(二) :ROS2gazebo阿克曼小车模型搭建-gazebo_ackermann_drive等插件的配置和说明
-
如果直接将上述模型进行
Nav2
的运行,会导致小车判断眼前始终存在一个动态障碍物,导致导航出现问题,这时候我们需要对齐进行调整。 -
调整的思路很简单,有两种:
- 修改方向盘位置
- 修改雷达最小扫描距离
-
秉持着最简单原则,我们选择第二种,打开小车的
gazebo_core.urdf
文件仿真 -
修改后进行编译,发现问题被解决。
0-2 cartographer建图
-
为了接下来的导航,我们需要额外再对复杂环境进行建图。
-
这里的流程我们之前在第三期讲过,这里我们就不再进行说明。
-
-
-
这里我们可以使用之前写的时间脚本进行地图保存。
1 nav2_bringup
配置
![[a.png]]
1-1 nav2_bringup
介绍
nav2_bringup
是一个用于启动和配置ROS 2 Humble导航堆栈(Navigation2)的包。- 主要功能:
启动导航堆栈
:nav2_bringup
包含了启动导航堆栈所需的所有脚本和配置文件。它可以启动包括行为树、控制器、地图服务器、定位、规划器和恢复行为在内的所有必要的节点。配置管理
:它允许用户通过参数文件来配置导航堆栈,这使得根据不同的机器人和环境需求调整系统变得简单。示例用法
:nav2_bringup
提供了示例启动文件和配置,这些示例可以帮助用户快速理解如何为自己的机器人设置导航。
- 这里建议大家可以下载一份源码,方便后续参数配置的时候参考官方的示例
git clone https://github.com/ros-planning/navigation2.git -b humble
- 这里我们可以顺路看一下各个功能包大致是做什么的:
codecov.yml
: 这个文件用于配置Codecov,Codecov是一个测试覆盖率工具,用于监测代码的测试覆盖率。doc
: 这个目录包含了项目文档,如如何安装、配置和使用Navigation2的说明。Dockerfile
: Dockerfile用于创建包含Navigation2的Docker容器,这有助于在不同环境中复现和部署机器人导航系统。Doxyfile
: Doxyfile是Doxygen的配置文件,用于生成代码文档。LICENSE
: 包含项目许可信息的文件,通常是开源许可协议。nav2_amcl
: 适应性蒙特卡洛定位(AMCL)系统,用于在已知地图中定位机器人。nav2_behaviors
: 包含用于Navigation2的行为脚本。nav2_behavior_tree
: 包含用于Navigation2的行为树(BT)相关文件,行为树用于机器人决策制定。nav2_bringup
: 启动和配置Navigation2系统的脚本和参数文件。nav2_bt_navigator
: 导航器节点,使用行为树进行高级导航任务。nav2_collision_monitor
: 用于监控机器人碰撞的组件。nav2_common
: 包含在Navigation2中常用的数据结构和实用程序。nav2_constrained_smoother
: 用于平滑机器人路径的约束平滑器。nav2_controller
: 控制器接口和实现,用于控制机器人的速度和方向。nav2_core
: Navigation2的核心接口和抽象类。nav2_costmap_2d
: 用于创建和更新二维代价地图的包,代价地图是导航系统中用于表示环境的障碍物和可通行区域的数据结构。nav2_dwb_controller
: 动态窗口_approach(DWB)控制器,用于生成平滑且有效的机器人轨迹。nav2_graceful_controller
: 一个控制器,旨在优雅地处理机器人故障。nav2_lifecycle_manager
: 生命周期管理器,用于管理Navigation2中节点的启动和关闭。nav2_map_server
: 地图服务器,用于提供地图数据给导航系统。nav2_mppi_controller
: 多模型预测路径积分(MPPI)控制器,用于生成机器人的控制命令。nav2_navfn_planner
: Navfn路径规划器,用于计算全局路径。nav2_planner
: 规划器接口和实现,用于生成从起点到终点的路径。nav2_regulated_pure_pursuit_controller
: 调节纯追踪控制器,用于追踪由规划器生成的路径。nav2_rotation_shim_controller
: 旋转垫片控制器,用于处理特定的旋转动作。nav2_rviz_plugins
: 用于RViz的插件,以可视化导航数据。nav2_simple_commander
: 一个简单的节点,用于发送基本导航命令。nav2_smac_planner
: SMAC(平滑移动的A*)规划器,用于快速生成平滑的局部路径。nav2_smoother
: 用于平滑机器人路径的接口和实现。nav2_system_tests
: Navigation2的系统测试。nav2_theta_star_planner
: Theta*规划器,用于生成全局路径。nav2_util
: 包含Navigation2中常用的实用程序和工具。nav2_velocity_smoother
: 用于平滑机器人速度的组件。nav2_voxel_grid
: 用于创建和处理体素网格的包,体素网格是代价地图的基础。nav2_waypoint_follower
: 跟随航点的节点,用于使机器人沿着一系列预定义的点移动。README.md
: 项目自述文件,通常包含如何安装和运行项目的说明。tools
: 包含用于开发和调试Navigation2的工具。
1-2 下载
- 我们还是采取
apt
进行下载
sudo apt install ros-humble-nav2-*
- 确认下载成功:
ros2 pkg list | grep navigation2
1-3 基础配置
-
我们新建一个新的功能包,这里需要把刚刚建好的地图移动过来
-
-
然后我们进行参数配置,这里我们可以参考官方教程里头的参数文件
-
前三个是配置多机器人导航的,这里我们选择最后一个即可。
-
然后我们在
params
文件夹下新建一个qingzhou_nav2_param.yaml
文件,把官方的文件参数复制进来。
amcl:
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_footprint"
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: 1.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
bt_navigator:
ros__parameters:
use_sim_time: True
global_frame: map
robot_base_frame: base_link
odom_topic: /odom
bt_loop_duration: 10
default_server_timeout: 20
wait_for_service_timeout: 1000
# 'default_nav_through_poses_bt_xml' and 'default_nav_to_pose_bt_xml' are use defaults:
# nav2_bt_navigator/navigate_to_pose_w_replanning_and_recovery.xml
# nav2_bt_navigator/navigate_through_poses_w_replanning_and_recovery.xml
# They can be set here or via a RewrittenYaml remap from a parent launch file to Nav2.
plugin_lib_names:
- nav2_compute_path_to_pose_action_bt_node
- nav2_compute_path_through_poses_action_bt_node
- nav2_smooth_path_action_bt_node
- nav2_follow_path_action_bt_node
- nav2_spin_action_bt_node
- nav2_wait_action_bt_node
- nav2_assisted_teleop_action_bt_node
- nav2_back_up_action_bt_node
- nav2_drive_on_heading_bt_node
- nav2_clear_costmap_service_bt_node
- nav2_is_stuck_condition_bt_node
- nav2_goal_reached_condition_bt_node
- nav2_goal_updated_condition_bt_node
- nav2_globally_updated_goal_condition_bt_node
- nav2_is_path_valid_condition_bt_node
- nav2_initial_pose_received_condition_bt_node
- nav2_reinitialize_global_localization_service_bt_node
- nav2_rate_controller_bt_node
- nav2_distance_controller_bt_node
- nav2_speed_controller_bt_node
- nav2_truncate_path_action_bt_node
- nav2_truncate_path_local_action_bt_node
- nav2_goal_updater_node_bt_node
- nav2_recovery_node_bt_node
- nav2_pipeline_sequence_bt_node
- nav2_round_robin_node_bt_node
- nav2_transform_available_condition_bt_node
- nav2_time_expired_condition_bt_node
- nav2_path_expiring_timer_condition
- nav2_distance_traveled_condition_bt_node
- nav2_single_trigger_bt_node
- nav2_goal_updated_controller_bt_node
- nav2_is_battery_low_condition_bt_node
- nav2_navigate_through_poses_action_bt_node
- nav2_navigate_to_pose_action_bt_node
- nav2_remove_passed_goals_action_bt_node
- nav2_planner_selector_bt_node
- nav2_controller_selector_bt_node
- nav2_goal_checker_selector_bt_node
- nav2_controller_cancel_bt_node
- nav2_path_longer_on_approach_bt_node
- nav2_wait_cancel_bt_node
- nav2_spin_cancel_bt_node
- nav2_back_up_cancel_bt_node
- nav2_assisted_teleop_cancel_bt_node
- nav2_drive_on_heading_cancel_bt_node
- nav2_is_battery_charging_condition_bt_node
bt_navigator_navigate_through_poses_rclcpp_node:
ros__parameters:
use_sim_time: True
bt_navigator_navigate_to_pose_rclcpp_node:
ros__parameters:
use_sim_time: True
controller_server:
ros__parameters:
use_sim_time: True
controller_frequency: 20.0
min_x_velocity_threshold: 0.001
min_y_velocity_threshold: 0.5
min_theta_velocity_threshold: 0.001
failure_tolerance: 0.3
progress_checker_plugin: "progress_checker"
goal_checker_plugins: ["general_goal_checker"] # "precise_goal_checker"
controller_plugins: ["FollowPath"]
# Progress checker parameters
progress_checker:
plugin: "nav2_controller::SimpleProgressChecker"
required_movement_radius: 0.5
movement_time_allowance: 10.0
# Goal checker parameters
#precise_goal_checker:
# plugin: "nav2_controller::SimpleGoalChecker"
# xy_goal_tolerance: 0.25
# yaw_goal_tolerance: 0.25
# stateful: True
general_goal_checker:
stateful: True
plugin: "nav2_controller::SimpleGoalChecker"
xy_goal_tolerance: 0.25
yaw_goal_tolerance: 0.25
# DWB parameters
FollowPath:
plugin: "dwb_core::DWBLocalPlanner"
debug_trajectory_details: True
min_vel_x: 0.0
min_vel_y: 0.0
max_vel_x: 0.26
max_vel_y: 0.0
max_vel_theta: 1.0
min_speed_xy: 0.0
max_speed_xy: 0.26
min_speed_theta: 0.0
# Add high threshold velocity for turtlebot 3 issue.
# https://github.com/ROBOTIS-GIT/turtlebot3_simulations/issues/75
acc_lim_x: 2.5
acc_lim_y: 0.0
acc_lim_theta: 3.2
decel_lim_x: -2.5
decel_lim_y: 0.0
decel_lim_theta: -3.2
vx_samples: 20
vy_samples: 5
vtheta_samples: 20
sim_time: 1.7
linear_granularity: 0.05
angular_granularity: 0.025
transform_tolerance: 0.2
xy_goal_tolerance: 0.25
trans_stopped_velocity: 0.25
short_circuit_trajectory_evaluation: True
stateful: True
critics: ["RotateToGoal", "Oscillation", "BaseObstacle", "GoalAlign", "PathAlign", "PathDist", "GoalDist"]
BaseObstacle.scale: 0.02
PathAlign.scale: 32.0
PathAlign.forward_point_distance: 0.1
GoalAlign.scale: 24.0
GoalAlign.forward_point_distance: 0.1
PathDist.scale: 32.0
GoalDist.scale: 24.0
RotateToGoal.scale: 32.0
RotateToGoal.slowing_factor: 5.0
RotateToGoal.lookahead_time: -1.0
local_costmap:
local_costmap:
ros__parameters:
update_frequency: 5.0
publish_frequency: 2.0
global_frame: odom
robot_base_frame: base_link
use_sim_time: True
rolling_window: true
width: 3
height: 3
resolution: 0.05
robot_radius: 0.22
plugins: ["voxel_layer", "inflation_layer"]
inflation_layer:
plugin: "nav2_costmap_2d::InflationLayer"
cost_scaling_factor: 3.0
inflation_radius: 0.55
voxel_layer:
plugin: "nav2_costmap_2d::VoxelLayer"
enabled: True
publish_voxel_map: True
origin_z: 0.0
z_resolution: 0.05
z_voxels: 16
max_obstacle_height: 2.0
mark_threshold: 0
observation_sources: scan
scan:
topic: /scan
max_obstacle_height: 2.0
clearing: True
marking: True
data_type: "LaserScan"
raytrace_max_range: 3.0
raytrace_min_range: 0.0
obstacle_max_range: 2.5
obstacle_min_range: 0.0
static_layer:
plugin: "nav2_costmap_2d::StaticLayer"
map_subscribe_transient_local: True
always_send_full_costmap: True
global_costmap:
global_costmap:
ros__parameters:
update_frequency: 1.0
publish_frequency: 1.0
global_frame: map
robot_base_frame: base_link
use_sim_time: True
robot_radius: 0.22
resolution: 0.05
track_unknown_space: true
plugins: ["static_layer", "obstacle_layer", "inflation_layer"]
obstacle_layer:
plugin: "nav2_costmap_2d::ObstacleLayer"
enabled: True
observation_sources: scan
scan:
topic: /scan
max_obstacle_height: 2.0
clearing: True
marking: True
data_type: "LaserScan"
raytrace_max_range: 3.0
raytrace_min_range: 0.0
obstacle_max_range: 2.5
obstacle_min_range: 0.0
static_layer:
plugin: "nav2_costmap_2d::StaticLayer"
map_subscribe_transient_local: True
inflation_layer:
plugin: "nav2_costmap_2d::InflationLayer"
cost_scaling_factor: 3.0
inflation_radius: 0.55
always_send_full_costmap: True
map_server:
ros__parameters:
use_sim_time: True
# Overridden in launch by the "map" launch configuration or provided default value.
# To use in yaml, remove the default "map" value in the tb3_simulation_launch.py file & provide full path to map below.
yaml_filename: ""
map_saver:
ros__parameters:
use_sim_time: True
save_map_timeout: 5.0
free_thresh_default: 0.25
occupied_thresh_default: 0.65
map_subscribe_transient_local: True
planner_server:
ros__parameters:
expected_planner_frequency: 20.0
use_sim_time: True
planner_plugins: ["GridBased"]
GridBased:
plugin: "nav2_navfn_planner/NavfnPlanner"
tolerance: 0.5
use_astar: false
allow_unknown: true
smoother_server:
ros__parameters:
use_sim_time: True
smoother_plugins: ["simple_smoother"]
simple_smoother:
plugin: "nav2_smoother::SimpleSmoother"
tolerance: 1.0e-10
max_its: 1000
do_refinement: True
behavior_server:
ros__parameters:
costmap_topic: local_costmap/costmap_raw
footprint_topic: local_costmap/published_footprint
cycle_frequency: 10.0
behavior_plugins: ["spin", "backup", "drive_on_heading", "assisted_teleop", "wait"]
spin:
plugin: "nav2_behaviors/Spin"
backup:
plugin: "nav2_behaviors/BackUp"
drive_on_heading:
plugin: "nav2_behaviors/DriveOnHeading"
wait:
plugin: "nav2_behaviors/Wait"
assisted_teleop:
plugin: "nav2_behaviors/AssistedTeleop"
global_frame: odom
robot_base_frame: base_link
transform_tolerance: 0.1
use_sim_time: true
simulate_ahead_time: 2.0
max_rotational_vel: 1.0
min_rotational_vel: 0.4
rotational_acc_lim: 3.2
robot_state_publisher:
ros__parameters:
use_sim_time: True
waypoint_follower:
ros__parameters:
use_sim_time: True
loop_rate: 20
stop_on_failure: false
waypoint_task_executor_plugin: "wait_at_waypoint"
wait_at_waypoint:
plugin: "nav2_waypoint_follower::WaitAtWaypoint"
enabled: True
waypoint_pause_duration: 200
velocity_smoother:
ros__parameters:
use_sim_time: True
smoothing_frequency: 20.0
scale_velocities: False
feedback: "OPEN_LOOP"
max_velocity: [0.26, 0.0, 1.0]
min_velocity: [-0.26, 0.0, -1.0]
max_accel: [2.5, 0.0, 3.2]
max_decel: [-2.5, 0.0, -3.2]
odom_topic: "odom"
odom_duration: 0.1
deadband_velocity: [0.0, 0.0, 0.0]
velocity_timeout: 1.0
- 老规矩我们先跑起来再解释具体参数,我们在
launch
文件夹下创建一个新的文件,用于启动Nav2
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
def generate_launch_description():
fishbot_navigation2_dir = get_package_share_directory('qingzhou_navigation2')
nav2_bringup_dir = get_package_share_directory('nav2_bringup')
use_sim_time = LaunchConfiguration('use_sim_time', default='true')
map_yaml_path = LaunchConfiguration('map',default=os.path.join(fishbot_navigation2_dir,'maps','map_2024-11-20_18-04-52.yaml'))
nav2_param_path = LaunchConfiguration('params_file',default=os.path.join(fishbot_navigation2_dir,'params','qingzhou_nav2_params.yaml'))
rviz_config_dir = os.path.join(nav2_bringup_dir,'rviz','nav2_default_view.rviz')
nav2_bringup_launch = 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(),
)
rviz_node = Node(
package='rviz2',
executable='rviz2',
name='rviz2',
arguments=['-d', rviz_config_dir],
parameters=[{'use_sim_time': use_sim_time}],
output='screen')
return LaunchDescription([nav2_bringup_launch,rviz_node])
- 注意需要修改自己的功能包名字和参数名字
- 同时注意这里我们开的是仿真,需要指定
use_sim_time
为true
,表示使用仿真时间
use_sim_time = LaunchConfiguration('use_sim_time', default='true')
- 在仿真环境中,所有节点都应当使用同一个时间源,以确保时间同步。如果某些节点使用系统时间(wall time),而其他节点使用仿真时间,那么这些节点之间的时间就会不同步,这可能导致各种问题,比如消息传递的延迟、定时器的不准确等。
- 然后我们就可以启动了。
1-3 懒人工具:shell脚本
- 这里提一嘴,每次都需要敲启动代码很麻烦,这里可以把启动命令写成校本
- 我们新建一个
gazebo.sh
脚本
source ./install/setup.bash
ros2 launch qingzhou_gazebo qingzhou_gazebo_warehouse.launch.py
- 同理我们可以新建一个
nav2.sh
脚本
source ./install/setup.bash
ros2 launch qingzhou_navigation2 nav2_bringup.launch.py
- 这里需要注意,
shell
脚本编写完以后需要添加可执行权限
chmod +x ./*.sh
- 然后我们终端就可以输入(小贴士:每个脚本设置不同的首字母,这样输入的时候只需要输入
./
和首字母,然后再按下Tab
就可以自动补全了,超级懒人福利!!!)
./nav2.sh
1-4 展示
- 我们新开两个终端
./gazebo.sh
- 然后启动
Nav2-bringup
./nav2.sh
-
启动后会自动化开启
RVIZ2
(我们在launch
里头写的) -
-
这时候什么都没有,不要慌!!!我们需要设计机器人基础位置
-
仔细看到
RVIZ2
上面的这三个工具,以后我们会经常用到 -
2D Pose Estimate
用途
:这个工具允许用户在RViz中手动设置机器人的初始位置估计。这对于在地图上准确初始化机器人的位置至关重要,尤其是在没有GPS或定位系统的情况下。
操作
:在RViz中,用户可以点击2D Pose Estimate
按钮,然后在地图上点击一个点,接着拖动方向箭头以设置机器人的朝向。这将发布一个geometry_msgs/PoseWithCovarianceStamped
消息到/initialpose
话题。重要提示
:正确的初始位置估计对于导航系统的性能至关重要,因为它会影响机器人定位的准确性。
-
Publish Point
用途
:Publish Point
工具允许用户在地图上发布一个点的位置。这通常用于标记或记录特定的兴趣点。操作
:在RViz中,用户点击Publish Point
按钮,然后在地图上点击想要发布的位置。这将发布一个geometry_msgs/PointStamped
消息到用户指定的RViz配置文件中定义的话题。应用
:这个功能可以用于各种目的,例如,为路径规划提供参考点或标记地图上的特定位置。
-
Nav2 Goal
用途
:Nav2 Goal
是Navigation2系统中最关键的交互工具之一,它允许用户发送导航目标给机器人。机器人将尝试规划一条路径并移动到该目标位置。操作
:在RViz中,用户点击Nav2 Goal
按钮,然后在地图上选择目标位置。这将发布一个geometry_msgs/PoseStamped
消息到/goal_pose
话题。重要提示
:发送目标之前,确保机器人已经有了一个有效的位置估计,并且导航系统已经正确配置和启动。
-
这里我们使用
2D Pose Estimate
发布机器人的初始位姿 -
等个一两秒就有
AMCL
的位姿估计 -
-
这是我们可以使用
Nav2 Goal
发布机器人导航目标点,设置目标后,小车生成轨迹,并向轨迹前进 -
最后会缓慢到达目标点
-
完整的
tf
树如下 -
节点图
2 Nav2参数解析
- 完成了基础的配置,那我们来看看参数的配置吧
- 我们可以去官网,找到对应的参数配置文档去查看对应的参数内容
- 官网参数配置
2-1 AMCL
-
AMCL(Adaptive Monte Carlo Localization)是一种用于移动机器人的概率定位系统,它能够在已知地图中估计机器人的位姿。
-
简单理解就是
AMCL
发布了MAP
->ODOM
坐标系之间的坐标变换 -
AMCL通过处理来自激光测距仪等传感器数据,并结合里程计信息,来估计机器人在MAP坐标系中的准确位置。这个过程涉及到以下几个步骤:
粒子滤波
:AMCL使用粒子滤波算法来表示机器人可能的位置。每个粒子代表一个可能的位姿估计。权重计算
:根据传感器数据(通常是激光扫描)和地图信息,计算每个粒子的权重,这反映了粒子表示的位姿估计的可能性。重采样
:根据粒子的权重,对粒子集合进行重采样,以保持一组最有可能的位姿估计。发布变换
:AMCL计算出最有可能的位姿后,会发布一个TF变换,将MAP坐标系与ODOM坐标系关联起来。这个变换告诉其他ROS节点,机器人在地图上的位置。
amcl:
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: 10.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
amcl_map_client:
ros__parameters:
use_sim_time: True
amcl_rclcpp_node:
ros__parameters:
use_sim_time: True
-
use_sim_time
: 是否使用仿真时间。在仿真环境中应设置为True
。 -
alpha1 - alpha5
: 这些参数用于调整AMCL的里程计模型。它们代表了里程计读数的不确定性,通常根据机器人的具体型号和传感器精度进行调整。 -
base_frame_id
: 机器人基座的参考坐标系,通常是"base_link"。 -
beam_skip_distance
: 在执行beam-skip算法时,激光束跳过的距离。 -
beam_skip_error_threshold
: 当计算激光束跳过的误差时使用的阈值。 -
beam_skip_threshold
: 用于确定是否跳过激光束的阈值。 -
do_beamskip
: 是否启用beam-skip算法。该算法可以加速处理,但可能会降低定位精度。 -
global_frame_id
: 地图的参考坐标系,通常是"map"。 -
lambda_short
: 用于调整短距离激光读数的权重。 -
laser_likelihood_max_dist
: 计算似然场模型时的最大距离。 -
laser_max_range
: 激光测距仪的最大测量范围。 -
laser_min_range
: 激光测距仪的最小测量范围。 -
laser_model_type
: 激光模型类型,可以是"likelihood_field"或"beam"。 -
max_beams
: 用于粒子滤波的最大激光束数。 -
max_particles
: 粒子滤波器的最大粒子数。 -
min_particles
: 粒子滤波器的最小粒子数。 -
odom_frame_id
: 里程计的参考坐标系,通常是"odom"。 -
pf_err
: 粒子滤波器的初始误差。 -
pf_z
: 粒子滤波器的初始权重。 -
recovery_alpha_fast / recovery_alpha_slow
: 用于调整粒子滤波器在机器人定位丢失时的恢复速度。 -
resample_interval
: 粒子重采样间隔。 -
robot_model_type
: 机器人运动模型类型,通常是"nav2_amcl::DifferentialMotionModel"。robot_model_type
参数的设置确实可以有多种选择,包括预定义的模型和自定义模型。- 下面是官方提供的两个预定义模型:
nav2_amcl::DifferentialMotionModel
:- 适用于差分驱动的机器人,如常见的轮式机器人。nav2_amcl::OmniMotionModel
:适用于麦克纳姆轮(或者万向)机器人。
-
save_pose_rate
: 保存机器人位姿的频率。 -
sigma_hit
: 用于计算似然场模型的参数。 -
tf_broadcast
: 是否广播AMCL的变换。,设置为true
才会触发MAP
->ODOM
的坐标变换 -
transform_tolerance
: 变换容忍时间。 -
update_min_a / update_min_d
: 更新粒子滤波器所需的最小角度和距离。 -
z_hit / z_max / z_rand / z_short
: 这些参数用于调整激光模型,以计算粒子的权重。 -
scan_topic
: 激光扫描数据的话题名称。 -
在
RVIZ2
中地图出现的绿色小点点就是AMCL
估计的机器人位姿信息 -
值得一提的是
AMCL
的估计需要机器人进行运动,因此如果一开始设置初始位姿的时候设置错了,只有机器人重新运行后才能进行矫正。 -
这时候其实
AMCL
是具有一定的不可靠性的,因此我们常常会考虑其他的方式进行替换SLAM(Simultaneous Localization and Mapping)
:- 使用雷达传感器进行SLAM可以同时估计机器人的位置和构建环境地图。SLAM系统通常包括定位算法和地图构建算法,可以提供实时定位和环境映射。Pose Estimation
:雷达传感器可以用于直接估计机器人的姿态,这可能比AMCL更直接和准确。一些雷达传感器具有内置的定位功能,可以直接提供机器人的位置和方向。
2-2 BT_navigator
bt_navigator
是Navigation2行为树导航器的核心组件,它负责根据给定的目标位置和环境信息,选择合适的路径规划器、控制器和服务,以实现导航任务。bt_navigator
和bt_navigator_rclcpp_node
共同工作,通过行为树来协调和执行导航任务。行为树提供了一种灵活的方式来组合和执行导航任务,使得导航系统能够适应不同的环境和任务需求。
bt_navigator:
ros__parameters:
use_sim_time: True
global_frame: map
robot_base_frame: base_link
odom_topic: /odom
bt_loop_duration: 10
default_server_timeout: 20
# 'default_nav_through_poses_bt_xml' and 'default_nav_to_pose_bt_xml' are use defaults:
# nav2_bt_navigator/navigate_to_pose_w_replanning_and_recovery.xml
# nav2_bt_navigator/navigate_through_poses_w_replanning_and_recovery.xml
# They can be set here or via a RewrittenYaml remap from a parent launch file to Nav2.
plugin_lib_names:
- nav2_compute_path_to_pose_action_bt_node
- nav2_compute_path_through_poses_action_bt_node
- nav2_smooth_path_action_bt_node
- nav2_follow_path_action_bt_node
- nav2_spin_action_bt_node
- nav2_wait_action_bt_node
- nav2_back_up_action_bt_node
- nav2_drive_on_heading_bt_node
- nav2_clear_costmap_service_bt_node
- nav2_is_stuck_condition_bt_node
- nav2_goal_reached_condition_bt_node
- nav2_goal_updated_condition_bt_node
- nav2_globally_updated_goal_condition_bt_node
- nav2_is_path_valid_condition_bt_node
- nav2_initial_pose_received_condition_bt_node
- nav2_reinitialize_global_localization_service_bt_node
- nav2_rate_controller_bt_node
- nav2_distance_controller_bt_node
- nav2_speed_controller_bt_node
- nav2_truncate_path_action_bt_node
- nav2_truncate_path_local_action_bt_node
- nav2_goal_updater_node_bt_node
- nav2_recovery_node_bt_node
- nav2_pipeline_sequence_bt_node
- nav2_round_robin_node_bt_node
- nav2_transform_available_condition_bt_node
- nav2_time_expired_condition_bt_node
- nav2_path_expiring_timer_condition
- nav2_distance_traveled_condition_bt_node
- nav2_single_trigger_bt_node
- nav2_is_battery_low_condition_bt_node
- nav2_navigate_through_poses_action_bt_node
- nav2_navigate_to_pose_action_bt_node
- nav2_remove_passed_goals_action_bt_node
- nav2_planner_selector_bt_node
- nav2_controller_selector_bt_node
- nav2_goal_checker_selector_bt_node
- nav2_controller_cancel_bt_node
- nav2_path_longer_on_approach_bt_node
- nav2_wait_cancel_bt_node
- nav2_spin_cancel_bt_node
- nav2_back_up_cancel_bt_node
- nav2_drive_on_heading_cancel_bt_node
bt_navigator_rclcpp_node:
ros__parameters:
use_sim_time: True
- 参数说明:
use_sim_time
: 是否使用仿真时间。在仿真环境中应设置为True
。global_frame
: 全局坐标系,通常为"map"。robot_base_frame
: 机器人基座的参考坐标系,通常为"base_link"。odom_topic
: 里程计数据的话题名称,通常为"/odom"。bt_loop_duration
: 行为树循环的持续时间default_server_timeout
: 默认服务超时时间。plugin_lib_names
: 行为树节点插件库的名称列表。这些插件提供了各种导航行为和条件,如路径规划、控制器、服务和决策逻辑。
- 这里的参数我们选择默认即可,基本不需要调整。
2-3 Controller_server
-
这里就开始重要了,回顾
Nav2
的基础结构 -
controller_server
是Navigation2控制器服务器的核心组件,它负责根据导航请求和当前状态,选择和启动适当的控制器。
controller_server:
ros__parameters:
use_sim_time: True
controller_frequency: 20.0
min_x_velocity_threshold: 0.001
min_y_velocity_threshold: 0.5
min_theta_velocity_threshold: 0.001
failure_tolerance: 0.3
progress_checker_plugin: "progress_checker"
goal_checker_plugins: ["general_goal_checker"] # "precise_goal_checker"
controller_plugins: ["FollowPath"]
# Progress checker parameters
progress_checker:
plugin: "nav2_controller::SimpleProgressChecker"
required_movement_radius: 0.5
movement_time_allowance: 10.0
# Goal checker parameters
#precise_goal_checker:
# plugin: "nav2_controller::SimpleGoalChecker"
# xy_goal_tolerance: 0.25
# yaw_goal_tolerance: 0.25
# stateful: True
general_goal_checker:
stateful: True
plugin: "nav2_controller::SimpleGoalChecker"
xy_goal_tolerance: 0.25
yaw_goal_tolerance: 0.25
# DWB parameters
FollowPath:
plugin: "dwb_core::DWBLocalPlanner"
debug_trajectory_details: True
min_vel_x: 0.0
min_vel_y: 0.0
max_vel_x: 0.26
max_vel_y: 0.0
max_vel_theta: 1.0
min_speed_xy: 0.0
max_speed_xy: 0.26
min_speed_theta: 0.0
# Add high threshold velocity for turtlebot 3 issue.
# https://github.com/ROBOTIS-GIT/turtlebot3_simulations/issues/75
acc_lim_x: 2.5
acc_lim_y: 0.0
acc_lim_theta: 3.2
decel_lim_x: -2.5
decel_lim_y: 0.0
decel_lim_theta: -3.2
vx_samples: 20
vy_samples: 5
vtheta_samples: 20
sim_time: 1.7
linear_granularity: 0.05
angular_granularity: 0.025
transform_tolerance: 0.2
xy_goal_tolerance: 0.25
trans_stopped_velocity: 0.25
short_circuit_trajectory_evaluation: True
stateful: True
critics: ["RotateToGoal", "Oscillation", "BaseObstacle", "GoalAlign", "PathAlign", "PathDist", "GoalDist"]
BaseObstacle.scale: 0.02
PathAlign.scale: 32.0
PathAlign.forward_point_distance: 0.1
GoalAlign.scale: 24.0
GoalAlign.forward_point_distance: 0.1
PathDist.scale: 32.0
GoalDist.scale: 24.0
RotateToGoal.scale: 32.0
RotateToGoal.slowing_factor: 5.0
RotateToGoal.lookahead_time: -1.0
controller_server_rclcpp_node:
ros__parameters:
use_sim_time: True
- 参数说明:
use_sim_time
: 是否使用仿真时间。在仿真环境中应设置为True
。controller_frequency
: 控制器运行的频率。min_x_velocity_threshold
: 最小允许的X轴速度阈值。min_y_velocity_threshold
: 最小允许的Y轴速度阈值。min_theta_velocity_threshold
: 最小允许的θ轴(绕Z轴)速度阈值。failure_tolerance
: 控制器失败容忍度。progress_checker_plugin
: 进度检查器插件的名称。goal_checker_plugins
: 目标检查器插件的名称列表。controller_plugins
: 控制器插件的名称列表。
2-3-1 进度检查器
和目标检查器
# Progress checker parameters
progress_checker:
plugin: "nav2_controller::SimpleProgressChecker"
required_movement_radius: 0.5
movement_time_allowance: 10.0
# Goal checker parameters
#precise_goal_checker:
# plugin: "nav2_controller::SimpleGoalChecker"
# xy_goal_tolerance: 0.25
# yaw_goal_tolerance: 0.25
# stateful: True
general_goal_checker:
stateful: True
plugin: "nav2_controller::SimpleGoalChecker"
xy_goal_tolerance: 0.25
yaw_goal_tolerance: 0.25
progress_checker
: 用于检查机器人是否在向目标前进。required_movement_radius
: 机器人必须移动的最小半径。如果机器人在指定时间内没有达到这个半径,则认为没有进展。movement_time_allowance
: 机器人必须移动的时间。如果机器人在指定时间内没有达到所需的最小半径,则认为没有进展。
goal_checker
: 用于检查机器人是否到达了目标位置。(不用写停车程序了(不是))xy_goal_tolerance
: 在XY平面上的目标位置容忍度。如果机器人的位置在XY平面上的误差小于这个值,则认为机器人已经到达目标。yaw_goal_tolerance
: 在Yaw方向上的目标位置容忍度。如果机器人的Yaw方向的误差小于这个值,则认为机器人已经到达目标。
2-3-2 DWB
DWB(Dynamic Window Behavior)
是一种用于轮式机器人的控制器,它基于动态窗口理论(Dynamic Window Approach,DWA)
来生成控制命令。DWA是一种用于机器人运动控制的方法,它考虑了机器人的当前状态、运动约束和安全区域,以生成安全且有效的路径。- DWB控制器的主要特点包括:
动态窗口理论
:DWB控制器使用动态窗口理论来评估机器人在给定时间内可以安全地移动的范围。它考虑了机器人的速度、加速度和转向能力,以及周围环境中的障碍物。安全区域
:DWB控制器为机器人定义了一个安全区域,在这个区域内,机器人可以安全地移动而不与障碍物发生碰撞。它通过计算动态窗口来确定这个区域。速度和方向控制
:DWB控制器根据安全区域和机器人的当前状态来生成速度和方向控制命令。它尝试在保持安全的同时,使机器人以最短路径到达目标。实时响应
:DWB控制器能够实时响应环境变化和机器人状态的变化,动态调整控制命令以适应新的情况。可扩展性
:DWB控制器的设计使其可以很容易地集成到更复杂的导航系统中,如ROS 2 Navigation2(Nav2)系统。
# DWB parameters
FollowPath:
plugin: "dwb_core::DWBLocalPlanner"
debug_trajectory_details: True
min_vel_x: 0.0
min_vel_y: 0.0
max_vel_x: 0.26
max_vel_y: 0.0
max_vel_theta: 1.0
min_speed_xy: 0.0
max_speed_xy: 0.26
min_speed_theta: 0.0
# Add high threshold velocity for turtlebot 3 issue.
# https://github.com/ROBOTIS-GIT/turtlebot3_simulations/issues/75
acc_lim_x: 2.5
acc_lim_y: 0.0
acc_lim_theta: 3.2
decel_lim_x: -2.5
decel_lim_y: 0.0
decel_lim_theta: -3.2
vx_samples: 20
vy_samples: 5
vtheta_samples: 20
sim_time: 1.7
linear_granularity: 0.05
angular_granularity: 0.025
transform_tolerance: 0.2
xy_goal_tolerance: 0.25
trans_stopped_velocity: 0.25
short_circuit_trajectory_evaluation: True
stateful: True
critics: ["RotateToGoal", "Oscillation", "BaseObstacle", "GoalAlign", "PathAlign", "PathDist", "GoalDist"]
BaseObstacle.scale: 0.02
PathAlign.scale: 32.0
PathAlign.forward_point_distance: 0.1
GoalAlign.scale: 24.0
GoalAlign.forward_point_distance: 0.1
PathDist.scale: 32.0
GoalDist.scale: 24.0
RotateToGoal.scale: 32.0
RotateToGoal.slowing_factor: 5.0
RotateToGoal.lookahead_time: -1.0
- 参数设置:
min_vel_x
: X轴最小速度。min_vel_y
: Y轴最小速度。max_vel_x
: X轴最大速度。max_vel_y
: Y轴最大速度。max_vel_theta
: θ轴最大速度。acc_lim_x
: X轴加速度限制。acc_lim_y
: Y轴加速度限制。acc_lim_theta
: θ轴加速度限制。decel_lim_x
: X轴减速度限制。decel_lim_y
: Y轴减速度限制。decel_lim_theta
: θ轴减速度限制。vx_samples
: X轴速度样本数。vy_samples
: Y轴速度样本数。vtheta_samples
: θ轴速度样本数。sim_time
: 仿真时间。linear_granularity
: 线性速度粒度。angular_granularity
: 角速度粒度。transform_tolerance
: 变换容忍度。xy_goal_tolerance
: XY方向目标容忍度。trans_stopped_velocity
: 变换停止时的速度。short_circuit_trajectory_evaluation
: 是否提前评估轨迹。critics
: 用于评估轨迹的批评者列表。
2-3-3 其他Controller
Dynamic Window Behavior (DWB)
: DWB是一种基于动态窗口理论的运动控制方法,用于在考虑机器人速度、加速度和转向能力的同时,生成安全且有效的路径。DWB控制器通常用于轮式机器人,能够实时响应环境变化和机器人状态的变化,动态调整控制命令以适应新的情况。Trajectory-based Efficient Bicycle Model (TEB)
: TEB是一种运动规划方法,类似于模型预测控制(MPC)。它为机器人提供了一条最优路径,同时考虑了机器人的动力学约束和环境障碍。TEB适用于阿克曼、差分和全向机器人。Regulated Pure Pursuit (RPP)
: RPP是一种基于纯追踪算法的控制方法,用于服务/工业机器人。它通过一个自适应的纯追踪控制器,使机器人能够沿着一条预先规划的路径精确地移动。RPP控制器适用于阿克曼、差分和腿部驱动的机器人。
Model Predictive Path Integral (MPPI)
: MPPI是一种基于预测模型的控制方法,它通过使用模块化和自定义成本函数,能够完成多种任务。MPPI控制器适用于差分、全向和阿克曼驱动的机器人。
Rotation Shim Controller
: 这是一个“垫片”控制器,用于在通过主控制器进行跟踪之前旋转到路径头部。它适用于差分、全向和腿部驱动的机器人。Graceful Controller
: 这是一个基于姿态跟随控制定律的控制器,用于生成平滑的轨迹。它适用于差分驱动的机器人。Vector Pursuit Controller
: 这是一个基于向量追踪算法的控制器,适用于高速准确的路径跟踪。它适用于差分、阿克曼、腿部驱动的机器人。
2-4 LocalCostMap
local_costmap
用于生成和维护机器人当前所处区域的局部代价地图。代价地图是导航系统中用于表示环境的障碍物和可通行区域的数据结构
local_costmap:
local_costmap:
ros__parameters:
update_frequency: 5.0
publish_frequency: 2.0
global_frame: odom
robot_base_frame: base_link
use_sim_time: True
rolling_window: true
width: 3
height: 3
resolution: 0.05
robot_radius: 0.22
plugins: ["voxel_layer", "inflation_layer"]
inflation_layer:
plugin: "nav2_costmap_2d::InflationLayer"
cost_scaling_factor: 3.0
inflation_radius: 0.55
voxel_layer:
plugin: "nav2_costmap_2d::VoxelLayer"
enabled: True
publish_voxel_map: True
origin_z: 0.0
z_resolution: 0.05
z_voxels: 16
max_obstacle_height: 2.0
mark_threshold: 0
observation_sources: scan
scan:
topic: /scan
max_obstacle_height: 2.0
clearing: True
marking: True
data_type: "LaserScan"
raytrace_max_range: 3.0
raytrace_min_range: 0.0
obstacle_max_range: 2.5
obstacle_min_range: 0.0
static_layer:
map_subscribe_transient_local: True
always_send_full_costmap: True
local_costmap_client:
ros__parameters:
use_sim_time: True
local_costmap_rclcpp_node:
ros__parameters:
use_sim_time: True
- local_costmap:local_costmap
update_frequency
: 局部代价地图更新的频率。publish_frequency
: 局部代价地图发布的频率。global_frame
: 局部代价地图的参考坐标系,通常为"odom"。robot_base_frame
: 机器人基座的参考坐标系,通常为"base_link"。use_sim_time
: 是否使用仿真时间。在仿真环境中应设置为True
。rolling_window
: 是否使用滚动窗口。滚动窗口允许局部代价地图在机器人的移动过程中不断更新。width / height
: 局部代价地图的尺寸。resolution
: 局部代价地图的分辨率。robot_radius
: 机器人的半径。plugins
: 局部代价地图插件的名称列表。这些插件提供了额外的功能,如膨胀层和体素层。
- 膨胀层
inflation_layer
:膨胀层将代价地图中的障碍物向外扩展,形成一个更大的安全区域,使得机器人可以在这个区域内安全地移动。
inflation_layer:
plugin: "nav2_costmap_2d::InflationLayer"
cost_scaling_factor: 3.0
inflation_radius: 0.55
cost_scaling_factor
: 膨胀层中的成本缩放因子。inflation_radius
: 膨胀层的膨胀半径- 我们可以在
RVIZ2
左侧的窗口设置局部代价地图的颜色
- 体素层
voxel_layer
:用于处理激光扫描数据,以生成体素地图(voxel map)。体素地图是一种用于表示环境的地图,其中每个体素代表一个立方体单元,可以包含关于环境的信息,如障碍物的位置和高度。plugin
: 体素层插件的名称。enabled
: 是否启用体素层。publish_voxel_map
: 是否发布体素地图。origin_z
: 体素地图的Z轴原点。z_resolution
: 体素地图的Z轴分辨率。z_voxels
: 体素地图的Z轴尺寸。max_obstacle_height
: 体素地图中障碍物的最大高度。mark_threshold
: 体素地图中标记的阈值。observation_sources
: 体素层观察源的名称列表。scan
: 激光扫描数据的相关参数。
map_subscribe_transient_local
: 是否订阅临时局部地图。
always_send_full_costmap
:是否总是发送完整的局部代价地图。
2-5 GlobalMap
global_costmap
用于生成和维护全局代价地图。全局代价地图是导航系统中用于表示环境的全局障碍物和可通行区域的数据结构。
global_costmap:
global_costmap:
ros__parameters:
update_frequency: 1.0
publish_frequency: 1.0
global_frame: map
robot_base_frame: base_link
use_sim_time: True
robot_radius: 0.22
resolution: 0.05
track_unknown_space: true
plugins: ["static_layer", "obstacle_layer", "inflation_layer"]
obstacle_layer:
plugin: "nav2_costmap_2d::ObstacleLayer"
enabled: True
observation_sources: scan
scan:
topic: /scan
max_obstacle_height: 2.0
clearing: True
marking: True
data_type: "LaserScan"
raytrace_max_range: 3.0
raytrace_min_range: 0.0
obstacle_max_range: 2.5
obstacle_min_range: 0.0
static_layer:
plugin: "nav2_costmap_2d::StaticLayer"
map_subscribe_transient_local: True
inflation_layer:
plugin: "nav2_costmap_2d::InflationLayer"
cost_scaling_factor: 3.0
inflation_radius: 0.55
always_send_full_costmap: True
global_costmap_client:
ros__parameters:
use_sim_time: True
global_costmap_rclcpp_node:
ros__parameters:
use_sim_time: True
- global_costmap:global_costmap
update_frequency
: 全局代价地图更新的频率。publish_frequency
: 全局代价地图发布的频率。global_frame
: 全局代价地图的参考坐标系,通常为"map"。robot_base_frame
: 机器人基座的参考坐标系,通常为"base_link"。use_sim_time
: 是否使用仿真时间。在仿真环境中应设置为True
。robot_radius
: 机器人的半径。resolution
: 全局代价地图的分辨率。track_unknown_space
: 是否跟踪未知空间。plugins
: 全局代价地图插件的名称列表。这些插件提供了额外的功能,如静态层、障碍物层和膨胀层。
2-5-1 障碍物层obstacle_layer
obstacle_layer:
plugin: "nav2_costmap_2d::ObstacleLayer"
enabled: True
observation_sources: scan
scan:
topic: /scan
max_obstacle_height: 2.0
clearing: True
marking: True
data_type: "LaserScan"
raytrace_max_range: 3.0
raytrace_min_range: 0.0
obstacle_max_range: 2.5
obstacle_min_range: 0.0
plugin
: 障碍物层插件的名称。enabled
: 是否启用障碍物层。observation_sources
: 障碍物层观察源的名称列表。scan
: 激光扫描数据的相关参数。
2-5-2 静态层static_layer
plugin
: 静态层插件的名称。map_subscribe_transient_local
: 是否订阅临时局部地图。
2-5-3 膨胀层inflation_layer
plugin
: 膨胀层插件的名称。cost_scaling_factor
: 膨胀层中的成本缩放因子。inflation_radius
: 膨胀层的膨胀半径。
inflation_layer:
plugin: "nav2_costmap_2d::InflationLayer"
cost_scaling_factor: 3.0
inflation_radius: 0.55
always_send_full_costmap
是否总是发送完整的全局代价地图。
2-6 map_sever和map_saver
- 这里就熟悉了不
map_server:
ros__parameters:
use_sim_time: True
yaml_filename: "turtlebot3_world.yaml"
map_saver:
ros__parameters:
use_sim_time: True
save_map_timeout: 5.0
free_thresh_default: 0.25
occupied_thresh_default: 0.65
map_subscribe_transient_local: True
yaml_filename
:我们在launch
里头通过指定'map': map_yaml_path,
去修改地图的位置use_sim_time
: 是否使用仿真时间。在仿真环境中应设置为True
。
save_map_timeout
: 保存地图的超时时间。如果在这个时间内没有保存地图,则保存操作会取消。free_thresh_default
: 用于定义代价地图中空闲空间的阈值。当代价值低于这个阈值时,该区域被视为空闲。occupied_thresh_default
: 用于定义代价地图中被占据空间的阈值。当代价值高于这个阈值时,该区域被视为被占据。map_subscribe_transient_local
: 是否订阅临时局部地图。如果设置为True
,地图订阅将只持续一个ROS会话,并且不会持久化。
2-7 Planner模块
- 作为同样重要的一个模块,
planner_server
用于选择和启动适当的路径规划器。路径规划器是导航系统的核心组件之一,负责在考虑环境约束和机器人的运动能力的基础上,计算从起点到终点的最优路径。
planner_server:
ros__parameters:
expected_planner_frequency: 20.0
use_sim_time: True
planner_plugins: ["GridBased"]
GridBased:
plugin: "nav2_navfn_planner/NavfnPlanner"
tolerance: 0.5
use_astar: false
allow_unknown: true
expected_planner_frequency
: 路径规划器期望的频率。
use_sim_time
: 是否使用仿真时间。在仿真环境中应设置为True
。planner_plugins
: 路径规划器插件的名称列表。这些插件提供了不同的路径规划算法,可以根据不同的应用场景和环境条件来选择最合适的规划器。
- GridBased
plugin
: 路径规划器插件的名称,通常为"nav2_navfn_planner::NavfnPlanner"。tolerance
: 路径规划器在计算路径时允许的最大误差。use_astar
: 是否使用A_算法。A_算法是一种启发式搜索算法,用于在给定起始点和目标点的情况下,找到最短路径。allow_unknown
: 是否允许规划器处理未知区域。
2-7-1 NavfnPlanner
- NavfnPlanner(Navigation Function Planner)是一种路径规划器,用于在ROS 2 Navigation2(Nav2)系统中为机器人规划从起点到终点的路径。它基于Navigation Function(Navfn)算法,这是一种全局路径规划方法,旨在在已知环境中为机器人找到一条从起点到终点的路径。
2-7-3 其他规划器
NavFn Planner
:一种使用A*或Dijkstra扩展的导航函数,假设2D全向粒子。适用于差分、全向和腿部驱动的机器人。SmacPlannerHybrid
: 一个SE2混合-A实现,使用Dubin或Reeds-shepp运动模型,具有平滑器和多分辨率查询。适用于阿克曼、差分、全向和腿部驱动的车辆。SmacPlanner2D
:一个2D A实现,使用4或8连接的邻域,具有平滑器和多分辨率查询。适用于差分、全向和腿部驱动的机器人。SmacPlannerLattice:
一个状态格子规划器的实现,使用预生成的最小控制集进行运动可行性的规划。适用于阿克曼、差分、全向、腿部驱动和任意类型的车辆。ThetaStarPlanner
:一个使用4或8连接的邻域的Theta实现,假设机器人是一个2D全向粒子。适用于差分、全向和腿部驱动的机器人。
2-8 smoother_server
smoother_server
用于选择和启动适当的路径平滑器。路径平滑器用于对机器人路径进行平滑处理,以减少振动和提高路径的舒适性。
smoother_server:
ros__parameters:
use_sim_time: True
smoother_plugins: ["simple_smoother"]
simple_smoother:
plugin: "nav2_smoother::SimpleSmoother"
tolerance: 1.0e-10
max_its: 1000
do_refinement: True
plugin
: 路径平滑器插件的名称,通常为"nav2_smoother::SimpleSmoother"。tolerance
: 平滑器在迭代过程中允许的最大误差。max_its
: 平滑器进行迭代的次数上限。do_refinement
: 是否进行路径平滑的细化。细化可以进一步提高路径的平滑度,但可能会增加计算时间。
2-9 behavior_server
behavior_server
用于选择和启动各种导航行为。这些行为包括自旋、后退、沿航向驱动和等待等,它们可以被组合起来形成复杂的导航任务。
behavior_server:
ros__parameters:
costmap_topic: local_costmap/costmap_raw
footprint_topic: local_costmap/published_footprint
cycle_frequency: 10.0
behavior_plugins: ["spin", "backup", "drive_on_heading", "wait"]
spin:
plugin: "nav2_behaviors/Spin"
backup:
plugin: "nav2_behaviors/BackUp"
drive_on_heading:
plugin: "nav2_behaviors/DriveOnHeading"
wait:
plugin: "nav2_behaviors/Wait"
global_frame: odom
robot_base_frame: base_link
transform_tolerance: 0.1
use_sim_time: true
simulate_ahead_time: 2.0
max_rotational_vel: 1.0
min_rotational_vel: 0.4
rotational_acc_lim: 3.2
2-10 robot_state_publisher
robot_state_publisher:
ros__parameters:
use_sim_time: True
2-11 waypoint_follower
waypoint_follower
用于根据预设的航点(waypoints)来控制机器人的运动。航点是导航过程中定义的关键位置,机器人需要在这些位置执行特定的操作或等待一段时间。
waypoint_follower:
ros__parameters:
loop_rate: 20
stop_on_failure: false
waypoint_task_executor_plugin: "wait_at_waypoint"
wait_at_waypoint:
plugin: "nav2_waypoint_follower::WaitAtWaypoint"
enabled: True
waypoint_pause_duration: 200
loop_rate
: 循环频率,即每秒执行的次数。stop_on_failure
: 是否在任务失败时停止。waypoint_task_executor_plugin
: 航点任务执行器的插件名称。wait_at_waypoint
: 用于在航点处等待的插件参数。plugin
: 航点等待插件的名称,通常为"nav2_waypoint_follower::WaitAtWaypoint"。enabled
: 是否启用航点等待功能。waypoint_pause_duration
: 在航点处等待的时间长度。
3 小节
-
本节介绍了基础的
nav2_bringup
的基础参数,并进行了基础的配置。 -
你可能在疑问,上述的配置都已经足够机器人基本的运行了,为什么后面还需要替换自己的
Planner
和Controller
呢,我们来看一个简单的例子: -
上述例子中,我发布的一个位于小车后方的目标点,根据
A*
或者Djstra
算法计算的路径实际上是没有考虑小车的初始朝向和目标朝向的,同时也没有考虑运动学约束,在实际运行中,上述问题小车可以通过规划需要倒车的路径进行完成任务。 -
这也就是我们后续要配置的
hybrid-A*
的内容~~ -
感谢支持!!!!
-
如有错误,欢迎指出!!!!!!