Как использовать minDistanceConstraint в пидраке - PullRequest
0 голосов
/ 15 ноября 2018

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Вот что означают 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] [консоль] [предупреждение] Попытка вычислить расстояние между двумя элементами столкновения, по крайней мере один из которых невыпуклый. ... есть ли другая причина этой ошибки всплывет?

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

0 голосов
/ 16 ноября 2018

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

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

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

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

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

...