ArmarXPhysicsWorldVisualization.h
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2013-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5  *
6  * ArmarX is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * ArmarX is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * @package ArmarXSimulation::ArmarXPhysicsWorldVisualization
19  * @author Nikolaus Vahrenkamp ( vahrenkamp at kit dot edu )
20  * @date 2014
21  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22  * GNU General Public License
23  */
24 
25 #pragma once
26 
27 #include <memory>
28 #include <mutex>
29 
30 #include <Eigen/Core>
31 #include <Eigen/Geometry>
32 
33 #include <VirtualRobot/SceneObject.h>
34 
37 
38 #include <RobotAPI/interface/core/RobotState.h>
40 
41 #include <ArmarXSimulation/interface/simulator/SimulatorInterface.h>
42 
43 #include <Inventor/nodes/SoSeparator.h>
44 
45 namespace armarx
46 {
47  /*!
48  * \class ArmarXPhysicsWorldVisualizationPropertyDefinitions
49  * \brief
50  */
52  {
53  public:
56  {
57  defineOptionalProperty<std::string>(
58  "ReportVisuTopicName",
59  "SimulatorVisuUpdates",
60  "The topic on which the visualization updates are published.");
61  }
62  };
63 
64  /*!
65  * \brief The ArmarXPhysicsWorldVisualization class organizes the Coin3D visualization of the physics scene. It connects to the SimulatorVisuUpdate topic
66  * in order to retrieve the visualization stream of the current simulated environment.
67  * All scene changes (new objects / removed objects) are handled by checking the current setup with the retrieved one.
68  */
70  virtual public SimulatorListenerInterface,
71  virtual public Component
72  {
73  public:
75 
77 
78  void releaseResources();
79 
80  // inherited from Component
81  std::string
82  getDefaultName() const override
83  {
84  return "ArmarXPhysicsWorldVisualization";
85  }
86 
87  void onInitComponent() override;
88  void onConnectComponent() override;
89  void onDisconnectComponent() override;
90  void onExitComponent() override;
91 
92  /*! Inherited from SimulatorListenerInterface.
93  * This method is called when the simulator publishes a scene update. For now the complete scene is described in the SyeneVisuData format.
94  *
95  */
96  void reportSceneUpdated(const ::armarx::SceneVisuData& actualData,
97  const ::Ice::Current& = Ice::emptyCurrent) override;
98 
99  /*!
100  * \brief getVisu returns the visualization that is synchronized with ArmarXPhysicsWorld
101  * \return
102  */
103  SoSeparator* getVisualization();
104 
105  /*!
106  * \brief Returns the scene without floor (allows for better viewAll handling)
107  * \return
108  */
109  SoSeparator* getViewableScene();
110 
111  /**
112  * @see PropertyUser::createPropertyDefinitions()
113  */
116  {
117  return PropertyDefinitionsPtr(
119  }
120 
121  /*!
122  * \brief buildVisu Creates visualization with increased ref counter.
123  * \param o
124  * \param visuType
125  * \return
126  */
128  VirtualRobot::SceneObject::VisualizationType visuType =
129  VirtualRobot::SceneObject::Full);
130  /*!
131  * \brief buildVisu Creates visualization with increased ref counter.
132  * \param ro
133  * \param visuType
134  * \return
135  */
137  VirtualRobot::SceneObject::VisualizationType visuType =
138  VirtualRobot::SceneObject::Full);
139 
141  VirtualRobot::SceneObject::VisualizationType visuType =
142  VirtualRobot::SceneObject::Full);
144  VirtualRobot::SceneObject::VisualizationType visuType =
145  VirtualRobot::SceneObject::Full);
146 
147  void removeObjectVisualization(const std::string& name);
149  void removeRobotVisualization(const std::string& name);
151 
152  void enableVisuType(bool fullModel);
153  void addFloorVisualization(Eigen::Vector3f floorPos,
154  Eigen::Vector3f floorUp,
155  float floorExtendMM,
156  std::string floorTexture);
157 
158  void showBaseCoord(bool enable, float scale = 5.0f);
159 
160  // If set, this mutex is used to generate locks (for visu updates)
161  void setMutex(std::shared_ptr<std::recursive_mutex> const& m);
162 
163  using RecursiveLockPtr = std::shared_ptr<std::unique_lock<std::recursive_mutex>>;
166 
167  /*!
168  * \brief Show/hide contacts
169  * \param enable
170  */
171  //void enableContactVisu(bool enable);
172 
173  /*!
174  * \brief Update the contact visualization
175  * Draws an arrow at each contact
176  * Does nothing if enableContacts is false
177  */
178  //void updateContactVisualization(std::vector<SimDynamics::DynamicsEngine::DynamicsContactInfo> &c);
179 
180  /*!
181  * \brief synchronizeVisualizationData Updates world poses of all objects of the visualization according to the current state of the physics engine.
182  * \return True on success.
183  */
185 
186  float getSyncVisuTime();
187 
188 
189  VirtualRobot::RobotPtr getRobot(const std::string& name);
190  VirtualRobot::SceneObjectPtr getObject(const std::string& name);
191 
192  std::vector<VirtualRobot::RobotPtr> getRobots() const;
193  std::vector<VirtualRobot::SceneObjectPtr> getObjects() const;
194 
195  /**
196  * @brief getSyncTimestamp
197  * @return time in microseconds
198  */
199  Ice::Long getSyncTimestamp() const;
200 
201  protected:
202  bool loadObject(const ObjectVisuData& obj);
203  bool loadRobot(const std::string& robotName,
204  const std::string& robotFile,
205  const std::string& project,
206  float scaling,
207  bool colModel);
208  bool loadObject(const std::string& objectFile,
209  const std::string& project,
210  const std::string& instanceName);
211 
212  bool synchronizeSceneObjectPoses(NamePoseMap& objMap,
213  NameValueMap& jvMap,
214  VirtualRobot::SceneObjectPtr currentObjVisu);
215 
216  SoSeparator* coinVisu;
217  SoSeparator* dynamicsVisu;
218  SoSeparator* baseCoordVisu;
219  //SoSeparator* contactsVisu;
220  SoSeparator* sceneViewableSep;
221  SoSeparator* floorVisu;
222 
223  std::map<VirtualRobot::SceneObjectPtr, SoNode*> addedVisualizations;
224  std::map<VirtualRobot::RobotPtr, SoNode*> addedRobotVisualizations;
225 
226  float synchronize2TimeMS; // synchronize data from engine to visu and report object
227 
228  //bool contactVisuEnabled;
229 
230  //! mutex to protect access to visualization models
231  std::shared_ptr<std::recursive_mutex> mutex;
232 
233  //! mutex to process SceneData
234  std::shared_ptr<std::recursive_mutex> mutexData;
235 
236  SceneVisuData currentSceneData;
237  SceneVisuData lastSceneData;
238 
239  VirtualRobot::SceneObject::VisualizationType modelType;
240 
242  bool synchronizeRobots();
243  bool synchronizeFloor();
244  bool synchronizeObjects();
245  bool createPrimitiveObject(ObjectVisuPrimitivePtr objectPrimitiveData,
246  const std::string& name);
247  };
248 
250 } // namespace armarx
armarx::ArmarXPhysicsWorldVisualization::synchronizeRobots
bool synchronizeRobots()
Definition: ArmarXPhysicsWorldVisualization.cpp:585
armarx::ArmarXPhysicsWorldVisualization::getSyncTimestamp
Ice::Long getSyncTimestamp() const
getSyncTimestamp
Definition: ArmarXPhysicsWorldVisualization.cpp:1060
armarx::ArmarXPhysicsWorldVisualization::lastSceneData
SceneVisuData lastSceneData
Definition: ArmarXPhysicsWorldVisualization.h:237
armarx::ArmarXPhysicsWorldVisualization::addedRobotVisualizations
std::map< VirtualRobot::RobotPtr, SoNode * > addedRobotVisualizations
Definition: ArmarXPhysicsWorldVisualization.h:224
armarx::ArmarXPhysicsWorldVisualization::getDefaultName
std::string getDefaultName() const override
Retrieve default name of component.
Definition: ArmarXPhysicsWorldVisualization.h:82
armarx::ArmarXPhysicsWorldVisualization::~ArmarXPhysicsWorldVisualization
~ArmarXPhysicsWorldVisualization() override
Definition: ArmarXPhysicsWorldVisualization.cpp:75
armarx::ArmarXPhysicsWorldVisualizationPropertyDefinitions
Definition: ArmarXPhysicsWorldVisualization.h:51
armarx::ArmarXPhysicsWorldVisualization::getSyncVisuTime
float getSyncVisuTime()
Definition: ArmarXPhysicsWorldVisualization.cpp:841
armarx::ArmarXPhysicsWorldVisualization::synchronizeObjects
bool synchronizeObjects()
Definition: ArmarXPhysicsWorldVisualization.cpp:687
armarx::ArmarXPhysicsWorldVisualization::getViewableScene
SoSeparator * getViewableScene()
Returns the scene without floor (allows for better viewAll handling)
Definition: ArmarXPhysicsWorldVisualization.cpp:145
armarx::ArmarXPhysicsWorldVisualization::showBaseCoord
void showBaseCoord(bool enable, float scale=5.0f)
Definition: ArmarXPhysicsWorldVisualization.cpp:266
armarx::ArmarXPhysicsWorldVisualization::addVisualization
void addVisualization(VirtualRobot::SceneObjectPtr so, VirtualRobot::SceneObject::VisualizationType visuType=VirtualRobot::SceneObject::Full)
Pose.h
armarx::ArmarXPhysicsWorldVisualization::sceneViewableSep
SoSeparator * sceneViewableSep
Definition: ArmarXPhysicsWorldVisualization.h:220
armarx::ArmarXPhysicsWorldVisualization::onDisconnectComponent
void onDisconnectComponent() override
Hook for subclass.
Definition: ArmarXPhysicsWorldVisualization.cpp:120
armarx::ArmarXPhysicsWorldVisualization::dynamicsVisu
SoSeparator * dynamicsVisu
Definition: ArmarXPhysicsWorldVisualization.h:217
armarx::PropertyDefinitionContainer::prefix
std::string prefix
Prefix of the properties such as namespace, domain, component name, etc.
Definition: PropertyDefinitionContainer.h:345
armarx::ArmarXPhysicsWorldVisualization::enableVisuType
void enableVisuType(bool fullModel)
Definition: ArmarXPhysicsWorldVisualization.cpp:396
armarx::ArmarXPhysicsWorldVisualization
The ArmarXPhysicsWorldVisualization class organizes the Coin3D visualization of the physics scene....
Definition: ArmarXPhysicsWorldVisualization.h:69
armarx::ArmarXPhysicsWorldVisualization::removeFloorVisualization
void removeFloorVisualization()
Definition: ArmarXPhysicsWorldVisualization.cpp:258
so
linux gnu libIceDB so
Definition: CMakeLists.txt:7
armarx::ArmarXPhysicsWorldVisualization::getScopedDataLock
RecursiveLockPtr getScopedDataLock()
Definition: ArmarXPhysicsWorldVisualization.cpp:486
armarx::ArmarXPhysicsWorldVisualization::modelType
VirtualRobot::SceneObject::VisualizationType modelType
Definition: ArmarXPhysicsWorldVisualization.h:239
armarx::ArmarXPhysicsWorldVisualization::floorVisu
SoSeparator * floorVisu
Definition: ArmarXPhysicsWorldVisualization.h:221
armarx::ArmarXPhysicsWorldVisualization::releaseResources
void releaseResources()
Definition: ArmarXPhysicsWorldVisualization.cpp:92
project
std::string project
Definition: VisualizationRobot.cpp:85
armarx::ArmarXPhysicsWorldVisualization::currentSceneData
SceneVisuData currentSceneData
Definition: ArmarXPhysicsWorldVisualization.h:236
armarx::ArmarXPhysicsWorldVisualization::loadRobot
bool loadRobot(const std::string &robotName, const std::string &robotFile, const std::string &project, float scaling, bool colModel)
Definition: ArmarXPhysicsWorldVisualization.cpp:868
IceInternal::Handle< ArmarXPhysicsWorldVisualization >
armarx::ArmarXPhysicsWorldVisualization::onConnectComponent
void onConnectComponent() override
Pure virtual hook for the subclass.
Definition: ArmarXPhysicsWorldVisualization.cpp:115
armarx::ArmarXPhysicsWorldVisualization::reportSceneUpdated
void reportSceneUpdated(const ::armarx::SceneVisuData &actualData, const ::Ice::Current &=Ice::emptyCurrent) override
Definition: ArmarXPhysicsWorldVisualization.cpp:130
armarx::ArmarXPhysicsWorldVisualization::onExitComponent
void onExitComponent() override
Hook for subclass.
Definition: ArmarXPhysicsWorldVisualization.cpp:125
armarx::ArmarXPhysicsWorldVisualization::getRobots
std::vector< VirtualRobot::RobotPtr > getRobots() const
Definition: ArmarXPhysicsWorldVisualization.cpp:1034
armarx::ArmarXPhysicsWorldVisualization::getVisualization
SoSeparator * getVisualization()
getVisu returns the visualization that is synchronized with ArmarXPhysicsWorld
Definition: ArmarXPhysicsWorldVisualization.cpp:139
armarx::ArmarXPhysicsWorldVisualization::removeObjectVisualization
void removeObjectVisualization(const std::string &name)
Definition: ArmarXPhysicsWorldVisualization.cpp:331
armarx::ArmarXPhysicsWorldVisualization::getScopedLock
RecursiveLockPtr getScopedLock()
Definition: ArmarXPhysicsWorldVisualization.cpp:479
armarx::VariantType::Long
const VariantTypeId Long
Definition: Variant.h:918
armarx::ArmarXPhysicsWorldVisualization::getObject
VirtualRobot::SceneObjectPtr getObject(const std::string &name)
Definition: ArmarXPhysicsWorldVisualization.cpp:1020
armarx::ArmarXPhysicsWorldVisualization::synchronize2TimeMS
float synchronize2TimeMS
Definition: ArmarXPhysicsWorldVisualization.h:226
armarx::ArmarXPhysicsWorldVisualization::synchronizeFloor
bool synchronizeFloor()
Definition: ArmarXPhysicsWorldVisualization.cpp:561
armarx::ArmarXPhysicsWorldVisualization::mutex
std::shared_ptr< std::recursive_mutex > mutex
mutex to protect access to visualization models
Definition: ArmarXPhysicsWorldVisualization.h:231
armarx::ArmarXPhysicsWorldVisualization::RecursiveLockPtr
std::shared_ptr< std::unique_lock< std::recursive_mutex > > RecursiveLockPtr
Definition: ArmarXPhysicsWorldVisualization.h:163
Component.h
armarx::ArmarXPhysicsWorldVisualization::getObjects
std::vector< VirtualRobot::SceneObjectPtr > getObjects() const
Definition: ArmarXPhysicsWorldVisualization.cpp:1047
armarx::Component
Baseclass for all ArmarX ManagedIceObjects requiring properties.
Definition: Component.h:91
armarx::ArmarXPhysicsWorldVisualization::coinVisu
SoSeparator * coinVisu
Definition: ArmarXPhysicsWorldVisualization.h:216
armarx::control::njoint_controller::platform::platform_follower_controller::NameValueMap
std::map< std::string, float > NameValueMap
Definition: PlatformFollowerController.h:88
armarx::ArmarXPhysicsWorldVisualization::removeVisualization
void removeVisualization(VirtualRobot::RobotPtr r)
Definition: ArmarXPhysicsWorldVisualization.cpp:377
armarx::Component::getConfigIdentifier
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
Definition: Component.cpp:79
armarx::ArmarXPhysicsWorldVisualizationPropertyDefinitions::ArmarXPhysicsWorldVisualizationPropertyDefinitions
ArmarXPhysicsWorldVisualizationPropertyDefinitions(std::string prefix)
Definition: ArmarXPhysicsWorldVisualization.h:54
armarx::ArmarXPhysicsWorldVisualization::addedVisualizations
std::map< VirtualRobot::SceneObjectPtr, SoNode * > addedVisualizations
Definition: ArmarXPhysicsWorldVisualization.h:223
armarx::ComponentPropertyDefinitions
Default component property definition container.
Definition: Component.h:69
armarx::ArmarXPhysicsWorldVisualization::synchronizeSceneObjectPoses
bool synchronizeSceneObjectPoses(NamePoseMap &objMap, NameValueMap &jvMap, VirtualRobot::SceneObjectPtr currentObjVisu)
Definition: ArmarXPhysicsWorldVisualization.cpp:500
IceUtil::Handle
Definition: forward_declarations.h:30
armarx::ArmarXPhysicsWorldVisualization::mutexData
std::shared_ptr< std::recursive_mutex > mutexData
mutex to process SceneData
Definition: ArmarXPhysicsWorldVisualization.h:234
armarx::ArmarXPhysicsWorldVisualization::onInitComponent
void onInitComponent() override
Pure virtual hook for the subclass.
Definition: ArmarXPhysicsWorldVisualization.cpp:106
scene3D::SceneObjectPtr
boost::intrusive_ptr< SceneObject > SceneObjectPtr
Definition: PointerDefinitions.h:40
armarx::ArmarXPhysicsWorldVisualization::createPropertyDefinitions
PropertyDefinitionsPtr createPropertyDefinitions() override
Definition: ArmarXPhysicsWorldVisualization.h:115
armarx::ArmarXPhysicsWorldVisualization::addFloorVisualization
void addFloorVisualization(Eigen::Vector3f floorPos, Eigen::Vector3f floorUp, float floorExtendMM, std::string floorTexture)
Definition: ArmarXPhysicsWorldVisualization.cpp:234
armarx::ArmarXPhysicsWorldVisualization::removeRobotVisualization
void removeRobotVisualization(const std::string &name)
Definition: ArmarXPhysicsWorldVisualization.cpp:355
armarx::PropertyDefinitionsPtr
IceUtil::Handle< class PropertyDefinitionContainer > PropertyDefinitionsPtr
PropertyDefinitions smart pointer type.
Definition: forward_declarations.h:35
armarx::ArmarXPhysicsWorldVisualization::getRobot
VirtualRobot::RobotPtr getRobot(const std::string &name)
Definition: ArmarXPhysicsWorldVisualization.cpp:1165
armarx::ArmarXPhysicsWorldVisualization::loadObject
bool loadObject(const ObjectVisuData &obj)
Definition: ArmarXPhysicsWorldVisualization.cpp:847
armarx::ArmarXPhysicsWorldVisualization::baseCoordVisu
SoSeparator * baseCoordVisu
Definition: ArmarXPhysicsWorldVisualization.h:218
armarx::ArmarXPhysicsWorldVisualization::createPrimitiveObject
bool createPrimitiveObject(ObjectVisuPrimitivePtr objectPrimitiveData, const std::string &name)
Definition: ArmarXPhysicsWorldVisualization.cpp:1067
armarx::ArmarXPhysicsWorldVisualization::synchronizeVisualizationData
bool synchronizeVisualizationData()
Show/hide contacts.
Definition: ArmarXPhysicsWorldVisualization.cpp:776
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
armarx::ArmarXPhysicsWorldVisualization::ArmarXPhysicsWorldVisualization
ArmarXPhysicsWorldVisualization()
Definition: ArmarXPhysicsWorldVisualization.cpp:48
Application.h
armarx::ArmarXPhysicsWorldVisualization::buildVisu
SoNode * buildVisu(VirtualRobot::SceneObjectPtr o, VirtualRobot::SceneObject::VisualizationType visuType=VirtualRobot::SceneObject::Full)
buildVisu Creates visualization with increased ref counter.
VirtualRobot::RobotPtr
std::shared_ptr< class Robot > RobotPtr
Definition: Bus.h:19
armarx::ArmarXPhysicsWorldVisualization::setMutex
void setMutex(std::shared_ptr< std::recursive_mutex > const &m)
Definition: ArmarXPhysicsWorldVisualization.cpp:473