IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Navigation实训整理 -> 正文阅读

[人工智能]Navigation实训整理

Navigation实训整理

乱七八糟的东西记了很多,放在这做个纪念吧

1. SLAM和Navigation整体流程

SLAM即实时定位与建图技术,要点有两点即定位建图。定位要求能都依据里程计和imu的信息并结合雷达的修正得到实时准确位置。而建图则依据雷达或相机的信息,并据此得到该位置处环境中实物的距离和方位角,通过某种算法得到代价栅格地图。
Navigation包含如下步骤:

  1. mapserver节点把SLAM或者其他方法得到的地图传到move_base并在此生成Costmap,之后以此作为避障的依据;
  2. amcl节点订阅odom(里程计信息)并订阅Laser(需要有laser到root_link的TF)将实时场景与静态全局地图匹配来修正odom到map的偏移;
  3. move_base调用全局规划器调用作为插件存在的全局规划器、局部规划器完成路径规划生成目标轨迹并发送cmd_vel指令到控制器;
  4. 控制器依据具体硬件结构将cmd_vel信息转为各个轮子的转速或转矩信号并发送给执行器。

定位的核心是维护一条准确且实时更新的从map到base_link的TF树;路径规划的核心是生成global_costmap和local_costmap并调用路径规算法。
ROS定位与导航框架
导航消息类型,此外导航涉及到许多的话题和服务,这些通讯模式有自己的消息格式,学习过程中了解消息类型也很重要。

2. Navigation运行了那些节点,各有何特点:

AMCL:通过雷达实时信息与静态地图匹配计算出对里程计长距离移动引起的误差进行修正;

  • 需要配置好Laser和inu到root_link的TF;
  • 更改机器人对应基坐标系名称;
  • 配置里程计模型参数(diff、omni)

move_base:全局路径规划、局部避障、速度指令生成;

Laser启动节点:发布laser信息,为amcl和move_base提供scan信息;

Imu/编码器里程计启动节点:用于生成odom信息;

mapserver:通过Service/Topic方式向move_base提供静态地图;

此部分内容基本上是第一部分Navigation导航元功能包几部分内容的实现,基本的配置方式可参见奥特学院ROS ,该文本第七章有基本方法介绍。需要注意的是,此部分内容为仿真实现真实的机器人在静态TF发布和/odom到/base_footprint坐标的发布有些不同。

3. 导航涉及到哪些坐标变换:

实体机器人导航时主要维护一条TF树:

/map——/odom——/root_link——/base_link——/laser&/imu_link

而当仿真或者实体机器人经过rviz显示时还需要经由robot_state_publisherjoint_state_publisher两个节点来发布机器人信息,涉及urdf模型中包括车轮、辅助支撑link等所有link的TF变换;
该部分的内容可以在这个博客里找到:导航坐标系

4. 各个TF变换都由谁来发布和维护

建图和导航过程中主要涉及的坐标系有地图坐标系(/map)、里程计坐标系(/odom)、机器人基坐标系(/base_footprint)、雷达坐标系(/laser)、imu安装坐标系(/imu);若在rviz中展示机器人模型需要包括车轮、底盘支撑架等一系列link的位置;

对于这些TF的发布和维护,有几种不同方式,

  • /odom——>/map:由AMCL节点维护一个动态坐标变换,可用来表示里程计误差;
  • /base_footprint——>/odom:主要与里程计的来源有关。可以直接由编码器生成并在编码器节点发布,或者由imu经inu_filter处理后发布;也可两者结合经由卡尔曼滤波生成。用于描述机器人相对于里程计坐标(坐标原点,只是最初的原点,之后会相对于/map偏移)的位移;
  • 雷达和imu相对于机器人基坐标系:在launch文件中加入静态变换或者写进urdf
  • 其他TF:在urdf中的各个link的位置,通过robot_state_publisher发布;
    需要注意的是,要根据实际定义的坐标系来更改yaml和launch文件中坐标系的名称;另外注意静态TF和urdf中的内容要避免重复;

