41 Eigen::MatrixXd J(
dim_, x.size());
60 if (!
scene_->AlwaysUpdatesCollisionScene())
61 cscene_->UpdateCollisionObjectTransforms();
64 std::vector<CollisionProxy> proxies;
79 Eigen::MatrixXd J_a(6,
scene_->GetKinematicTree().GetNumControlledJoints()), J_b(6,
scene_->GetKinematicTree().GetNumControlledJoints());
80 for (
const auto& proxy : proxies)
82 bool is_robot_to_robot = (proxy.e1 !=
nullptr && proxy.e2 !=
nullptr) && (proxy.e1->is_robot_link || proxy.e1->closest_robot_link.lock()) && (proxy.e2->is_robot_link || proxy.e2->closest_robot_link.lock());
85 if (proxy.distance < margin)
88 d += std::pow((1. - proxy.distance / margin),
linear_ ? 1 : 2);
93 if (proxy.e1 !=
nullptr)
95 arel =
KDL::Frame(proxy.e1->frame.Inverse(
KDL::Vector(proxy.contact1.x(), proxy.contact1.y(), proxy.contact1.z())));
96 J_a =
scene_->GetKinematicTree().Jacobian(proxy.e1, arel,
nullptr,
KDL::Frame());
104 if (proxy.e2 !=
nullptr)
106 brel =
KDL::Frame(proxy.e2->frame.Inverse(
KDL::Vector(proxy.contact2.x(), proxy.contact2.y(), proxy.contact2.z())));
107 J_b =
scene_->GetKinematicTree().Jacobian(proxy.e2, brel,
nullptr,
KDL::Frame());
117 J += (2. / (margin * margin)) * (proxy.normal1.transpose() * J_a.topRows<3>());
118 J -= (2. / (margin * margin)) * (proxy.normal1.transpose() * J_b.topRows<3>());
122 J += 1 / margin * (proxy.normal1.transpose() * J_a.topRows<3>());
123 J -= 1 / margin * (proxy.normal1.transpose() * J_b.topRows<3>());
void AssignScene(ScenePtr scene) override
Eigen::Ref< Eigen::VectorXd > VectorXdRef
std::shared_ptr< Scene > ScenePtr
int TaskSpaceDim() override
CollisionScenePtr cscene_
void Update(Eigen::VectorXdRefConst x, Eigen::VectorXdRef phi) override
SmoothCollisionDistanceInitializer parameters_
const Eigen::Ref< const Eigen::VectorXd > & VectorXdRefConst
void UpdateInternal(Eigen::VectorXdRefConst x, Eigen::VectorXdRef phi, Eigen::MatrixXdRef J, bool updateJacobian=true)
#define HIGHLIGHT_NAMED(name, x)
Eigen::Ref< Eigen::MatrixXd > MatrixXdRef
REGISTER_TASKMAP_TYPE("SmoothCollisionDistance", exotica::SmoothCollisionDistance)
void AppendVector(std::vector< Val > &orig, const std::vector< Val > &extra)
bool check_self_collision_