初识ros-Navigation

news2024/11/15 9:55:00

  最近一直在看京天Turtlebot3 waffle pi的导航部分,这篇文章就介绍一下相关内容。导航模块是一个独立完整的模块,内容比较多也很深入。因为笔者没有看过源码,只是一些概念上的了解,做个整理,为后续的源码阅读做准备。本文整体上分为两个的大部分,第一部分针对Turtlebot下Navigation模块的理论介绍,第二部分结合京天Turtlebot3 waffle pi做一些具体应用阐述。

  关于Navigation的介绍,起点要从这张图开始:
在这里插入图片描述
  图中的方块有三种颜色,代表不同含义。白色的部分是必须且已实现的组件,灰色的部分是可选且已实现的组件,蓝色的部分是必须为每一个机器人平台定制创建的组件。简单点儿说,就是一个机器人开发商,白灰都可以直接拿轮子用,蓝色的需要自主开发。
  Navigation整体可以划分成几个子模块:map_server、amcl、move_base

  1)map_server

  严格上来讲map_server不算Navigation里面的,只是使用到了其中的一些功能。map_server最直接的功能就是提供了地图(静态地图可输入,所以提供的应该是实时地图),map_server会发布/map话题,实时的获取一些激光雷达信息。

  2)amcl

  amcl全称是adaptive Monte Carlo localization,自适应蒙特卡洛定位。主要功能就是负责定位(机器人位姿确定),输入是激光雷达(包括激光地图,激光扫描)、里程计的数据、tf转换,输出机器人在地图中的位姿。这个作为可选的因素是在Navigation也有默认的定位方式:里程计直接定位(fake_localization)。二者的对比关系如下图:在这里插入图片描述
图源:https://blog.csdn.net/x_r_su/article/details/53396564
留一个amcl的学习资料:https://www.bilibili.com/video/BV18D4y1c7jz/?spm_id_from=333.337.search-card.all.click
  很多学者对于tf总能看到,却没有一个明确的概念。借此机会介绍下tf转换树:
  tf变换树:管理不同坐标系之间的平移和旋转,用树形结构保证存在单向的转换。树中每个节点代表一个坐标系,节点之间的连线代表坐标系转换。tf库已经集成好,只要添加节点关系就能实现自动转换
  tf库学习:https://blog.csdn.net/x_r_su/article/details/53332959
  tf作用:确定机器人在物理世界位置以及传感器数据和静态地图关系

  3)move_base

  move_base是Navigation中最核心的内容,它主要负责的功能是路径规划以及驱动控制。move_base包含四个组成:全局规划器(global_planner)、局部规划器(local_planner)、代价地图(costmap)、恢复行为(recover_bechivor)。
  move_base的整体工作流程是:目标点信息→全局规划器(利用全局代价地图信息计算全局路径)→局部规划器(计算速度)→控制器。
  设定目标点以及静态地图,全局规划就会规划一个大概路径,然后在路径上产生一些路径点,把这些路径点交给局部规划器进行局部规划,最后由局部规划器控制移动。
  Move_base是基于状态机的,三个状态
  1)PLANNING状态 全局路径规划状态
  2)CONTROLLING状态 控制移动状态(判断是否到达目标点)
  3)CLEARING状态 执行恢复行为状态

  下面更为详细的介绍下四个组成部分:

  (1)global_planner

  关于global_planner没有太多的东西,这里就简单说一下分类:global planner,navfn planner

  (2)local_planner

local_planner稍微重要一点,先说下分类:base_local_planner、eband_local_planner、teb_local_planner、dwa_local_planner
  关于这四种,详细的介绍下dwa_local_planner(因为这个是京天实际选择的)
  dwa全称为Dynamic Window Approach,这种方法在1997年,这里附上原论文:The Dynamic Window Approach to Collision Avoidance 1997
  dwa整体的算法逻辑是先离散采样,对于每个采样速度结合当前状态进行移动模拟,结合几个方面评价正向模拟轨迹并打分,选择分最高。
  直接这么看可能不太好理解,结合一个图说一下:在这里插入图片描述
图源:https://scm_mos.gitlab.io/motion-planner/dwa-local-planner/
  dwa的算法步骤先通过离散采样获取一些状态信息,然后对每一个采样进行前向模拟(就是上图的虚线路径),路径会有好几条,对每条进行打分,最后选择分最高的。至于打分的评判有以下七个方面:在这里插入图片描述
