从零搭建一台基于ROS的自动驾驶车-----5.路径规划与导航

news/2025/2/22 8:30:00

系列文章目录

北科天绘 16线3维激光雷达开发教程
基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图
Nvidia Jetson Nano学习笔记–串口通信
Nvidia Jetson Nano学习笔记–使用C语言实现GPIO 输入输出
Autolabor ROS机器人教程
从零搭建一台基于ROS的自动驾驶车-----1.整体介绍
从零搭建一台基于ROS的自动驾驶车-----2.运动控制
从零搭建一台基于ROS的自动驾驶车-----3.激光Slam建图
从零搭建一台基于ROS的自动驾驶车-----4.定位


文章目录

  • 系列文章目录
  • 前言
  • 一、move_base介绍
  • 二、move_base节点说明
    • 1.订阅
    • 2.发布
  • 三、move_base与代价地图
    • 1.概念
    • 2.组成
  • 三、move_base的使用
    • 1.launch文件
    • 2.配置文件
      • 2.1 costmap_common_params.yaml
      • 2.2 global_costmap_params.yaml
      • 2.3 local_costmap_params.yaml
      • 2.4 base_local_planner_params
  • 总结


前言

在之前的几篇教程中,我们已经可以通过ROS来控制底盘小车的运动,还建立了一张全局静态地图,以及实现了机器人在全局静态地图中的定位,这篇教程将讲述最后一篇路径规划与导航。
在ROS中提供了一个可以实现导航的功能包navigation,路径规划是导航中的核心功能之一,在ROS的导航功能包集navigation中提供了 move_base 功能包,用于实现此功能。


一、move_base介绍

move_base 功能包提供了基于动作(action)的路径规划实现,move_base 可以根据给定的目标点,控制机器人底盘运动至目标位置,并且在运动过程中会连续反馈机器人自身的姿态与目标点的状态信息,move_base主要由全局路径规划与本地路径规划组成。

导航就是机器人从A点运动至B点的过程,在这一过程中,机器人需要根据目标位置计算全局运动路线,并且在运动过程中,还需要时时根据出现的一些动态障碍物调整运动路线,直至到达目标点,该过程就称之为路径规划。在 ROS 中提供了 move_base 包来实现路径规则,该功能包主要由两大规划器组成:

1.全局路径规划(gloable_planner)
根据给定的目标点和全局地图实现总体的路径规划,使用 Dijkstra 或 A* 算法进行全局路径规划,计算最优路线,作为全局路线。

2.本地时时规划(local_planner)
在实际导航过程中,机器人可能无法按照给定的全局最优路线运行,比如:机器人在运行中,可能会随时出现一定的障碍物… 本地规划的作用就是使用一定算法(Dynamic Window Approaches) 来实现障碍物的规避,并选取当前最优路径以尽量符合全局最优路径

全局路径规划与本地路径规划是相对的,全局路径规划侧重于全局、宏观实现,而本地路径规划侧重与当前、微观实现。

下载导航功能包

sudo apt-gei install ros-noetic-navigation

二、move_base节点说明

move_base功能包中的核心节点是:move_base。为了方便调用,需要先了解该节点action、订阅的话题、发布的话题、服务以及相关参数。

1.订阅

  1. move_base/goal(move_base_msgs/MoveBaseActionGoal),move_base 的运动规划目标。

  2. move_base/cancel(actionlib_msgs/GoalID),取消目标。

  3. move_base_simple/goal(geometry_msgs/PoseStamped),运动规划目标(与action相比,没有连续反馈,无法追踪机器人执行状态)。

2.发布

  1. move_base/feedback(move_base_msgs/MoveBaseActionFeedback),连续反馈的信息,包含机器人底盘坐标。
  2. move_base/status(actionlib_msgs/GoalStatusArray),发送到move_base的目标状态信息。
  3. cmd_vel(geometry_msgs/Twist),输出到机器人底盘的运动控制消息。

三、move_base与代价地图

1.概念

机器人导航(尤其是路径规划模块)是依赖于地图的,地图在SLAM时已经有所介绍了,ROS中的地图其实就是一张图片,这张图片有宽度、高度、分辨率等元数据,在图片中使用灰度值来表示障碍物存在的概率。不过SLAM构建的地图在导航中是不可以直接使用的,因为:

  1. SLAM构建的地图是静态地图,而导航过程中,障碍物信息是可变的,可能障碍物被移走了,也可能添加了新的障碍物,导航中需要时时的获取障碍物信息;
  2. 在靠近障碍物边缘时,虽然此处是空闲区域,但是机器人在进入该区域后可能由于其他一些因素,比如:惯性、或者不规则形体的机器人转弯时可能会与障碍物产生碰撞,安全起见,最好在地图的障碍物边缘设置警戒区,尽量禁止机器人进入…

