diff --git a/src/engine/engine_io.c b/src/engine/engine_io.c index 77dd0063..5626baee 100644 --- a/src/engine/engine_io.c +++ b/src/engine/engine_io.c @@ -2072,8 +2072,7 @@ const char* mj_validateReferences(const mjModel* m) { return "Invalid model: invalid sensor_refid"; } if (sensor_type == mjSENS_TACTILE) { - int obj_id = m->sensor_objid[i]; - int parent_body = m->geom_bodyid[obj_id]; + int parent_body = m->geom_bodyid[m->sensor_refid[i]]; int collision_geoms = 0; for (int b = 0; b < m->body_geomnum[parent_body]; ++b) { int geom_id = m->body_geomadr[parent_body]+b; diff --git a/test/engine/engine_sensor_test.cc b/test/engine/engine_sensor_test.cc index 01aced2e..1474c856 100644 --- a/test/engine/engine_sensor_test.cc +++ b/test/engine/engine_sensor_test.cc @@ -1784,5 +1784,34 @@ TEST_F(SensorTest, InsideSiteFlexBody) { mj_deleteModel(m); } +// Test that a tactile sensor's compile-time body-collision check correctly +// uses the referenced Geom ID instead of mistakenly indexing by Mesh ID. +TEST_F(SensorTest, TactileMeshIdMismatchedValidator) { + static constexpr char xml[] = R"( + + + + + + + + + + + + + + + + + )"; + + char error[1024] = {0}; + mjModel* m = LoadModelFromString(xml, error, sizeof(error)); + ASSERT_THAT(m, NotNull()) << error; + + mj_deleteModel(m); +} + } // namespace } // namespace mujoco