iMSTK
Interactive Medical Simulation Toolkit
imstkPbdRigidObjectGrasping.cpp
1 /*
2 ** This file is part of the Interactive Medical Simulation Toolkit (iMSTK)
3 ** iMSTK is distributed under the Apache License, Version 2.0.
4 ** See accompanying NOTICE for details.
5 */
6 
7 #include "imstkPbdObject.h"
8 #include "imstkPbdRigidObjectGrasping.h"
9 #include "imstkPbdRigidBaryPointToPointConstraint.h"
10 #include "imstkRigidBodyModel2.h"
11 #include "imstkRigidObject2.h"
12 #include "imstkTaskGraph.h"
13 
14 namespace imstk
15 {
16 PbdRigidObjectGrasping::PbdRigidObjectGrasping(
17  std::shared_ptr<PbdObject> obj1,
18  std::shared_ptr<RigidObject2> obj2) :
19  PbdObjectGrasping(obj1), m_rbdObj(obj2)
20 {
21  m_taskGraph->addNode(m_pickingNode);
22  m_taskGraph->addNode(obj2->getRigidBodyModel2()->getSolveNode());
23 }
24 
25 void
27 {
29  for (int i = 0; i < m_constraints.size(); i++)
30  {
31  auto constraint = std::dynamic_pointer_cast<PbdRigidBaryPointToPointConstraint>(m_constraints[i]);
32 
33  constraint->compute(m_rbdObj->getRigidBodyModel2()->getConfig()->m_dt);
34  m_rbdObj->getRigidBodyModel2()->addConstraint(constraint);
35  }
36 }
37 
38 void
40  const std::vector<PbdParticleId>& ptsA,
41  const std::vector<double>& weightsA,
42  const std::vector<PbdParticleId>& ptsB,
43  const std::vector<double>& weightsB,
44  double stiffnessA, double stiffnessB)
45 {
46  // Create constraint
47  auto constraint = std::make_shared<PbdRigidBaryPointToPointConstraint>(m_rbdObj->getRigidBody());
48  constraint->initConstraint(
49  ptsA, weightsA,
50  ptsB, weightsB,
51  stiffnessA,
52  stiffnessB);
53  // Add to constraints
54  m_constraints.push_back(constraint);
55 }
56 
57 void
58 PbdRigidObjectGrasping::initGraphEdges(std::shared_ptr<TaskNode> source, std::shared_ptr<TaskNode> sink)
59 {
61 
62  std::shared_ptr<PbdModel> pbdModel = m_objectToGrasp->getPbdModel();
63  std::shared_ptr<RigidBodyModel2> rbdModel = m_rbdObj->getRigidBodyModel2();
64 
65  m_taskGraph->addEdge(m_pickingNode, rbdModel->getSolveNode());
66  m_taskGraph->addEdge(rbdModel->getSolveNode(), m_taskGraph->getSink());
67 }
68 } // namespace imstk
void updatePicking()
Update picking state, this should move grasp points.
Compound Geometry.
std::shared_ptr< TaskGraph > m_taskGraph
Computational Graph.
void addPointToPointConstraint(const std::vector< PbdParticleId > &ptsA, const std::vector< double > &weightsA, const std::vector< PbdParticleId > &ptsB, const std::vector< double > &weightsB, double stiffnessA, double stiffnessB) override
Add constraint between a point on each element given via barycentric coordinates pt position = weight...
void initGraphEdges()
Initializes the edges of the SceneObject&#39;s computational graph.
virtual void updatePicking()
Update picking state, this should move grasp points.
void compute(double dt) override
Compute constraint jacobian.