所以,静态地图无法直接应用于导航,其基础之上需要添加一些辅助信息的地图,比如时时获取的障碍物数据,基于静态地图添加的膨胀区等数据。

2.组成

代价地图有两张:global_costmap(全局代价地图) 和 local_costmap(本地代价地图),前者用于全局路径规划,后者用于本地路径规划。

三、move_base的使用

路径规划算法在move_base功能包的move_base节点中已经封装完毕了,但是还不可以直接调用,因为算法虽然已经封装了,但是该功能包面向的是各种类型支持ROS的机器人,不同类型机器人可能大小尺寸不同,传感器不同,速度不同,应用场景不同…最后可能会导致不同的路径规划结果,那么在调用路径规划节点之前,我们还需要配置机器人参数。

1.launch文件

<launch>

    <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true">
        <rosparam file="$(find 功能包)/param/costmap_common_params.yaml" command="load" ns="global_costmap" />
        <rosparam file="$(find 功能包)/param/costmap_common_params.yaml" command="load" ns="local_costmap" />
        <rosparam file="$(find 功能包)/param/local_costmap_params.yaml" command="load" />
        <rosparam file="$(find 功能包)/param/global_costmap_params.yaml" command="load" />
        <rosparam file="$(find 功能包)/param/base_local_planner_params.yaml" command="load" />
    </node>

</launch>

2.配置文件

2.1 costmap_common_params.yaml

该文件是move_base 在全局路径规划与本地路径规划时调用的通用参数,包括:机器人的尺寸、距离障碍物的安全距离、传感器信息等。配置参考如下:

#机器人几何参,如果机器人是圆形,设置 robot_radius,如果是其他形状设置 footprint
robot_radius: 0.12 #圆形
# footprint: [[-0.12, -0.12], [-0.12, 0.12], [0.12, 0.12], [0.12, -0.12]] #其他形状

obstacle_range: 3.0 # 用于障碍物探测,比如: 值为 3.0,意味着检测到距离小于 3 米的障碍物时,就会引入代价地图
raytrace_range: 3.5 # 用于清除障碍物,比如:值为 3.5,意味着清除代价地图中 3.5 米以外的障碍物


#膨胀半径,扩展在碰撞区域以外的代价区域,使得机器人规划路径避开障碍物
inflation_radius: 0.2
#代价比例系数,越大则代价值越小
cost_scaling_factor: 3.0

#地图类型
map_type: costmap
#导航包所需要的传感器
observation_sources: scan
#对传感器的坐标系和数据进行配置。这个也会用于代价地图添加和清除障碍物。例如,你可以用激光雷达传感器用于在代价地图添加障碍物,再添加kinect用于导航和清除障碍物。
scan: {sensor_frame: laser, data_type: LaserScan, topic: scan, marking: true, clearing: true}

2.2 global_costmap_params.yaml

该文件用于全局代价地图参数设置:

global_costmap:
  global_frame: map #地图坐标系
  robot_base_frame: base_footprint #机器人坐标系
  # 以此实现坐标变换

  update_frequency: 1.0 #代价地图更新频率
  publish_frequency: 1.0 #代价地图的发布频率
  transform_tolerance: 0.5 #等待坐标变换发布信息的超时时间

  static_map: true # 是否使用一个地图或者地图服务器来初始化全局代价地图,如果不使用静态地图,这个参数为false.

2.3 local_costmap_params.yaml

该文件用于局部代价地图参数设置:

local_costmap:
  global_frame: odom #里程计坐标系
  robot_base_frame: base_footprint #机器人坐标系

  update_frequency: 10.0 #代价地图更新频率
  publish_frequency: 10.0 #代价地图的发布频率
  transform_tolerance: 0.5 #等待坐标变换发布信息的超时时间

  static_map: false  #不需要静态地图,可以提升导航效果
  rolling_window: true #是否使用动态窗口,默认为false,在静态的全局地图中,地图不会变化
  width: 3 # 局部地图宽度 单位是 m
  height: 3 # 局部地图高度 单位是 m
  resolution: 0.05 # 局部地图分辨率 单位是 m,一般与静态地图分辨率保持一致

