一文洞悉Python必备的50种算法

原文:https://atsushisakai.github.io/PythonRobotics/#what-is-this

作者说明:

  • AtsushiSakai,日本机器人工程师,从事自动驾驶技术开发,精通C++、ROS、MATLAB、Python、Vim和Robotics。

文章说明:

  • 本文是一些机器人算法(特别是自动导航算法)的Python代码合集。

特点:

  • 选择了在实践中广泛应用的算法;
  • 依赖最少;
  • 容易阅读,容易理解每个算法的基本思想

目录:

  • 一、环境需求
  • 二、怎样使用
  • 三、本地化
    • 3.1 扩展卡尔曼滤波本地化
    • 3.2 无损卡尔曼滤波本地化
    • 3.3 粒子滤波本地化
    • 3.4 直方图滤波本地化
  • 四、映射
    • 4.1 高斯网格映射
    • 4.2 光线投射网格映射
    • 4.3 k均值物体聚类
    • 4.4 圆形拟合物体形状识别
  • 五、SLAM
    • 5.1 迭代最近点匹配
    • 5.2 EKF SLAM
    • 5.3 FastSLAM 1.0
    • 5.4 FastSLAM 2.0
    • 5.5 基于图的SLAM
  • 六、路径规划
    • 6.1 动态窗口方式
    • 6.2 基于网格的搜索
      • 迪杰斯特拉算法
      • A*算法
      • 势场算法
    • 6.3 模型预测路径生成
      • 路径优化示例
      • 查找表生成示例
    • 6.4 状态晶格规划
      • 均匀极性采样(Uniform polar sampling)
      • 偏差极性采样(Biased polar sampling)
      • 路线采样(Lane sampling)
    • 6.5 随机路径图(PRM)规划
    • 6.6 Voronoi路径图规划
    • 6.7 快速搜索随机树(RRT)
      • 基本RRT
      • RRT*
      • 基于Dubins路径的RRT
      • 基于Dubins路径的RRT*
      • 基于reeds-shepp路径的RRT*
      • Informed RRT*
      • 批量Informed RRT*
      • 闭合回路RRT*
      • LQR-RRT*
    • 6.8 三次样条规划
    • 6.9 B样条规划
    • 6.10 Eta^3样条路径规划
    • 6.11 贝济埃路径规划
    • 6.12 五次多项式规划
    • 6.13 Dubins路径规划
    • 6.14 Reeds Shepp路径规划
    • 6.15 基于LQR的路径规划
    • 6.16 Frenet Frame中的最优路径
  • 七、路径跟踪
    • 7.1 姿势控制跟踪
    • 7.2 纯追迹跟踪
    • 7.3 史坦利控制
    • 7.4 后轮反馈控制
    • 7.5 线性二次regulator(LQR)转向控制
    • 7.6 线性二次regulator(LQR)转向和速度控制
    • 7.7 模型预测速度和转向控制
  • 八、项目支持

一、环境需求:

  • Python 3.8.x
  • numpy
  • scipy
  • matplotlib
  • pandas
  • cvxpy

二、怎样使用

  • 克隆以下仓库:
    https://github.com/AtsushiSakai/PythonRobotics.git

  • 安装必要的库;

    conda env create -f environment.yml using pip :- pip install -r requirements.txt
    
  • 执行每个目录下的python脚本;

三、本地化

3.1 扩展卡尔曼滤波本地化
  • 图解:【动图太大,无法上传】
    https://github.com/AtsushiSakai/PythonRoboticsGifs/raw/master/Localization/extended_kalman_filter/animation.gif

  • 算法说明:

    • 该算法利用扩展卡尔曼滤波器(Extended Kalman Filter, EKF)实现传感器混合本地化。
    • 蓝线为真实路径,黑线为导航推测路径(dead reckoning trajectory),绿点为位置观测(如GPS),红线为EKF估算的路径。
    • 红色椭圆为EKF估算的协方差。
  • 推荐相关阅读:http://www.probabilistic-robotics.org/

3.2 无损卡尔曼滤波本地化
  • 图解:


    无损卡尔曼滤波本地化
  • 算法说明:

    • 该算法利用无损卡尔曼滤波器(Unscented Kalman Filter, UKF)实现传感器混合本地化。
    • 线和点的含义与EKF模拟的例子相同。
  • 推荐相关阅读:利用无差别训练过的无损卡尔曼滤波进行机器人移动本地化:https://www.researchgate.net/publication/267963417_Discriminatively_Trained_Unscented_Kalman_Filter_for_Mobile_Robot_Localization

