Implement sleeping in engine
PiperOrigin-RevId: 829361787 Change-Id: I6f64d8e25c4248cf32c18cd94d37ff5def78946e
This commit is contained in:
committed by
Copybara-Service
parent
1e0226d360
commit
769f37b653
@@ -742,7 +742,7 @@ TEST_F(CoreSmoothTest, SolveLDs) {
|
||||
|
||||
mj_solveLD_legacy(m, vec.data(), 1, LDlegacy.data(), d->qLDiagInv);
|
||||
mj_solveLD(vec2.data(), d->qLD, d->qLDiagInv, nv, 1,
|
||||
m->M_rownnz, m->M_rowadr, m->M_colind);
|
||||
m->M_rownnz, m->M_rowadr, m->M_colind, nullptr);
|
||||
|
||||
// expect vectors to match up to floating point precision
|
||||
for (int i=0; i < nv; i++) {
|
||||
@@ -777,7 +777,7 @@ TEST_F(CoreSmoothTest, SolveLDmultipleVectors) {
|
||||
|
||||
mj_solveLD_legacy(m, vec.data(), n, LDlegacy.data(), d->qLDiagInv);
|
||||
mj_solveLD(vec2.data(), d->qLD, d->qLDiagInv, nv, n,
|
||||
m->M_rownnz, m->M_rowadr, m->M_colind);
|
||||
m->M_rownnz, m->M_rowadr, m->M_colind, nullptr);
|
||||
|
||||
// expect vectors to match up to floating point precision
|
||||
for (int i=0; i < nv*n; i++) {
|
||||
@@ -815,7 +815,7 @@ TEST_F(CoreSmoothTest, SolveM2) {
|
||||
|
||||
mj_solveM2(m, d, res.data(), vec.data(), sqrtInvD.data(), n);
|
||||
mj_solveLD(vec2.data(), d->qLD, d->qLDiagInv, nv, n,
|
||||
m->M_rownnz, m->M_rowadr, m->M_colind);
|
||||
m->M_rownnz, m->M_rowadr, m->M_colind, nullptr);
|
||||
|
||||
// expect equality of dot(v, M^-1 * v) and dot(M^-1/2 * v, M^-1/2 * v)
|
||||
for (int i=0; i < n; i++) {
|
||||
@@ -854,7 +854,7 @@ TEST_F(CoreSmoothTest, FactorIs) {
|
||||
vector<mjtNum> qLDiagInv(nv, 0);
|
||||
|
||||
mj_factorI(qLD.data(), qLDiagInv.data(), nv,
|
||||
m->M_rownnz, m->M_rowadr, m->M_colind);
|
||||
m->M_rownnz, m->M_rowadr, m->M_colind, nullptr);
|
||||
|
||||
// expect outputs to match to floating point precision
|
||||
EXPECT_THAT(qLD, Pointwise(DoubleNear(1e-12), qLDexpected));
|
||||
|
||||
@@ -438,7 +438,7 @@ static void LinearSystem(const mjModel* m, mjData* d, mjtNum* A, mjtNum* B) {
|
||||
Ac[nv*nv + i*nv + i] = -m->dof_damping[i];
|
||||
}
|
||||
mj_solveLD(Ac, d->qH, d->qHDiagInv, nv, 2*nv,
|
||||
m->M_rownnz, m->M_rowadr, m->M_colind);
|
||||
m->M_rownnz, m->M_rowadr, m->M_colind, nullptr);
|
||||
|
||||
// A = [dt*Ac; Ac]
|
||||
mju_transpose(A, Ac, 2*nv, nv);
|
||||
@@ -466,7 +466,7 @@ static void LinearSystem(const mjModel* m, mjData* d, mjtNum* A, mjtNum* B) {
|
||||
mju_sparse2dense(Bc, d->actuator_moment, nu, nv, d->moment_rownnz,
|
||||
d->moment_rowadr, d->moment_colind);
|
||||
mj_solveLD(Bc, d->qH, d->qHDiagInv, nv, nu,
|
||||
m->M_rownnz, m->M_rowadr, m->M_colind);
|
||||
m->M_rownnz, m->M_rowadr, m->M_colind, nullptr);
|
||||
mju_transpose(BcT, Bc, nu, nv);
|
||||
mju_scl(B, BcT, dt*dt, nu*nv);
|
||||
mju_scl(B+nu*nv, BcT, dt, nu*nv);
|
||||
|
||||
@@ -14,8 +14,11 @@
|
||||
|
||||
// Tests for engine/engine_sleep.c.
|
||||
|
||||
#include <string>
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
#include <gtest/gtest.h>
|
||||
#include <gtest/gtest-spi.h>
|
||||
#include <mujoco/mjmodel.h>
|
||||
#include <mujoco/mujoco.h>
|
||||
#include "src/engine/engine_sleep.h"
|
||||
@@ -25,7 +28,10 @@ namespace mujoco {
|
||||
namespace {
|
||||
|
||||
using ::testing::ElementsAre;
|
||||
using ::testing::IsNull;
|
||||
using ::testing::HasSubstr;
|
||||
using ::testing::NotNull;
|
||||
using ::std::string;
|
||||
|
||||
using SleepTest = MujocoTest;
|
||||
|
||||
@@ -177,5 +183,348 @@ TEST_F(SleepTest, MjSleepUpdate) {
|
||||
mj_deleteModel(m);
|
||||
}
|
||||
|
||||
TEST_F(SleepTest, MjWakeTree) {
|
||||
// one awake tree and two cycles
|
||||
int asleep[] = {kAwake, 2, 1, 3};
|
||||
EXPECT_EQ(mj_wakeTree(asleep, 4, 0, kAwake), 0);
|
||||
EXPECT_THAT(AsVector(asleep, 4), ElementsAre(kAwake, 2, 1, 3));
|
||||
EXPECT_EQ(mj_wakeTree(asleep, 4, 1, kAwake), 2);
|
||||
EXPECT_THAT(AsVector(asleep, 4),
|
||||
ElementsAre(kAwake, kAwake, kAwake, 3));
|
||||
EXPECT_EQ(mj_wakeTree(asleep, 4, 3, kAwake), 1);
|
||||
EXPECT_THAT(AsVector(asleep, 4),
|
||||
ElementsAre(kAwake, kAwake, kAwake, kAwake));
|
||||
}
|
||||
|
||||
TEST_F(SleepTest, BadWakeTree) {
|
||||
EXPECT_FATAL_FAILURE(
|
||||
([] {
|
||||
int asleep_bad1[] = {-1, 0};
|
||||
mj_wakeTree(asleep_bad1, 2, 1, kAwake);
|
||||
}()),
|
||||
"invalid sleep state index -1 when waking tree 1");
|
||||
|
||||
EXPECT_FATAL_FAILURE(
|
||||
([] {
|
||||
int asleep_bad2[] = {-1, 2};
|
||||
mj_wakeTree(asleep_bad2, 2, 1, kAwake);
|
||||
}()),
|
||||
"invalid sleep state index 2 when waking tree 1");
|
||||
|
||||
EXPECT_FATAL_FAILURE(
|
||||
([] {
|
||||
int asleep_bad3[] = {1, 2, 1};
|
||||
mj_wakeTree(asleep_bad3, 3, 0, kAwake);
|
||||
}()),
|
||||
"tree 0 is not in a cycle");
|
||||
}
|
||||
|
||||
static const char* const kStaticModel = "engine/testdata/sleep/static.xml";
|
||||
static const char* const kSmoothModel = "engine/testdata/sleep/smooth.xml";
|
||||
static const char* const kInitModel = "engine/testdata/sleep/init.xml";
|
||||
static const char* const kInitIslandModel =
|
||||
"engine/testdata/sleep/init_island.xml";
|
||||
static const char* const kTendonModel = "engine/testdata/sleep/tendon.xml";
|
||||
static const char* const kContactModel = "engine/testdata/sleep/contact.xml";
|
||||
static const char* const kPairModel = "engine/testdata/sleep/contactpair.xml";
|
||||
static const char* const kSensorModel = "engine/testdata/sleep/sensor.xml";
|
||||
|
||||
// roll out some models with sleeping enabled, valuable under ASAN and MSAN
|
||||
TEST_F(SleepTest, KickTires) {
|
||||
for (const char* path :
|
||||
{kStaticModel, kInitModel, kInitIslandModel, kSensorModel, kTendonModel,
|
||||
kContactModel, kPairModel, kSmoothModel}) {
|
||||
const std::string xml_path = GetTestDataFilePath(path);
|
||||
char error[1024];
|
||||
mjModel* m = mj_loadXML(xml_path.c_str(), 0, error, sizeof(error));
|
||||
ASSERT_THAT(m, NotNull()) << error;
|
||||
|
||||
int duration_id = mj_name2id(m, mjOBJ_NUMERIC, "duration");
|
||||
ASSERT_GE(duration_id, 0);
|
||||
mjtNum duration = m->numeric_data[m->numeric_adr[duration_id]];
|
||||
|
||||
mjData* d = mj_makeData(m);
|
||||
while (d->time < duration) {
|
||||
mj_step(m, d);
|
||||
}
|
||||
|
||||
mj_deleteData(d);
|
||||
mj_deleteModel(m);
|
||||
}
|
||||
}
|
||||
|
||||
// Test that sleeping does not affect the simulation of awake trees:
|
||||
// Roll out kSmoothModel, where all trees go to sleep within `duration` seconds
|
||||
// in two mjData's, one with sleeping enabled and one without; expect the same
|
||||
// values (for selected arrays) in awake trees in both.
|
||||
TEST_F(SleepTest, WakingUnaffectedBySleeping) {
|
||||
const std::string xml_path = GetTestDataFilePath(kSmoothModel);
|
||||
char error[1024];
|
||||
mjModel* m = mj_loadXML(xml_path.c_str(), 0, error, sizeof(error));
|
||||
ASSERT_THAT(m, NotNull()) << error;
|
||||
|
||||
int duration_id = mj_name2id(m, mjOBJ_NUMERIC, "duration");
|
||||
ASSERT_GE(duration_id, 0);
|
||||
mjtNum duration = m->numeric_data[m->numeric_adr[duration_id]];
|
||||
|
||||
for (mjtJacobian jacobian : {mjJAC_DENSE, mjJAC_SPARSE}) {
|
||||
m->opt.jacobian = jacobian;
|
||||
for (mjtIntegrator integrator : // TODO: b/457674312 - Add support for RK4.
|
||||
{mjINT_EULER, mjINT_IMPLICITFAST, mjINT_IMPLICIT}) {
|
||||
m->opt.integrator = integrator;
|
||||
|
||||
// make data with sleeping enabled
|
||||
m->opt.enableflags |= mjENBL_SLEEP;
|
||||
mjData* d_sleep = mj_makeData(m);
|
||||
|
||||
// make data with sleeping disabled
|
||||
m->opt.enableflags &= ~mjENBL_SLEEP;
|
||||
mjData* d_nosleep = mj_makeData(m);
|
||||
|
||||
// disable constraints, contacts
|
||||
m->opt.disableflags |= mjDSBL_CONSTRAINT | mjDSBL_CONTACT;
|
||||
|
||||
ASSERT_EQ(d_sleep->nbody_awake, m->nbody);
|
||||
int nbody_awake = -1;
|
||||
|
||||
while (d_nosleep->time < duration) {
|
||||
m->opt.enableflags |= mjENBL_SLEEP;
|
||||
mj_step(m, d_sleep);
|
||||
m->opt.enableflags &= ~mjENBL_SLEEP;
|
||||
mj_step(m, d_nosleep);
|
||||
|
||||
// if nbody_awake is not changed, skip
|
||||
if (d_sleep->nbody_awake == nbody_awake) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// compare xpos
|
||||
for (int i = 0; i < m->nbody; i++) {
|
||||
if (d_sleep->body_awake[i] == mjS_ASLEEP) continue;
|
||||
auto xpos1 = AsVector(d_nosleep->xpos + 3 * i, 3);
|
||||
auto xpos2 = AsVector(d_sleep->xpos + 3 * i, 3);
|
||||
EXPECT_EQ(xpos1, xpos2)
|
||||
<< " xpos[" << i << "] at time " << d_nosleep->time;
|
||||
}
|
||||
|
||||
// compare M and qLD
|
||||
for (int i = 0; i < d_sleep->nv_awake; i++) {
|
||||
int j = d_sleep->dof_awake_ind[i];
|
||||
auto M1 = AsVector(d_nosleep->M + m->M_rowadr[j], m->M_rownnz[j]);
|
||||
auto M2 = AsVector(d_sleep->M + m->M_rowadr[j], m->M_rownnz[j]);
|
||||
EXPECT_EQ(M1, M2) << " M[" << j << ",:] at time " << d_nosleep->time;
|
||||
auto qLD1 = AsVector(d_nosleep->qLD + m->M_rowadr[j], m->M_rownnz[j]);
|
||||
auto qLD2 = AsVector(d_sleep->qLD + m->M_rowadr[j], m->M_rownnz[j]);
|
||||
EXPECT_EQ(qLD1, qLD2)
|
||||
<< " qLD[" << j << ",:] at time " << d_nosleep->time;
|
||||
}
|
||||
|
||||
// compare cvel
|
||||
for (int i = 0; i < d_sleep->nbody_awake; i++) {
|
||||
if (d_sleep->body_awake[i] == mjS_ASLEEP) continue;
|
||||
auto cvel1 = AsVector(d_nosleep->cvel + 6 * i, 6);
|
||||
auto cvel2 = AsVector(d_sleep->cvel + 6 * i, 6);
|
||||
EXPECT_EQ(cvel1, cvel2)
|
||||
<< " cvel[" << i << "] at time " << d_nosleep->time;
|
||||
}
|
||||
|
||||
// compare subtree_angmom, only for dynamic bodies
|
||||
for (int i = 0; i < d_sleep->nbody_awake; i++) {
|
||||
if (d_sleep->body_awake[i] != mjS_AWAKE) continue;
|
||||
auto subtree_angmom1 = AsVector(d_nosleep->subtree_angmom + 3 * i, 3);
|
||||
auto subtree_angmom2 = AsVector(d_sleep->subtree_angmom + 3 * i, 3);
|
||||
EXPECT_EQ(subtree_angmom1, subtree_angmom2)
|
||||
<< " subtree_angmom[" << i << "] at time " << d_nosleep->time;
|
||||
}
|
||||
|
||||
// compare qfrc/qacc arrays
|
||||
for (int i = 0; i < d_sleep->nv_awake; i++) {
|
||||
int j = d_sleep->dof_awake_ind[i];
|
||||
EXPECT_EQ(d_nosleep->qfrc_smooth[j], d_sleep->qfrc_smooth[j])
|
||||
<< " qfrc_smooth[" << j << "] at time " << d_nosleep->time;
|
||||
EXPECT_EQ(d_nosleep->qacc_smooth[j], d_sleep->qacc_smooth[j])
|
||||
<< " qacc_smooth[" << j << "] at time " << d_nosleep->time;
|
||||
EXPECT_EQ(d_nosleep->qacc[j], d_sleep->qacc[j])
|
||||
<< " qacc[" << j << "] at time " << d_nosleep->time;
|
||||
}
|
||||
|
||||
nbody_awake = d_sleep->nbody_awake;
|
||||
}
|
||||
|
||||
mj_deleteData(d_sleep);
|
||||
mj_deleteData(d_nosleep);
|
||||
}
|
||||
}
|
||||
mj_deleteModel(m);
|
||||
}
|
||||
|
||||
|
||||
// Test that waking does not affect sleeping trees for pos/vel-dependent arrays.
|
||||
// Roll out models where some trees wake and/or sleep. At kCompare intervals,
|
||||
// copy the state from the mjData with sleeping enabled to another mjData and
|
||||
// call mj_forward with sleeping disabled. Expect pos/vel-dependent arrays to be
|
||||
// unchanged for all trees and frc/acc-dependent arrays to be the same for awake
|
||||
// trees.
|
||||
TEST_F(SleepTest, SleepingUnaffectedByWaking) {
|
||||
for (const char* path : {kInitModel, kInitIslandModel, kTendonModel,
|
||||
kContactModel, kSensorModel, kSmoothModel}) {
|
||||
const std::string xml_path = GetTestDataFilePath(path);
|
||||
char error[1024];
|
||||
mjModel* m = mj_loadXML(xml_path.c_str(), 0, error, sizeof(error));
|
||||
ASSERT_THAT(m, NotNull()) << error;
|
||||
|
||||
const int kCompare = 10; // number of comparisons per rollout
|
||||
|
||||
// TODO: b/457674312 - Add support for RK4.
|
||||
for (mjtIntegrator integrator :
|
||||
{mjINT_EULER, mjINT_IMPLICITFAST, mjINT_IMPLICIT}) {
|
||||
m->opt.integrator = integrator;
|
||||
|
||||
// make data with sleeping enabled
|
||||
m->opt.enableflags |= mjENBL_SLEEP;
|
||||
mjData* d_sleep = mj_makeData(m);
|
||||
|
||||
// make data with sleeping disabled
|
||||
m->opt.enableflags &= ~mjENBL_SLEEP;
|
||||
mjData* d_nosleep = mj_makeData(m);
|
||||
|
||||
int duration_id = mj_name2id(m, mjOBJ_NUMERIC, "duration");
|
||||
ASSERT_GE(duration_id, 0);
|
||||
mjtNum duration = m->numeric_data[m->numeric_adr[duration_id]];
|
||||
|
||||
int compare_interval = duration / (m->opt.timestep * kCompare);
|
||||
int nsteps = 0;
|
||||
while (d_sleep->time < duration) {
|
||||
// step d_sleep with sleeping enabled
|
||||
m->opt.enableflags |= mjENBL_SLEEP;
|
||||
mj_step(m, d_sleep);
|
||||
nsteps++;
|
||||
|
||||
// every compare_interval steps, compare with d_nosleep
|
||||
if (nsteps % compare_interval != 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// call mj_forward to update d_sleep
|
||||
mj_forward(m, d_sleep);
|
||||
|
||||
// copy state from d_sleep to d_nosleep
|
||||
mj_copyData(d_nosleep, m, d_sleep);
|
||||
|
||||
// forward d_nosleep with sleeping disabled
|
||||
m->opt.enableflags &= ~mjENBL_SLEEP;
|
||||
mj_forward(m, d_nosleep);
|
||||
|
||||
// ==== compare arrays for all dofs / bodies / sensors ====
|
||||
|
||||
// compare xpos
|
||||
for (int i = 0; i < m->nbody; i++) {
|
||||
auto xpos1 = AsVector(d_sleep->xpos + 3 * i, 3);
|
||||
auto xpos2 = AsVector(d_nosleep->xpos + 3 * i, 3);
|
||||
EXPECT_EQ(xpos1, xpos2)
|
||||
<< " xpos[" << i << "] at time " << d_sleep->time;
|
||||
}
|
||||
|
||||
// compare M and qLD
|
||||
for (int i = 0; i < m->nv; i++) {
|
||||
auto M1 = AsVector(d_sleep->M + m->M_rowadr[i], m->M_rownnz[i]);
|
||||
auto M2 = AsVector(d_nosleep->M + m->M_rowadr[i], m->M_rownnz[i]);
|
||||
EXPECT_EQ(M1, M2) << " M[" << i << ",:] at time " << d_sleep->time;
|
||||
auto qLD1 = AsVector(d_sleep->qLD + m->M_rowadr[i], m->M_rownnz[i]);
|
||||
auto qLD2 = AsVector(d_nosleep->qLD + m->M_rowadr[i], m->M_rownnz[i]);
|
||||
EXPECT_EQ(qLD1, qLD2)
|
||||
<< " qLD[" << i << ",:] at time " << d_sleep->time;
|
||||
}
|
||||
|
||||
// compare cvel
|
||||
for (int i = 0; i < m->nbody; i++) {
|
||||
auto cvel1 = AsVector(d_sleep->cvel + 6 * i, 6);
|
||||
auto cvel2 = AsVector(d_nosleep->cvel + 6 * i, 6);
|
||||
EXPECT_EQ(cvel1, cvel2)
|
||||
<< " cvel[" << i << "] at time " << d_sleep->time;
|
||||
}
|
||||
|
||||
// compare qfrc arrays
|
||||
for (int i = 0; i < m->nv; i++) {
|
||||
EXPECT_EQ(d_sleep->qfrc_fluid[i], d_nosleep->qfrc_fluid[i])
|
||||
<< " qfrc_fluid[" << i << "] at time " << d_sleep->time;
|
||||
EXPECT_EQ(d_sleep->qfrc_damper[i], d_nosleep->qfrc_damper[i])
|
||||
<< " qfrc_damper[" << i << "] at time " << d_sleep->time;
|
||||
EXPECT_EQ(d_sleep->qfrc_spring[i], d_nosleep->qfrc_spring[i])
|
||||
<< " qfrc_spring[" << i << "] at time " << d_sleep->time;
|
||||
EXPECT_EQ(d_sleep->qfrc_gravcomp[i], d_nosleep->qfrc_gravcomp[i])
|
||||
<< " qfrc_gravcomp[" << i << "] at time " << d_sleep->time;
|
||||
EXPECT_EQ(d_sleep->qfrc_bias[i], d_nosleep->qfrc_bias[i])
|
||||
<< " qfrc_bias[" << i << "] at time " << d_sleep->time;
|
||||
}
|
||||
|
||||
// compare sensordata
|
||||
for (int i = 0; i < m->nsensor; i++) {
|
||||
int dim = m->sensor_dim[i];
|
||||
int adr = m->sensor_adr[i];
|
||||
auto data1 = AsVector(d_sleep->sensordata + adr, dim);
|
||||
auto data2 = AsVector(d_nosleep->sensordata + adr, dim);
|
||||
EXPECT_EQ(data1, data2)
|
||||
<< " sensor " << i << " at time " << d_sleep->time;
|
||||
}
|
||||
|
||||
// ==== compare arrays for awake dofs only ====
|
||||
|
||||
// compare qacc arrays for awake dofs
|
||||
for (int j = 0; j < d_sleep->nv_awake; j++) {
|
||||
int i = d_sleep->dof_awake_ind[j];
|
||||
EXPECT_EQ(d_sleep->qacc_smooth[i], d_nosleep->qacc_smooth[i])
|
||||
<< " qacc_smooth[" << i << "] at time " << d_sleep->time;
|
||||
EXPECT_EQ(d_sleep->qacc[i], d_nosleep->qacc[i])
|
||||
<< " qacc[" << i << "] at time " << d_sleep->time;
|
||||
}
|
||||
}
|
||||
|
||||
mj_deleteData(d_nosleep);
|
||||
mj_deleteData(d_sleep);
|
||||
}
|
||||
mj_deleteModel(m);
|
||||
}
|
||||
}
|
||||
|
||||
static const char* const kEqualityModel = "engine/testdata/sleep/equality.xml";
|
||||
|
||||
// Activate equality between sleeping and awake trees, useful under ASAN/MSAN.
|
||||
TEST_F(SleepTest, Equality) {
|
||||
const std::string xml_path = GetTestDataFilePath(kEqualityModel);
|
||||
char error[1024];
|
||||
mjModel* m = mj_loadXML(xml_path.c_str(), 0, error, sizeof(error));
|
||||
ASSERT_THAT(m, NotNull()) << error;
|
||||
|
||||
mjData* d = mj_makeData(m);
|
||||
while (d->ntree_awake == m->ntree) {
|
||||
mj_step(m, d);
|
||||
}
|
||||
|
||||
int dd = mj_name2id(m, mjOBJ_EQUALITY, "dyn/dyn");
|
||||
ASSERT_GE(dd, 0);
|
||||
|
||||
mj_step(m, d);
|
||||
d->eq_active[dd] = 1;
|
||||
mj_step(m, d);
|
||||
|
||||
mj_deleteData(d);
|
||||
mj_deleteModel(m);
|
||||
}
|
||||
|
||||
static const char* const kInitIslandFailModel =
|
||||
"engine/testdata/sleep/init_island_fail.xml";
|
||||
|
||||
TEST_F(SleepTest, InitIslandFail) {
|
||||
const std::string xml_path = GetTestDataFilePath(kInitIslandFailModel);
|
||||
char error[1024];
|
||||
mjModel* m = mj_loadXML(xml_path.c_str(), 0, error, sizeof(error));
|
||||
EXPECT_THAT(m, IsNull());
|
||||
EXPECT_THAT(error,
|
||||
HasSubstr("3 trees were marked as sleep='init' but only 0 could "
|
||||
"be slept.\nBody 'asleep_init0' (id=1) is the root of "
|
||||
"the first tree that could not be slept."));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace mujoco
|
||||
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
<mujoco>
|
||||
<custom>
|
||||
<numeric name="duration" data="1.5"/>
|
||||
</custom>
|
||||
|
||||
<default>
|
||||
<default class="domino">
|
||||
<geom type="box" size=".008 .044 .089" rgba=".9 .9 .9 1" mass="0.09"/>
|
||||
</default>
|
||||
</default>
|
||||
|
||||
<visual>
|
||||
<global realtime="0.2"/>
|
||||
</visual>
|
||||
|
||||
<option cone="elliptic" impratio="10">
|
||||
<flag sleep="enable"/>
|
||||
</option>
|
||||
|
||||
<worldbody>
|
||||
<light pos="0 0 3"/>
|
||||
<geom type="plane" size="1 1 .01" pos="0 0 1e-6"/>
|
||||
|
||||
<body pos="-.1 0 .089" euler="0 7 0">
|
||||
<freejoint/>
|
||||
<geom type="box" class="domino"/>
|
||||
</body>
|
||||
|
||||
<replicate count="4" offset=".1 0 0">
|
||||
<body pos="0 0 .089">
|
||||
<freejoint/>
|
||||
<geom type="box" class="domino"/>
|
||||
</body>
|
||||
</replicate>
|
||||
</worldbody>
|
||||
</mujoco>
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
<mujoco>
|
||||
<custom>
|
||||
<numeric name="duration" data="1.0"/>
|
||||
</custom>
|
||||
|
||||
<default>
|
||||
<default class="domino">
|
||||
<geom type="box" size=".008 .044 .089" rgba=".9 .9 .9 1" mass="0.09"/>
|
||||
</default>
|
||||
</default>
|
||||
|
||||
<visual>
|
||||
<global realtime="0.2"/>
|
||||
</visual>
|
||||
|
||||
<option cone="elliptic" impratio="10">
|
||||
<flag sleep="enable"/>
|
||||
</option>
|
||||
|
||||
<worldbody>
|
||||
<light pos="0 0 3"/>
|
||||
<geom name="floor" type="plane" size="1 1 .01" pos="0 0 1e-6"/>
|
||||
|
||||
<body pos="-.1 0 .089" euler="0 7 0">
|
||||
<freejoint/>
|
||||
<geom name="1" type="box" class="domino"/>
|
||||
</body>
|
||||
|
||||
<body pos="0 0 .089">
|
||||
<freejoint/>
|
||||
<geom name="2" type="box" class="domino" contype="0" conaffinity="0"/>
|
||||
</body>
|
||||
</worldbody>
|
||||
|
||||
<contact>
|
||||
<pair geom1="1" geom2="2"/>
|
||||
<pair geom1="2" geom2="floor"/>
|
||||
</contact>
|
||||
</mujoco>
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
<mujoco>
|
||||
<option>
|
||||
<flag sleep="enable"/>
|
||||
</option>
|
||||
|
||||
<worldbody>
|
||||
<light pos="0 -1 4"/>
|
||||
<geom type="plane" size="1.5 1.5 .01"/>
|
||||
|
||||
<body pos=".3 0 .8">
|
||||
<joint name="1" axis="1 0 0" damping=".1"/>
|
||||
<geom type="box" size=".03 .1 .1"/>
|
||||
</body>
|
||||
|
||||
<body pos=".7 0 .8">
|
||||
<joint name="2" axis="1 0 0" damping=".1"/>
|
||||
<geom type="box" size=".03 .1 .1"/>
|
||||
</body>
|
||||
|
||||
<body pos=".5 0 .5">
|
||||
<geom type="box" size=".1 .1 .1"/>
|
||||
<site name="1" pos="-.1 0 0" size=".01" rgba="1 0 0 1"/>
|
||||
</body>
|
||||
|
||||
<body pos="-.3 -.4 .5" euler="10 20 30">
|
||||
<freejoint/>
|
||||
<geom type="box" size=".1 .1 .1"/>
|
||||
<site name="2" pos="0 0 .1" size=".01" rgba="1 0 0 1" euler="0 -90 0"/>
|
||||
<site name="3" pos="0 -.1 0" size=".01" rgba="1 0 0 1" euler="0 0 -90"/>
|
||||
</body>
|
||||
|
||||
<body pos=".7 -.3 .5">
|
||||
<freejoint/>
|
||||
<geom type="box" size=".1 .1 .1"/>
|
||||
<site name="4" pos="-.1 0 0" size=".01" rgba="1 0 0 1"/>
|
||||
</body>
|
||||
|
||||
<body pos="-.3 0 .7">
|
||||
<joint axis="0 1 0" springdamper=".03 1"/>
|
||||
<geom type="capsule" size=".03" fromto="0 0 0 .2 0 0"/>
|
||||
<site name="5" pos=".1 0 .03" size=".01" rgba="1 0 0 1"/>
|
||||
<body pos=".2 0 0">
|
||||
<joint axis="0 1 0" springdamper=".03 1"/>
|
||||
<geom type="capsule" size=".03" fromto="0 0 0 0 0 .2"/>
|
||||
<body pos="0 0 .2">
|
||||
<joint axis="0 1 0" springdamper=".03 1"/>
|
||||
<geom type="capsule" size=".03" fromto="0 0 0 -.15 0 0"/>
|
||||
<site name="6" pos="-.18 0 0" size=".01" rgba="1 0 0 1"/>
|
||||
</body>
|
||||
</body>
|
||||
</body>
|
||||
</worldbody>
|
||||
|
||||
<equality>
|
||||
<weld active="false" name="stat/dyn" site1="1" site2="2"/>
|
||||
<weld active="false" name="dyn/dyn" site1="3" site2="4"/>
|
||||
<connect active="false" name="self" site1="5" site2="6"/>
|
||||
<joint name="joint" joint1="1" joint2="2" polycoef="0 -2"/>
|
||||
</equality>
|
||||
</mujoco>
|
||||
Vendored
+26
@@ -0,0 +1,26 @@
|
||||
<mujoco>
|
||||
<custom>
|
||||
<numeric name="duration" data="2.0"/>
|
||||
</custom>
|
||||
|
||||
<option>
|
||||
<flag sleep="enable"/>
|
||||
</option>
|
||||
|
||||
<worldbody>
|
||||
<light pos="0 -1 3"/>
|
||||
<geom type="plane" size="1 1 .01"/>
|
||||
|
||||
<replicate count="3" offset="0 0 .3">
|
||||
<body pos="0 0 .15" sleep="init">
|
||||
<freejoint/>
|
||||
<geom type="box" size=".1 .1 .1"/>
|
||||
</body>
|
||||
</replicate>
|
||||
|
||||
<body pos="0 0 1.2" euler="10 20 30">
|
||||
<freejoint/>
|
||||
<geom type="box" size=".1 .1 .1"/>
|
||||
</body>
|
||||
</worldbody>
|
||||
</mujoco>
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
<mujoco>
|
||||
<custom>
|
||||
<numeric name="duration" data="2.0"/>
|
||||
</custom>
|
||||
|
||||
<option>
|
||||
<flag sleep="enable"/>
|
||||
</option>
|
||||
|
||||
<worldbody>
|
||||
<light pos="0 -1 3"/>
|
||||
<geom type="plane" size="1 1 .01"/>
|
||||
|
||||
<replicate count="3" offset="0 0 .18" euler="0 0 20">
|
||||
<body pos="0 0 .08" sleep="init">
|
||||
<freejoint/>
|
||||
<geom type="box" size=".1 .1 .1"/>
|
||||
</body>
|
||||
</replicate>
|
||||
|
||||
<body pos="0 0 1.2" euler="10 20 30">
|
||||
<freejoint/>
|
||||
<geom type="box" size=".1 .1 .1"/>
|
||||
</body>
|
||||
</worldbody>
|
||||
</mujoco>
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
<mujoco>
|
||||
<custom>
|
||||
<numeric name="duration" data="2.0"/>
|
||||
</custom>
|
||||
|
||||
<option>
|
||||
<flag sleep="enable"/>
|
||||
</option>
|
||||
|
||||
<worldbody>
|
||||
<light pos="0 -1 3"/>
|
||||
<geom type="plane" size="1 1 .01"/>
|
||||
|
||||
<replicate count="3" offset="0 0 .18" euler="0 0 20">
|
||||
<body name="asleep_init" pos="0 0 .08" sleep="init">
|
||||
<freejoint/>
|
||||
<geom type="box" size=".1 .1 .1"/>
|
||||
</body>
|
||||
</replicate>
|
||||
|
||||
<!-- the free objects above are marked as sleep="init", but they are touching this object which
|
||||
is awake so sleep initialization should fail -->
|
||||
<body pos="0 0 .6" euler="10 20 30">
|
||||
<freejoint/>
|
||||
<geom type="box" size=".1 .1 .1"/>
|
||||
</body>
|
||||
</worldbody>
|
||||
</mujoco>
|
||||
+123
@@ -0,0 +1,123 @@
|
||||
<mujoco model="2 Humanoids and 100 objects">
|
||||
<!--
|
||||
Model designed for a maximally-elaborate island structure.
|
||||
More horizontal gravity leads to larger, fewer islands.
|
||||
-->
|
||||
<option timestep="0.005" cone="elliptic" impratio="10" sleep_tolerance="1e-3">
|
||||
<flag island="enable" sleep="enable"/>
|
||||
</option>
|
||||
|
||||
<size memory="100M"/>
|
||||
|
||||
<default>
|
||||
<geom condim="6" friction="1 .01 .003"/>
|
||||
<default class="capsule">
|
||||
<geom type="capsule" material="capsule" size="0.1 0.05"/>
|
||||
</default>
|
||||
<default class="ellipsoid">
|
||||
<geom type="ellipsoid" material="ellipsoid" size="0.15 0.1 0.07"/>
|
||||
</default>
|
||||
<default class="box">
|
||||
<geom type="box" material="box" size="0.15 0.1 0.05"/>
|
||||
</default>
|
||||
<default class="cylinder">
|
||||
<geom type="cylinder" material="cylinder" size="0.1 0.05"/>
|
||||
</default>
|
||||
<default class="sphere">
|
||||
<geom type="sphere" material="sphere" size="0.1"/>
|
||||
</default>
|
||||
<default class="border">
|
||||
<geom type="capsule" size="0.4" rgba=".4 .4 .4 1"/>
|
||||
</default>
|
||||
<default class="borderpost">
|
||||
<geom type="box" size="0.41 0.41 0.41" rgba=".55 .55 .55 1"/>
|
||||
</default>
|
||||
</default>
|
||||
|
||||
<asset>
|
||||
<model file="humanoid.xml"/>
|
||||
<texture type="skybox" builtin="gradient" width="512" height="512" rgb1=".4 .6 .8" rgb2="0 0 0"/>
|
||||
<texture name="texgeom" type="cube" builtin="flat" mark="cross" width="128" height="128" rgb1="0.6 0.6 0.6" rgb2="0.6 0.6 0.6" markrgb="1 1 1"/>
|
||||
<texture name="texplane" type="2d" builtin="checker" rgb1=".4 .4 .4" rgb2=".6 .6 .6" width="512" height="512"/>
|
||||
<material name="MatPlane" reflectance="0.3" texture="texplane" texrepeat="1 1" texuniform="true" rgba=".7 .7 .7 1"/>
|
||||
<material name="capsule" texture="texgeom" texuniform="true" rgba=".4 .9 .6 1"/>
|
||||
<material name="ellipsoid" texture="texgeom" texuniform="true" rgba=".4 .6 .9 1"/>
|
||||
<material name="box" texture="texgeom" texuniform="true" rgba=".4 .9 .9 1"/>
|
||||
<material name="cylinder" texture="texgeom" texuniform="true" rgba=".8 .6 .8 1"/>
|
||||
<material name="sphere" texture="texgeom" texuniform="true" rgba=".9 .1 .1 1"/>
|
||||
</asset>
|
||||
|
||||
<visual>
|
||||
<quality shadowsize="4096" offsamples="8"/>
|
||||
<map znear="0.1" force="0.05"/>
|
||||
</visual>
|
||||
|
||||
<statistic extent="4"/>
|
||||
|
||||
<worldbody>
|
||||
<light directional="true" diffuse=".8 .8 .8" pos="0 0 10" dir="0 0 -10"/>
|
||||
<geom name="floor" type="plane" size="3 3 .5" material="MatPlane"/>
|
||||
<geom class="border" fromto="-3 3 0 3 3 0"/>
|
||||
<geom class="border" fromto="-3 -3 0 3 -3 0"/>
|
||||
<geom class="border" fromto="3 3 0 3 -3 0"/>
|
||||
<geom class="border" fromto="-3 3 0 -3 -3 0"/>
|
||||
<geom class="borderpost" pos="3 3 0"/>
|
||||
<geom class="borderpost" pos="-3 3 0"/>
|
||||
<geom class="borderpost" pos="3 -3 0"/>
|
||||
<geom class="borderpost" pos="-3 -3 0"/>
|
||||
|
||||
<replicate count="4" euler="0 0 90">
|
||||
<geom type="plane" size=".5 3 .05" zaxis="1 0 0" pos="-3 0 0.4"/>
|
||||
</replicate>
|
||||
|
||||
<replicate count="20" offset="0 0 0.2" euler="0 0 20">
|
||||
<body pos="-2 0 0.5" euler="30 40 0">
|
||||
<freejoint/>
|
||||
<geom class="capsule"/>
|
||||
</body>
|
||||
</replicate>
|
||||
|
||||
<attach model="Humanoid" body="torso" prefix="1_"/>
|
||||
|
||||
<frame euler="0 0 72">
|
||||
<replicate count="20" offset="0 0 0.2" euler="0 0 20">
|
||||
<body pos="-2 0 0.5" euler="20 40 60">
|
||||
<freejoint/>
|
||||
<geom class="ellipsoid"/>
|
||||
</body>
|
||||
</replicate>
|
||||
</frame>
|
||||
|
||||
<frame euler="0 0 144">
|
||||
<replicate count="20" offset="0 0 0.2" euler="0 0 20">
|
||||
<body pos="-2 0 0.5" euler="30 70 110">
|
||||
<freejoint/>
|
||||
<geom class="box"/>
|
||||
</body>
|
||||
</replicate>
|
||||
</frame>
|
||||
|
||||
<frame pos="1 1 0" euler="0 0 144">
|
||||
<attach model="Humanoid" body="torso" prefix="2_"/>
|
||||
</frame>
|
||||
|
||||
<frame euler="0 0 216">
|
||||
<replicate count="20" offset="0 0 0.2" euler="0 0 20">
|
||||
<body pos="-2 0 0.5" euler="60 30 0">
|
||||
<freejoint/>
|
||||
<geom class="cylinder"/>
|
||||
</body>
|
||||
</replicate>
|
||||
</frame>
|
||||
|
||||
<frame euler="0 0 288">
|
||||
<replicate count="20" offset="0 0 0.2" euler="0 0 20">
|
||||
<body pos="-2 0 0.5" euler="60 30 0">
|
||||
<freejoint/>
|
||||
<geom class="sphere"/>
|
||||
</body>
|
||||
</replicate>
|
||||
</frame>
|
||||
|
||||
</worldbody>
|
||||
</mujoco>
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
<mujoco model="sleeping dominos">
|
||||
<option cone="elliptic" impratio="10" sleep_tolerance="3e-4">
|
||||
<flag sleep="enable"/>
|
||||
</option>
|
||||
|
||||
<default>
|
||||
<default class="domino">
|
||||
<geom type="box" size=".008 .044 .089" rgba=".9 .9 .9 1" mass="0.09"/>
|
||||
</default>
|
||||
</default>
|
||||
|
||||
<worldbody>
|
||||
<light pos=".5 0 3" diffuse="1 1 1"/>
|
||||
<geom type="plane" size="2 2 .01" pos=".5 0 1e-6"/>
|
||||
|
||||
<!-- one domino atilt kicks off the chain reaction -->
|
||||
<body pos="-.1 0 .089" euler="0 7 0">
|
||||
<freejoint/>
|
||||
<geom type="box" class="domino"/>
|
||||
</body>
|
||||
|
||||
<!-- 5 rows of 15 dominoes, arranged in toppling order for consistent ids and colors -->
|
||||
|
||||
<!-- 3 rows of 15 dominoes, left to right -->
|
||||
<replicate count="3" offset="0 1 0">
|
||||
<frame pos="0 -1 0">
|
||||
<replicate count="15" offset=".1 0 0">
|
||||
<body pos="0 0 .089">
|
||||
<freejoint/>
|
||||
<geom type="box" class="domino"/>
|
||||
</body>
|
||||
</replicate>
|
||||
</frame>
|
||||
</replicate>
|
||||
|
||||
<!-- 2 rows of 15 dominoes, right to left -->
|
||||
<replicate count="2" offset="0 1 0">
|
||||
<frame pos="0 -.5 0">
|
||||
<replicate count="15" offset="-.1 0 0">
|
||||
<body pos="1.4 0 .089">
|
||||
<freejoint/>
|
||||
<geom type="box" class="domino"/>
|
||||
</body>
|
||||
</replicate>
|
||||
</frame>
|
||||
</replicate>
|
||||
|
||||
<!-- two "U turns", not too close in order to break the island chain -->
|
||||
<replicate offset="0 -.55 0" count="2">
|
||||
<frame pos="1.5 .26 0">
|
||||
<replicate count="5" euler="0 0 45">
|
||||
<body pos="0 -.23 .089">
|
||||
<freejoint/>
|
||||
<geom type="box" class="domino"/>
|
||||
</body>
|
||||
</replicate>
|
||||
</frame>
|
||||
</replicate>
|
||||
|
||||
<!-- two more U turns for the outside rows -->
|
||||
<replicate offset="0 1.5 0" count="2">
|
||||
<frame pos="-.1 -.75 0" euler="0 0 180">
|
||||
<replicate count="5" euler="0 0 45">
|
||||
<body pos="0 -.23 .089">
|
||||
<freejoint/>
|
||||
<geom type="box" class="domino"/>
|
||||
</body>
|
||||
</replicate>
|
||||
</frame>
|
||||
</replicate>
|
||||
</worldbody>
|
||||
|
||||
<visual>
|
||||
<global elevation="-25" azimuth="60"/>
|
||||
</visual>
|
||||
<statistic center="1.2 0 0"/>
|
||||
</mujoco>
|
||||
+254
@@ -0,0 +1,254 @@
|
||||
<mujoco model="Humanoid">
|
||||
<option timestep="0.005" cone="elliptic" impratio="10" sleep_tolerance="1e-3">
|
||||
<flag sleep="enable"/>
|
||||
</option>
|
||||
|
||||
<visual>
|
||||
<map force="0.1" zfar="30"/>
|
||||
<rgba haze="0.15 0.25 0.35 1"/>
|
||||
<global offwidth="2560" offheight="1440" elevation="-20" azimuth="120"/>
|
||||
</visual>
|
||||
|
||||
<statistic center="0 0 0.7"/>
|
||||
|
||||
<asset>
|
||||
<texture type="skybox" builtin="gradient" rgb1=".3 .5 .7" rgb2="0 0 0" width="32" height="512"/>
|
||||
<texture name="body" type="cube" builtin="flat" mark="cross" width="128" height="128" rgb1="0.8 0.6 0.4" rgb2="0.8 0.6 0.4" markrgb="1 1 1"/>
|
||||
<material name="body" texture="body" texuniform="true" rgba="0.8 0.6 .4 1"/>
|
||||
<texture name="grid" type="2d" builtin="checker" width="512" height="512" rgb1=".1 .2 .3" rgb2=".2 .3 .4"/>
|
||||
<material name="grid" texture="grid" texrepeat="1 1" texuniform="true" reflectance=".2"/>
|
||||
</asset>
|
||||
|
||||
<default>
|
||||
<motor ctrlrange="-1 1" ctrllimited="true"/>
|
||||
<default class="body">
|
||||
|
||||
<!-- geoms -->
|
||||
<geom type="capsule" condim="1" friction=".7" solimp=".9 .99 .003" solref=".015 1" material="body" group="1"/>
|
||||
<default class="thigh">
|
||||
<geom size=".06"/>
|
||||
</default>
|
||||
<default class="shin">
|
||||
<geom fromto="0 0 0 0 0 -.3" size=".049"/>
|
||||
</default>
|
||||
<default class="foot">
|
||||
<geom size=".027"/>
|
||||
<default class="foot1">
|
||||
<geom fromto="-.07 -.01 0 .14 -.03 0"/>
|
||||
</default>
|
||||
<default class="foot2">
|
||||
<geom fromto="-.07 .01 0 .14 .03 0"/>
|
||||
</default>
|
||||
</default>
|
||||
<default class="arm_upper">
|
||||
<geom size=".04"/>
|
||||
</default>
|
||||
<default class="arm_lower">
|
||||
<geom size=".031"/>
|
||||
</default>
|
||||
<default class="hand">
|
||||
<geom type="sphere" size=".04"/>
|
||||
</default>
|
||||
|
||||
<!-- joints -->
|
||||
<joint type="hinge" damping=".2" stiffness="1" armature=".01" limited="true" solimplimit="0 .99 .01" frictionloss="0.0001"/>
|
||||
<default class="joint_big">
|
||||
<joint damping="5" stiffness="10"/>
|
||||
<default class="hip_x">
|
||||
<joint range="-30 10"/>
|
||||
</default>
|
||||
<default class="hip_z">
|
||||
<joint range="-60 35"/>
|
||||
</default>
|
||||
<default class="hip_y">
|
||||
<joint axis="0 1 0" range="-150 20"/>
|
||||
</default>
|
||||
<default class="joint_big_stiff">
|
||||
<joint stiffness="20"/>
|
||||
</default>
|
||||
</default>
|
||||
<default class="knee">
|
||||
<joint pos="0 0 .02" axis="0 -1 0" range="-160 2"/>
|
||||
</default>
|
||||
<default class="ankle">
|
||||
<joint range="-50 50"/>
|
||||
<default class="ankle_y">
|
||||
<joint pos="0 0 .08" axis="0 1 0" stiffness="6"/>
|
||||
</default>
|
||||
<default class="ankle_x">
|
||||
<joint pos="0 0 .04" stiffness="3"/>
|
||||
</default>
|
||||
</default>
|
||||
<default class="shoulder">
|
||||
<joint range="-85 60"/>
|
||||
</default>
|
||||
<default class="elbow">
|
||||
<joint range="-100 50" stiffness="0"/>
|
||||
</default>
|
||||
</default>
|
||||
</default>
|
||||
|
||||
<worldbody>
|
||||
<geom name="floor" size="0 0 .05" type="plane" material="grid" condim="3"/>
|
||||
<light name="spotlight" mode="targetbodycom" target="torso" diffuse=".8 .8 .8" specular="0.3 0.3 0.3" pos="0 -6 4" cutoff="30"/>
|
||||
<light name="top" pos="0 0 2" mode="trackcom"/>
|
||||
<body name="torso" pos="0 0 1.282" childclass="body" sleep="allowed">
|
||||
<camera name="back" pos="-3 0 1" xyaxes="0 -1 0 1 0 2" mode="trackcom"/>
|
||||
<camera name="side" pos="0 -3 1" xyaxes="1 0 0 0 1 2" mode="trackcom"/>
|
||||
<freejoint name="root"/>
|
||||
<geom name="torso" fromto="0 -.07 0 0 .07 0" size=".07"/>
|
||||
<geom name="waist_upper" fromto="-.01 -.06 -.12 -.01 .06 -.12" size=".06"/>
|
||||
<body name="head" pos="0 0 .19">
|
||||
<geom name="head" type="sphere" size=".09"/>
|
||||
<camera name="egocentric" pos=".09 0 0" xyaxes="0 -1 0 .1 0 1" fovy="80"/>
|
||||
</body>
|
||||
<body name="waist_lower" pos="-.01 0 -.26">
|
||||
<geom name="waist_lower" fromto="0 -.06 0 0 .06 0" size=".06"/>
|
||||
<joint name="abdomen_z" pos="0 0 .065" axis="0 0 1" range="-45 45" class="joint_big_stiff"/>
|
||||
<joint name="abdomen_y" pos="0 0 .065" axis="0 1 0" range="-75 30" class="joint_big"/>
|
||||
<body name="pelvis" pos="0 0 -.165">
|
||||
<joint name="abdomen_x" pos="0 0 .1" axis="1 0 0" range="-35 35" class="joint_big"/>
|
||||
<geom name="butt" fromto="-.02 -.07 0 -.02 .07 0" size=".09"/>
|
||||
<body name="thigh_right" pos="0 -.1 -.04">
|
||||
<joint name="hip_x_right" axis="1 0 0" class="hip_x"/>
|
||||
<joint name="hip_z_right" axis="0 0 1" class="hip_z"/>
|
||||
<joint name="hip_y_right" class="hip_y"/>
|
||||
<geom name="thigh_right" fromto="0 0 0 0 .01 -.34" class="thigh"/>
|
||||
<body name="shin_right" pos="0 .01 -.4">
|
||||
<joint name="knee_right" class="knee"/>
|
||||
<geom name="shin_right" class="shin"/>
|
||||
<body name="foot_right" pos="0 0 -.39">
|
||||
<joint name="ankle_y_right" class="ankle_y"/>
|
||||
<joint name="ankle_x_right" class="ankle_x" axis="1 0 .5"/>
|
||||
<geom name="foot1_right" class="foot1"/>
|
||||
<geom name="foot2_right" class="foot2"/>
|
||||
</body>
|
||||
</body>
|
||||
</body>
|
||||
<body name="thigh_left" pos="0 .1 -.04">
|
||||
<joint name="hip_x_left" axis="-1 0 0" class="hip_x"/>
|
||||
<joint name="hip_z_left" axis="0 0 -1" class="hip_z"/>
|
||||
<joint name="hip_y_left" class="hip_y"/>
|
||||
<geom name="thigh_left" fromto="0 0 0 0 -.01 -.34" class="thigh"/>
|
||||
<body name="shin_left" pos="0 -.01 -.4">
|
||||
<joint name="knee_left" class="knee"/>
|
||||
<geom name="shin_left" fromto="0 0 0 0 0 -.3" class="shin"/>
|
||||
<body name="foot_left" pos="0 0 -.39">
|
||||
<joint name="ankle_y_left" class="ankle_y"/>
|
||||
<joint name="ankle_x_left" class="ankle_x" axis="-1 0 -.5"/>
|
||||
<geom name="foot1_left" class="foot1"/>
|
||||
<geom name="foot2_left" class="foot2"/>
|
||||
</body>
|
||||
</body>
|
||||
</body>
|
||||
</body>
|
||||
</body>
|
||||
<body name="upper_arm_right" pos="0 -.17 .06">
|
||||
<joint name="shoulder1_right" axis="2 1 1" class="shoulder"/>
|
||||
<joint name="shoulder2_right" axis="0 -1 1" class="shoulder"/>
|
||||
<geom name="upper_arm_right" fromto="0 0 0 .16 -.16 -.16" class="arm_upper"/>
|
||||
<body name="lower_arm_right" pos=".18 -.18 -.18">
|
||||
<joint name="elbow_right" axis="0 -1 1" class="elbow"/>
|
||||
<geom name="lower_arm_right" fromto=".01 .01 .01 .17 .17 .17" class="arm_lower"/>
|
||||
<body name="hand_right" pos=".18 .18 .18">
|
||||
<geom name="hand_right" zaxis="1 1 1" class="hand"/>
|
||||
</body>
|
||||
</body>
|
||||
</body>
|
||||
<body name="upper_arm_left" pos="0 .17 .06">
|
||||
<joint name="shoulder1_left" axis="-2 1 -1" class="shoulder"/>
|
||||
<joint name="shoulder2_left" axis="0 -1 -1" class="shoulder"/>
|
||||
<geom name="upper_arm_left" fromto="0 0 0 .16 .16 -.16" class="arm_upper"/>
|
||||
<body name="lower_arm_left" pos=".18 .18 -.18">
|
||||
<joint name="elbow_left" axis="0 -1 -1" class="elbow"/>
|
||||
<geom name="lower_arm_left" fromto=".01 -.01 .01 .17 -.17 .17" class="arm_lower"/>
|
||||
<body name="hand_left" pos=".18 -.18 .18">
|
||||
<geom name="hand_left" zaxis="1 -1 1" class="hand"/>
|
||||
</body>
|
||||
</body>
|
||||
</body>
|
||||
</body>
|
||||
</worldbody>
|
||||
|
||||
<contact>
|
||||
<exclude body1="waist_lower" body2="thigh_right"/>
|
||||
<exclude body1="waist_lower" body2="thigh_left"/>
|
||||
</contact>
|
||||
|
||||
<tendon>
|
||||
<fixed name="hamstring_right" limited="true" range="-0.3 2">
|
||||
<joint joint="hip_y_right" coef=".5"/>
|
||||
<joint joint="knee_right" coef="-.5"/>
|
||||
</fixed>
|
||||
<fixed name="hamstring_left" limited="true" range="-0.3 2">
|
||||
<joint joint="hip_y_left" coef=".5"/>
|
||||
<joint joint="knee_left" coef="-.5"/>
|
||||
</fixed>
|
||||
</tendon>
|
||||
|
||||
<actuator>
|
||||
<motor name="abdomen_z" gear="40" joint="abdomen_z"/>
|
||||
<motor name="abdomen_y" gear="40" joint="abdomen_y"/>
|
||||
<motor name="abdomen_x" gear="40" joint="abdomen_x"/>
|
||||
<motor name="hip_x_right" gear="40" joint="hip_x_right"/>
|
||||
<motor name="hip_z_right" gear="40" joint="hip_z_right"/>
|
||||
<motor name="hip_y_right" gear="120" joint="hip_y_right"/>
|
||||
<motor name="knee_right" gear="80" joint="knee_right"/>
|
||||
<motor name="ankle_y_right" gear="20" joint="ankle_y_right"/>
|
||||
<motor name="ankle_x_right" gear="20" joint="ankle_x_right"/>
|
||||
<motor name="hip_x_left" gear="40" joint="hip_x_left"/>
|
||||
<motor name="hip_z_left" gear="40" joint="hip_z_left"/>
|
||||
<motor name="hip_y_left" gear="120" joint="hip_y_left"/>
|
||||
<motor name="knee_left" gear="80" joint="knee_left"/>
|
||||
<motor name="ankle_y_left" gear="20" joint="ankle_y_left"/>
|
||||
<motor name="ankle_x_left" gear="20" joint="ankle_x_left"/>
|
||||
<motor name="shoulder1_right" gear="20" joint="shoulder1_right"/>
|
||||
<motor name="shoulder2_right" gear="20" joint="shoulder2_right"/>
|
||||
<motor name="elbow_right" gear="40" joint="elbow_right"/>
|
||||
<motor name="shoulder1_left" gear="20" joint="shoulder1_left"/>
|
||||
<motor name="shoulder2_left" gear="20" joint="shoulder2_left"/>
|
||||
<motor name="elbow_left" gear="40" joint="elbow_left"/>
|
||||
</actuator>
|
||||
|
||||
<keyframe>
|
||||
<!--
|
||||
The values below are split into rows for readibility:
|
||||
torso position
|
||||
torso orientation
|
||||
spinal
|
||||
right leg
|
||||
left leg
|
||||
arms
|
||||
-->
|
||||
<key name="squat"
|
||||
qpos="0 0 0.596
|
||||
0.988015 0 0.154359 0
|
||||
0 0.4 0
|
||||
-0.25 -0.5 -2.5 -2.65 -0.8 0.56
|
||||
-0.25 -0.5 -2.5 -2.65 -0.8 0.56
|
||||
0 0 0 0 0 0"/>
|
||||
<key name="stand_on_left_leg"
|
||||
qpos="0 0 1.21948
|
||||
0.971588 -0.179973 0.135318 -0.0729076
|
||||
-0.0516 -0.202 0.23
|
||||
-0.24 -0.007 -0.34 -1.76 -0.466 -0.0415
|
||||
-0.08 -0.01 -0.37 -0.685 -0.35 -0.09
|
||||
0.109 -0.067 -0.7 -0.05 0.12 0.16"/>
|
||||
<key name="prone"
|
||||
qpos="0.4 0 0.0757706
|
||||
0.7325 0 0.680767 0
|
||||
0 0.0729 0
|
||||
0.0077 0.0019 -0.026 -0.351 -0.27 0
|
||||
0.0077 0.0019 -0.026 -0.351 -0.27 0
|
||||
0.56 -0.62 -1.752
|
||||
0.56 -0.62 -1.752"/>
|
||||
<key name="supine"
|
||||
qpos="-0.4 0 0.08122
|
||||
0.722788 0 -0.69107 0
|
||||
0 -0.25 0
|
||||
0.0182 0.0142 0.3 0.042 -0.44 -0.02
|
||||
0.0182 0.0142 0.3 0.042 -0.44 -0.02
|
||||
0.186 -0.73 -1.73
|
||||
0.186 -0.73 -1.73"/>
|
||||
</keyframe>
|
||||
</mujoco>
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
<mujoco>
|
||||
<option viscosity="30" integrator="implicit">
|
||||
<flag gravity="disable" constraint="disable" contact="disable" energy="enable" sleep="enable"/>
|
||||
</option>
|
||||
|
||||
<worldbody>
|
||||
<replicate offset="0 0 2.5" count="7">
|
||||
<replicate offset="4 0 0" count="7">
|
||||
<replicate offset="0 2 0" count="7">
|
||||
<body sleep="init">
|
||||
<geom size=".4"/>
|
||||
<freejoint/>
|
||||
<body pos="-.4 0 0">
|
||||
<geom type="cylinder" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
<joint type="slide" axis="0 0 1" springref="0.2" stiffness="1000" damping="100"/>
|
||||
</body>
|
||||
</body>
|
||||
|
||||
<body pos="1 0 0" sleep="init">
|
||||
<geom type="capsule" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
<joint axis="1 0 0" stiffness="300" damping="30"/>
|
||||
<body pos="0 0 1">
|
||||
<geom type="capsule" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
<joint axis="1 0 0" springref="45" stiffness="300" damping="30"/>
|
||||
</body>
|
||||
</body>
|
||||
|
||||
<body pos="2 0 0" sleep="init">
|
||||
<geom type="box" size=".2 .2 .2"/>
|
||||
<joint type="ball" stiffness="300" damping="30"/>
|
||||
<body pos=".2 0 0">
|
||||
<geom type="cylinder" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
<joint type="slide" axis="0 0 1" springref="0.2" stiffness="1000" damping="100"/>
|
||||
</body>
|
||||
</body>
|
||||
</replicate>
|
||||
</replicate>
|
||||
</replicate>
|
||||
</worldbody>
|
||||
</mujoco>
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
<mujoco>
|
||||
<size memory="200M"/>
|
||||
|
||||
<option timestep="1e-2">
|
||||
<flag sleep="enable"/>
|
||||
</option>
|
||||
|
||||
<worldbody>
|
||||
<replicate offset="0 0 2.5" count="7">
|
||||
<replicate offset="4 0 0" count="7">
|
||||
<replicate offset="0 2 0" count="7">
|
||||
<body>
|
||||
<geom size=".4"/>
|
||||
<body pos="-.4 0 0">
|
||||
<geom type="cylinder" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
</body>
|
||||
</body>
|
||||
|
||||
<geom type="box" size="0.1" fromto=".6 0 0 .6 0 1"/>
|
||||
|
||||
<body pos="1 0 0">
|
||||
<geom type="capsule" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
<body pos="0 0 1">
|
||||
<geom type="capsule" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
</body>
|
||||
</body>
|
||||
|
||||
<geom type="box" size="0.1" fromto="1.4 0 0 1.4 0 1"/>
|
||||
|
||||
<body pos="2 0 0">
|
||||
<geom type="box" size=".2 .2 .2"/>
|
||||
<body pos=".2 0 0">
|
||||
<geom type="cylinder" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
</body>
|
||||
</body>
|
||||
</replicate>
|
||||
</replicate>
|
||||
</replicate>
|
||||
</worldbody>
|
||||
</mujoco>
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
<mujoco>
|
||||
<size memory="200M"/>
|
||||
|
||||
<option timestep="1e-2">
|
||||
<flag sleep="enable"/>
|
||||
</option>
|
||||
|
||||
<worldbody>
|
||||
<replicate offset="0 0 2.5" count="7">
|
||||
<replicate offset="4 0 0" count="7">
|
||||
<replicate offset="0 2 0" count="7">
|
||||
<frame>
|
||||
<geom size=".4"/>
|
||||
<frame pos="-.4 0 0">
|
||||
<geom type="cylinder" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
</frame>
|
||||
</frame>
|
||||
|
||||
<geom type="box" size="0.1" fromto=".6 0 0 .6 0 1"/>
|
||||
|
||||
<frame pos="1 0 0">
|
||||
<geom type="capsule" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
<frame pos="0 0 1">
|
||||
<geom type="capsule" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
</frame>
|
||||
</frame>
|
||||
|
||||
<geom type="box" size="0.1" fromto="1.4 0 0 1.4 0 1"/>
|
||||
|
||||
<frame pos="2 0 0">
|
||||
<geom type="box" size=".2 .2 .2"/>
|
||||
<frame pos=".2 0 0">
|
||||
<geom type="cylinder" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
</frame>
|
||||
</frame>
|
||||
</replicate>
|
||||
</replicate>
|
||||
</replicate>
|
||||
</worldbody>
|
||||
</mujoco>
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
<mujoco>
|
||||
<custom>
|
||||
<numeric name="duration" data="2.0"/>
|
||||
</custom>
|
||||
|
||||
<option>
|
||||
<flag sleep="enable" warmstart="disable"/>
|
||||
</option>
|
||||
|
||||
<worldbody>
|
||||
<light pos="0 -1 3"/>
|
||||
<geom name="floor" type="plane" size="1 1 .01"/>
|
||||
|
||||
<body name="1" pos="0 0 .1">
|
||||
<freejoint/>
|
||||
<geom name="1" type="box" size=".1 .1 .1"/>
|
||||
</body>
|
||||
|
||||
<body name="2" pos="0 0 .3">
|
||||
<freejoint/>
|
||||
<geom name="2" type="box" size=".1 .1 .1"/>
|
||||
<site name="2"/>
|
||||
</body>
|
||||
|
||||
<body name="3" pos="0 0 1.2" euler="10 20 30">
|
||||
<freejoint/>
|
||||
<geom name="3" type="box" size=".1 .1 .1"/>
|
||||
</body>
|
||||
</worldbody>
|
||||
|
||||
<sensor>
|
||||
<contact reduce="maxforce" data="force"/>
|
||||
<contact geom1="1" geom2="2"/>
|
||||
<contact geom1="1" geom2="2" reduce="maxforce" data="force"/>
|
||||
<contact geom1="1" geom2="floor"/>
|
||||
<contact geom1="1" reduce="maxforce" data="force"/>
|
||||
<gyro site="2"/>
|
||||
<clock/>
|
||||
</sensor>
|
||||
</mujoco>
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
<mujoco>
|
||||
<custom>
|
||||
<numeric name="duration" data="6.5"/>
|
||||
</custom>
|
||||
|
||||
<option viscosity="60" gravity="0 0 -1">
|
||||
<flag energy="enable" sleep="enable" constraint="disable" contact="disable"/>
|
||||
</option>
|
||||
|
||||
<worldbody>
|
||||
<body gravcomp="1">
|
||||
<geom type="box" size=".2 .2 .2"/>
|
||||
<freejoint/>
|
||||
<body pos="-.4 0 0" gravcomp="1">
|
||||
<geom type="cylinder" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
<joint type="slide" axis="0 0 1" springref="0.2" springdamper="0.1 1"/>
|
||||
</body>
|
||||
</body>
|
||||
|
||||
<body pos="1 0 0">
|
||||
<geom type="box" size=".2 .2 .2"/>
|
||||
<body>
|
||||
<joint axis="1 0 0" springdamper="0.1 1"/>
|
||||
<geom type="capsule" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
<site name="1" pos="0 -.1 .5" size=".03" rgba="1 0 0 1"/>
|
||||
<body pos="0 0 1">
|
||||
<joint axis="1 0 0" springref="45" springdamper="0.1 1"/>
|
||||
<geom type="capsule" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
<site name="2" pos="0 -.1 .5" size=".03" rgba="1 0 0 1"/>
|
||||
</body>
|
||||
</body>
|
||||
</body>
|
||||
|
||||
<body pos="2 0 0">
|
||||
<geom size=".3"/>
|
||||
<joint type="ball" stiffness="300" damping="30"/>
|
||||
<body name="angmom" pos=".2 0 0">
|
||||
<geom type="cylinder" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
<joint type="slide" axis="0 0 1" springref="0.2" stiffness="1000" damping="100"/>
|
||||
</body>
|
||||
</body>
|
||||
</worldbody>
|
||||
|
||||
<tendon>
|
||||
<spatial width="0.01" armature="1">
|
||||
<site site="1"/>
|
||||
<site site="2"/>
|
||||
</spatial>
|
||||
</tendon>
|
||||
|
||||
<sensor>
|
||||
<subtreeangmom body="angmom"/>
|
||||
</sensor>
|
||||
</mujoco>
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
<mujoco>
|
||||
<custom>
|
||||
<numeric name="duration" data="0.1"/>
|
||||
</custom>
|
||||
|
||||
<option>
|
||||
<flag sleep="enable"/>
|
||||
</option>
|
||||
|
||||
<worldbody>
|
||||
<body>
|
||||
<geom type="box" size=".2 .2 .2"/>
|
||||
<body pos="-.4 0 0">
|
||||
<geom type="cylinder" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
</body>
|
||||
</body>
|
||||
|
||||
<body pos="1 0 0">
|
||||
<geom type="capsule" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
<body pos="0 0 1">
|
||||
<geom type="capsule" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
<site/>
|
||||
</body>
|
||||
</body>
|
||||
|
||||
<body pos="2 0 0">
|
||||
<geom size=".3"/>
|
||||
<body pos=".2 0 0">
|
||||
<geom type="cylinder" size="0.1" fromto="0 0 0 0 0 1"/>
|
||||
<camera/>
|
||||
<light pos="0 0 1.5"/>
|
||||
</body>
|
||||
</body>
|
||||
</worldbody>
|
||||
</mujoco>
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
<mujoco>
|
||||
<custom>
|
||||
<numeric name="duration" data="2.0"/>
|
||||
</custom>
|
||||
|
||||
<option>
|
||||
<flag sleep="enable"/>
|
||||
</option>
|
||||
|
||||
<worldbody>
|
||||
<light pos="0 -1 4"/>
|
||||
<geom type="plane" size="1.5 1.5 .01" rgba=".5 .5 .5 .5"/>
|
||||
|
||||
<body pos=".3 0 1" sleep="init">
|
||||
<freejoint/>
|
||||
<geom type="box" size=".1 .1 .1"/>
|
||||
<site name="1" pos="-.1 -.1 -.1" size=".01" rgba="1 0 0 1"/>
|
||||
</body>
|
||||
|
||||
<body pos="-.3 0 1" euler="10 20 30">
|
||||
<freejoint/>
|
||||
<geom type="box" size=".1 .1 .1"/>
|
||||
<site name="2" pos=".1 -.1 .1" size=".01" rgba="1 0 0 1"/>
|
||||
</body>
|
||||
</worldbody>
|
||||
|
||||
<tendon>
|
||||
<spatial range="0 .6" width="0.01">
|
||||
<site site="1"/>
|
||||
<site site="2"/>
|
||||
</spatial>
|
||||
</tendon>
|
||||
</mujoco>
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
<mujoco>
|
||||
<option>
|
||||
<flag sleep="enable"/>
|
||||
</option>
|
||||
|
||||
<worldbody>
|
||||
<light pos="0 -1 4"/>
|
||||
<geom type="plane" size="1.5 1.5 .01" rgba=".5 .5 .5 .5"/>
|
||||
|
||||
<body pos=".3 0 1" sleep="init">
|
||||
<freejoint/>
|
||||
<geom type="box" size=".1 .1 .1"/>
|
||||
<site name="1" pos="-.1 -.1 -.1" size=".01" rgba="1 0 0 1"/>
|
||||
<site name="2" pos=".1 -.1 -.1" size=".01" rgba="1 0 0 1"/>
|
||||
</body>
|
||||
|
||||
<body pos="-.3 0 1" euler="10 20 30">
|
||||
<freejoint/>
|
||||
<geom type="box" size=".1 .1 .1"/>
|
||||
<site name="3" pos=".1 -.1 .1" size=".01" rgba="1 0 0 1"/>
|
||||
</body>
|
||||
|
||||
<body pos=".7 0 1" sleep="init">
|
||||
<freejoint/>
|
||||
<geom type="box" size=".1 .1 .1"/>
|
||||
<site name="4" pos="-.1 -.1 -.1" size=".01" rgba="1 0 0 1"/>
|
||||
</body>
|
||||
</worldbody>
|
||||
|
||||
<tendon>
|
||||
<spatial range="0 .6" width="0.01">
|
||||
<site site="1"/>
|
||||
<site site="3"/>
|
||||
</spatial>
|
||||
<spatial range="0 .6" width="0.01">
|
||||
<site site="2"/>
|
||||
<site site="4"/>
|
||||
</spatial>
|
||||
</tendon>
|
||||
</mujoco>
|
||||
Reference in New Issue
Block a user