ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PythonRobotics 如何用 4 控制点 Bezier 路径生成平滑曲线轨迹

PythonRobotics 如何用 4 控制点 Bezier 路径生成平滑曲线轨迹 PythonRobotics 如何用 4 控制点 Bezier 路径生成平滑曲线轨迹【免费下载链接】PythonRoboticsPython sample codes and textbook for robotics algorithms.项目地址: https://gitcode.com/GitHub_Trending/py/PythonRobotics在路径规划中经常需要给出一条连接起点和终点的平滑二维曲线而不是折线。PythonRobotics 仓库的PathPlanning/BezierPath/bezier_path.py提供了一个基于 4 控制点 Bezier 曲线的路径规划示例给定起点和终点的坐标与朝向yaw它计算出 4 个控制点采样出一条由 100 个点组成的轨迹并用 Matplotlib 画出曲线、控制点、起点/终点箭头以及在指定参数处的切线、法线和曲率圆。适用环境为 Python 3.12.x文档推荐版本示例代码仅在该版本上测试过运行只需 numpy、scipy、matplotlib 等核心依赖。准备运行环境与依赖官方文档How to run sample codes给出的安装流程安装 Python 3.12.x。文档注明老版本 Python 3 可能可以运行但示例代码只在该版本上测试过因此推荐使用 3.12.x。获取仓库并进入根目录PythonRobotics/。安装依赖二选一# 使用 conda需要先安装 Anaconda 或 Miniconda conda env create -f requirements/environment.yml # 或使用 pip pip install -r requirements/requirements.txtrequirements/requirements.txt 固定了 numpy、scipy、matplotlib、cvxpy 等运行库以及 pytest、mypy、ruff 等开发测试库。只运行 Bezier 示例时bezier_path.py 实际只导入matplotlib、numpy和scipy.special文档说明这五个核心库Python、NumPy、SciPy、cvxpy、Matplotlib即可运行各示例。理解 4 个控制点是如何确定的核心函数calc_4points_bezier_path(sx, sy, syaw, ex, ey, eyaw, offset)的参数含义来自源码 docstringsx/sy起点 x、y 坐标syaw起点 yaw 角ex/ey终点 x、y 坐标eyaw终点 yaw 角offset偏移系数float返回值(path, control_points)均为 numpy array控制点的确定逻辑源码第 29-34 行dist np.hypot(sx - ex, sy - ey) / offset control_points np.array( [[sx, sy], [sx dist * np.cos(syaw), sy dist * np.sin(syaw)], [ex - dist * np.cos(eyaw), ey - dist * np.sin(eyaw)], [ex, ey]])即第 1 个控制点是起点第 4 个是终点第 2 个控制点从起点沿起点朝向syaw方向延伸dist第 3 个控制点从终点沿终点朝向eyaw反方向回退dist其中dist等于起点终点直线距离除以offset。offset越大两个中间控制点离端点越近曲线越接近直线offset越小延伸越长曲线弯曲越明显——上面第二张图展示了offset取 1.0 到 4.0 时的差异。得到控制点后calc_bezier_path(control_points, n_points100)在t ∈ [0, 1]上用np.linspace取 100 个采样点逐点调用bezier(t, control_points)。bezier基于 Bernstein 多项式scipy.special.comb(n, i) * t**i * (1 - t)**(n - i)计算曲线上的一点n len(control_points) - 1即 4 控制点对应三次 Bezier 曲线。运行示例生成平滑轨迹按文档进入各目录直接执行 python 脚本的方式运行cd PathPlanning/BezierPath python bezier_path.py示例main()使用的默认参数源码第 125-137 行start_x 10.0 # [m] start_y 1.0 # [m] start_yaw np.radians(180.0) # [rad] end_x -0.0 # [m] end_y -3.0 # [m] end_yaw np.radians(-45.0) # [rad] offset 3.0 path, control_points calc_4points_bezier_path( start_x, start_y, start_yaw, end_x, end_y, end_yaw, offset)文件顶部的show_animation True控制是否绘图。运行时窗口会显示实线的 Bezier Path、虚线连接的 Control Points、起点/终点朝向箭头以及在t 0.86处计算的切线Tangent、法线Normal和曲率圆圆心与半径由bezier_derivatives_control_points(control_points, 2)求出导数控制点、再由curvature(dx, dy, ddx, ddy)计算得到半径取1 / curvature。验证生成结果是否有效示例自带 4 条断言源码第 161-164 行检查轨迹的首点等于起点、末点等于终点assert path.T[0][0] start_x, path is invalid assert path.T[1][0] start_y, path is invalid assert path.T[0][-1] end_x, path is invalid assert path.T[1][-1] end_y, path is invalid如果轨迹端点不符合预期输入运行会抛出AssertionError: path is invalid。想跳过绘图只跑计算逻辑把模块级show_animation设为False即可。仓库还为单位测试准备了 tests/test_bezier_path.py它把show_animation设为False后分别执行main()和main2()。在仓库根目录可以运行pytest tests/test_bezier_path.pytests/conftest.py 会把仓库根目录加入sys.path保证from PathPlanning.BezierPath import bezier_path能正常导入。可选直接指定 4 个控制点生成曲线如果已经确定了 4 个控制点、不需要通过起点/终点姿态反推源码注释给出了直接用法bezier_path.py 第 139-142 行control_points np.array([[5., 1.], [-2.78, 1.], [-11.5, -4.5], [-6., -8.]]) path calc_bezier_path(control_points, n_points100)此时曲线由你给定的 4 个点直接决定n_points可按需调整采样密度。可选用 main2 对比不同 offset 的曲线main2()用同样的起终点姿态遍历np.arange(1.0, 5.0, 1.0)即 offset 1.0、2.0、3.0、4.0在同一张图上画出 4 条曲线并标注Offset图例用于直观比较 offset 对曲线形状的影响对应上文第二张图。文件末尾默认调用main()main2()处于注释状态# main2()按注释提示取消注释改为main2()或像测试文件那样导入后调用from PathPlanning.BezierPath import bezier_path bezier_path.main2()使用限制轨迹是离散点集默认 100 个点calc_bezier_path的n_points100绘图密度或后续逐点使用都受该值影响。示例只做曲线生成与可视化文档bezier_path_main.rst将其定位为 4 控制点 Bezier 路径的 sample code并给出了一篇关于基于 Bezier 曲线的连续曲率路径生成面向自动驾驶车辆的参考文献作为延伸阅读。端点校验依赖浮点相等的 assert输入姿态变化后若端点不匹配会直接抛错而不是自动修正。想继续看 Bezier 路径在整体路径规划算法中的位置可参考文档目录 docs/modules/5_path_planning/path_planning_main.rst。【免费下载链接】PythonRoboticsPython sample codes and textbook for robotics algorithms.项目地址: https://gitcode.com/GitHub_Trending/py/PythonRobotics创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表