Библиотека для генерации кубических сплайн-траекторий (не интерполяция)?

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

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

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

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

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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