Как использовать minDistanceConstraint в пидраке

В этом репозитории @Gizatt использует следующую команду для сборки ограничений коллизий для kuka iiwa:
ik.MinDistanceConstraint (дерево, collision_tol, список (), набор ())

Вот что означают list() и set(). Оба здесь кажутся пустыми.

Скажем так, у меня есть элемент (элемент 1), который состоит из 6 тел (в одном urdf) ​​и другой объект (элемент 2) в моем RigidBodyTree, который состоит из одного тела (в отдельном urdf), и я хочу проверять только столкновения между любым из 6 тел, составляющих элемент 1 и элемент 2. Есть ли способ установить эту функцию так, чтобы она не проверяла столкновения всех тел в элементе 1, а только на столкновения между элементом 1 и элементом 2?

Наконец, в настоящее время у меня возникает следующая ошибка при использовании этой функции: [2018-11-14 19:39:20.812] [console] [warning] Попытка вычислить расстояние между двумя элементами столкновения, по крайней мере один из которых является невыпуклым, Я воспользовался советом @gizatt и преобразовал сетки каждой ссылки в элементе 1 в выпуклые оболочки с помощью meshlab, и когда я смотрю на каждую сетку с помощью визуализатора, все они кажутся мне выпуклыми. Однако я все еще получаю эту ошибку. Есть ли какая-то другая причина, по которой эта ошибка всплывала?

2 ответа

Вот что означают list() и set(). Оба здесь кажутся пустыми.

Эти аргументы являются историческими артефактами и почти никогда не являются тем, что вы хотите использовать. Я бы рекомендовал оставить их пустыми, как в приведенном вами примере. Первое ограничивает ограничение, чтобы рассматривать только тела, указанные active_bodies_idx, Второй ограничивает ограничение, чтобы рассматривать только группы столкновений, имена которых содержатся в active_group_names, Обратите внимание, что концепция "группы столкновений" для active_group_names Аргумент не совпадает с понятием "группа фильтра столкновений".

Есть ли способ установить эту функцию так, чтобы она не проверяла столкновения во всех телах в элементе 1, но только для столкновений между элементом 1 и элементом 2?

Вы были на правильном пути. Вы хотите добавить группу фильтра столкновений, которая содержит все тела в элементе 1, а затем настроить эту группу столкновений на игнорирование себя. Следующий код требует AddCollisionFilterIgnoreTarget() переплет добавлен PR № 10085.

tree.DefineCollisionFilterGroup("1_filtergroup")

tree.AddCollisionFilterGroupMember("1_filtergroup", "base_link", 1_model_id)
# Repeat the previous line for all bodies in item 1.

tree.AddCollisionFilterIgnoreTarget("1_filtergroup", "1_filtergroup")

Затем вы можете создать ограничение с желаемым поведением, вызвав ik.MinDistanceConstraint(tree, collision_tol, list(), set()),

Наконец, в настоящее время у меня возникает следующая ошибка при использовании этой функции: [2018-11-14 19:39:20.812] [console] [warning] Попытка вычислить расстояние между двумя элементами столкновения, по крайней мере один из которых является невыпуклым,... Есть ли какая-то другая причина, по которой эта ошибка появится?

Как упомянул @Russ Tedrake, все элементы столкновения сетки, прикрепленные к закрепленным (приваренным к миру) телам, преобразуются в невыпуклые объекты сетки в бэкленде Bullet, независимо от выпуклости исходной сетки. Это прискорбно, но, скорее всего, не будет решено, так как все RigidBodyTree код близится к концу срока службы. В целях IK вы можете обойти это, прикрепив сетку к фиктивному телу, которое соединено с миром призматическим или поворотным соединением, верхний и нижний пределы которого равны 0. Это заставит сервер работать с выпуклой оболочкой. из сетки обеспечивают. Затем вам нужно будет удалить элемент, соответствующий фиктивному соединению, из конфигурации, возвращенной IK.

Документация по этому методу находится здесь: https://drake.mit.edu/pydrake/pydrake.solvers.ik.html?highlight=mindistanceconstraint.

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

Если вы хотите игнорировать некоторые пары столкновений, используйте группы фильтров столкновений: https://drake.mit.edu/pydrake/pydrake.multibody.rigid_body_tree.html?highlight=collision%20filter

Наша оболочка RBT/Bullet предполагает, что каждая сетка выпуклая, КРОМЕ статической / закрепленной геометрии. Вполне вероятно, что вы получаете это предупреждение, потому что вы проверяете столкновение со статической / привязанной геометрией?

FWIW - документация НАМНОГО более полная для multibodytree vs hardbodybodytree, но для этого конкретного запроса я думаю, что вы правы в использовании RBT - multibody еще не совсем там.

Другие вопросы по тегам