Add engine settings to mjmModel.

PiperOrigin-RevId: 608915453
Change-Id: Ic58566d7a9cdb57e25954caec69f595c8c9ee88a
This commit is contained in:
Alessio Quaglino
2024-02-21 02:24:53 -08:00
committed by Copybara-Service
parent a4a621f6e3
commit 7edacd39cd
8 changed files with 70 additions and 56 deletions
+25 -1
View File
@@ -15,6 +15,7 @@
#ifndef MUJOCO_SRC_USER_USER_API_H_ #ifndef MUJOCO_SRC_USER_USER_API_H_
#define MUJOCO_SRC_USER_USER_API_H_ #define MUJOCO_SRC_USER_USER_API_H_
#include <stddef.h>
#include <mujoco/mjexport.h> #include <mujoco/mjexport.h>
#include <mujoco/mjmodel.h> #include <mujoco/mjmodel.h>
#include <mujoco/mjtnum.h> #include <mujoco/mjtnum.h>
@@ -82,7 +83,7 @@ typedef struct _mjmModel { // model specification
mjElement element; // internal, do not modify mjElement element; // internal, do not modify
mjStatistic stat; // statistics override (if defined) mjStatistic stat; // statistics override (if defined)
//------------------------ compiler settings // compiler settings
mjtByte autolimits; // infer "limited" attribute based on range mjtByte autolimits; // infer "limited" attribute based on range
double boundmass; // enforce minimum body mass double boundmass; // enforce minimum body mass
double boundinertia; // enforce minimum body diagonal inertia double boundinertia; // enforce minimum body diagonal inertia
@@ -102,8 +103,31 @@ typedef struct _mjmModel { // model specification
int inertiagrouprange[2]; // range of geom groups used to compute inertia int inertiagrouprange[2]; // range of geom groups used to compute inertia
mjtByte exactmeshinertia; // if false, use old formula mjtByte exactmeshinertia; // if false, use old formula
mjLROpt LRopt; // options for lengthrange computation mjLROpt LRopt; // options for lengthrange computation
// engine data
mjString modelname; // model name
mjOption option; // options
mjVisual visual; // visual options
size_t memory; // size of arena+stack memory in bytes
int nemax; // max number of equality constraints
int njmax; // max number of constraints (Jacobian rows)
int nconmax; // max number of detected contacts (mjContact array size)
size_t nstack; // (deprecated) number of fields in mjData stack
int nuserdata; // number extra fields in mjData
int nuser_body; // number of mjtNums in body_user
int nuser_jnt; // number of mjtNums in jnt_user
int nuser_geom; // number of mjtNums in geom_user
int nuser_site; // number of mjtNums in site_user
int nuser_cam; // number of mjtNums in cam_user
int nuser_tendon; // number of mjtNums in tendon_user
int nuser_actuator; // number of mjtNums in actuator_user
int nuser_sensor; // number of mjtNums in sensor_user
// sizes
int nkey; // number of keyframes
} mjmModel; } mjmModel;
typedef struct _mjmOrientation { // alternative orientation specifiers typedef struct _mjmOrientation { // alternative orientation specifiers
double axisangle[4]; // rotation axis and angle double axisangle[4]; // rotation axis and angle
double xyaxes[6]; // x and y axes double xyaxes[6]; // x and y axes
+18
View File
@@ -53,6 +53,24 @@ void mjm_defaultModel(mjmModel& model) {
model.inertiagrouprange[1] = mjNGROUP-1; model.inertiagrouprange[1] = mjNGROUP-1;
model.exactmeshinertia = false; model.exactmeshinertia = false;
mj_defaultLROpt(&model.LRopt); mj_defaultLROpt(&model.LRopt);
// engine data
mj_defaultOption(&model.option);
mj_defaultVisual(&model.visual);
model.memory = -1;
model.nemax = 0;
model.njmax = -1;
model.nconmax = -1;
model.nstack = -1;
model.nuserdata = 0;
model.nuser_body = -1;
model.nuser_jnt = -1;
model.nuser_geom = -1;
model.nuser_site = -1;
model.nuser_cam = -1;
model.nuser_tendon = -1;
model.nuser_actuator = -1;
model.nuser_sensor = -1;
} }
+7 -23
View File
@@ -88,6 +88,7 @@ mjCModel::mjCModel() {
modelfiledir.clear(); modelfiledir.clear();
spec_meshdir_.clear(); spec_meshdir_.clear();
spec_texturedir_.clear(); spec_texturedir_.clear();
spec_modelname_ = "MuJoCo Model";
//------------------------ auto-computed statistics //------------------------ auto-computed statistics
#ifndef MEMORY_SANITIZER #ifndef MEMORY_SANITIZER
@@ -99,28 +100,8 @@ mjCModel::mjCModel() {
center_auto[0] = center_auto[1] = center_auto[2] = 0; center_auto[0] = center_auto[1] = center_auto[2] = 0;
#endif #endif
//------------------------ engine data
modelname = "MuJoCo Model";
mj_defaultOption(&option);
mj_defaultVisual(&visual);
memory = -1;
nemax = 0;
njmax = -1;
nconmax = -1;
nstack = -1;
nuserdata = 0;
nkey = 0;
nmocap = 0; nmocap = 0;
nplugin = 0; nplugin = 0;
nuser_body = -1;
nuser_jnt = -1;
nuser_geom = -1;
nuser_site = -1;
nuser_cam = -1;
nuser_tendon = -1;
nuser_actuator = -1;
nuser_sensor = -1;
//------------------------ private variables //------------------------ private variables
cameras.clear(); cameras.clear();
lights.clear(); lights.clear();
@@ -196,6 +177,7 @@ mjCModel::mjCModel() {
void mjCModel::PointToLocal() { void mjCModel::PointToLocal() {
spec.element = (mjElement)this; spec.element = (mjElement)this;
spec.modelname = (mjString)&spec_modelname_;
spec.meshdir = (mjString)&spec_meshdir_; spec.meshdir = (mjString)&spec_meshdir_;
spec.texturedir = (mjString)&spec_texturedir_; spec.texturedir = (mjString)&spec_texturedir_;
} }
@@ -204,8 +186,10 @@ void mjCModel::PointToLocal() {
void mjCModel::CopyFromSpec() { void mjCModel::CopyFromSpec() {
*static_cast<mjmModel*>(this) = spec; *static_cast<mjmModel*>(this) = spec;
modelname_ = spec_modelname_;
meshdir_ = spec_meshdir_; meshdir_ = spec_meshdir_;
texturedir_ = spec_texturedir_; texturedir_ = spec_texturedir_;
modelname = (mjString)&modelname_;
meshdir = (mjString)&meshdir_; meshdir = (mjString)&meshdir_;
texturedir = (mjString)&texturedir_; texturedir = (mjString)&texturedir_;
} }
@@ -1072,7 +1056,7 @@ void mjCModel::SetSizes(void) {
for (int i=0; i<nplugin; i++) npluginattr += (int)plugins[i]->flattened_attributes.size(); for (int i=0; i<nplugin; i++) npluginattr += (int)plugins[i]->flattened_attributes.size();
// nnames // nnames
nnames = (int)modelname.size() + 1; nnames = (int)modelname_.size() + 1;
for (int i=0; i<nbody; i++) nnames += (int)bodies[i]->name.length() + 1; for (int i=0; i<nbody; i++) nnames += (int)bodies[i]->name.length() + 1;
for (int i=0; i<njnt; i++) nnames += (int)joints[i]->name.length() + 1; for (int i=0; i<njnt; i++) nnames += (int)joints[i]->name.length() + 1;
for (int i=0; i<ngeom; i++) nnames += (int)geoms[i]->name.length() + 1; for (int i=0; i<ngeom; i++) nnames += (int)geoms[i]->name.length() + 1;
@@ -1351,9 +1335,9 @@ static int namelist(vector<T*>& list, int adr, int* name_adr, char* names, int*
// copy names, compute name addresses // copy names, compute name addresses
void mjCModel::CopyNames(mjModel* m) { void mjCModel::CopyNames(mjModel* m) {
// start with model name // start with model name
int adr = (int)modelname.size()+1; int adr = (int)modelname_.size()+1;
int* map_adr = m->names_map; int* map_adr = m->names_map;
mju_strncpy(m->names, modelname.c_str(), m->nnames); mju_strncpy(m->names, modelname_.c_str(), m->nnames);
memset(m->names_map, -1, sizeof(int) * m->nnames_map); memset(m->names_map, -1, sizeof(int) * m->nnames_map);
// process all lists // process all lists
+4 -20
View File
@@ -57,6 +57,8 @@ class mjCModel : private mjmModel {
friend class mjCTendon; friend class mjCTendon;
friend class mjCTexture; friend class mjCTexture;
friend class mjCActuator; friend class mjCActuator;
friend class mjCSensor;
friend class mjCDef;
friend class mjXReader; friend class mjXReader;
friend class mjXWriter; friend class mjXWriter;
@@ -131,25 +133,6 @@ class mjCModel : private mjmModel {
std::string modelfiledir; // path to model file std::string modelfiledir; // path to model file
std::vector<mjCDef*> defaults; // settings for each defaults class std::vector<mjCDef*> defaults; // settings for each defaults class
//------------------------ engine data
std::string modelname; // model name
mjOption option; // options
mjVisual visual; // visual options
std::size_t memory; // size of arena+stack memory in bytes
int nemax; // max number of equality constraints
int njmax; // max number of constraints (Jacobian rows)
int nconmax; // max number of detected contacts (mjContact array size)
size_t nstack; // (deprecated) number of fields in mjData stack
int nuserdata; // number extra fields in mjData
int nuser_body; // number of mjtNums in body_user
int nuser_jnt; // number of mjtNums in jnt_user
int nuser_geom; // number of mjtNums in geom_user
int nuser_site; // number of mjtNums in site_user
int nuser_cam; // number of mjtNums in cam_user
int nuser_tendon; // number of mjtNums in tendon_user
int nuser_actuator; // number of mjtNums in actuator_user
int nuser_sensor; // number of mjtNums in sensor_user
private: private:
void TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs); void TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs);
mjModel* _Compile(const mjVFS* vfs); mjModel* _Compile(const mjVFS* vfs);
@@ -202,7 +185,6 @@ class mjCModel : private mjmModel {
int nnumeric; // number of numeric fields int nnumeric; // number of numeric fields
int ntext; // number of text fields int ntext; // number of text fields
int ntuple; // number of tuple fields int ntuple; // number of tuple fields
int nkey; // number of keyframes
int nmocap; // number of mocap bodies int nmocap; // number of mocap bodies
int nplugin; // number of plugin instances int nplugin; // number of plugin instances
@@ -297,8 +279,10 @@ class mjCModel : private mjmModel {
std::vector<mjtNum> qpos0; // save qpos0, to recognize changed key_qpos in write std::vector<mjtNum> qpos0; // save qpos0, to recognize changed key_qpos in write
// variable-size attributes // variable-size attributes
std::string modelname_;
std::string meshdir_; std::string meshdir_;
std::string texturedir_; std::string texturedir_;
std::string spec_modelname_;
std::string spec_meshdir_; std::string spec_meshdir_;
std::string spec_texturedir_; std::string spec_texturedir_;
}; };
+8 -6
View File
@@ -39,7 +39,6 @@
#include "user/user_api.h" #include "user/user_api.h"
#include "user/user_composite.h" #include "user/user_composite.h"
#include "user/user_flexcomp.h" #include "user/user_flexcomp.h"
#include "user/user_model.h"
#include "user/user_util.h" #include "user/user_util.h"
#include "xml/xml_base.h" #include "xml/xml_base.h"
#include "xml/xml_util.h" #include "xml/xml_util.h"
@@ -805,7 +804,10 @@ void mjXReader::Parse(XMLElement* root) {
} }
// get model name // get model name
ReadAttrTxt(root, "model", model->modelname); string modelname;
if (ReadAttrTxt(root, "model", modelname)) {
mjm_setString(model->spec.modelname, modelname.c_str());
}
// get comment // get comment
if (root->FirstChild() && root->FirstChild()->ToComment()) { if (root->FirstChild() && root->FirstChild()->ToComment()) {
@@ -823,12 +825,12 @@ void mjXReader::Parse(XMLElement* root) {
for (XMLElement* section = FirstChildElement(root, "option"); section; for (XMLElement* section = FirstChildElement(root, "option"); section;
section = NextSiblingElement(section, "option")) { section = NextSiblingElement(section, "option")) {
Option(section, &model->option); Option(section, &model->spec.option);
} }
for (XMLElement* section = FirstChildElement(root, "size"); section; for (XMLElement* section = FirstChildElement(root, "size"); section;
section = NextSiblingElement(section, "size")) { section = NextSiblingElement(section, "size")) {
Size(section, model); Size(section, &model->spec);
} }
//------------------ parse MJCF-specific sections //------------------ parse MJCF-specific sections
@@ -1096,7 +1098,7 @@ void mjXReader::Option(XMLElement* section, mjOption* opt) {
// size section parser // size section parser
void mjXReader::Size(XMLElement* section, mjCModel* mod) { void mjXReader::Size(XMLElement* section, mjmModel* mod) {
// read memory bytes // read memory bytes
{ {
constexpr char err_msg[] = constexpr char err_msg[] =
@@ -2936,7 +2938,7 @@ void mjXReader::Custom(XMLElement* section) {
void mjXReader::Visual(XMLElement* section) { void mjXReader::Visual(XMLElement* section) {
string text, name; string text, name;
XMLElement* elem; XMLElement* elem;
mjVisual* vis = &model->visual; mjVisual* vis = &model->spec.visual;
// iterate over child elements // iterate over child elements
elem = FirstChildElement(section); elem = FirstChildElement(section);
+1 -2
View File
@@ -22,7 +22,6 @@
#include <mujoco/mujoco.h> #include <mujoco/mujoco.h>
#include "user/user_api.h" #include "user/user_api.h"
#include "user/user_model.h"
#include "xml/xml_base.h" #include "xml/xml_base.h"
#include "xml/xml_util.h" #include "xml/xml_util.h"
@@ -45,7 +44,7 @@ class mjXReader : public mjXBase {
// XML sections embedded in all formats // XML sections embedded in all formats
static void Compiler(tinyxml2::XMLElement* section, mjmModel* mod); // compiler section static void Compiler(tinyxml2::XMLElement* section, mjmModel* mod); // compiler section
static void Option(tinyxml2::XMLElement* section, mjOption* opt); // option section static void Option(tinyxml2::XMLElement* section, mjOption* opt); // option section
static void Size(tinyxml2::XMLElement* section, mjCModel* mod); // size section static void Size(tinyxml2::XMLElement* section, mjmModel* mod); // size section
private: private:
// XML section specific to MJCF // XML section specific to MJCF
+1 -1
View File
@@ -775,7 +775,7 @@ string mjXWriter::Write(char *error, size_t error_sz) {
// create document and root // create document and root
XMLDocument doc; XMLDocument doc;
XMLElement* root = doc.NewElement("mujoco"); XMLElement* root = doc.NewElement("mujoco");
root->SetAttribute("model", model->modelname.c_str()); root->SetAttribute("model", mjm_getString(model->modelname));
// insert root // insert root
doc.InsertFirstChild(root); doc.InsertFirstChild(root);
+6 -3
View File
@@ -97,11 +97,11 @@ void mjXURDF::Parse(
} }
if ((section = FindSubElem(mjc, "option"))) { if ((section = FindSubElem(mjc, "option"))) {
mjXReader::Option(section, &model->option); mjXReader::Option(section, &model->spec.option);
} }
if ((section = FindSubElem(mjc, "size"))) { if ((section = FindSubElem(mjc, "size"))) {
mjXReader::Size(section, model); mjXReader::Size(section, &model->spec);
} }
} }
@@ -109,7 +109,10 @@ void mjXURDF::Parse(
model->spec.degree = false; model->spec.degree = false;
// get model name // get model name
ReadAttrTxt(root, "name", model->modelname); std::string modelname;
if (ReadAttrTxt(root, "name", modelname)) {
mjm_setString(model->spec.modelname, modelname.c_str());
}
// find and register all materials // find and register all materials
MakeMaterials(root); MakeMaterials(root);