MujocoPhysicsWorld.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::Simulator
19 * @author Rainer Kartmann ( rainer dot kartmann at student dot kit dot edu )
20 * @date 2019
21 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22 * GNU General Public License
23 */
24
25#pragma once
26
27#include <filesystem>
28
29#include <VirtualRobot/XML/mujoco/RobotMjcf.h>
30
31#include "SimulatedWorld.h"
33#include "mujoco/SimMjcf.h"
34#include "mujoco/SimObject.h"
35#include "mujoco/SimRobot.h"
36#include <MujocoX/libraries/MJCF/Document.h>
37#include <MujocoX/libraries/Simulation/MujocoSim.h>
38#include <MujocoX/libraries/Simulation/SimCallbackListener.h>
39#include <MujocoX/libraries/Simulation/SimEntity.h>
40
41namespace armarx
42{
43 /**
44 * @brief The MujocoPhysicsWorld class encapsulates the whole physics
45 * simulation and the corresponding data.
46 */
47 class MujocoPhysicsWorld : public SimulatedWorld, mujoco::SimCallbackListener
48 {
49 public:
51 virtual ~MujocoPhysicsWorld() override = default;
52
53
54 public:
55 /**
56 * @brief Initialize `*this`. To be called after construction.
57 *
58 * Sets up simulation model document and requests a reload.
59 *
60 * @param stepTimeMs The step time in ms.
61 * @param floorEnabled Whether to add a floor.
62 * @param floorTexture The floor texture file.
63 */
64 void initialize(int stepTimeMs, bool floorEnabled, const std::string& floorTexture);
65
66
67 // SimulatedWorld interface
68
69 virtual void stepPhysicsRealTime() override;
70 virtual void stepPhysicsFixedTimeStep() override;
71 virtual int getFixedTimeStepMS() override;
72
73 virtual std::vector<std::string> getObstacleNames() override;
74 virtual std::vector<std::string> getRobotNames() override;
75
76
77 virtual void actuateRobotJoints(const std::string& robotName,
78 const std::map<std::string, float>& angles,
79 const std::map<std::string, float>& velocities) override;
80 virtual void actuateRobotJointsPos(const std::string& robotName,
81 const std::map<std::string, float>& angles) override;
82 virtual void actuateRobotJointsVel(const std::string& robotName,
83 const std::map<std::string, float>& velocities) override;
84 virtual void actuateRobotJointsTorque(const std::string& robotName,
85 const std::map<std::string, float>& torques) override;
86
87 virtual void applyForceRobotNode(const std::string& robotName,
88 const std::string& robotNodeName,
89 const Eigen::Vector3f& force) override;
90 virtual void applyTorqueRobotNode(const std::string& robotName,
91 const std::string& robotNodeName,
92 const Eigen::Vector3f& torque) override;
93
94 virtual void applyForceObject(const std::string& objectName,
95 const Eigen::Vector3f& force) override;
96 virtual void applyTorqueObject(const std::string& objectName,
97 const Eigen::Vector3f& torque) override;
98
99 virtual std::map<std::string, float>
100 getRobotJointAngles(const std::string& robotName) override;
101 virtual float getRobotJointAngle(const std::string& robotName,
102 const std::string& nodeName) override;
103
104 virtual std::map<std::string, float>
105 getRobotJointVelocities(const std::string& robotName) override;
106 virtual float getRobotJointVelocity(const std::string& robotName,
107 const std::string& nodeName) override;
108
109 virtual std::map<std::string, float>
110 getRobotJointTorques(const std::string& robotName) override;
111 virtual ForceTorqueDataSeq
112 getRobotForceTorqueSensors(const std::string& robotName) override;
113
114
115 virtual Eigen::Matrix4f getObjectPose(const std::string& objectName) override;
116 virtual void setObjectPose(const std::string& objectName,
117 const Eigen::Matrix4f& globalPose) override;
118
119 virtual Eigen::Matrix4f getRobotPose(const std::string& robotName) override;
120 virtual void setRobotPose(const std::string& robotName,
121 const Eigen::Matrix4f& globalPose) override;
122
123 virtual Eigen::Matrix4f getRobotNodePose(const std::string& robotName,
124 const std::string& robotNodeName) override;
125 virtual Eigen::Vector3f getRobotLinearVelocity(const std::string& robotName,
126 const std::string& nodeName) override;
127 virtual Eigen::Vector3f getRobotAngularVelocity(const std::string& robotName,
128 const std::string& nodeName) override;
129
130 virtual void setRobotLinearVelocity(const std::string& robotName,
131 const std::string& robotNodeName,
132 const Eigen::Vector3f& vel) override;
133 virtual void setRobotAngularVelocity(const std::string& robotName,
134 const std::string& robotNodeName,
135 const Eigen::Vector3f& vel) override;
136
137 virtual void setRobotLinearVelocityRobotRootFrame(const std::string& robotName,
138 const std::string& robotNodeName,
139 const Eigen::Vector3f& vel) override;
140 virtual void setRobotAngularVelocityRobotRootFrame(const std::string& robotName,
141 const std::string& robotNodeName,
142 const Eigen::Vector3f& vel) override;
143
144 virtual bool hasObject(const std::string& instanceName) override;
145
146 virtual bool hasRobot(const std::string& robotName) override;
147 virtual bool hasRobotNode(const std::string& robotName,
148 const std::string& robotNodeName) override;
149
150 virtual std::vector<VirtualRobot::SceneObjectPtr> getObjects() override;
151
152 virtual VirtualRobot::RobotPtr getRobot(const std::string& robotName) override;
153 virtual std::map<std::string, VirtualRobot::RobotPtr> getRobots() override;
154
155 virtual float getRobotJointLimitLo(const std::string& robotName,
156 const std::string& nodeName) override;
157 virtual float getRobotJointLimitHi(const std::string& robotName,
158 const std::string& nodeName) override;
159
160 virtual float getRobotMaxTorque(const std::string& robotName,
161 const std::string& nodeName) override;
162 virtual void setRobotMaxTorque(const std::string& robotName,
163 const std::string& nodeName,
164 float maxTorque) override;
165
166 virtual float getRobotMass(const std::string& robotName) override;
167
168 virtual DistanceInfo getRobotNodeDistance(const std::string& robotName,
169 const std::string& robotNodeName1,
170 const std::string& robotNodeName2) override;
171 virtual DistanceInfo getDistance(const std::string& robotName,
172 const std::string& robotNodeName,
173 const std::string& worldObjectName) override;
174
175 virtual std::vector<SimDynamics::DynamicsEngine::DynamicsContactInfo>
176 copyContacts() override;
177
178 virtual FramedPosePtr toFramedPose(const Eigen::Matrix4f& globalPose,
179 const std::string& robotName,
180 const std::string& frameName) override;
181
182 virtual void
183 setObjectSimType(const std::string& objectName,
184 VirtualRobot::SceneObject::Physics::SimulationType simType) override;
185
186 virtual void
187 setRobotNodeSimType(const std::string& robotName,
188 const std::string& robotNodeName,
189 VirtualRobot::SceneObject::Physics::SimulationType simType) override;
190
191
192 protected:
193 // SimulatedWorld interface
194
195 virtual bool
196 addObstacleEngine(VirtualRobot::SceneObjectPtr o,
197 VirtualRobot::SceneObject::Physics::SimulationType simType) override;
198 virtual bool removeObstacleEngine(const std::string& name) override;
199
201 double pid_p,
202 double pid_i,
203 double pid_d,
204 const std::string& filename,
205 bool staticRobot,
206 bool selfCollisions) override;
207 virtual bool removeRobotEngine(const std::string& robotName) override;
208
209 virtual bool objectGraspedEngine(const std::string& robotName,
210 const std::string& robotNodeName,
211 const std::string& objectName,
212 Eigen::Matrix4f& storeLocalTransform) override;
213 virtual bool objectReleasedEngine(const std::string& robotName,
214 const std::string& robotNodeName,
215 const std::string& objectName) override;
216
217 // floor
218 virtual VirtualRobot::SceneObjectPtr getFloor() override;
219 virtual void setupFloorEngine(bool enable, const std::string& floorTexture) override;
220
221 /// According to other SimulatedWorlds, this method's only job is to update contacts.
222 virtual bool synchronizeSimulationDataEngine() override;
223 virtual int getContactCount() override;
224
225 virtual bool synchronizeObjects() override;
226 virtual bool
227 synchronizeSceneObjectPoses(VirtualRobot::SceneObjectPtr currentObjEngine,
228 std::map<std::string, PoseBasePtr>& objMap) override;
229
230 virtual bool synchronizeRobotNodePoses(const std::string& robotName,
231 std::map<std::string, PoseBasePtr>& objMap) override;
232
233 virtual bool getRobotStatus(const std::string& robotName,
234 NameValueMap& jointAngles,
235 NameValueMap& jointVelocities,
236 NameValueMap& jointTorques,
237 Eigen::Vector3f& linearVelocity,
238 Eigen::Vector3f& angularVelocity) override;
239
240 virtual bool updateForceTorqueSensor(ForceTorqueInfo& ftInfo) override;
241
242
243 protected:
244 // mujoco::SimCallbackListener
245 /// Sets time step and fetches entity IDs.
246 virtual void onLoadModel(mujoco::Model& model) override;
247 virtual void onMakeData(mujoco::Model& model, mujoco::Data& data) override;
248
249
250 private:
251 /// Name of base file included by model.
252 static const std::filesystem::path BASE_MJCF_FILENAME;
253 /// Temporary directory to store models.
254 static const std::filesystem::path TEMP_DIR;
255 /// File where model is stored for loading.
256 static const std::filesystem::path TEMP_MODEL_FILE;
257 /// Directory where object meshes are placed (relative to TEMP_DIR).
258 static const std::filesystem::path TEMP_MESH_DIR_REL;
259 /// Directory where object meshes are placed.
260 static const std::filesystem::path TEMP_MESH_DIR;
261
262 /// Name of floor entities and class.
263 static const std::string FLOOR_NAME;
264 /// Name of object defaults class.
265 static const std::string OBJECT_CLASS_NAME;
266
267
268 private:
269 VirtualRobot::ObstaclePtr makeFloorObject(mujoco::Model& model,
270 const mujoco::SimGeom& floorGeom) const;
271
272 /// Make a MJCF model for the given robot and return its absolute path.
273 VirtualRobot::mujoco::RobotMjcf
274 makeRobotMjcfModel(const VirtualRobot::RobotPtr& robot) const;
275
276
277 /// Save the MJCF document and request a reload.
278 void reloadModel(bool request = true);
279
280
281 // MJCF
282
283 /// Length scaling manager.
284 LengthScaling lengthScaling;
285
286 /// The model document.
287 mjcf::Document mjcfDocument;
288
289 /// The model document helper.
290 SimMJCF simMjcf{mjcfDocument, lengthScaling, "MujocoPhysicsWorld"};
291
292
293 /// The simulation.
294 mujoco::MujocoSim sim;
295
296 /// The fixed time step.
297 std::chrono::milliseconds fixedTimeStep;
298
299
300 // Entities & Objects
301
302 /// The floor object.
303 mujoco::SimObject floor{FLOOR_NAME};
304 /// The floor texture file.
305 std::filesystem::path floorTextureFile;
306
307
308 /// The simulation obstacles.
309 std::map<std::string, mujoco::SimObject> obstacles;
310
311 /// The simulation objects.
312 std::map<std::string, mujoco::SimObject> objects;
313
314 /// The robots (key is name).
315 std::map<std::string, mujoco::SimRobot> robots;
316
317
318 // Simulation data
319
320 /// Contacts.
321 std::vector<mjContact> contacts;
322 };
323
324 using MujocoPhysicsWorldPtr = std::shared_ptr<MujocoPhysicsWorld>;
325} // namespace armarx
virtual bool removeObstacleEngine(const std::string &name) override
virtual ForceTorqueDataSeq getRobotForceTorqueSensors(const std::string &robotName) override
virtual bool objectReleasedEngine(const std::string &robotName, const std::string &robotNodeName, const std::string &objectName) override
remove a joint
virtual float getRobotJointVelocity(const std::string &robotName, const std::string &nodeName) override
virtual ~MujocoPhysicsWorld() override=default
virtual void applyTorqueRobotNode(const std::string &robotName, const std::string &robotNodeName, const Eigen::Vector3f &torque) override
virtual bool synchronizeSceneObjectPoses(VirtualRobot::SceneObjectPtr currentObjEngine, std::map< std::string, PoseBasePtr > &objMap) override
virtual void setupFloorEngine(bool enable, const std::string &floorTexture) override
virtual void stepPhysicsFixedTimeStep() override
Perform one simulation step.
virtual bool hasObject(const std::string &instanceName) override
virtual VirtualRobot::SceneObjectPtr getFloor() override
virtual void setRobotPose(const std::string &robotName, const Eigen::Matrix4f &globalPose) override
virtual VirtualRobot::RobotPtr getRobot(const std::string &robotName) override
virtual void setRobotNodeSimType(const std::string &robotName, const std::string &robotNodeName, VirtualRobot::SceneObject::Physics::SimulationType simType) override
virtual void setRobotAngularVelocity(const std::string &robotName, const std::string &robotNodeName, const Eigen::Vector3f &vel) override
virtual float getRobotMass(const std::string &robotName) override
virtual bool addObstacleEngine(VirtualRobot::SceneObjectPtr o, VirtualRobot::SceneObject::Physics::SimulationType simType) override
virtual bool getRobotStatus(const std::string &robotName, NameValueMap &jointAngles, NameValueMap &jointVelocities, NameValueMap &jointTorques, Eigen::Vector3f &linearVelocity, Eigen::Vector3f &angularVelocity) override
virtual bool objectGraspedEngine(const std::string &robotName, const std::string &robotNodeName, const std::string &objectName, Eigen::Matrix4f &storeLocalTransform) override
create a joint
virtual std::vector< std::string > getObstacleNames() override
virtual void applyForceObject(const std::string &objectName, const Eigen::Vector3f &force) override
virtual void applyForceRobotNode(const std::string &robotName, const std::string &robotNodeName, const Eigen::Vector3f &force) override
virtual std::vector< VirtualRobot::SceneObjectPtr > getObjects() override
virtual void onLoadModel(mujoco::Model &model) override
Sets time step and fetches entity IDs.
virtual void setRobotLinearVelocity(const std::string &robotName, const std::string &robotNodeName, const Eigen::Vector3f &vel) override
virtual Eigen::Vector3f getRobotLinearVelocity(const std::string &robotName, const std::string &nodeName) override
virtual float getRobotMaxTorque(const std::string &robotName, const std::string &nodeName) override
virtual void setObjectSimType(const std::string &objectName, VirtualRobot::SceneObject::Physics::SimulationType simType) override
virtual std::vector< std::string > getRobotNames() override
virtual void stepPhysicsRealTime() override
Perform one simulation step.
virtual int getFixedTimeStepMS() override
virtual int getContactCount() override
virtual void setRobotAngularVelocityRobotRootFrame(const std::string &robotName, const std::string &robotNodeName, const Eigen::Vector3f &vel) override
void initialize(int stepTimeMs, bool floorEnabled, const std::string &floorTexture)
Initialize *this.
virtual void actuateRobotJointsTorque(const std::string &robotName, const std::map< std::string, float > &torques) override
virtual void actuateRobotJointsVel(const std::string &robotName, const std::map< std::string, float > &velocities) override
virtual void setRobotLinearVelocityRobotRootFrame(const std::string &robotName, const std::string &robotNodeName, const Eigen::Vector3f &vel) override
virtual bool hasRobot(const std::string &robotName) override
virtual float getRobotJointLimitLo(const std::string &robotName, const std::string &nodeName) override
virtual std::map< std::string, float > getRobotJointVelocities(const std::string &robotName) override
virtual bool removeRobotEngine(const std::string &robotName) override
virtual Eigen::Matrix4f getObjectPose(const std::string &objectName) override
virtual DistanceInfo getDistance(const std::string &robotName, const std::string &robotNodeName, const std::string &worldObjectName) override
virtual bool synchronizeRobotNodePoses(const std::string &robotName, std::map< std::string, PoseBasePtr > &objMap) override
virtual float getRobotJointAngle(const std::string &robotName, const std::string &nodeName) override
virtual void actuateRobotJointsPos(const std::string &robotName, const std::map< std::string, float > &angles) override
virtual std::map< std::string, VirtualRobot::RobotPtr > getRobots() override
virtual std::map< std::string, float > getRobotJointTorques(const std::string &robotName) override
virtual bool synchronizeObjects() override
virtual Eigen::Matrix4f getRobotPose(const std::string &robotName) override
virtual DistanceInfo getRobotNodeDistance(const std::string &robotName, const std::string &robotNodeName1, const std::string &robotNodeName2) override
virtual std::vector< SimDynamics::DynamicsEngine::DynamicsContactInfo > copyContacts() override
virtual void actuateRobotJoints(const std::string &robotName, const std::map< std::string, float > &angles, const std::map< std::string, float > &velocities) override
virtual bool addRobotEngine(VirtualRobot::RobotPtr robot, double pid_p, double pid_i, double pid_d, const std::string &filename, bool staticRobot, bool selfCollisions) override
virtual FramedPosePtr toFramedPose(const Eigen::Matrix4f &globalPose, const std::string &robotName, const std::string &frameName) override
toFramedPose Constructs a framed pose
virtual void onMakeData(mujoco::Model &model, mujoco::Data &data) override
virtual bool updateForceTorqueSensor(ForceTorqueInfo &ftInfo) override
virtual void setRobotMaxTorque(const std::string &robotName, const std::string &nodeName, float maxTorque) override
virtual Eigen::Matrix4f getRobotNodePose(const std::string &robotName, const std::string &robotNodeName) override
virtual bool synchronizeSimulationDataEngine() override
According to other SimulatedWorlds, this method's only job is to update contacts.
virtual Eigen::Vector3f getRobotAngularVelocity(const std::string &robotName, const std::string &nodeName) override
virtual void setObjectPose(const std::string &objectName, const Eigen::Matrix4f &globalPose) override
virtual void applyTorqueObject(const std::string &objectName, const Eigen::Vector3f &torque) override
virtual float getRobotJointLimitHi(const std::string &robotName, const std::string &nodeName) override
virtual bool hasRobotNode(const std::string &robotName, const std::string &robotNodeName) override
virtual std::map< std::string, float > getRobotJointAngles(const std::string &robotName) override
std::shared_ptr< class Robot > RobotPtr
Definition Bus.h:19
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::shared_ptr< MujocoPhysicsWorld > MujocoPhysicsWorldPtr
IceInternal::Handle< FramedPose > FramedPosePtr
Definition FramedPose.h:272