首页 > 编程问答 >使用三次或五次多项式生成约束路径

使用三次或五次多项式生成约束路径

时间:2024-07-21 02:56:08浏览次数:14  
标签:python optimization mathematical-optimization polynomials polynomial-math

我需要编写一个程序来使用三次/五次多项式生成路径。

我编写了以下代码来生成 3D 空间的路径。它绘制一条路径(使用三次多项式),并对起点、目标点、初始速度和目标速度进行约束。

import numpy as np
import matplotlib.pyplot as plt


def cubic_trajectory(x0, xf, v0, vf, T):
    # Calculate coefficients for cubic polynomial
    a0 = x0
    a1 = v0
    a2 = (3 * (xf - x0) - (2 * v0 + vf) * T) / T ** 2
    a3 = (2 * (x0 - xf) + (v0 + vf) * T) / T ** 3
    return a0, a1, a2, a3


def generate_trajectory(a0, a1, a2, a3, T, num_points=100):
    t = np.linspace(0, T, num_points)
    x_t = a0 + a1 * t + a2 * t ** 2 + a3 * t ** 3
    return t, x_t


def plot_trajectories_3d(trajectories):
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')

    for traj in trajectories:
        t, x_t, y_t, z_t = traj
        ax.plot(x_t, y_t, z_t,
                label=f'Trajectory from ({x_t[0]}, {y_t[0]}, {z_t[0]}) to ({x_t[-1]}, {y_t[-1]}, {z_t[-1]})')

    ax.set_xlabel('X Position')
    ax.set_ylabel('Y Position')
    ax.set_zlabel('Z Position')
    ax.set_title('3D Cubic Polynomial Trajectories')
    ax.legend()
    plt.show()


# Define multiple start and end conditions for 3D
conditions_3d = [
    {'x0': (-0.5, 0.0, 0.5), 'xf': (0.5, 0.0, 1.0), 'v0': (0, 0, 0), 'vf': (0, 10, 0), 'T': 5},
    #{'x0': (5, 5, 5), 'xf': (15, 15, 15), 'v0': (1, 1, 1), 'vf': (-1, -1, -1), 'T': 6},
    #{'x0': (-3, -3, -3), 'xf': (7, 7, 7), 'v0': (0, 0, 0), 'vf': (2, 0, 0), 'T': 4},
]

trajectories_3d = []
for cond in conditions_3d:
    a0_x, a1_x, a2_x, a3_x = cubic_trajectory(cond['x0'][0], cond['xf'][0], cond['v0'][0], cond['vf'][0], cond['T'])
    a0_y, a1_y, a2_y, a3_y = cubic_trajectory(cond['x0'][1], cond['xf'][1], cond['v0'][1], cond['vf'][1], cond['T'])
    a0_z, a1_z, a2_z, a3_z = cubic_trajectory(cond['x0'][2], cond['xf'][2], cond['v0'][2], cond['vf'][2], cond['T'])

    t, x_t = generate_trajectory(a0_x, a1_x, a2_x, a3_x, cond['T'])
    _, y_t = generate_trajectory(a0_y, a1_y, a2_y, a3_y, cond['T'])
    _, z_t = generate_trajectory(a0_z, a1_z, a2_z, a3_z, cond['T'])

    trajectories_3d.append((t, x_t, y_t, z_t))

plot_trajectories_3d(trajectories_3d)

现在我需要扩展此代码,以便生成的路径位于特定区域内。例如,在下图中的蓝色区域中。

问题:

  • 如何向三次或五次多项式添加约束,以便生成的线位于某个区域内。例如,在下面的蓝色区域中:

Region_Of_Interest

例如,如果我生成一条从 (3,4) 到 (8,5) 的线,则输出线应如下图所示的红线(意味着不穿过白色部分):

Output

谢谢


不幸的是,不能保证使用三次或五次多项式生成完全位于给定区域内的路径,同时仍然满足起点、终点、初始速度和最终速度的约束条件。这是因为多项式具有固定的数学形式,并且对于更复杂形状的区域(例如提供的示例),多项式可能无法准确地跟随区域边界。

以下是可以考虑的替代方法:

1. 使用其他路径规划算法:

  • 基于采样的路径规划: 诸如快速探索随机树 (RRT) 或概率路线图 (PRM) 之类的算法可以在复杂环境中找到可行的路径。这些算法通过在约束空间中采样随机点并连接这些点以形成路径来工作。
  • 人工势场 (APF): 此方法将目标建模为具有吸引力的“势场”,并将障碍物建模为具有排斥力的“势场”。然后,通过遵循势场的梯度,可以找到从起点到终点的路径。
  • A* 搜索算法: 这是一种图搜索算法,可以找到从起点到终点的最短路径,同时也要考虑成本函数,该成本函数可以根据想要生成的路径留在区域内的程度来设计。

2. 对多项式路径进行优化:

  • 可以生成初始三次或五次多项式路径,然后使用优化技术将其调整为在所需区域内。
  • 此方法涉及定义一个衡量路径违反约束条件程度的成本函数。
  • 然后,可以使用诸如梯度下降或遗传算法之类的优化算法来调整多项式系数,以最小化成本函数。

