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 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 */
120
121 /*!
122 * \brief buildVisu Creates visualization with increased ref counter.
123 * \param o
124 * \param visuType
125 * \return
126 */
127 SoNode* buildVisu(VirtualRobot::SceneObjectPtr o,
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
140 void addVisualization(VirtualRobot::SceneObjectPtr so,
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);
150 void removeVisualization(VirtualRobot::SceneObjectPtr so);
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
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.