参考:https://blog.csdn.net/weixin_44126988/article/details/126147666?spm=1001.2014.3001.5502
  在实现上dwa_local_planner的大部分处理在base_local_planner中,大部分包括实际的路径规划、打分的实现

  (3)costmap

  costmap是平面的,所以也常常被叫做costmap_2d。这个有两类:local_costmap和global_costmap。分别针对于global_planner和local_planner。其余方面没有差别。
  明确costmap的作用:保存障碍物信息,所以costmap的来源有两个——静态地图和传感器数据。上面说costmap是2d,其实是由无数个小方格组成的地图,每一个格都有代价值,两个格的差值就是移动代价。
  在实现上costmap以层的结构维护,层包括static map layer,obstacle map layer,inflation layer,自定义层(自定义层存在的价值是可以随意控制,即使没有障碍物也能够避开该区域)
  有了costmap就可以规划路径了,常用的路径有以下两种:
    栅格路径:终点开始上下左右四个点最小的直到起点
    梯度路径:周围八个栅格中下降梯度最大的点
map_server负责初始化costmap_2d

  (4)恢复行为

  恢复行为发生在导航出现故障时,这个故障指暂时找不到合适的路径。就会执行一些行为恢复之前的状态,行为比如抛弃之前的costmap,在现实中的体现就是机器人会原地旋转,不过也是可以自行设置的。
以上对move_base的四个组成部分进行了介绍,其实在实现上move_base对于每个模块提供接口,以插件的形式供ros使用,然后做整合。所以每一个部分都是可以自主定制的。

  下面结合一下京天Turtlebot3_waffle_pi对上面的理论进行下夯实
  执行命令:

roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml

  这里面的map.yaml其实就是静态地图的导入,再此说明下参数含义:在这里插入图片描述
  来看看turtlebot3_navigation.launch,可以分为下面几个部分在这里插入图片描述
  其中Turtlebot3_remote.launch是waffle_pi的模型导入,map_server提供一些地图操作,amcl.launch提供定位,move_base.launch提供路径规划。turtlebot3_navigation.rviz提供可视化。
  京天Turtlebot3_waffle_pi使用的local_planner默认是dwa_local_planner,它的参数放在了dwa_local_planner_params_waffle_pi.yaml中,里面有很多参数,对参数含义进行一下解释:

DWAPlannerROS:

# Robot Configuration Parameters
  max_vel_x: 0.26    #x方向最大线速度绝对值,单位m/s,(负值代表可以后退)
  min_vel_x: -0.26   #x方向最小线速度绝对值,单位m/s,(负值代表可以后退)

  max_vel_y: 0.0   #y方向最大线速度绝对值,单位m/s,差分机器人没有y
  min_vel_y: 0.0   #y方向最小线速度绝对值,单位m/s,差分机器人没有y


#注意不要将min_trans_vel设置为0,否则DWA认为平移速度不可忽略,将创建较小的旋转速度
# The velocity when robot is moving in a straight line(纯直线移动时,与前面max_vel_x不冲突)
  max_vel_trans:  0.26      #最大平移速度绝对值,单位m/s
  min_vel_trans:  0.13      # 最小平移速度绝对值,单位m/s

  max_vel_theta: 1.82   #最大旋转角速度绝对值,单位rad/s
  min_vel_theta: 0.9     #最小旋转角速度绝对值,单位rad/s

  acc_lim_x: 2.5   #x方向极限加速度,单位m/(s^2)
  acc_lim_y: 0.0   #y方向极限加速度,单位m/(s^2),差分机器人y为0
  acc_lim_theta: 3.2 #旋转极限加速度,单位rad/(s^2)

# Goal Tolerance Parametes(目标距离差距容忍参数)
  xy_goal_tolerance: 0.05 #xy方向上容忍误差,单位m
  yaw_goal_tolerance: 0.17 #控制器偏航时弧度容忍误差,单位rad
  latch_xy_goal_tolerance: false #设置为true时表示:如果到达容错距离内,机器人就会原地旋转;即使转动是会跑出容错距离外