3.3 粒子滤波本地化
  • 图解:


    粒子滤波本地化
  • 算法说明:

    • 该算法利用粒子滤波器(Particle Filter, PF)实现传感器混合本地化。
    • 蓝线为真实路径,黑线为导航推测路径(dead reckoning trajectory),绿点为位置观测(如GPS),红线为PF估算的路径。
    • 该算法假设机器人能够测量与地标(RFID)之间的距离。
    • PF本地化会用到该测量结果。、
  • 推荐相关阅读:概率机器人学:http://www.probabilistic-robotics.org/

3.4 直方图滤波本地化
  • 图解:


    直方图滤波本地化

https://github.com/AtsushiSakai/PythonRoboticsGifs/raw/master/Localization/histogram_filter/animation.gif

  • 算法说明:

    • 该算法是利用直方图滤波器(Histogram filter)实现二维本地化的例子。
    • 红十字是实际位置,黑点是RFID的位置。
    • 蓝色格子是直方图滤波器的概率位置。
    • 在该模拟中,x,y是未知数,yaw已知。
    • 滤波器整合了速度输入和从RFID获得距离观测数据进行本地化。
    • 不需要初始位置。
  • 推荐相关阅读:概率机器人学:http://www.probabilistic-robotics.org/

四、映射

4.1 高斯网格映射
  • 图解:


    高斯网格映射
  • 算法说明:本算法是二维高斯网格映射(Gaussian grid mapping)的例子。
4.2 光线投射网格映射
  • 图解:
    光线投射网格映射
  • 算法说明:本算法是二维光线投射网格映射(Ray casting grid map)的例子。
4.3 k均值物体聚类
  • 图解:


    k均值物体聚类
  • 算法说明:本算法是使用k均值算法进行二维物体聚类的例子。

4.4 圆形拟合物体形状识别
  • 图解:
    圆形拟合物体形状识别
  • 图形说明:

    • 蓝圈是实际的物体形状。

    • 红叉是通过距离传感器观测到的点。

    • 红圈是使用圆形拟合估计的物体形状。

  • 算法说明:本算法是使用圆形拟合进行物体形状识别的例子。

五、SLAM

5.1 迭代最近点匹配
  • 图解:
    迭代最近点匹配
  • 算法说明:

    • 本算法是使用单值解构进行二维迭代最近点(Iterative Closest Point,ICP)匹配的例子。
    • 它能计算从一些点到另一些点的旋转矩阵和平移矩阵。
  • 推荐相关阅读:机器人运动介绍:迭代最近点算法
    https://cs.gmu.edu/~kosecka/cs685/cs685-icp.pdf

5.2 EKF SLAM
  • 图解:


    EKF SLAM
  • 算法说明:

    • 这是基于扩展卡尔曼滤波的SLAM示例。
    • 蓝线是真实路径,黑线是导航推测路径,红线是EKF SLAM估计的路径。
    • 绿叉是估计的地标。
  • 推荐相关阅读:概率机器人学:http://www.probabilistic-robotics.org/

5.3 FastSLAM 1.0
  • 图解:


    FastSLAM 1.0
  • 算法说明:

    • 这是用FastSLAM 1.0进行基于特征的SLAM的示例。
    • 蓝线是实际路径,黑线是导航推测,红线是FastSLAM的推测路径。
    • 红点是FastSLAM中的粒子。
    • 黑点是地标,蓝叉是FastLSAM估算的地标位置。
  • 推荐相关阅读:概率机器人学:http://www.probabilistic-robotics.org/

5.4 FastSLAM 2.0
  • 图解:


    FastSLAM 2.0
  • 算法说明:

    • 这是用FastSLAM 2.0进行基于特征的SLAM的示例。
    • 动画的含义与FastSLAM 1.0的情况相同。
  • 推荐相关阅读:

    • 概率机器人学:http://www.probabilistic-robotics.org/
    • Tim Bailey的SLAM模拟: http://www-personal.acfr.usyd.edu.au/tbailey/software/slam_simulations.htm
5.5 基于图的SLAM
  • 图解:


    基于图的SLAM
  • 算法说明:

    • 这是基于图的SLAM的示例。
    • 蓝线是实际路径。
    • 黑线是导航推测路径。
    • 红线是基于图的SLAM估算的路径。
    • 黑星是地标,用于生成图的边。
  • 推荐相关阅读:基于图的SLAM入门:http://www2.informatik.uni-freiburg.de/~stachnis/pdf/grisetti10titsmag.pdf

六、路径规划

