Библиотека для генерации траекторий кубического сплайна (не интерполяция)? - PullRequest
13 голосов
/ 06 декабря 2010

Немного фона. У меня есть симуляция, которая использует кубические сплайны для одномерных траекторий. В этом контексте кубический сплайн определяет положение объекта, скорость, ускорение и рывок как функцию времени.

Если у вас есть:

  • начальные и конечные значения для положение, скорость, ускорение и время
  • постоянные значения ограничений на максимальная и минимальная скорость, ускорение и рывок

тогда есть уникальный сплайн. Если вы не указываете конечное время, а хотите использовать траекторию минимального времени, то существует также уникальный сплайн.

Однако нахождение этих сплайнов может быть королевской болью. В случае, когда указано время, сплайн будет содержать до 7 полиномов, а узлы (точки перехода между полиномами) заранее неизвестны.

Это не обычный случай подгонки сплайна к набору данных, это создание сплайнов из граничных условий и некоторых дополнительных ограничений. Я читал статьи, в которых люди использовали схожие механизмы и имели схожие потребности, но я никогда не обнаруживал библиотек (или даже исходного кода), которые бы занимались генерацией сплайнов такого рода. Я написал некоторый код, который обрабатывает большинство случаев, но он не очень надежный и быстрый. Я не очень беспокоюсь о том, что это быстро, но было бы лучше, если бы он был крепче.

Есть ли библиотеки, которые могут сделать это доступным? Открытый исходный код, даже если он не собран как библиотека? C, C ++, Java или Python предпочтительнее, но если это открытый исходный код, другие языки все равно будут полезны в качестве ссылки.

Ответы [ 3 ]

1 голос
/ 05 апреля 2011

Проблема со сплайнами заключается в том, что для решения условий необходимо решать линейные уравнения одновременно. Если в вашей ситуации есть какая-либо дополнительная информация о некоторых из этих производных, вы можете использовать Piecewise Cubic Hermite Interpolation (PCHIP).

Например, вместо определения того, что рывок должен быть равен нулю, вы можете придумать другое ограничение, использовать PCHIP и жадно решить свою проблему. Во всяком случае, это то, что нужно запомнить, даже если вы не можете использовать это на этот раз.

http://www.mathworks.com/moler/interp.pdf

1 голос
/ 26 января 2011

Существует библиотека для C ++ с открытым исходным кодом, которая может привести вас на полпути.

В ней есть все основные строительные блоки, которые вам нужны (полиномы Legrendre / Laguerre / Hermite, поиск корнейи т. д.), хотя это не соответствует фактическому вычислению сплайнов.

Документация библиотеки здесь, так что вы можете проверить сами: http://www.boost.org/doc/libs/1_45_0/libs/math/doc/html/index.html

0 голосов
/ 02 февраля 2011

Функции интерполяции SciPy могут помочь ... Плюс вы можете легко получить производные или интегралы этих сплайнов ... Я не уверен, почему вы говорите "не интерполяция" ... Кажется,я, как это то, что вы пытаетесь достичь.

...