#注:这三个参数的设置及影响讨论请参考《ROS导航功能调优指南》

# Forward Simulation Parameters
  sim_time: 2.0     #前向模拟轨迹时间,单位为s
  vx_samples: 20   #x方向速度空间采样点数
  vy_samples: 0     #y方向速度空间采样点数,差分机器人为0
  vth_samples: 40  #旋转方向速度空间采样点数
  controller_frequency: 10.0   
#注:参数的设置及影响讨论请参考《ROS导航功能调优指南》

# Trajectory Scoring Parameters (估计评分参数)
  path_distance_bias: 32.0   #控制器与给定路径接近程度的权重(越大说明越贴合)
  goal_distance_bias: 20.0   #控制器与局部目标点接近程度的权重,也用于速度控制
  occdist_scale: 0.02   #控制器躲避障碍物的程度
  forward_point_distance: 0.325  #以机器人为中心,额外放置一个计分点的距离
  stop_time_buffer: 0.2  #为防止碰撞,机器人必须提前停止的时间长度,单位为s
  scaling_speed: 0.25  #开始缩放机器人足迹时的速度的绝对值,单位为m/s。
  #在进行对轨迹各个点计算footprintCost之前,会先计算缩放因子。如果当前平移速度小于scaling_speed,则缩放因子为1.0,否则,缩放因子为(vmag - scaling_speed) / (max_trans_vel - scaling_speed) * max_scaling_factor + 1.0。然后,该缩放因子会被用于计算轨迹中各个点的footprintCost。
  # 参考:https://www.cnblogs.com/sakabatou/p/8297479.html
  #亦可简单理解为:启动机器人底盘的速度.(Ref.: https://www.corvin.cn/858.html)
  max_scaling_factor: 0.2   #最大缩放因子

# Oscillation Prevention Parameters
  oscillation_reset_dist: 0.05    #机器人重置震荡标记的运动距离

# Debugging
  publish_traj_pc : true   #规划的轨迹是否在rviz上可视化
  publish_cost_grid_pc: true #是否将代价值可视化显示


#整篇参数注释参考:[https://www.codeleading.com/article/62641792851/

  还有导航时的一些可查询信息,此处列举了rosnode和rostopic,最后附带一下它们的节点话题图在这里插入图片描述

user@ubuntu:~$ rostopic list
/amcl/parameter_descriptions
/amcl/parameter_updates
/amcl_pose
/battery_state
/cmd_vel
/cmd_vel_rc100
/diagnostics
/firmware_version
/imu
/initialpose
/joint_states
/magnetic_field
/map
/map_metadata
/map_updates
/motor_power
/move_base/DWAPlannerROS/cost_cloud
/move_base/DWAPlannerROS/global_plan
/move_base/DWAPlannerROS/local_plan
/move_base/DWAPlannerROS/parameter_descriptions
/move_base/DWAPlannerROS/parameter_updates
/move_base/DWAPlannerROS/trajectory_cloud
/move_base/NavfnROS/plan
/move_base/cancel
/move_base/current_goal
/move_base/feedback
/move_base/global_costmap/costmap
/move_base/global_costmap/costmap_updates
/move_base/global_costmap/footprint
/move_base/global_costmap/inflation_layer/parameter_descriptions
/move_base/global_costmap/inflation_layer/parameter_updates
/move_base/global_costmap/obstacle_layer/parameter_descriptions
/move_base/global_costmap/obstacle_layer/parameter_updates
/move_base/global_costmap/parameter_descriptions
/move_base/global_costmap/parameter_updates
/move_base/global_costmap/static_layer/parameter_descriptions
/move_base/global_costmap/static_layer/parameter_updates
/move_base/goal
/move_base/local_costmap/costmap
/move_base/local_costmap/costmap_updates
/move_base/local_costmap/footprint
/move_base/local_costmap/inflation_layer/parameter_descriptions
/move_base/local_costmap/inflation_layer/parameter_updates
/move_base/local_costmap/obstacle_layer/parameter_descriptions
/move_base/local_costmap/obstacle_layer/parameter_updates
/move_base/local_costmap/parameter_descriptions
/move_base/local_costmap/parameter_updates
/move_base/parameter_descriptions
/move_base/parameter_updates
/move_base/result
/move_base/status
/move_base_simple/goal
/odom
/particlecloud
/reset
/rosout
/rosout_agg
/rpms
/scan
/sensor_state
/sound
/tf
/tf_static
/version_info

