7cdf180641
These flexes use only 24 DOFs (3 per vertex of the bounding box), while colliding with the full high resolution mesh. On an 8x8x8 cube, the performance using DOFs at all vertices is ``` Simulation time : 18.74 s Steps per second : 533 Realtime factor : 0.53 x Time per step : 1874.4 µs Contacts per step : 114.88 Constraints per step : 3322.51 Degrees of freedom : 1536 ``` With the new implementation, it is the following: ``` Simulation time : 1.82 s Steps per second : 5507 Realtime factor : 5.51 x Time per step : 181.6 µs Contacts per step : 38.84 Constraints per step : 155.36 Degrees of freedom : 24 ``` PiperOrigin-RevId: 721008829 Change-Id: I833df027527db578d86667cc4b24295bcf6f7d22
117 lines
4.0 KiB
C++
117 lines
4.0 KiB
C++
// Copyright 2021 DeepMind Technologies Limited
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#ifndef MUJOCO_SRC_USER_USER_FLEXCOMP_H_
|
|
#define MUJOCO_SRC_USER_USER_FLEXCOMP_H_
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <mujoco/mujoco.h>
|
|
#include <mujoco/mjspec.h>
|
|
#include "user/user_model.h"
|
|
#include "user/user_objects.h"
|
|
|
|
|
|
typedef enum _mjtFcompType {
|
|
mjFCOMPTYPE_GRID = 0,
|
|
mjFCOMPTYPE_BOX,
|
|
mjFCOMPTYPE_CYLINDER,
|
|
mjFCOMPTYPE_ELLIPSOID,
|
|
mjFCOMPTYPE_SQUARE,
|
|
mjFCOMPTYPE_DISC,
|
|
mjFCOMPTYPE_CIRCLE,
|
|
mjFCOMPTYPE_MESH,
|
|
mjFCOMPTYPE_GMSH,
|
|
mjFCOMPTYPE_DIRECT,
|
|
|
|
mjNFCOMPTYPES
|
|
} mjtFcompType;
|
|
|
|
|
|
typedef enum _mjtDof {
|
|
mjFCOMPDOF_FULL = 0,
|
|
mjFCOMPDOF_RADIAL,
|
|
mjFCOMPDOF_TRILINEAR,
|
|
|
|
mjNFCOMPDOFS
|
|
} mjtDof;
|
|
|
|
|
|
class mjCFlexcomp {
|
|
public:
|
|
mjCFlexcomp(void);
|
|
bool Make(mjsBody* body, char* error, int error_sz);
|
|
|
|
bool MakeGrid(char* error, int error_sz);
|
|
bool MakeBox(char* error, int error_sz);
|
|
bool MakeSquare(char* error, int error_sz);
|
|
bool MakeMesh(mjCModel* model, char* error, int error_sz);
|
|
bool MakeGMSH(mjCModel* model, char* error, int error_sz);
|
|
void LoadGMSH(mjCModel* model, mjResource* resource);
|
|
void LoadGMSH41(char* buffer, int binary, int nodeend, int nodebegin,
|
|
int elemend, int elembegin);
|
|
void LoadGMSH22(char* buffer, int binary, int nodeend, int nodebegin,
|
|
int elemend, int elembegin);
|
|
|
|
|
|
int GridID(int ix, int iy);
|
|
int GridID(int ix, int iy, int iz);
|
|
int BoxID(int ix, int iy, int iz);
|
|
void BoxProject(double* pos, int ix, int iy, int iz);
|
|
|
|
// common properties set by user
|
|
std::string name; // flex name
|
|
mjtFcompType type; // flexcomp type
|
|
int count[3]; // grid count in each dimension
|
|
double spacing[3]; // spacing between grid elements
|
|
double scale[3]; // scaling for mesh and direct
|
|
double origin[3]; // origin for generating a 3D mesh from a convex 2D mesh
|
|
double mass; // total mass of auto-generated bodies
|
|
double inertiabox; // size of inertia box for each body
|
|
bool equality; // create edge equality constraint
|
|
std::string file; // mesh/gmsh file name
|
|
mjtDof doftype; // dof type, all vertices or trilinear interpolation
|
|
|
|
// pin specifications
|
|
std::vector<int> pinid; // ids of points to pin
|
|
std::vector<int> pinrange; // range of ids to pin
|
|
std::vector<int> pingrid; // grid coordinates to pin
|
|
std::vector<int> pingridrange; // range of grid coordinates to pin
|
|
|
|
// all other properties
|
|
mjCDef def; // local copy, parsed parameters stored here
|
|
|
|
// pose transform relative to parent body
|
|
double pos[3]; // position
|
|
double quat[4]; // orientation
|
|
mjsOrientation alt; // alternative orientation
|
|
|
|
// set by user or computed internally
|
|
bool rigid; // all vertices are in parent body (all pinned)
|
|
bool centered; // all vertex coordinates are (0,0,0) (nothing pinned)
|
|
std::vector<double> point; // flex bodies/vertices
|
|
std::vector<bool> pinned; // is point pinned (true: no new body)
|
|
std::vector<bool> used; // is point used by any element (false: skip)
|
|
std::vector<int> element; // flex elements
|
|
std::vector<float> texcoord; // vertex texture coordinates
|
|
|
|
// plugin support
|
|
std::string plugin_name;
|
|
std::string plugin_instance_name;
|
|
mjsPlugin plugin;
|
|
};
|
|
|
|
#endif // MUJOCO_SRC_USER_USER_FLEXCOMP_H_
|