06-ros1-navigation

ROS 的导航系统架构图

image-20241121105937466

矩形为 节点

椭圆为 内部组件 —-> 启动会自动建立

翻译成人话 —– >

image-20241121110630745

  • local_costmap 局部地图
  • global_costmap 全局地图

move_base,年轻人的第一次导航

move_base 节点

输入

  • map_server

    • 建立好的地图,由我们手动输入其中
  • sensor_sources 输入

    • 仿真机器人模型自己提供了
  • sensor transforms

    • 仿真机器人给我们提供了
  • odometry source 里程计

    • 仿真机器人给我们提供了
  • amcl 需要我们来提供

仿真环境

下载项目仓库 catkin_ws/src 相关的依赖

git clone https://github.com/6-robot/wpb_home.git

下载相关的依赖

cd wpb_home/wpb_home_bringup/scripts/

回到 catkin_ws 进行编译

catkin_make
  • 开始仿真
roslaunch wpr_simulation wpb_gmapping.launch
  • 使用键盘操作
rosrun wpr_simulation keyboard_vel_ctrl
  • 建图图后保存地图
rosrun map_server map_saver -f map

将地图复制到 wpr_simulation/maps 文件夹中

导航代码编写

使用launch文件启动

  1. move_base 导航节点
  2. map_server 地图服务节点
  3. amcl 定位节点

nav.launch

<launch>
    <!--- Run move_base -->
    <node pkg="move_base" type="move_base" name="move_base">
        <rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="global_costmap" />
        <rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="local_costmap" />
        <rosparam file="$(find wpb_home_tutorials)/nav_lidar/global_costmap_params.yaml" command="load" />
        <rosparam file="$(find wpb_home_tutorials)/nav_lidar/local_costmap_params.yaml" command="load" />
        <param name="base_global_planner" value="global_planner/GlobalPlanner" /> 
        <param name="base_local_planner" value="wpbh_local_planner/WpbhLocalPlanner" />
    </node>

    <!-- Run map server -->
    <node pkg="map_server" type="map_server" name="map_server" args="$(find wpr_simulation)/maps/map.yaml"/>

    <!--- Run AMCL -->
    <node pkg="amcl" type="amcl" name="amcl"/>

    <!--- Run rviz -->
    <node name="rviz" pkg="rviz" type="rviz" args="-d $(find wpr_simulation)/rviz/nav.rviz"/>
</launch>

move_base

创建软件包 nav_pkg

catkin_create_pkg nav_pkg roscpp rospy move_base_msgs actionlib

参考的文件为 wpr_simulation/launch/wpb_demo_nav.launch

map_server

<!-- Run map server -->
<node pkg="map_server" type="map_server" name="map_server" args="$(find wpr_simulation)/maps/map.yaml"/>

amcl

<!--- Run AMCL -->
<node pkg="amcl" type="amcl" name="amcl"/>

启动

  • 启动导航节点
roslaunch nav_pkg nav.launch
  • 启动rviz
rviz

全局规划器 global_planner

  • 深度优先

    • 如 A*

    • 算力消耗比较小,虽然不是全局最优

    • image-20241122095742722

  • 广度优先

    • Dijkstra算法
    • image-20241122100010855

ROS提供给我们的

image-20241122100121426

Dijkstra 和 A* 对于现代的计算机,算力差距不大

默认的 Dijkstra 就能满足了

  • Navfn 【史山代码—-> 用 Dijkstra算法没啥】 ROS 默认规划器
    • navfn/NavfnROS
  • Global_planner 【另起炉灶】 —> 提供了 Dijkstra 和 A*
    • global_pplanner/GlobalPlanner
  • Carrot_planner
    • 这个规划器比较简单
    • 作为自定义规划器的模板

AMCL 定位算法

Adaptive Monte Carlo Localiztion 自适应蒙特卡洛定位算法

(使用粒子滤波)

可以做到对雷达数据匹配,降低里程计误差

image-20241122101733885

需要的数据有:

  1. 里程计
  2. 雷达数据

红色点都是粒子

image-20241122102203121

AMCL —–> 粒子数量大约在 100-500 个

代价地图

会出现这种情况

没考虑机器人的地盘宽度

image-20241122102353929

  • 代价地图