在这里插入图片描述
  在执行程序的时候会有两个错误:

#第一个代表恢复行为执行失败
[ERROR] [1673842142.773870082]: Rotate recovery can't rotate in place because there is a potential collision. Cost: -1.00
#第二个代表导航实现不了
[ERROR] [1673842147.874115059]: Aborting because a valid plan could not be found. Even after executing all recovery behaviors

下面留一些参考资料:
首先是Navigation的源码解读,都是一系列的博客,感觉十分有帮助:
https://blog.csdn.net/weixin_44126988?type=blog
https://blog.csdn.net/x_r_su/category_6374886.html
https://blog.csdn.net/heyijia0327/category_2768679.html
https://gaoyichao.com/Xiaotu/?book=turtlebot&title=index#part4
还有过程中发现了一本讲ros的书,也在此做个记录
https://www.kancloud.cn/zhouws/robot_ustc_mooc/2153732

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/185159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苏嵌实训——day16

文章目录一、进程间通信:1.传统通信方式:2. IPC通信方式(第五代操作系统):(1)传统通信之无名管道(2)传统通信方式之有名管道(3)使用有名管道来实现…

Python实现清除文件夹中重复视频

目录一、二进制文件二、摘要算法(MD5)三、shutil模块四、视频清除视频全在一个文件夹里视频在不同的文件夹里一、二进制文件 二进制文件是以文本的二进制形式存储在计算机中。 用户一般不能直接读取它们,需要通过相应的软件才能将其显示出来。 二进制文件一般是可…

jspssm大学生宿舍管理系统-宿管带前端

目录 摘 要 II Abstract III 1 绪论 1 1.1 课题背景 1 1.2 课题研究现状 1 1.3 初步设计方法与实施方案 2 1.4 本文研究内容 2 2 系统开发环境 4 2.1 JSP技术 4 2.2 B/S架构 5 2.3 Eclipse环境配置 5 2.4 MySQL数据库 6 3 系统分析 7 3…

【微服务】Docker容器化

🚩本文已收录至专栏:微服务探索之旅 👍希望您能有所收获 一.引入 (1) 为什么需要Docker 微服务虽然具备各种各样的优势,但服务的拆分的非常多给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同…

【1】Python基础语法

字面量 字面量:在程序中,被写下来的固定值,称之为字面量。Python中常用的6种数据类型: 字符串(string),又称文本,是由任意数量的字符如中文、英文、各类符号、数字等组成&#xff0…

虚拟化技术学习笔记10

虚拟机镜像管理 学习目标: 能够了解KVM虚拟机支持的镜像格式 能够使用qemu-img实现镜像创建 能够使用qemu-img实现镜像查看 能够使用qemu-img实现镜像格式转换 能够了解后备镜像的作用 能够了解差量镜像的作用 能够基于后备镜像制作差量镜像 能够使用差量镜…

[网鼎杯 2020 朱雀组]Nmap(双解详细分析)

目录 Nmap 相关参数 信息收集 思路 方法一 方法二 nmap常见操作 Nmap 相关参数 -iL 读取文件内容,以文件内容作为搜索目标 -o 输出到文件 -oN 标准保存 -oX XML保存 -oG Grep保存 -oA 保存到所有格式 信息收集 可以对ip进行扫描 思路 方法一 将一句话木马…

【高并发】- 生产级系统搭建 - 3

前言 本章讲解高并发系统动静分离方案设计、热点数据处理、管控等思想。 1. 动静分离方案设计 动静分离实质,将静态页面与动态页面(或者静态数据与动态数据)解耦分离,用不同系统承载对应流量。这样可以提升整个服务的访问性能和可…

MySql性能优化(五)优化细节

优化细节 当使用数据库列进行查询的时候尽量不要使用表达式,把计算结果放到业务层而不是数据层尽量使用主键索引,而不是其他索引,因此主键索引不会触发回表查询使用前缀索引 有的时候需要索引很长的字符串,这会让索引变的大且慢&…

Ethercat系列(1)COE非周期性数据通信

