本文是一些机器人算法(特别是自动导航算法)的Python代码合集。其主要特点有以下三点:
-
选择了在实践中广泛应用的算法;
-
依赖最少;
-
容易阅读,容易理解每个算法的基本思想。
希望阅读本文后能对你有所帮助。前排友情提示,文章较长,建议收藏后再看。
如果有对学python方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步。
也希望大家对学python能够持之以恒
如果你想要学好python最好加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,
【 784758214 】,这里是python学习者聚集地
点:速学python
01 目录
环境需求
怎样使用
本地化
-
扩展卡尔曼滤波本地化
-
无损卡尔曼滤波本地化
-
粒子滤波本地化
-
直方图滤波本地化
映射
-
高斯网格映射
-
光线投射网格映射
-
k均值物体聚类
-
圆形拟合物体形状识别
-
迭代最近点匹配
-
EKF SLAM
-
FastSLAM 1.0
-
FastSLAM 2.0
-
基于图的SLAM
路径规划
-
动态窗口方式
-
基于网格的搜索
-
迪杰斯特拉算法
-
A*算法
-
势场算法
-
模型预测路径生成
-
路径优化示例
-
查找表生成示例
-
状态晶格规划
-
均匀极性采样(Uniform polar sampling)
-
偏差极性采样(Biased polar sampling)
-
路线采样(Lane sampling)
-
随机路径图(PRM)规划
-
Voronoi路径图规划
-
快速搜索随机树(RRT)
-
基本RRT
-
RRT*
-
基于Dubins路径的RRT
-
基于Dubins路径的RRT*
-
基于reeds-shepp路径的RRT*
-
Informed RRT*
-
批量Informed RRT*
-
三次样条规划
-
B样条规划
-
贝济埃路径规划
-
五次多项式规划
-
Dubins路径规划
-
Reeds Shepp路径规划
-
基于LQR的路径规划
-
Frenet Frame中的最优路径
路径跟踪
-
纯追迹跟踪
-
史坦利控制
-
后轮反馈控制
-
线性二次regulator(LQR)转向控制
-
线性二次regulator(LQR)转向和速度控制
02 环境需求
-
Python 3.6.x
-
numpy
-
scipy
-
matplotlib
-
pandas
-
cvxpy 0.4.x
03 怎样使用
1、安装必要的库;
2、克隆本代码仓库;
3、执行每个目录下的python脚本;
4、如果你喜欢,则收藏本代码库。
04 本地化
1.扩展卡尔曼滤波本地化
![](https://img.haomeiwen.com/i13090773/5f5e1e77a0638b32.png)
该算法利用扩展卡尔曼滤波器(Extended Kalman Filter, EKF)实现传感器混合本地化。
蓝线为真实路径,黑线为导航推测路径(dead reckoning trajectory),绿点为位置观测(如GPS),红线为EKF估算的路径。红色椭圆为EKF估算的协方差。
2.无损卡尔曼滤波本地化
![](https://img.haomeiwen.com/i13090773/108f226c91d5e7b2.png)
该算法利用无损卡尔曼滤波器(Unscented Kalman Filter, UKF)实现传感器混合本地化。
线和点的含义与EKF模拟的例子相同。
3. 粒子滤波本地化
![](https://img.haomeiwen.com/i13090773/d7d4f39fb810f581.png)
该算法利用粒子滤波器(Particle Filter, PF)实现传感器混合本地化。
蓝线为真实路径,黑线为导航推测路径(dead reckoning trajectory),绿点为位置观测(如GPS),红线为PF估算的路径。
该算法假设机器人能够测量与地标(RFID)之间的距离。PF本地化会用到该测量结果。
4. 直方图滤波本地化
![](https://img.haomeiwen.com/i13090773/dfb29d6606da9e56.png)
该算法是利用直方图滤波器(Histogram filter)实现二维本地化的例子。
红十字是实际位置,黑点是RFID的位置。蓝色格子是直方图滤波器的概率位置。在该模拟中,x,y是未知数,yaw已知。滤波器整合了速度输入和从RFID获得距离观测数据进行本地化。不需要初始位置。
05 映射
1. 高斯网格映射
本算法是二维高斯网格映射(Gaussian grid mapping)的例子。
![](https://img.haomeiwen.com/i13090773/469e6dfd184d7f51.png)
2. 光线投射网格映射
本算法是二维光线投射网格映射(Ray casting grid map)的例子。
![](https://img.haomeiwen.com/i13090773/0b9a182a01d0e068.png)
3. k均值物体聚类
本算法是使用k均值算法进行二维物体聚类的例子。
![](https://img.haomeiwen.com/i13090773/cb3f1476a2879ce6.png)
4. 圆形拟合物体形状识别
本算法是使用圆形拟合进行物体形状识别的例子。
![](https://img.haomeiwen.com/i13090773/62b84a0c03ea5a7a.png)
蓝圈是实际的物体形状。红叉是通过距离传感器观测到的点。红圈是使用圆形拟合估计的物体形状。
06 SLAM
同时本地化和映射(Simultaneous Localization and Mapping,SLAM)的例子。
1. 迭代最近点匹配
本算法是使用单值解构进行二维迭代最近点(Iterative Closest Point,ICP)匹配的例子。它能计算从一些点到另一些点的旋转矩阵和平移矩阵。
![](https://img.haomeiwen.com/i13090773/e9769c5564347b51.png)
2. EKF SLAM
这是基于扩展卡尔曼滤波的SLAM示例。蓝线是真实路径,黑线是导航推测路径,红线是EKF SLAM估计的路径。绿叉是估计的地标。
![](https://img.haomeiwen.com/i13090773/fd646fc6a7a8a107.png)
3. FastSLAM 1.0
这是用FastSLAM 1.0进行基于特征的SLAM的示例。蓝线是实际路径,黑线是导航推测,红线是FastSLAM的推测路径。红点是FastSLAM中的粒子。黑点是地标,蓝叉是FastLSAM估算的地标位置。
![](https://img.haomeiwen.com/i13090773/e4e5b3e061f64356.png)
4. FastSLAM 2.0
这是用FastSLAM 2.0进行基于特征的SLAM的示例。
动画的含义与FastSLAM 1.0的情况相同。
![](https://img.haomeiwen.com/i13090773/9158bc62acd48c79.png)
相关阅读:
概率机器人学
Tim Bailey的SLAM模拟
5. 基于图的SLAM
这是基于图的SLAM的示例。蓝线是实际路径。黑线是导航推测路径。红线是基于图的SLAM估算的路径。黑星是地标,用于生成图的边。
![](https://img.haomeiwen.com/i13090773/6d9aa1bdf91f74ac.png)
07 路径规划
1. 动态窗口方式
这是使用动态窗口方式(Dynamic Window Approach)进行二维导航的示例代码。
![](https://img.haomeiwen.com/i13090773/c2ab880c37c8932e.png)
2. 基于网格的搜索
2.1 迪杰斯特拉算法
这是利用迪杰斯特拉(Dijkstra)算法实现的基于二维网格的最短路径规划。
![](https://img.haomeiwen.com/i13090773/0c218bb656e13635.png)
动画中青色点为搜索过的节点。
2.2 A*算法
下面是使用A星算法进行基于二维网格的最短路径规划。
![](https://img.haomeiwen.com/i13090773/6cd3efbe6b12e081.png)
动画中青色点为搜索过的节点。启发算法为二维欧几里得距离。
2.3 势场算法
下面是使用势场算法进行基于二维网格的路径规划。
![](https://img.haomeiwen.com/i13090773/292d547f8ee63d33.png)
动画中蓝色的热区图显示了每个格子的势能。
3. 模型预测路径生成
下面是模型预测路径生成的路径优化示例,算法用于状态晶格规划(state lattice planning)。
3.1 路径优化示例
![](https://img.haomeiwen.com/i13090773/8a13d9616d2e2eb1.png)
3.2 查找表生成示例
![](https://img.haomeiwen.com/i13090773/38686137b1fd0bf8.png)
4. 状态晶格规划
这个脚本使用了状态晶格规划(state lattice planning)实现路径规划。
这段代码通过模型预测路径生成来解决边界问题。
4.1 均匀极性采样(Uniform polar sampling)
![](https://img.haomeiwen.com/i13090773/8a5b84b987c81d13.png)
4.2 偏差极性采样(Biased polar sampling)
![](https://img.haomeiwen.com/i13090773/73aaeb18e3d8cc4e.png)
4.3 路线采样(Lane sampling)
![](https://img.haomeiwen.com/i13090773/e7946c43408818f4.png)
5. 随机路径图(PRM)规划
这个随机路径图(Probabilistic Road-Map,PRM)规划算法在图搜索上采用了迪杰斯特拉方法。动画中的蓝点为采样点。青色叉为迪杰斯特拉方法搜索过的点。红线为PRM的最终路径。
6. Voronoi路径图规划
![](https://img.haomeiwen.com/i13090773/4b825d5440f57d46.png)
这个Voronoi路径图(Probabilistic Road-Map,PRM)规划算法在图搜索上采用了迪杰斯特拉方法。动画中的蓝点为Voronoi点。青色叉为迪杰斯特拉方法搜索过的点。红线为Voronoi路径图的最终路径。
7. 快速搜索随机树(RRT)
7.1 基本RRT
![](https://img.haomeiwen.com/i13090773/ca8ffd18b8c2d351.png)
这是个使用快速搜索随机树(Rapidly-Exploring Random Trees,RRT)的简单路径规划代码。黑色圆为障碍物,绿线为搜索树,红叉为开始位置和目标位置。
7.2 RRT*
![](https://img.haomeiwen.com/i13090773/9f2a14a69f22879c.png)
这是使用RRT*的路径规划代码。黑色圆为障碍物,绿线为搜索树,红叉为开始位置和目标位置。
7.3 基于Dubins路径的RRT
![](https://img.haomeiwen.com/i13090773/ac13d26d47371288.png)
为汽车形机器人提供的使用RRT和dubins路径规划的路径规划算法。
7.4 基于Dubins路径的RRT*
![](https://img.haomeiwen.com/i13090773/6a15c3a2fd7f9400.png)
为汽车形机器人提供的使用RRT*和dubins路径规划的路径规划算法。
7.5 基于reeds-shepp路径的RRT*
![](https://img.haomeiwen.com/i13090773/cadeeb6b9e287c25.png)
为汽车形机器人提供的使用RRT*和reeds shepp路径规划的路径规划算法。
7.6 Informed RRT*
![](https://img.haomeiwen.com/i13090773/e59e5f1bda026efb.png)
这是使用Informed RRT的路径规划代码。青色椭圆为Informed RRT的启发采样域。
7.7 批量Informed RRT*
![](https://img.haomeiwen.com/i13090773/ca5ef9e7052df393.png)
这是使用批量Informed RRT*的路径规划代码。
7.8 闭合回路RRT*
使用闭合回路RRT(Closed loop RRT)实现的基于车辆模型的路径规划。
![](https://img.haomeiwen.com/i13090773/3e47f44591bf8e74.png)
这段代码里,转向控制用的是纯追迹算法(pure-pursuit algorithm)。速度控制采用了PID。
7.9 LQR-RRT*
这是个使用LQR-RRT*的路径规划模拟。LQR局部规划采用了双重积分运动模型。
![](https://img.haomeiwen.com/i13090773/2730c8b24e8651f1.png)
8. 三次样条规划
这是段三次路径规划的示例代码。这段代码根据x-y的路点,利用三次样条生成一段曲率连续的路径。每个点的指向角度也可以用解析的方式计算。
![](https://img.haomeiwen.com/i13090773/a70054dcc87519d3.png)
![](https://img.haomeiwen.com/i13090773/d813740920c9887d.png)
![](https://img.haomeiwen.com/i13090773/5e7352a10e0c5799.png)
9. B样条规划
![](https://img.haomeiwen.com/i13090773/c1d3900914112a80.png)
这是段使用B样条曲线进行规划的例子。输入路点,它会利用B样条生成光滑的路径。第一个和最后一个路点位于最后的路径上。
10. Eta^3样条路径规划
![](https://img.haomeiwen.com/i13090773/8dd9fd86f687ce33.png)
这是使用Eta ^ 3样条曲线的路径规划。
11. 贝济埃路径规划
贝济埃路径规划的示例代码。根据四个控制点生成贝济埃路径。
![](https://img.haomeiwen.com/i13090773/e96ebd7b66fe2087.png)
改变起点和终点的偏移距离,可以生成不同的贝济埃路径:
![](https://img.haomeiwen.com/i13090773/34ba957206ae9998.png)
12. 五次多项式规划
利用五次多项式进行路径规划。
![](https://img.haomeiwen.com/i13090773/d99ed2e7ee135395.png)
它能根据五次多项式计算二维路径、速度和加速度。
13. Dubins路径规划
Dubins路径规划的示例代码。
![](https://img.haomeiwen.com/i13090773/8fc96c4b222a3638.png)
14. Reeds Shepp路径规划
Reeds Shepp路径规划的示例代码。
![](https://img.haomeiwen.com/i13090773/e441449f4034e0f4.png)
相关阅读:
15.3.2 Reeds-Shepp曲线
http://planning.cs.uiuc.edu/node822.html
用于能前进和后退的汽车的最优路径
ghliu/pyReedsShepp:实现Reeds Shepp曲线
15. 基于LQR的路径规划
为双重积分模型使用基于LQR的路径规划的示例代码。
![](https://img.haomeiwen.com/i13090773/210461acfc08ff65.png)
16. Frenet Frame中的最优路径
![](https://img.haomeiwen.com/i13090773/244dd46a753690a0.png)
这段代码在Frenet Frame中生成最优路径。青色线为目标路径,黑色叉为障碍物。红色线为预测的路径。
08 路径跟踪
1. 姿势控制跟踪
这是姿势控制跟踪的模拟。
![](https://img.haomeiwen.com/i13090773/7f34ff992a36c80d.png)
2. 纯追迹跟踪
使用纯追迹(pure pursuit)转向控制和PID速度控制的路径跟踪模拟。
![](https://img.haomeiwen.com/i13090773/532969a76be40a5a.png)
红线为目标路线,绿叉为纯追迹控制的目标点,蓝线为跟踪路线。
3. 史坦利控制
使用史坦利(Stanley)转向控制和PID速度控制的路径跟踪模拟。
![](https://img.haomeiwen.com/i13090773/dad1fc2925839e68.png)
4. 后轮反馈控制
利用后轮反馈转向控制和PID速度控制的路径跟踪模拟。
![](https://img.haomeiwen.com/i13090773/48308e083bbcb7b1.png)
5. 线性二次regulator(LQR)转向控制
使用LQR转向控制和PID速度控制的路径跟踪模拟。
![](https://img.haomeiwen.com/i13090773/79844c9af2b5e55f.png)
6. 线性二次regulator(LQR)转向和速度控制
使用LQR转向和速度控制的路径跟踪模拟。
![](https://img.haomeiwen.com/i13090773/f609cfb720237f3a.png)
7. 模型预测速度和转向控制
使用迭代线性模型预测转向和速度控制的路径跟踪模拟。
![](https://img.haomeiwen.com/i13090773/27c11808afc6da92.png)
这段代码使用了cxvxpy作为最优建模工具。
End.
如果有对学python方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步。
也希望大家对学python能够持之以恒
如果你想要学好python最好加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,
【 784758214 】,这里是python学习者聚集地
点:速学python
网友评论