这些坐标系和TF的配置一般在move_base需要的yaml文件、urdf文件、雷达或者imu的启动launch文件中。

比较难理解的是AMCL维护的/odom和/map的变换,它涉及到了两种定位方式的融合,最终以连续定位偏差额形式输出,这块内容这个博客讲的很好:AMCL定位

5. map的一生:

  • SLAM生成map话题;
  • mapserver节点将SLAM生成的地图保存(一种栅格占有地图OGM),包括两个文件PGM文件是一张灰度图片,YAML文件保存了一些参数;
  • 导航开始,map_server以/map的topic将静态地图发布到move_base;
    静态地图经move_base生成global_cost_map,即全局代价地图。
  • 同时AMCL节点通过map_server包的static_map服务来获取map话题,用于之后的步骤;

本质上是一张包含了障碍物等空间信息的二维图片,每一个像素代表一定的距离,因此可以通过PS或者opencv、matlab等来进行后续平滑处理。此外,也可由CAD生成图片,直接将施工图转为map图片。

激光slam-- .pgm格式地图分析及修改方法
ROS自定义地图(CAD、手绘等)

6.map和/map坐标系、odom和/odom坐标系关系:

  • /map和/odom是两个坐标系,可以理解为世界中的两个坐标原点。他们在导航刚开始的时候是重合的(一般),但随着小车的移动里程计难免会有误差,这时小车里程计所记录的此刻的位置和小车真实的位置出现偏差,在ROS中这一偏差体现为/odom相对于/map两个坐标系之间的相对移动,具体体现形式为两个坐标系之间的TF,这一TF由AMCL维护;
  • map和odom是两个消息类型前者通过int8数组形式传递了代价栅格地图的信息;后者包含了位姿信息(geometry_msgs/PoseWithCovariance pose)和速度信息(geometry_msgs/TwistWithCovariance twist)以及协方差矩阵。

7. 代价地图

代价地图的生成方式如,即继承父类后分三层来生成,分别为静态层、基本障碍层和膨胀层。对于具体的流程不必了解太多,大体如下图所示,其实例化过程由costmap_2D功能包来完成,具体由cottmap2DROS这一类函数来实现。
https://blog.csdn.net/lqygame/article/details/71270858;
在实际使用过程中,代价地图有两种,即全局代价地图和局部代价地图,前者来源于静态地图,并用于全局路径规划,并生成全局路径;后者来源于实时传感器数据(与静态地图无关)与生成的全局路径一起输入到局部规划器,生成一定范围内的局部路径。
此外,cost_map每层采用了插件式结构故而可以分层编译和自定义添加地图层用以完成包括手动设置不可达区域甚至结合体素(voxel)来完成三维形式的地图,详细信息可参考该博客;cost_map

8. scan的一生

雷达是导航中很重要的一部分,他可以提供机器人到周围环境的距离和相位角信息,它的作用如下:

  • 提供给AMCL节点,用于机器人定位,具体在AMCL实现;
  • 提供给move_base节点,用于在cost_map2D节点生成局部代价地图;

需要注意的有两点,一是雷达和imu一样,也有相应的filter功能包可以对/scan数据进行相应处理后再发送到各节点;二是雷达的/scan信息也可以由摄像头点云数据经功能包处理得到;

宕开一笔—— move_base实现流程

这一套下来从整体上,在功能包层梳理了Navigation实现流程和一些注意事项,但熟悉这一套也只能成为一名光荣的——“调参侠”。SLAM和Navigation中最为核心的永远是算法,具体到Navigation,是全局规划器和本地规划器,想要能做个性化开发和应用,甚至算法研究必须能在这上面下点功夫。

而做路径规划离不了move_base和Movebase类,最好的方式是读源码(开源真香)
move_base代码流程图详细注释
ROS Navigation之move_base完全详解(强烈推荐)
源码分析系列(可以结合上文一起看)

目前在龟速学习中,下阶段希望可以写出一个简单的全局规划器并实现调用

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-01-01 13:53:53  更:2022-01-01 13:53:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 23:19:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码