diff --git a/src/engine/CMakeLists.txt b/src/engine/CMakeLists.txt index d1e195f1..96fc10ff 100644 --- a/src/engine/CMakeLists.txt +++ b/src/engine/CMakeLists.txt @@ -44,6 +44,8 @@ set(MUJOCO_ENGINE_SRCS engine_global_table.h engine_inverse.c engine_inverse.h + engine_init.c + engine_init.h engine_island.c engine_island.h engine_io.c diff --git a/src/engine/engine_core_util.c b/src/engine/engine_core_util.c index d48b7b1e..8aeedba7 100644 --- a/src/engine/engine_core_util.c +++ b/src/engine/engine_core_util.c @@ -943,18 +943,4 @@ void mj_local2Global(mjData* d, mjtNum xpos[3], mjtNum xmat[9], } -// set default solver parameters -void mj_defaultSolRefImp(mjtNum* solref, mjtNum* solimp) { - if (solref) { - solref[0] = 0.02; // timeconst - solref[1] = 1; // dampratio - } - if (solimp) { - solimp[0] = 0.9; // dmin - solimp[1] = 0.95; // dmax - solimp[2] = 0.001; // width - solimp[3] = 0.5; // midpoint - solimp[4] = 2; // power - } -} diff --git a/src/engine/engine_init.c b/src/engine/engine_init.c new file mode 100644 index 00000000..2b22621d --- /dev/null +++ b/src/engine/engine_init.c @@ -0,0 +1,250 @@ +// Copyright 2025 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. + +#include "engine/engine_init.h" + +#include + +#include +#include +#include "engine/engine_util_blas.h" + +#ifdef _MSC_VER + #pragma warning (disable: 4305) // disable MSVC warning: truncation from 'double' to 'float' +#endif + + + +//------------------------------- solver parameters ------------------------------------------------ + +// set default solver parameters +void mj_defaultSolRefImp(mjtNum* solref, mjtNum* solimp) { + if (solref) { + solref[0] = 0.02; // timeconst + solref[1] = 1; // dampratio + } + + if (solimp) { + solimp[0] = 0.9; // dmin + solimp[1] = 0.95; // dmax + solimp[2] = 0.001; // width + solimp[3] = 0.5; // midpoint + solimp[4] = 2; // power + } +} + + + +//------------------------------- mjOption --------------------------------------------------------- + +// set model options to default values +void mj_defaultOption(mjOption* opt) { + // fill opt with zeros in case struct is padded + memset(opt, 0, sizeof(mjOption)); + + // timing parameters + opt->timestep = 0.002; + opt->apirate = 100; + + // solver parameters + opt->impratio = 1; + opt->tolerance = 1e-8; + opt->ls_tolerance = 0.01; + opt->noslip_tolerance = 1e-6; + opt->ccd_tolerance = 1e-6; + + // physical constants + opt->gravity[0] = 0; + opt->gravity[1] = 0; + opt->gravity[2] = -9.81; + opt->wind[0] = 0; + opt->wind[1] = 0; + opt->wind[2] = 0; + opt->magnetic[0] = 0; + opt->magnetic[1] = -0.5; + opt->magnetic[2] = 0; + opt->density = 0; + opt->viscosity = 0; + + // solver overrides + opt->o_margin = 0; + mj_defaultSolRefImp(opt->o_solref, opt->o_solimp); + opt->o_friction[0] = 1; + opt->o_friction[1] = 1; + opt->o_friction[2] = 0.005; + opt->o_friction[3] = 0.0001; + opt->o_friction[4] = 0.0001; + + // discrete options + opt->integrator = mjINT_EULER; + opt->cone = mjCONE_PYRAMIDAL; + opt->jacobian = mjJAC_AUTO; + opt->solver = mjSOL_NEWTON; + opt->iterations = 100; + opt->ls_iterations = 50; + opt->noslip_iterations = 0; + opt->ccd_iterations = 35; + opt->disableflags = 0; + opt->enableflags = 0; + opt->disableactuator = 0; + + // sdf collisions + opt->sdf_initpoints = 40; + opt->sdf_iterations = 10; +} + + + + +//------------------------------- mjStatistic ------------------------------------------------------ + +// set statistics to default values; compute later in compiler +void mj_defaultStatistic(mjStatistic* stat) { + mju_zero3(stat->center); + stat->extent = 2; + stat->meaninertia = 1; + stat->meanmass = 1; + stat->meansize = 0.2; +} + + + +//------------------------------- mjVisual --------------------------------------------------------- + +// set 4 floats +static void setf4(float* rgba, float r, float g, float b, float a) { + rgba[0] = r; + rgba[1] = g; + rgba[2] = b; + rgba[3] = a; +} + + +// set visual options to default values +void mj_defaultVisual(mjVisual* vis) { + // global + vis->global.cameraid = -1; + vis->global.orthographic = 0; + vis->global.fovy = 45; + vis->global.ipd = 0.068; + vis->global.azimuth = 90; + vis->global.elevation = -45; + vis->global.linewidth = 1.0; + vis->global.glow = 0.3; + vis->global.offwidth = 640; + vis->global.offheight = 480; + vis->global.realtime = 1.0; + vis->global.ellipsoidinertia = 0; + vis->global.bvactive = 1; + + // rendering quality + vis->quality.shadowsize = 4096; + vis->quality.offsamples = 4; + vis->quality.numslices = 28; + vis->quality.numstacks = 16; + vis->quality.numquads = 4; + + // head light + vis->headlight.ambient[0] = 0.1; + vis->headlight.ambient[1] = 0.1; + vis->headlight.ambient[2] = 0.1; + vis->headlight.diffuse[0] = 0.4; + vis->headlight.diffuse[1] = 0.4; + vis->headlight.diffuse[2] = 0.4; + vis->headlight.specular[0] = 0.5; + vis->headlight.specular[1] = 0.5; + vis->headlight.specular[2] = 0.5; + vis->headlight.active = 1; + + // map parameters + vis->map.stiffness = 100; + vis->map.stiffnessrot = 500; + vis->map.force = 0.005; + vis->map.torque = 0.1; + vis->map.alpha = 0.3; + vis->map.fogstart = 3.0; + vis->map.fogend = 10.0; + vis->map.znear = 0.01; + vis->map.zfar = 50.0; + vis->map.haze = 0.3; + vis->map.shadowclip = 1.0; + vis->map.shadowscale = 0.6; + vis->map.actuatortendon = 2.0; + + // size parameters + vis->scale.forcewidth = 0.1; + vis->scale.contactwidth = 0.3; + vis->scale.contactheight = 0.1; + vis->scale.connect = 0.2; + vis->scale.com = 0.4; + vis->scale.camera = 0.3; + vis->scale.light = 0.3; + vis->scale.selectpoint = 0.2; + vis->scale.jointlength = 1.0; + vis->scale.jointwidth = 0.1; + vis->scale.actuatorlength = 0.7; + vis->scale.actuatorwidth = 0.2; + vis->scale.framelength = 1.0; + vis->scale.framewidth = 0.1; + vis->scale.constraint = 0.1; + vis->scale.slidercrank = 0.2; + vis->scale.frustum = 10.0; + + // colors + setf4(vis->rgba.fog, 0., 0., 0., 1.); + setf4(vis->rgba.haze, 1., 1., 1., 1.); + setf4(vis->rgba.force, 1., .5, .5, 1.); + setf4(vis->rgba.inertia, .8, .2, .2, .6); + setf4(vis->rgba.joint, .2, .6, .8, 1.); + setf4(vis->rgba.actuator, .2, .25, .2, 1); + setf4(vis->rgba.actuatornegative, .2, .6, .9, 1.); + setf4(vis->rgba.actuatorpositive, .9, .4, .2, 1.); + setf4(vis->rgba.com, .9, .9, .9, 1.); + setf4(vis->rgba.camera, .6, .9, .6, 1); + setf4(vis->rgba.light, .6, .6, .9, 1.); + setf4(vis->rgba.selectpoint, .9, .9, .1, 1.); + setf4(vis->rgba.connect, .2, .2, .8, 1.); + setf4(vis->rgba.contactpoint, .9, .6, .2, 1.); + setf4(vis->rgba.contactforce, .7, .9, .9, 1.); + setf4(vis->rgba.contactfriction, .9, .8, .4, 1.); + setf4(vis->rgba.contacttorque, .9, .7, .9, 1.); + setf4(vis->rgba.contactgap, .5, .8, .9, 1.); + setf4(vis->rgba.rangefinder, 1., 1., .1, 1.); + setf4(vis->rgba.constraint, .9, .0, .0, 1.); + setf4(vis->rgba.slidercrank, .5, .3, .8, 1.); + setf4(vis->rgba.crankbroken, .9, .0, .0, 1.); + setf4(vis->rgba.frustum, 1., 1., .0, .2); + setf4(vis->rgba.bv, 0., 1., .0, .5); + setf4(vis->rgba.bvactive, 1., 0., .0, .5); +} + + + + +//------------------------------ mjLROpt ----------------------------------------------------------- + +// set default options for length range computation +void mj_defaultLROpt(mjLROpt* opt) { + opt->mode = mjLRMODE_MUSCLE; + opt->useexisting = 1; + opt->uselimit = 0; + + opt->accel = 20; + opt->maxforce = 0; + opt->timeconst = 1; + opt->timestep = 0.01; + opt->inttotal = 10; + opt->interval = 2; + opt->tolrange = 0.05; +} diff --git a/src/engine/engine_init.h b/src/engine/engine_init.h new file mode 100644 index 00000000..084cc8e3 --- /dev/null +++ b/src/engine/engine_init.h @@ -0,0 +1,35 @@ +// Copyright 2025 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_ENGINE_ENGINE_INIT_H_ +#define MUJOCO_SRC_ENGINE_ENGINE_INIT_H_ + +#include + +// set default options for length range computation +void mj_defaultLROpt(mjLROpt* opt); + +// set model options to default values +void mj_defaultOption(mjOption* opt); + +// set visual options to default values +void mj_defaultVisual(mjVisual* vis); + +// set statistics to default values +void mj_defaultStatistic(mjStatistic* stat); + +// set solver parameters to default values +void mj_defaultSolRefImp(mjtNum* solref, mjtNum* solimp); + +#endif // MUJOCO_SRC_ENGINE_ENGINE_INIT_H_ diff --git a/src/engine/engine_io.c b/src/engine/engine_io.c index c971ba60..159939b2 100644 --- a/src/engine/engine_io.c +++ b/src/engine/engine_io.c @@ -26,7 +26,7 @@ #include #include // IWYU pragma: keep #include -#include "engine/engine_core_util.h" +#include "engine/engine_init.h" #include "engine/engine_macro.h" #include "engine/engine_memory.h" #include "engine/engine_plugin.h" @@ -50,208 +50,7 @@ static const int MAX_ARRAY_SIZE = INT_MAX / 4; -//------------------------------ mjLROpt ----------------------------------------------------------- - -// set default options for length range computation -void mj_defaultLROpt(mjLROpt* opt) { - opt->mode = mjLRMODE_MUSCLE; - opt->useexisting = 1; - opt->uselimit = 0; - - opt->accel = 20; - opt->maxforce = 0; - opt->timeconst = 1; - opt->timestep = 0.01; - opt->inttotal = 10; - opt->interval = 2; - opt->tolrange = 0.05; -} - - - -//------------------------------- mjOption --------------------------------------------------------- - - - -// set model options to default values -void mj_defaultOption(mjOption* opt) { - // fill opt with zeros in case struct is padded - memset(opt, 0, sizeof(mjOption)); - - // timing parameters - opt->timestep = 0.002; - opt->apirate = 100; - - // solver parameters - opt->impratio = 1; - opt->tolerance = 1e-8; - opt->ls_tolerance = 0.01; - opt->noslip_tolerance = 1e-6; - opt->ccd_tolerance = 1e-6; - - // physical constants - opt->gravity[0] = 0; - opt->gravity[1] = 0; - opt->gravity[2] = -9.81; - opt->wind[0] = 0; - opt->wind[1] = 0; - opt->wind[2] = 0; - opt->magnetic[0] = 0; - opt->magnetic[1] = -0.5; - opt->magnetic[2] = 0; - opt->density = 0; - opt->viscosity = 0; - - // solver overrides - opt->o_margin = 0; - mj_defaultSolRefImp(opt->o_solref, opt->o_solimp); - opt->o_friction[0] = 1; - opt->o_friction[1] = 1; - opt->o_friction[2] = 0.005; - opt->o_friction[3] = 0.0001; - opt->o_friction[4] = 0.0001; - - // discrete options - opt->integrator = mjINT_EULER; - opt->cone = mjCONE_PYRAMIDAL; - opt->jacobian = mjJAC_AUTO; - opt->solver = mjSOL_NEWTON; - opt->iterations = 100; - opt->ls_iterations = 50; - opt->noslip_iterations = 0; - opt->ccd_iterations = 35; - opt->disableflags = 0; - opt->enableflags = 0; - opt->disableactuator = 0; - - // sdf collisions - opt->sdf_initpoints = 40; - opt->sdf_iterations = 10; -} - - - -//------------------------------- mjVisual --------------------------------------------------------- - -// set 4 floats -static void setf4(float* rgba, float r, float g, float b, float a) { - rgba[0] = r; - rgba[1] = g; - rgba[2] = b; - rgba[3] = a; -} - - -// set visual options to default values -void mj_defaultVisual(mjVisual* vis) { - // global - vis->global.cameraid = -1; - vis->global.orthographic = 0; - vis->global.fovy = 45; - vis->global.ipd = 0.068; - vis->global.azimuth = 90; - vis->global.elevation = -45; - vis->global.linewidth = 1.0; - vis->global.glow = 0.3; - vis->global.offwidth = 640; - vis->global.offheight = 480; - vis->global.realtime = 1.0; - vis->global.ellipsoidinertia = 0; - vis->global.bvactive = 1; - - // rendering quality - vis->quality.shadowsize = 4096; - vis->quality.offsamples = 4; - vis->quality.numslices = 28; - vis->quality.numstacks = 16; - vis->quality.numquads = 4; - - // head light - vis->headlight.ambient[0] = 0.1; - vis->headlight.ambient[1] = 0.1; - vis->headlight.ambient[2] = 0.1; - vis->headlight.diffuse[0] = 0.4; - vis->headlight.diffuse[1] = 0.4; - vis->headlight.diffuse[2] = 0.4; - vis->headlight.specular[0] = 0.5; - vis->headlight.specular[1] = 0.5; - vis->headlight.specular[2] = 0.5; - vis->headlight.active = 1; - - // map parameters - vis->map.stiffness = 100; - vis->map.stiffnessrot = 500; - vis->map.force = 0.005; - vis->map.torque = 0.1; - vis->map.alpha = 0.3; - vis->map.fogstart = 3.0; - vis->map.fogend = 10.0; - vis->map.znear = 0.01; - vis->map.zfar = 50.0; - vis->map.haze = 0.3; - vis->map.shadowclip = 1.0; - vis->map.shadowscale = 0.6; - vis->map.actuatortendon = 2.0; - - // size parameters - vis->scale.forcewidth = 0.1; - vis->scale.contactwidth = 0.3; - vis->scale.contactheight = 0.1; - vis->scale.connect = 0.2; - vis->scale.com = 0.4; - vis->scale.camera = 0.3; - vis->scale.light = 0.3; - vis->scale.selectpoint = 0.2; - vis->scale.jointlength = 1.0; - vis->scale.jointwidth = 0.1; - vis->scale.actuatorlength = 0.7; - vis->scale.actuatorwidth = 0.2; - vis->scale.framelength = 1.0; - vis->scale.framewidth = 0.1; - vis->scale.constraint = 0.1; - vis->scale.slidercrank = 0.2; - vis->scale.frustum = 10.0; - - // colors - setf4(vis->rgba.fog, 0., 0., 0., 1.); - setf4(vis->rgba.haze, 1., 1., 1., 1.); - setf4(vis->rgba.force, 1., .5, .5, 1.); - setf4(vis->rgba.inertia, .8, .2, .2, .6); - setf4(vis->rgba.joint, .2, .6, .8, 1.); - setf4(vis->rgba.actuator, .2, .25, .2, 1); - setf4(vis->rgba.actuatornegative, .2, .6, .9, 1.); - setf4(vis->rgba.actuatorpositive, .9, .4, .2, 1.); - setf4(vis->rgba.com, .9, .9, .9, 1.); - setf4(vis->rgba.camera, .6, .9, .6, 1); - setf4(vis->rgba.light, .6, .6, .9, 1.); - setf4(vis->rgba.selectpoint, .9, .9, .1, 1.); - setf4(vis->rgba.connect, .2, .2, .8, 1.); - setf4(vis->rgba.contactpoint, .9, .6, .2, 1.); - setf4(vis->rgba.contactforce, .7, .9, .9, 1.); - setf4(vis->rgba.contactfriction, .9, .8, .4, 1.); - setf4(vis->rgba.contacttorque, .9, .7, .9, 1.); - setf4(vis->rgba.contactgap, .5, .8, .9, 1.); - setf4(vis->rgba.rangefinder, 1., 1., .1, 1.); - setf4(vis->rgba.constraint, .9, .0, .0, 1.); - setf4(vis->rgba.slidercrank, .5, .3, .8, 1.); - setf4(vis->rgba.crankbroken, .9, .0, .0, 1.); - setf4(vis->rgba.frustum, 1., 1., .0, .2); - setf4(vis->rgba.bv, 0., 1., .0, .5); - setf4(vis->rgba.bvactive, 1., 0., .0, .5); -} - - - -//------------------------------- mjStatistic ------------------------------------------------------ - -// set statistics to default values; compute later in compiler -void mj_defaultStatistic(mjStatistic* stat) { - mju_zero3(stat->center); - stat->extent = 2; - stat->meaninertia = 1; - stat->meanmass = 1; - stat->meansize = 0.2; -} +//----------------------------------- static utility functions -------------------------------------