image-20241122102547130

全局代价地图 global_costmap

算的贼慢,然后会出现干扰

Color Scheme 选择 costmap

image-20241122103019614

局部代价地图 loacl_costmap

计算频率高,实时性高

image-20241122103135312

参数解析

代价地图的参数至关重要,直接影响了导航的效果

查看参数

costmap_2d

我们看看 move_base 的参数

<node pkg="move_base" type="move_base" name="move_base">
    <rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="global_costmap" />
        <rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="local_costmap" />
        <rosparam file="$(find wpb_home_tutorials)/nav_lidar/global_costmap_params.yaml" command="load" />
        <rosparam file="$(find wpb_home_tutorials)/nav_lidar/local_costmap_params.yaml" command="load" />
        <param name="base_global_planner" value="global_planner/GlobalPlanner" /> 
        <param name="base_local_planner" value="wpbh_local_planner/WpbhLocalPlanner" />
</node>
  • costmap_common_params.yaml
  • global_costmap_params.yaml
  • local_costmap_params.yaml

costmap_common_params.yaml

  • image-20241122103735886
robot_radius: 0.25
inflation_radius: 0.5
obstacle_range: 1.0
raytrace_range: 6.0
observation_sources: base_lidar // 随便起名的
base_lidar: {
    data_type: LaserScan,
    topic: /scan, 
    marking: true, 
    clearing: true
    }
  • robot_radius

    • 绝对不能进来的地方
  • inflation_radius

    • 排斥的力场
    • 设置大一点,有的时候会有狭小区域有奇效
  • obstacle_range

    • 一般填写激光雷达的有效距离
  • observation_sources

    • 观测物来源
    • data_type 类型
    • topic 订阅的话题
    • marking 是否将扫描到的物体添加到代价地图
    • clearing 是否把扫描范围内的障碍物残影清除掉

image-20241122104258767

global_costmap_params.yaml

  • image-20241122103855978
global_costmap:
  global_frame: map
  robot_base_frame: base_footprint
  static_map: true
  update_frequency: 1.0
  publish_frequency: 1.0
  transform_tolerance: 1.0
  • global_frame
    • global_frame 地图的坐标系名称
    • robot_base_frame 机器人地盘坐标名称
    • static_map 是否将map_server 发来的数据作为基础地图
    • update_frequency 地图更新频率,更新到全局代价地图
    • publish_frequency 地图发布频率,发给rviz
    • transform_tolerance tf超时设置

image-20241122110053057

性能太差会寄

local_costmap_params.yaml

  • image-20241122103954908
local_costmap:
  global_frame: odom
  robot_base_frame: base_footprint
  static_map: false
  rolling_window: true
  width: 3.0
  height: 3.0
  update_frequency: 10.0
  publish_frequency: 10.0
  transform_tolerance: 1.0
  • global_frame
    • 地图坐标系
    • 选择 odom 变化更平滑
  • robot_base_frame
    • 坐标系名称
  • static_map
    • 不使用已经建好的图
  • rolling_window
    • 局部代价地图的范围
  • width
  • height

局部代价地图的范围

  • update_frequency
    • 更新频率
  • publish_frequency
    • 发布频率
  • transform_tolerance
    • 超时时间设置

恢复行为 recovery beaviors

image-20241122110732911

完整流程

image-20241124110219452

适合激光雷达有盲区的机器人

设置参数

image-20241124110329946

ros自带的行为类型

  • 重置
    • 在一定距离内,将超出距离的地图部分全部改为默认地图

设置

image-20241124110611691

这是新的恢复流程

image-20241124110631752

参数设置

image-20241124110721114

reset_distance

清除这个范围以外的所有消息

image-20241124110921615

地图分层结构

image-20241124110813724

史山代码,参数名不同意,有地方需要修改

局部规划器 loacal_planner

局部规划器直接决定了 导航效果

  • 开源规划器

image-20241124112845649

推荐 DWA Planner TEB Planner Eband Planner

DWA Planner

动态窗口方法

Dynamic Window Approach

image-20241124113637493

  • 生成一系列的轨迹
  • 挑选轨迹
    • 综合考量挑选

TEB Planner

TEB 规划器

适用于竞赛,竞速型的机器人

容易倒车入库

github