2.4 base_local_planner_params

基本的局部规划器参数配置,这个配置文件设定了机器人的最大和最小速度限制值,也设定了加速度的阈值。

TrajectoryPlannerROS:

# Robot Configuration Parameters
  max_vel_x: 0.5 # X 方向最大速度
  min_vel_x: 0.1 # X 方向最小速速

  max_vel_theta:  1.0 # 
  min_vel_theta: -1.0
  min_in_place_vel_theta: 1.0

  acc_lim_x: 1.0 # X 加速限制
  acc_lim_y: 0.0 # Y 加速限制
  acc_lim_theta: 0.6 # 角速度加速限制

# Goal Tolerance Parameters,目标公差
  xy_goal_tolerance: 0.10
  yaw_goal_tolerance: 0.05

# Differential-drive robot configuration
# 是否是全向移动机器人
  holonomic_robot: false

# Forward Simulation Parameters,前进模拟参数
  sim_time: 0.8
  vx_samples: 18
  vtheta_samples: 20
  sim_granularity: 0.05

总结


http://www.niftyadmin.cn/n/1400980.html

相关文章

树莓派该文件名_树莓派基本指令

树莓派通过指令&#xff1a; uname-a //查看内核、操作系统和CPU信息查看操作系统版本piraspberrypi:~ $ cat /proc/version查看主板版本piraspberrypi:~ $ cat /proc/cpuinfo树莓派配置&#xff1a; raspi-configsudo su 进入root权限操作clear指令&#xff1a;清屏reboot 重…

css3昼夜背景切换开关特效,8种选项开关的切换特效

一款8种选项开关的切换特效代码&#xff0c;每种特效的动画样式都不同&#xff0c;样式的形状大小、颜色、字体等均可以自由调整&#xff0c;适用于表单里的选项开关等场景&#xff0c;喜欢的童鞋请收下吧。查看演示下载资源&#xff1a;28次 下载资源下载积分&#xff1a;20积…

双光子荧光成像_双光子荧光显微镜

【技术特点】-- 双光子荧光显微镜MitochondriaHela cellshuman skinBiopsie of LungSHG & Red in ZebrafishImage in Lung Slice第二代双光子显微镜: LaVision BioTeczei新的双光子显微镜-第二代双光子显微镜TriM Scope II具有一些新的特点&#xff1a;TriM ScopeII双光子显…

ajax获取数据显示列表,AJAX获取到数据后表格显示不出来

控制层RequestMapping(value "/list")public void select(HttpServletResponse resp){try {/list集合中存放的是好多student对象/List studentsuserMapper.selectList(null);/将list集合装换成json对象/JSONArray jsonlist JSONArray.fromObject(students);//接下来…

子站间 携带cookie_总结一下顶级域名和子级域名之间的cookie共享和相互修改、删除...

最近项目中刚好涉及到了主域名和子域名之间的共享和相互修改、删除&#xff0c;也就借此机会总结一下常用的几个场景&#xff0c;这里代码以PHP为例来说明&#xff0c;域名的话就拿顶级域名和二级域名为例&#xff0c;其他的场景都是类似哈&#xff01;设置COOKIE顶级域名顶级域…

c ajax 验证码,asp.net ajax实现无刷新验证码

1、首先是在后台验证码的aspx文件的Page_Load中的事件代码&#xff1a; using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Drawing;namespace 学生在线考试系统{public p…

bcb mdi窗体画背景图片_BCB实现MDI程序背景图

BCB实现MDI程序背景图.在开发软件时&#xff0c;总希望软件界面越漂亮越好&#xff0c;我们在C Builder的SDI程序中比较容易实现漂亮的软件界面&#xff0c;但在MDI程序中&#xff0c;由于Windows的MDI软件的开发隐藏了许多技术细节&#xff0c;用SDI程序的方法&#xff0c;就不…

修改服务器地址链家网6,怎么更改网络服务器的ip地址?

网络服务器是计算机局域网的核心部件。网络操作系统是在网络服务器上运行的&#xff0c;网络服务器的效率直接影响整个网络的效率。1、修改IP第一步&#xff0c;进入网络连接&#xff0c;方法&#xff0c;在桌面右键点击“网上邻居”&#xff0c;然后在右键菜单中选择“属性”这…