Implement multi-cell finite element method for interpolated flexes.

This change introduces a `flex_cellcount` field to `mjModel` to specify the number of cells in each dimension for interpolated flexes. The stiffness computation, passive force calculation, and Jacobian derivatives are updated to operate on a per-cell basis, significantly improving performance by localizing computations to the nodes within each cell.

PiperOrigin-RevId: 901216393
Change-Id: Ic23132e609de11e71bb7fef8d1f139daad2ec264
This commit is contained in:
Alessio Quaglino
2026-04-17 04:10:54 -07:00
committed by Copybara-Service
parent 8415dff307
commit 6c7ed66781
36 changed files with 1777 additions and 1039 deletions
+15
View File
@@ -2446,6 +2446,15 @@ struct MjsFlex {
void set_elastic2d(int value) {
ptr_->elastic2d = value;
}
emscripten::val cellcount() const {
return emscripten::val(emscripten::typed_memory_view(3, ptr_->cellcount));
}
int order() const {
return ptr_->order;
}
void set_order(int value) {
ptr_->order = value;
}
mjStringVec &nodebody() const {
return *(ptr_->nodebody);
}
@@ -4640,6 +4649,9 @@ struct MjModel {
emscripten::val flex_interp() const {
return emscripten::val(emscripten::typed_memory_view(ptr_->nflex, ptr_->flex_interp));
}
emscripten::val flex_cellnum() const {
return emscripten::val(emscripten::typed_memory_view(ptr_->nflex * 3, ptr_->flex_cellnum));
}
emscripten::val flex_nodeadr() const {
return emscripten::val(emscripten::typed_memory_view(ptr_->nflex, ptr_->flex_nodeadr));
}
@@ -11806,6 +11818,7 @@ EMSCRIPTEN_BINDINGS(mujoco_bindings) {
.property("flex_bending", &MjModel::flex_bending)
.property("flex_bvhadr", &MjModel::flex_bvhadr)
.property("flex_bvhnum", &MjModel::flex_bvhnum)
.property("flex_cellnum", &MjModel::flex_cellnum)
.property("flex_centered", &MjModel::flex_centered)
.property("flex_conaffinity", &MjModel::flex_conaffinity)
.property("flex_condim", &MjModel::flex_condim)
@@ -12569,6 +12582,7 @@ EMSCRIPTEN_BINDINGS(mujoco_bindings) {
.property("info", &MjsExclude::info, &MjsExclude::set_info, reference());
emscripten::class_<MjsFlex>("MjsFlex")
.property("activelayers", &MjsFlex::activelayers, &MjsFlex::set_activelayers, reference())
.property("cellcount", &MjsFlex::cellcount)
.property("conaffinity", &MjsFlex::conaffinity, &MjsFlex::set_conaffinity, reference())
.property("condim", &MjsFlex::condim, &MjsFlex::set_condim, reference())
.property("contype", &MjsFlex::contype, &MjsFlex::set_contype, reference())
@@ -12590,6 +12604,7 @@ EMSCRIPTEN_BINDINGS(mujoco_bindings) {
.property("material", &MjsFlex::material, &MjsFlex::set_material, reference())
.property("node", &MjsFlex::node, reference())
.property("nodebody", &MjsFlex::nodebody, reference())
.property("order", &MjsFlex::order, &MjsFlex::set_order, reference())
.property("passive", &MjsFlex::passive, &MjsFlex::set_passive, reference())
.property("poisson", &MjsFlex::poisson, &MjsFlex::set_poisson, reference())
.property("priority", &MjsFlex::priority, &MjsFlex::set_priority, reference())