6.1 动态窗口方式
  • 图解:


    动态窗口方式
  • 算法说明:这是使用动态窗口方式(Dynamic Window Approach)进行二维导航的示例代码。

  • 推荐相关阅读:用动态窗口方式避免碰撞:https://www.ri.cmu.edu/pub_files/pub1/fox_dieter_1997_1/fox_dieter_1997_1.pdf

6.2 基于网格的搜索
  • 迪杰斯特拉算法

    • 图解:


      迪杰斯特拉算法
    • 算法说明:

    • 这是利用迪杰斯特拉(Dijkstra)算法实现的基于二维网格的最短路径规划。

    • 动画中青色点为搜索过的节点。

  • A*算法

    • 图解:


      A*算法
    • 算法说明:

      • 使用A星算法进行基于二维网格的最短路径规划。
      • 动画中青色点为搜索过的节点。
      • 启发算法为二维欧几里得距离。
  • 势场算法

    • 图解:


      势场算法
    • 算法说明:

      • 使用势场算法进行基于二维网格的路径规划。
      • 动画中蓝色的热区图显示了每个格子的势能。
    • 推荐相关阅读:机器人运动规划:势能函数:https://www.cs.cmu.edu/~motionplanning/lecture/Chap4-Potential-Field_howie.pdf

6.3 模型预测路径生成
  • 路径优化示例
    • 图解:


      路径优化示例
  • 算法说明:算法用于状态晶格规划(state lattice planning)

  • 查找表生成示例

    • 图解:


      查找表生成示例
    • 推荐相关阅读:用于带轮子的机器人的最优不平整地形路径生成:http://journals.sagepub.com/doi/pdf/10.1177/0278364906075328

6.4 状态晶格规划
  • 均匀极性采样(Uniform polar sampling)

    • 图解:


      均匀极性采样
  • 偏差极性采样(Biased polar sampling)

    • 图解:


      偏差极性采样
  • 路线采样(Lane sampling)

    • 图解:


      路线采样
6.5 随机路径图(PRM)规划
  • 图解:


    随机路径图(PRM)规划
  • 算法说明:

    • 这个随机路径图(Probabilistic Road-Map,PRM)规划算法在图搜索上采用了迪杰斯特拉方法。
    • 动画中的蓝点为采样点。
    • 青色叉为迪杰斯特拉方法搜索过的点。
    • 红线为PRM的最终路径。
  • 推荐相关阅读:随机路径图:https://en.wikipedia.org/wiki/Probabilistic_roadmap

6.6 Voronoi路径图规划
  • 图解:


    Voronoi路径图规划
  • 算法说明:

    • 这个Voronoi路径图(Probabilistic Road-Map,PRM)规划算法在图搜索上采用了迪杰斯特拉方法。
    • 动画中的蓝点为Voronoi点。
    • 青色叉为迪杰斯特拉方法搜索过的点。
    • 红线为Voronoi路径图的最终路径。
  • 推荐相关阅读:机器人运动规划:https://www.cs.cmu.edu/~motionplanning/lecture/Chap5-RoadMap-Methods_howie.pdf

