
PythonRobotics 如何用 Catmull-Rom 样条对航点进行平滑路径规划【免费下载链接】PythonRoboticsPython sample codes and textbook for robotics algorithms.项目地址: https://gitcode.com/GitHub_Trending/py/PythonRobotics当你手里有一组离散航点waypoints需要把它们连接成一条机器人可以执行的平滑路径时PythonRobotics 提供了一个基于 Catmull-Rom 样条的实现。它的特点是生成的路径始终穿过每个控制点航点、具有局部控制特性、并维持 C1 连续性见 官方说明文档。适用环境为 Python 3.12.x该版本是示例代码的测试基准依赖numpy和matplotlib。准备运行环境安装 Python 3.12.x。克隆仓库并进入目录git clone https://github.com/AtsushiSakai/PythonRobotics.git cd PythonRobotics安装依赖。仓库的requirements/目录下提供了 pip 与 conda 两套管理文件本场景只需要pip install -r requirements/requirements.txtrequirements/requirements.txt 中锁定了numpy 2.3.5、matplotlib 3.11.0等版本其中本示例直接用到的是numpy和matplotlib。理解两个 API核心实现位于 catmull_rom_spline_path.py对外提供两个函数catmull_rom_point(t, p0, p1, p2, p3)计算单个样条段上的点。t取值范围为 0 到 1p0~p3是包围当前参数t的 4 个控制点内部使用 Catmull-Rom 标准三次样条公式0.5 * ((2 * p1) (-p0 p2) * t (2 * p0 - 5 * p1 4 * p2 - p3) * t**2 (-p0 3 * p1 - 3 * p2 p3) * t**3)catmull_rom_spline(control_points, num_points)接收航点列表和每个样条段的采样点数返回(spline_x, spline_y)两个坐标数组。段数等于len(control_points) - 1因此返回数组的长度为(段数 × num_points)。注意首尾段的处理方式第一个段缺少前驱控制点代码取p0 p1复制起点最后一个段取p3 p2复制终点。这意味着路径在首、末端各借用了一个虚拟点来保持四控制点的结构。官方文档中还介绍了 Chordal按控制点间弦长参数化和 Centripetal按弦长平方根参数化两种变体说明它们用于改善参数化、避免曲线振荡本仓库的示例代码采用的是标准 Uniform 实现即每段等参数化不考虑控制点间距。运行官方示例验证效果cd PathPlanning/Catmull_RomSplinePath python catmull_rom_spline_path.py示例main()中使用了 7 个航点、每段 100 个采样点way_points [[-1.0, -2.0], [1.0, -1.0], [3.0, -2.0], [4.0, -1.0], [3.0, 1.0], [1.0, 2.0], [0.0, 2.0]] n_course_point 100 spline_x, spline_y catmull_rom_spline(way_points, n_course_point)运行成功时会先打印catmull_rom_spline_path.py start!!然后弹出 matplotlib 图形窗口红色曲线是 Catmull-Rom 样条路径绿色圆点是原始航点。判断方法就是看红色曲线是否穿过每个绿色航点——这正是文档对 Catmull-Rom 样条的定义路径 always passes through the control points。上面文章开头的截图即为文档给出的该示例结果。在自己的航点上调用 API如果你的航点与示例不同可以在仓库根目录下直接复用catmull_rom_spline下面的调用方式与仓库自带单元测试 tests/test_catmull_rom_spline.py 完全一致航点换成你自己的值即可from PathPlanning.Catmull_RomSplinePath.catmull_rom_spline_path import catmull_rom_spline way_points [[0, 0], [1, 2], [2, 0], [3, 3]] # 替换为你的 [x, y] 航点 num_points 100 # 每个样条段的采样点数 spline_x, spline_y catmull_rom_spline(way_points, num_points) print(spline_x.shape, spline_y.shape)way_points是[x, y]坐标的列表至少需要 2 个航点1 段样条num_points控制曲线密度采样点越密路径越光滑。用单元测试做可核对的验证仓库自带针对该功能的测试可以独立运行pytest tests/test_catmull_rom_spline.py测试中的断言即官方给出的验证标准spline_x与spline_y均非空两者形状shape一致。如果你的自定义调用也通过了同样的两项断言说明接口调用与返回结构正确几何上是否穿过航点则参照上一节的图形窗口确认。可选查看混合函数Blending Functions官方文档用 4 个混合函数b1~b4来描述各控制点对样条的影响权重b1(t) -t 2t^2 - t^3 b2(t) 2 - 5t^2 3t^3 b3(t) t 4t^2 - 3t^3 b4(t) -t^2 t^3仓库在 blending_functions.py 中提供了可视化脚本运行后会画出[0, 1]区间内 4 条混合函数曲线帮助你核对文档中 混合函数示意图对应的数学形式cd PathPlanning/Catmull_RomSplinePath python blending_functions.py局限与边界示例实现是 Uniform 参数化的标准 Catmull-Rom不感知控制点间距若相邻航点距离差异很大文档中介绍的 Chordal/Centripetal 变体在理论上能减少振荡但仓库当前示例未提供这些变体的可运行代码。首、尾段通过复制端点p0 p1、p3 p2补齐四控制点结构端点处的切线行为与中间段不同规划长路径时可重点观察首末段形态。该模块只负责生成平滑几何路径不涉及避障或其他路径规划算法如需与其他算法对比可参考PathPlanning/目录下的其他示例。【免费下载链接】PythonRoboticsPython sample codes and textbook for robotics algorithms.项目地址: https://gitcode.com/GitHub_Trending/py/PythonRobotics创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考