opensurgsim
VirtualToolCoupler.h
1 // This file is a part of the OpenSurgSim project.
2 // Copyright 2013, SimQuest Solutions Inc.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 
16 #ifndef SURGSIM_PHYSICS_VIRTUALTOOLCOUPLER_H
17 #define SURGSIM_PHYSICS_VIRTUALTOOLCOUPLER_H
18 
19 #include <memory>
20 
21 #include "SurgSim/DataStructures/DataGroup.h"
22 #include "SurgSim/DataStructures/DataGroupBuilder.h"
23 #include "SurgSim/DataStructures/OptionalValue.h"
24 #include "SurgSim/Framework/Behavior.h"
25 #include "SurgSim/Framework/Log.h"
26 #include "SurgSim/Framework/ObjectFactory.h"
27 
28 namespace SurgSim
29 {
30 
31 namespace Input
32 {
33 class InputComponent;
34 class OutputComponent;
35 }
36 
37 namespace Physics
38 {
39 
40 class RigidRepresentation;
41 
42 SURGSIM_STATIC_REGISTRATION(VirtualToolCoupler);
43 
59 {
60 public:
63  explicit VirtualToolCoupler(const std::string& name);
64 
66 
67  SURGSIM_CLASSNAME(SurgSim::Physics::VirtualToolCoupler);
68 
70  const std::shared_ptr<Framework::Component> getInput();
71 
77  void setInput(const std::shared_ptr<Framework::Component> input);
78 
80  const std::shared_ptr<Framework::Component> getOutput();
81 
84  void setOutput(const std::shared_ptr<Framework::Component> output);
85 
87  const std::shared_ptr<Framework::Component> getRepresentation();
88 
91  void setRepresentation(const std::shared_ptr<Framework::Component> rigid);
92 
96  bool isHapticOutputOnlyWhenColliding() const;
97 
101  void setHapticOutputOnlyWhenColliding(bool haptic);
102 
104  const std::string& getPoseName();
105 
108  void setPoseName(const std::string& poseName = DataStructures::Names::POSE);
109 
110  void update(double dt) override;
111 
116  void overrideLinearStiffness(double linearStiffness);
117 
119  double getLinearStiffness();
120 
125  void overrideLinearDamping(double linearDamping);
126 
128  double getLinearDamping();
129 
134  void overrideAngularStiffness(double angularStiffness);
135 
137  double getAngularStiffness();
138 
143  void overrideAngularDamping(double angularDamping);
144 
146  double getAngularDamping();
147 
152  void overrideAttachmentPoint(const Math::Vector3d& attachment);
153 
156  const Math::Vector3d& getAttachmentPoint();
157 
162  void setCalculateInertialTorques(bool calculateInertialTorques);
163 
168  bool getCalculateInertialTorques() const;
169 
174  void setInitializeRigidWithInputPose(bool val);
175 
178  bool isInitializingRigidWithInputPose() const;
179 
180  void doRetire() override;
181 
182  void setLocalActive(bool val) override;
183 
184 protected:
185  bool doInitialize() override;
186  bool doWakeUp() override;
187  int getTargetManagerType() const override;
188  void setInitialInputPose(const SurgSim::Math::RigidTransform3d& pose);
189 
191  virtual DataStructures::DataGroup buildOutputData();
192 
195  void setOptionalLinearStiffness(const DataStructures::OptionalValue<double>& linearStiffness);
196 
199  const DataStructures::OptionalValue<double>& getOptionalLinearStiffness() const;
200 
204  void setOptionalLinearDamping(const DataStructures::OptionalValue<double>& linearDamping);
205 
208  const DataStructures::OptionalValue<double>& getOptionalLinearDamping() const;
209 
213  void setOptionalAngularStiffness(const DataStructures::OptionalValue<double>& angularStiffness);
214 
217  const DataStructures::OptionalValue<double>& getOptionalAngularStiffness() const;
218 
222  void setOptionalAngularDamping(const DataStructures::OptionalValue<double>& angularDamping);
223 
226  const DataStructures::OptionalValue<double>& getOptionalAngularDamping() const;
227 
230  void setOptionalAttachmentPoint(const DataStructures::OptionalValue<Math::Vector3d>& attachmentPoint);
231 
234  const DataStructures::OptionalValue<Math::Vector3d>& getOptionalAttachmentPoint() const;
235 
238 
241 
244 
247 
250 
253 
255  std::shared_ptr<Input::InputComponent> m_input;
256 
258  std::shared_ptr<Input::OutputComponent> m_output;
259 
260 private:
261  std::shared_ptr<RigidRepresentation> m_rigid;
262  std::string m_poseName;
263 
265  double m_linearStiffness;
266 
268  double m_linearDamping;
269 
271  double m_angularStiffness;
272 
274  double m_angularDamping;
275 
277  Math::Vector3d m_localAttachmentPoint;
278 
281  bool m_calculateInertialTorques;
282 
284  bool m_initializeRigidWithInputPose;
285 
287  std::shared_ptr<Framework::Logger> m_logger;
288 
290  bool m_hapticOutputOnlyWhenColliding;
291 
293  Math::RigidTransform3d m_previousInputPose;
294 
297  int m_poseIndex;
298  int m_linearVelocityIndex;
299  int m_angularVelocityIndex;
300  int m_forceIndex;
301  int m_torqueIndex;
302  int m_inputLinearVelocityIndex;
303  int m_inputAngularVelocityIndex;
304  int m_inputPoseIndex;
305  int m_springJacobianIndex;
306  int m_damperJacobianIndex;
308 };
309 
310 }; // Physics
311 
312 }; // SurgSim
313 
314 #endif // SURGSIM_PHYSICS_VIRTUALTOOLCOUPLER_H
DataStructures::DataGroup m_outputData
The DataGroup to output.
Definition: VirtualToolCoupler.h:252
Wraps glewInit() to separate the glew opengl definitions from the osg opengl definitions only imgui n...
Definition: AddRandomSphereBehavior.cpp:36
std::shared_ptr< Input::OutputComponent > m_output
The output component.
Definition: VirtualToolCoupler.h:258
Eigen::Transform< double, 3, Eigen::Isometry > RigidTransform3d
A 3D rigid (isometric) transform, represented as doubles.
Definition: RigidTransform.h:46
Eigen::Matrix< double, 3, 1 > Vector3d
A 3D vector of doubles.
Definition: Vector.h:57
The convenience header that provides the entirety of the logging API.
DataStructures::OptionalValue< double > m_optionalLinearDamping
User supplied Vtc damping parameter in linear mode (in N·s·m-1 or Kg·s-1)
Definition: VirtualToolCoupler.h:240
DataStructures::OptionalValue< double > m_optionalLinearStiffness
User supplied Vtc stiffness parameter in linear mode (in N·m-1)
Definition: VirtualToolCoupler.h:237
A collection of NamedData objects.
Definition: DataGroup.h:68
The VirtualToolCoupler couples a rigid object to an input/output device through a spring and damper...
Definition: VirtualToolCoupler.h:58
Behaviors perform actions.
Definition: Behavior.h:40
DataStructures::OptionalValue< Math::Vector3d > m_optionalAttachmentPoint
User supplied attachment point.
Definition: VirtualToolCoupler.h:249
std::shared_ptr< Input::InputComponent > m_input
The input component.
Definition: VirtualToolCoupler.h:255
DataStructures::OptionalValue< double > m_optionalAngularDamping
User supplied Vtc damping parameter in angular mode (in N·m·s·rad-1)
Definition: VirtualToolCoupler.h:246
DataStructures::OptionalValue< double > m_optionalAngularStiffness
User supplied Vtc stiffness parameter in angular mode (in N·m rad-1)
Definition: VirtualToolCoupler.h:243