6.7 快速搜索随机树(RRT)
  • 基本RRT

    • 图解:


      基本RRT
    • 算法说明:

      • 这是个使用快速搜索随机树(Rapidly-Exploring Random Trees,RRT)的简单路径规划代码。
      • 黑色圆为障碍物,绿线为搜索树,红叉为开始位置和目标位置。
  • RRT*

    • 图解:
      https://github.com/AtsushiSakai/PythonRoboticsGifs/raw/master/PathPlanning/RRTstar/animation.gif

    • 算法说明:

      • 这是使用RRT*的路径规划代码。
      • 黑色圆为障碍物,绿线为搜索树,红叉为开始位置和目标位置。
    • 推荐相关阅读:

      • 最优运动规划的基于增量采样的算法
        https://arxiv.org/abs/1005.0416
      • 最优运动规划的基于采样的算法
        http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.419.5503&rep=rep1&type=pdf
  • 基于Dubins路径的RRT

    • 图解:


      基于Dubins路径的RRT
    • 算法说明:为汽车形机器人提供的使用RRT和dubins路径规划的路径规划算法。

  • 基于Dubins路径的RRT*

    • 图解:


      基于Dubins路径的RRT*
    • 算法说明:为汽车形机器人提供的使用RRT*和dubins路径规划的路径规划算法。

  • 基于reeds-shepp路径的RRT*

    • 图解:
      https://github.com/AtsushiSakai/PythonRoboticsGifs/raw/master/PathPlanning/RRTStarReedsShepp/animation.gif
    • 算法说明:为汽车形机器人提供的使用RRT*和reeds shepp路径规划的路径规划算法。
  • Informed RRT*

    • 图解:


      Informed RRT*
    • 算法说明:

      • 这是使用Informed RRT*的路径规划代码。
      • 青色椭圆为Informed RRT*的启发采样域。
    • 推荐相关阅读:

      • Informed RRT*:通过对可接受的椭球启发的直接采样实现最优的基于采样的路径规划
        https://arxiv.org/pdf/1404.2334.pdf
  • 批量Informed RRT*

    • 图解:


      批量Informed RRT*
    • 算法说明:这是使用批量Informed RRT*的路径规划代码。

    • 推荐相关阅读:

      • 批量Informed树(BIT*):通过对隐含随机几何图形进行启发式搜索实现基于采样的最优规划
        https://arxiv.org/abs/1405.5848
  • 闭合回路RRT*

    • 图解:


      闭合回路RRT*
    • 算法说明:

      • 这段代码里,转向控制用的是纯追迹算法(pure-pursuit algorithm)。
      • 速度控制采用了PID。
    • 推荐相关阅读:

      • 使用闭合回路预测在复杂环境内实现运动规划
        http://acl.mit.edu/papers/KuwataGNC08.pdf)
      • 应用于自动城市驾驶的实时运动规划
        http://acl.mit.edu/papers/KuwataTCST09.pdf
      • [1601.06326]采用闭合回路预测实现最优运动规划的基于采样的算法
        https://arxiv.org/abs/1601.06326
  • LQR-RRT*

    • 图解:


      LQR-RRT*
    • 算法说明:

      • 这是个使用LQR-RRT*的路径规划模拟。
      • LQR局部规划采用了双重积分运动模型。
    • 推荐相关阅读:

      • LQR-RRT*:使用自动推导扩展启发实现最优基于采样的运动规划
        http://lis.csail.mit.edu/pubs/perez-icra12.pdf
      • MahanFathi/LQR-RRTstar:LQR-RRT*方法用于单摆相位中的随机运动规划
        https://github.com/MahanFathi/LQR-RRTstar
6.8 三次样条规划
  • 图解:


    第一阶段
第二阶段
第三阶段
  • 算法说明:
    • 这是段三次路径规划的示例代码。
    • 这段代码根据x-y的路点,利用三次样条生成一段曲率连续的路径。
    • 每个点的指向角度也可以用解析的方式计算。
  • 推荐相关阅读:
6.9 B样条规划
  • 图解:


    B样条规划
  • 算法说明:

    • 这是段使用B样条曲线进行规划的例子。
    • 输入路点,它会利用B样条生成光滑的路径。
    • 第一个和最后一个路点位于最后的路径上。
  • 推荐相关阅读:B样条
    https://en.wikipedia.org/wiki/B-spline

6.10 Eta^3样条路径规划
  • 图解:


    Eta^3样条路径规划
  • 算法说明:这是使用Eta ^ 3样条曲线的路径规划。

  • 推荐相关阅读:

    • eta^3-Splines for the Smooth Path Generation of Wheeled Mobile Robots
      https://ieeexplore.ieee.org/document/4339545/
6.11 贝济埃路径规划
  • 图解:


    第一阶段
第二阶段
  • 算法说明:
    • 贝济埃路径规划的示例代码。
    • 根据四个控制点生成贝济埃路径。
    • 改变起点和终点的偏移距离,可以生成不同的贝济埃路径【第二阶段】
  • 推荐相关阅读:
    • 根据贝济埃曲线为自动驾驶汽车生成曲率连续的路径
      http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.294.6438&rep=rep1&type=pdf
6.12 五次多项式规划
  • 图解:


    五次多项式规划
  • 算法说明:它能根据五次多项式计算二维路径、速度和加速度。

  • 推荐相关阅读:
    • 用于Agv In定位的局部路径规划和运动控制
      http://ieeexplore.ieee.org/document/637936/
6.13 Dubins路径规划
  • 图解:


    Dubins路径规划
  • 推荐相关阅读:

    • Dubins路径
      https://en.wikipedia.org/wiki/Dubins_path
6.14 Reeds Shepp路径规划
  • 图解:


    027.gif
  • 推荐相关阅读:

    • 15.3.2 Reeds-Shepp曲线
      http://planning.cs.uiuc.edu/node822.html
    • 用于能前进和后退的汽车的最优路径
      https://pdfs.semanticscholar.org/932e/c495b1d0018fd59dee12a0bf74434fac7af4.pdf
    • ghliu/pyReedsShepp:实现Reeds Shepp曲线
      https://github.com/ghliu/pyReedsShepp
