Add engine settings to mjmModel.
PiperOrigin-RevId: 608915453 Change-Id: Ic58566d7a9cdb57e25954caec69f595c8c9ee88a
This commit is contained in:
committed by
Copybara-Service
parent
a4a621f6e3
commit
7edacd39cd
+25
-1
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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_;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user