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
45namespace armarx
46{
47 /*!
48 * \class ArmarXPhysicsWorldVisualizationPropertyDefinitions
49 * \brief
50 */
52 {
53 public:
56 {
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 static std::string GetDefaultName();
82 std::string
83 getDefaultName() const override
84 {
85 return GetDefaultName();
86 }
87
88 void onInitComponent() override;
89 void onConnectComponent() override;
90 void onDisconnectComponent() override;
91 void onExitComponent() override;
92
93 /*! Inherited from SimulatorListenerInterface.
94 * This method is called when the simulator publishes a scene update. For now the complete scene is described in the SyeneVisuData format.
95 *
96 */
97 void reportSceneUpdated(const ::armarx::SceneVisuData& actualData,
98 const ::Ice::Current& = Ice::emptyCurrent) override;
99
100 /*!
101 * \brief getVisu returns the visualization that is synchronized with ArmarXPhysicsWorld
102 * \return
103 */
104 SoSeparator* getVisualization();
105
106 /*!
107 * \brief Returns the scene without floor (allows for better viewAll handling)
108 * \return
109 */
110 SoSeparator* getViewableScene();
111
112 /**
113 * @see PropertyUser::createPropertyDefinitions()
114 */
121
122 /*!
123 * \brief buildVisu Creates visualization with increased ref counter.
124 * \param o
125 * \param visuType
126 * \return
127 */
128 SoNode* buildVisu(VirtualRobot::SceneObjectPtr o,
129 VirtualRobot::SceneObject::VisualizationType visuType =
130 VirtualRobot::SceneObject::Full);
131 /*!
132 * \brief buildVisu Creates visualization with increased ref counter.
133 * \param ro
134 * \param visuType
135 * \return
136 */
138 VirtualRobot::SceneObject::VisualizationType visuType =
139 VirtualRobot::SceneObject::Full);
140
141 void addVisualization(VirtualRobot::SceneObjectPtr so,
142 VirtualRobot::SceneObject::VisualizationType visuType =
143 VirtualRobot::SceneObject::Full);
145 VirtualRobot::SceneObject::VisualizationType visuType =
146 VirtualRobot::SceneObject::Full);
147
148 void removeObjectVisualization(const std::string& name);
150 void removeRobotVisualization(const std::string& name);
151 void removeVisualization(VirtualRobot::SceneObjectPtr so);
152
153 void enableVisuType(bool fullModel);
154 void addFloorVisualization(Eigen::Vector3f floorPos,
155 Eigen::Vector3f floorUp,
156 float floorExtendMM,
157 std::string floorTexture);
158
159 void showBaseCoord(bool enable, float scale = 5.0f);
160
161 // If set, this mutex is used to generate locks (for visu updates)
162 void setMutex(std::shared_ptr<std::recursive_mutex> const& m);
163
164 using RecursiveLockPtr = std::shared_ptr<std::unique_lock<std::recursive_mutex>>;
167
168 /*!
169 * \brief Show/hide contacts
170 * \param enable
171 */
172 //void enableContactVisu(bool enable);
173
174 /*!
175 * \brief Update the contact visualization
176 * Draws an arrow at each contact
177 * Does nothing if enableContacts is false
178 */
179 //void updateContactVisualization(std::vector<SimDynamics::DynamicsEngine::DynamicsContactInfo> &c);
180
181 /*!
182 * \brief synchronizeVisualizationData Updates world poses of all objects of the visualization according to the current state of the physics engine.
183 * \return True on success.
184 */
186
187 float getSyncVisuTime();
188
189
190 VirtualRobot::RobotPtr getRobot(const std::string& name);
191 VirtualRobot::SceneObjectPtr getObject(const std::string& name);
192
193 std::vector<VirtualRobot::RobotPtr> getRobots() const;
194 std::vector<VirtualRobot::SceneObjectPtr> getObjects() const;
195
196 /**
197 * @brief getSyncTimestamp
198 * @return time in microseconds
199 */
200 Ice::Long getSyncTimestamp() const;
201
202 protected:
203 bool loadObject(const ObjectVisuData& obj);
204 bool loadRobot(const std::string& robotName,
205 const std::string& robotFile,
206 const std::string& project,
207 float scaling,
208 bool colModel);
209 bool loadObject(const std::string& objectFile,
210 const std::string& project,
211 const std::string& instanceName);
212
213 bool synchronizeSceneObjectPoses(NamePoseMap& objMap,
214 NameValueMap& jvMap,
215 VirtualRobot::SceneObjectPtr currentObjVisu);
216
217 SoSeparator* coinVisu;
218 SoSeparator* dynamicsVisu;
219 SoSeparator* baseCoordVisu;
220 //SoSeparator* contactsVisu;
221 SoSeparator* sceneViewableSep;
222 SoSeparator* floorVisu;
223
224 std::map<VirtualRobot::SceneObjectPtr, SoNode*> addedVisualizations;
225 std::map<VirtualRobot::RobotPtr, SoNode*> addedRobotVisualizations;
226
227 float synchronize2TimeMS; // synchronize data from engine to visu and report object
228
229 //bool contactVisuEnabled;
230
231 //! mutex to protect access to visualization models
232 std::shared_ptr<std::recursive_mutex> mutex;
233
234 //! mutex to process SceneData
235 std::shared_ptr<std::recursive_mutex> mutexData;
236
237 SceneVisuData currentSceneData;
238 SceneVisuData lastSceneData;
239
240 VirtualRobot::SceneObject::VisualizationType modelType;
241
243 bool synchronizeRobots();
244 bool synchronizeFloor();
245 bool synchronizeObjects();
246 bool createPrimitiveObject(ObjectVisuPrimitivePtr objectPrimitiveData,
247 const std::string& name);
248 };
249
251} // namespace armarx
void onInitComponent() override
Pure virtual hook for the subclass.
bool synchronizeSceneObjectPoses(NamePoseMap &objMap, NameValueMap &jvMap, VirtualRobot::SceneObjectPtr currentObjVisu)
std::map< VirtualRobot::SceneObjectPtr, SoNode * > addedVisualizations
VirtualRobot::RobotPtr getRobot(const std::string &name)
SoSeparator * getVisualization()
getVisu returns the visualization that is synchronized with ArmarXPhysicsWorld
VirtualRobot::SceneObjectPtr getObject(const std::string &name)
void removeVisualization(VirtualRobot::SceneObjectPtr so)
std::vector< VirtualRobot::RobotPtr > getRobots() const
std::vector< VirtualRobot::SceneObjectPtr > getObjects() const
void addFloorVisualization(Eigen::Vector3f floorPos, Eigen::Vector3f floorUp, float floorExtendMM, std::string floorTexture)
void onConnectComponent() override
Pure virtual hook for the subclass.
std::shared_ptr< std::recursive_mutex > mutex
mutex to protect access to visualization models
void addVisualization(VirtualRobot::SceneObjectPtr so, VirtualRobot::SceneObject::VisualizationType visuType=VirtualRobot::SceneObject::Full)
PropertyDefinitionsPtr createPropertyDefinitions() override
std::shared_ptr< std::unique_lock< std::recursive_mutex > > RecursiveLockPtr
std::shared_ptr< std::recursive_mutex > mutexData
mutex to process SceneData
SoSeparator * getViewableScene()
Returns the scene without floor (allows for better viewAll handling)
void setMutex(std::shared_ptr< std::recursive_mutex > const &m)
void reportSceneUpdated(const ::armarx::SceneVisuData &actualData, const ::Ice::Current &=Ice::emptyCurrent) override
bool loadRobot(const std::string &robotName, const std::string &robotFile, const std::string &project, float scaling, bool colModel)
bool createPrimitiveObject(ObjectVisuPrimitivePtr objectPrimitiveData, const std::string &name)
std::string getDefaultName() const override
Retrieve default name of component.
std::map< VirtualRobot::RobotPtr, SoNode * > addedRobotVisualizations
SoNode * buildVisu(VirtualRobot::SceneObjectPtr o, VirtualRobot::SceneObject::VisualizationType visuType=VirtualRobot::SceneObject::Full)
buildVisu Creates visualization with increased ref counter.
VirtualRobot::SceneObject::VisualizationType modelType
ComponentPropertyDefinitions(std::string prefix, bool hasObjectNameParameter=true)
Definition Component.cpp:46
Component()
Protected default constructor. Used for virtual inheritance. Use createManagedIceObject() instead.
Definition Component.cpp:66
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
Definition Component.cpp:90
std::string prefix
Prefix of the properties such as namespace, domain, component name, etc.
PropertyDefinition< PropertyType > & defineOptionalProperty(const std::string &name, PropertyType defaultValue, const std::string &description="", PropertyDefinitionBase::PropertyConstness constness=PropertyDefinitionBase::eConstant)
std::shared_ptr< class Robot > RobotPtr
Definition Bus.h:19
This file offers overloads of toIce() and fromIce() functions for STL container types.
IceInternal::Handle< ArmarXPhysicsWorldVisualization > ArmarXPhysicsWorldVisualizationPtr
IceUtil::Handle< class PropertyDefinitionContainer > PropertyDefinitionsPtr
PropertyDefinitions smart pointer type.