6.15 基于LQR的路径规划
  • 图解:


    基于LQR的路径规划
  • 算法说明:为双重积分模型使用基于LQR的路径规划的示例代码。

6.16 Frenet Frame中的最优路径
  • 图解:


    Frenet Frame中的最优路径
  • 算法说明:

    • 这段代码在Frenet Frame中生成最优路径。
    • 青色线为目标路径,黑色叉为障碍物。
    • 红色线为预测的路径。
  • 推荐相关阅读:

    • Frenet Frame中的动态接到场景中的最优路径生成
      https://www.researchgate.net/profile/Moritz_Werling/publication/224156269_Optimal_Trajectory_Generation_for_Dynamic_Street_Scenarios_in_a_Frenet_Frame/links/54f749df0cf210398e9277af.pdf
    • Frenet Frame中的动态接到场景中的最优路径生成
      https://www.youtube.com/watch?v=Cj6tAQe7UCY

七、路径跟踪

7.1 姿势控制跟踪
  • 图解:


    姿势控制跟踪
  • 算法说明:这是姿势控制跟踪的模拟。

  • 推荐相关阅读:

    • Robotics, Vision and Control - Fundamental Algorithms In MATLAB® Second, Completely Revised, Extended And Updated Edition | Peter Corke | Springer
      https://www.springer.com/us/book/9783319544120
7.2 纯追迹跟踪
  • 图解:


    纯追迹跟踪
  • 算法说明:
    • 使用纯追迹(pure pursuit)转向控制和PID速度控制的路径跟踪模拟。
    • 红线为目标路线,绿叉为纯追迹控制的目标点,蓝线为跟踪路线。
  • 推荐相关阅读:
    • 城市中的自动驾驶汽车的运动规划和控制技术的调查
      https://arxiv.org/abs/1604.07446
7.3 史坦利控制
  • 图解:


    史坦利控制
  • 算法说明:使用史坦利(Stanley)转向控制和PID速度控制的路径跟踪模拟。

  • 推荐相关阅读:

    • 史坦利:赢得DARPA大奖赛的机器人
      http://robots.stanford.edu/papers/thrun.stanley05.pdf
    • 用于自动驾驶机动车路径跟踪的自动转向方法
      https://www.ri.cmu.edu/pub_files/2009/2/Automatic_Steering_Methods_for_Autonomous_Automobile_Path_Tracking.pdf
7.4 后轮反馈控制
  • 图解:


    后轮反馈控制
  • 算法说明:利用后轮反馈转向控制和PID速度控制的路径跟踪模拟。

  • 推荐相关阅读:

    • 城市中的自动驾驶汽车的运动规划和控制技术的调查
      https://arxiv.org/abs/1604.07446
7.5 线性二次regulator(LQR)转向控制
  • 图解:


    线性二次regulator(LQR)转向控制
  • 算法说明:使用LQR转向控制和PID速度控制的路径跟踪模拟。

  • 推荐相关阅读:

    • ApolloAuto/apollo:开源自动驾驶平台
      https://github.com/ApolloAuto/apollo
7.6 线性二次regulator(LQR)转向和速度控制
  • 图解:


    线性二次regulator(LQR)转向和速度控制
  • 算法说明:使用LQR转向和速度控制的路径跟踪模拟。

  • 推荐相关阅读:

    • 完全自动驾驶:系统和算法 - IEEE会议出版物
      http://ieeexplore.ieee.org/document/5940562/
7.7 模型预测速度和转向控制
  • 图解:https://github.com/AtsushiSakai/PythonRoboticsGifs/raw/master/PathTracking/model_predictive_speed_and_steer_control/animation.gif

  • 算法说明:使用迭代线性模型预测转向和速度控制的路径跟踪模拟。

  • 推荐相关阅读:

    • 车辆动态和控制 | Rajesh Rajamani | Springer
      http://www.springer.com/us/book/9781461414322
    • MPC课程资料 - MPC Lab @ UC-Berkeley
      http://www.mpc.berkeley.edu/mpc-course-material

八、项目支持

  • 项目地址:https://github.com/AtsushiSakai/PythonRobotics

  • 打赏:通过Patreon(https://www.patreon.com/myenigma)对该项目进行经济支持

你可能感兴趣的:(一文洞悉Python必备的50种算法)