Ethercat主站通过读写邮箱数据SM通道实现非周期性数据通信。邮箱数据定义邮箱数据单元结构邮箱数据头各字段含义如下表非周期性邮箱数据通信EtherCAT协议中非周期性数据通信称为邮箱数据通信,它可以双向进行---主站到从站和从站到主站。它支持全双工,两个…

存储介质还是存储载体,这不是个问题

在档案领域中,“介质”和“载体”到底有什么区别?能不能混用?这个问题曾经困扰了笔者10几年,直到最近才发觉原来根本不是一个问题。我们先来看两句话: 1、磁盘、光盘、固态硬盘等常见数据存储载体的寿命无法满足电子档…

RabbitMQ快速入门和使用

文章目录1. 基础理论1.1. 同步调用与异步调用1.2. RabbitMQ 安装与运行1.2.1. 常见消息模型2. 基本消息队列的应用2.1. 消息发送流程2.2. 消息接收流程3. SpringAMQP的基础理论与应用(想快速应用看这里)3.1. 基础理论3.2. 【案例一】实现HelloWorld中的基础消息队列功能3.3. 【…

Neo4j数据库模糊查询

1、Neo4j单个查询条件模糊查询1.1使用 ~’.模糊匹配对象.’ 进行表示1.1.1 查询节点MATCH(n:Author) WHERE n.name ~.*梦.* RETURN n1.1.2 查询关系MATCH p({title:锆石U-Pb和Lu-Hf同位素研究内蒙乌努格吐山斑岩型铜钼矿岩浆岩特征})-[r:has_illustration]->(i:Illustration…

Python应用开发——制作bin文件

Python应用开发——制作bin文件 目录Python应用开发——制作bin文件前言1 环境搭建2 代码编写与测试结束语前言 什么是bin? bin是二进制文件,其用途依系统或应用而定。一种文件格式binary的缩写。一个后缀名为".bin"的文件,只是表…

无代码配置态势感知分析应用,预判你的预判

森林发生火势灾情时,应急管理中心快速做出部署,实时监测并分析演变趋势大型交通事故发生,应急指挥中对前端人员、车辆的远程调度线路规划实时监测无人机对电站电厂的运维工作公安警务对嫌疑人、嫌疑车辆等目标的跟踪侦查……以上这些&#xf…

Acwing---基础算法(一)

文章目录 快速排序归并排序整数二分浮点数二分一、快速排序 #include<iostream>using namespace std;const int N 1e6 10;int n; int q[N];void quick_sort(int q[], int l, int r) {//此时区间只有一个数或者没有数不需要排序了if (l > r) return;int x q[l], i…

【QCA】【实例】高通DTS中添加BLSP设备节点的基本配置

文章目录0. env1. 简介2. 需求及资料2.1 需求2.2 资料3. DTS实际配置及简述0. env IPQ601x SPF11.5cs 1. 简介 BLSP(BAM Low-Speed Peripheral) 不同chip有不止一组的BLSP&#xff0c;每个BLSP又有多个端口供使用。 每个端口功能可以复用为&#xff1a;SPI 或者 I2CUART 2. 需求…

计算机网络知识详解之:TCP连接原理详解

网络知识详解之&#xff1a;TCP连接原理详解 文章目录网络知识详解之&#xff1a;TCP连接原理详解TCP连接三次握手一、准备工作二、一次握手三、二次握手四、三次握手为什么TCP客户端最后还要发送一次确认呢&#xff1f;为什么要3次握手?握手中的SYN超时重试TCP协议缺陷四次挥…

HECS 安装mqtt

下载(hecs &#xff0c;centos8的样子&#xff0c;对mosquitto 版本高了安装不了)wget https://mosquitto.org/files/source/mosquitto-1.5.9.tar.gztar -zxvf mosquitto-1.5.9.tar.gz安装前置工具yum install gcc-cyum install cmakeyum install openssl-devel编译cd mosquitt…

Vue项目启动后跳转到制定路由页面

前言 今天把自己的项目布局完成了&#xff0c;但是想在项目启动的时候默认跳转到登录页面。 这其实需要借助路由实现跳转 开始编写之前&#xff0c;大家可以看下我的布局&#xff1a; 安装并使用路由 关于如何安装并使用路由&#xff0c;可以参考&#xff1a;Vue安装并使用路…