3. 使用样条曲线:

  • 样条曲线是分段多项式函数,可用于创建更灵活和平滑的路径。
  • 通过使用多个低阶多项式,样条曲线可以更好地逼近复杂形状。
  • 可以定义控制点以约束样条曲线并确保其位于所需区域内。

对于提供的区域示例,基于采样的路径规划算法或使用样条曲线可能是合适的选择。

实施这些方法需要更高级的算法和编程技术。有许多可用的库和工具可以帮助进行路径规划,例如:

  • OMPL (Open Motion Planning Library): 一个提供各种基于采样的路径规划算法的 C++ 库。
  • ROS (Robot Operating System): 一个广泛用于机器人应用程序的框架,其中包括用于路径规划的工具和库。
  • Python Robotics: 一个 Python 代码集合,其中包括用于路径规划和机器人技术中其他常见任务的算法。

请记住,选择的最佳方法将取决于的特定需求和约束条件。

标签:python,optimization,mathematical-optimization,polynomials,polynomial-math
From: 78763068

相关文章

  • Python 是一种选择性解释语言吗?为什么下面的代码不起作用?
    由于程序是从上到下运行的,为什么下面的代码不执行块中的第一行就直接抛出错误?if5>2:print("TwoislessthanFive!")print("Fiveisgreaterthantwo!")错误:文件“/Users/____/Desktop/Pythonpractise/practise.py”,第3行print("五比二大!")Indentati......
  • 裁剪时间变量 Python Matplotlib Xarray
    我不确定这是否是一个愚蠢的问题,但我想按时间变量剪辑.nc文件。我在xarray中打开了数据集,但以下ds.sel行(之前已运行)仅返回错误。ds=xr.open_dataset('/Users/mia/Desktop/RMP/data/tracking/mcs_tracks_2015_11.nc')selected_days=ds.sel(time=slice('2015-11-22',......
  • 用于匹配两个数据列表中的项目的高效数据结构 - python
    我有两个列表,其中一个列表填充ID,另一个列表填充进程名称。多个进程名称可以共享一个ID。我希望能够创建一个可以使用特定ID的数据结构,然后返回与该ID关联的进程列表。我还希望能够使用特定的进程名称并返回与其连接的ID列表。我知道我可以为此创建一个字典,但是I......
  • 有人可以解决我的代码中的问题吗?而且我无法在我的电脑上安装 nsetools。如何在 python
    从nsetools导入Nseimportpandasaspdnse=Nse()all_stock_codes=nse.get_stock_codes()companies_with_low_pe=[]对于all_stock_codes中的代码:如果代码=='符号':继续尝试:stock_quote=nse.get_quote(代码)pe_ratio=stock_quote.get('priceT......
  • 将 python 脚本的 stdin 重定向到 fifo 会导致 RuntimeError: input():lost sys.stdin
    我有这个python脚本,它的作用是充当服务器,它从重定向到fifo的stdin读取命令:test.py:whileTrue:try:line=input()exceptEOFError:breakprint(f'Received:{line}')在bash中运行命令:mkfifotestfifotest.py<testfifo......
  • Python/Flask mysql 游标:为什么它不起作用?
    fromflaskimportFlaskfromflask_mysqldbimportMySQLapp=Flask(__name__)app.config['MYSQL_HOST']='localhost'app.config['MYSQL_USER']='root'app.config['MYSQL_PASSWORD']='password'a......
  • Python pandas to_csv 导致 OSError: [Errno 22] 参数无效
    我的代码如下:importpandasaspdimportnumpyasnpdf=pd.read_csv("path/to/my/infile.csv")df=df.sort_values(['distance','time'])df.to_csv("path/to/my/outfile.csv")此代码成功从infile.csv(一个3GBcsv文件)读取数据,对其进行排......
  • 从 python 中的字符串列表中提取 def 定义函数的标签
    我想使用Python中的正常def过程创建函数,并将标签分配给从字符串列表中提取的命名空间。如何实现这一点?这个问题的动机:我正在创建一个与sympy兼容的python函数库,供数学家用于符号计算实验。许多函数需要初始化具有相关标签的多个对象的系统,这些标签分别由用户提供的字......
  • 在 Raspberry Pi 4 上使用 Python 从具有 SPI 连接的 MT6816 磁性编码器读取
    我对这个领域完全陌生,并不真正知道自己在做什么并且需要帮助。我正在尝试使用MT681614位磁性编码器通过RaspberryPi的SPI连接读取绝对角度。我有以下问题:在硬件方面,是否只是简单地连接必要的连接(3.3V、MOSI、MISO、SCK、GND、CE01)?对于编码......
  • PythonW 不运行脚本。严重地
    因此,使用Windows10和Python3.6。我创建了一个.py脚本,它可以使用命令pythonmyscript.py在命令提示符下正常运行,但是当我制作该脚本的精确副本并为其赋予扩展名.pyw,并尝试使用pythonw运行它时命令pythonwmyscript.pyw,什么也没有发生......