У меня есть граф выпуклых множеств, в котором я ищу оптимальный путь через несколько регионов. Я работаю над улучшением стоимости между каждой вершиной (областями в форме многоугольника). Стоимость перемещения по ребру от вершины u до вершины v должна равняться расстоянию от u до v, умноженному на коэффициент масштабирования для прохождения через эту вершину. (Чем дольше ребро проходит через вершину, тем больший эффект вершина окажет на стоимость)
т. е. стоимость_of_edge_from_u_to_v = расстояние_от_u_to_v * (фактор_пока_путешествие_через_u * расстояние_от_начальной_точки_до_конца_u + фактор_пока_путешествие_через_v * расстояние_от_начала_v_до_конечной_точки)
Я добавляю стоимость края в виде дракона::symbolic::expression. Я хотел бы вычислить точку пересечения края пути от u до v с одним из внешних краев многоугольника v. Используя эту точку пересечения, я смогу вычислить соотношение времени в многоугольнике u и в многоугольнике v. что позволит мне использовать упомянутое выше уравнение для получения верхней границы стоимости. В настоящее время я сталкиваюсь с проблемами деления на определитель, который может быть равен нулю в некоторых точках при поиске точки пересечения.
Примером этого может быть транспортное средство, путешествующее из одного региона в другой, где земля в первом регионе грязная, а во втором - бетонная. Хотя расстояние, которое должен преодолеть автомобиль в регионе 1 и 2, может быть одинаковым, стоимость проезда по грязи будет намного выше.
Как мне использовать Drake для создания непрерывного решения с помощью выпуклых множеств, включая определенные затраты на ребра (в зависимости от выбранной вершины)?
Я думаю, что есть лучшие способы сформулировать это.
Для обсуждения давайте предположим, что многоугольники представляют собой пути в ℜ³. Тогда было бы естественно создать регион GCS для каждого из ваших регионов в ℜ⁶ = ℜ³ x ℜ³. Другими словами, каждый раз, когда вы посещаете вершину, вы выбираете 2 точки в исходном пространстве. Затем вы можете добавить стоимость вершины к каждому региону, которая взимает скаляр для конкретного региона, умноженный на (евклидово?) расстояние между двумя точками. И вы можете добавить ограничение края, говорящее, что вторая точка u == первая точка v.
По сути, это самая простая версия транскрипции, которую мы использовали в первом документе по планированию движения GCS.
Мне очень сложно помочь без подробностей.
Понятно! Не могли бы вы указать мне, где я могу получить доступ к двум точкам внутри каждой вершины? Я хотел бы добавить стоимость, специфичную для вершины, и (как упоминалось в статье) стоимость сдерживания границ.
В GcsTrajectoryOptimization
, когда вы звоните AddRegions
, вы получаете Subgraph
в ответ. Вы можете перебирать вершины подграфа, используя subgraph.Vertices()
. Для каждой Вершины вы можете получить доступ к переменным и вызвать AddCost
. Например. v.AddCost(np.linalg.norm(v.x[:3] - v.x[-3:]))
. (возможность символически добавлять стоимость нормы l2 с нормой linalg — относительно недавняя функция, поэтому вам понадобится актуальная версия Drake)
Спасибо за вашу помощь! Последний вопрос, который у меня возник, касался добавления стоимости приближения к препятствию (только к определенным границам полигонов). Я хочу, чтобы план находился на определенном пороге/расстоянии от препятствия. Я предполагаю, что использую вершину->x() в качестве точек для выбора. В моем планировщике x() имеет 16 значений (x,y,z *5 + #ofpoints->значение 5 для 5 точек). Я хотел бы добавлять стоимость только в том случае, если точка находится в пределах, скажем, 2 от границы, и ничего не делать в противном случае. Я попробовал if_then_else, addquadraticcost(). Я не знаю, как Дрейк обрабатывает 16 значений с добавленной стоимостью.
Если вы просто хотите сохранить пороговое расстояние (в качестве строгого ограничения), вы можете просто соответствующим образом сжать регионы. Альтернативно, в arxiv.org/pdf/2402.10312 разделе VIIB уравнение (18) мы использовали стоимость 1/x, чтобы побудить решение не приближаться слишком близко к столкновениям. Это можно записать в выпуклую стоимость ( см. пример, как только появится PR. Или вы можете добавить невыпуклую стоимость, которая будет использоваться только во время округления.
Благодарю за ваш ответ! Пример оказался очень полезным. Я переключил свое решение на использование класса GcsTrajectoryOptimization. Моя проблема настроена аналогично книге: у меня есть исходный регион (точка), основной регион и целевой регион (точка). Как указать, где соединяются регионы? Я правильно добавил края между подграфами, но решатель выбирает прямую линию между исходным и целевым регионами и полностью игнорирует края основного региона. Я считаю, что это потому, что я включаю некоторые ограничения на исходный/целевой регион, но я не уверен, какие именно.