Add private function mj_makeM.

PiperOrigin-RevId: 757689756
Change-Id: Ie8bb49d9f18a95da2e3fd8622e30f9266a1ced98
This commit is contained in:
Yuval Tassa
2025-05-12 03:51:31 -07:00
committed by Copybara-Service
parent 9accc7ae51
commit 85dd78d6f3
5 changed files with 22 additions and 15 deletions
+8 -3
View File
@@ -1471,7 +1471,6 @@ void mj_transmission(const mjModel* m, mjData* d) {
// add tendon armature to qM // add tendon armature to qM
void mj_tendonArmature(const mjModel* m, mjData* d) { void mj_tendonArmature(const mjModel* m, mjData* d) {
TM_START;
int nv = m->nv, ntendon = m->ntendon, issparse = mj_isSparse(m); int nv = m->nv, ntendon = m->ntendon, issparse = mj_isSparse(m);
for (int k=0; k < ntendon; k++) { for (int k=0; k < ntendon; k++) {
@@ -1521,14 +1520,12 @@ void mj_tendonArmature(const mjModel* m, mjData* d) {
} }
} }
} }
TM_END(mjTIMER_POS_INERTIA);
} }
// composite rigid body inertia algorithm // composite rigid body inertia algorithm
void mj_crb(const mjModel* m, mjData* d) { void mj_crb(const mjModel* m, mjData* d) {
TM_START;
mjtNum buf[6]; mjtNum buf[6];
mjtNum* crb = d->crb; mjtNum* crb = d->crb;
int last_body = m->nbody - 1, nv = m->nv; int last_body = m->nbody - 1, nv = m->nv;
@@ -1574,6 +1571,14 @@ void mj_crb(const mjModel* m, mjData* d) {
d->qM[Madr_ij++] += mju_dot(d->cdof+6*j, buf, 6); d->qM[Madr_ij++] += mju_dot(d->cdof+6*j, buf, 6);
} }
} }
}
void mj_makeM(const mjModel* m, mjData* d) {
TM_START;
mj_crb(m, d);
mj_tendonArmature(m, d);
TM_END(mjTIMER_POS_INERTIA); TM_END(mjTIMER_POS_INERTIA);
} }
+3
View File
@@ -54,6 +54,9 @@ MJAPI void mj_crb(const mjModel* m, mjData* d);
// add tendon armature to qM // add tendon armature to qM
MJAPI void mj_tendonArmature(const mjModel* m, mjData* d); MJAPI void mj_tendonArmature(const mjModel* m, mjData* d);
// make inertia matrix
void mj_makeM(const mjModel* m, mjData* d);
// sparse L'*D*L factorizaton of inertia-like matrix M, assumed spd (legacy implementation) // sparse L'*D*L factorizaton of inertia-like matrix M, assumed spd (legacy implementation)
MJAPI void mj_factorI_legacy(const mjModel* m, mjData* d, const mjtNum* M, MJAPI void mj_factorI_legacy(const mjModel* m, mjData* d, const mjtNum* M,
mjtNum* qLD, mjtNum* qLDiagInv); mjtNum* qLD, mjtNum* qLDiagInv);
+9 -8
View File
@@ -114,16 +114,15 @@ typedef struct mjFwdPositionArgs_ mjFwdPositionArgs;
// wrapper for mj_crb and mj_factorM // wrapper for mj_crb and mj_factorM
void* mj_inertialThreaded(void* args) { void* mj_inertialThreaded(void* args) {
mjFwdPositionArgs* forward_args = (mjFwdPositionArgs*) args; mjFwdPositionArgs* forward_args = (mjFwdPositionArgs*) args;
mj_crb(forward_args->m, forward_args->d); // timed internally (POS_INERTIA) mj_makeM(forward_args->m, forward_args->d);
mj_tendonArmature(forward_args->m, forward_args->d); // timed internally (POS_INERTIA) mj_factorM(forward_args->m, forward_args->d);
mj_factorM(forward_args->m, forward_args->d); // timed internally (POS_INERTIA)
return NULL; return NULL;
} }
// wrapper for mj_collision // wrapper for mj_collision
void* mj_collisionThreaded(void* args) { void* mj_collisionThreaded(void* args) {
mjFwdPositionArgs* forward_args = (mjFwdPositionArgs*) args; mjFwdPositionArgs* forward_args = (mjFwdPositionArgs*) args;
mj_collision(forward_args->m, forward_args->d); // timed internally (POS_COLLISION) mj_collision(forward_args->m, forward_args->d);
return NULL; return NULL;
} }
@@ -143,10 +142,12 @@ void mj_fwdPosition(const mjModel* m, mjData* d) {
// no threadpool: inertia and collision on main thread // no threadpool: inertia and collision on main thread
if (!d->threadpool) { if (!d->threadpool) {
mj_crb(m, d); // timed internally (POS_INERTIA) // inertia, timed internally (POS_INERTIA)
mj_tendonArmature(m, d); // timed internally (POS_INERTIA) mj_makeM(m, d);
mj_factorM(m, d); // timed internally (POS_INERTIA) mj_factorM(m, d);
mj_collision(m, d); // timed internally (POS_COLLISION)
// collision, timed internally (POS_COLLISION)
mj_collision(m, d);
} }
// have threadpool: inertia and collision on separate threads // have threadpool: inertia and collision on separate threads
+1 -2
View File
@@ -46,8 +46,7 @@ void mj_invPosition(const mjModel* m, mjData* d) {
mj_tendon(m, d); mj_tendon(m, d);
TM_END(mjTIMER_POS_KINEMATICS); TM_END(mjTIMER_POS_KINEMATICS);
mj_crb(m, d); // timed internally (POS_INERTIA) mj_makeM(m, d); // timed internally (POS_INERTIA)
mj_tendonArmature(m, d); // timed internally (POS_INERTIA)
mj_factorM(m, d); // timed internally (POS_INERTIA) mj_factorM(m, d); // timed internally (POS_INERTIA)
mj_collision(m, d); // timed internally (POS_COLLISION) mj_collision(m, d); // timed internally (POS_COLLISION)
+1 -2
View File
@@ -103,8 +103,7 @@ static void set0(mjModel* m, mjData* d) {
// run remaining computations // run remaining computations
mj_tendon(m, d); mj_tendon(m, d);
mj_crb(m, d); mj_makeM(m, d);
mj_tendonArmature(m, d);
mj_factorM(m, d); mj_factorM(m, d);
mj_flex(m, d); mj_flex(m, d);
mj_transmission(m, d); mj_transmission(m, d);