diff --git a/src/xml/xml_native_writer.cc b/src/xml/xml_native_writer.cc index df2a1ef7..fbfd2261 100644 --- a/src/xml/xml_native_writer.cc +++ b/src/xml/xml_native_writer.cc @@ -640,7 +640,13 @@ void mjXWriter::OneActuator(XMLElement* elem, mjCActuator* pact, mjCDef* def) { // non-plugins: write actuator parameters else { - WriteAttrInt(elem, "actdim", pact->actdim, def->actuator.actdim); + // special handling of actdim which has default value of -1 + if (writingdefaults) { + WriteAttrInt(elem, "actdim", pact->actdim, def->actuator.actdim); + } else { + int default_actdim = pact->dyntype == mjDYN_NONE ? 0 : 1; + WriteAttrInt(elem, "actdim", pact->actdim, default_actdim); + } WriteAttrKey(elem, "dyntype", dyn_map, dyn_sz, pact->dyntype, def->actuator.dyntype); WriteAttrKey(elem, "gaintype", gain_map, gain_sz, pact->gaintype, def->actuator.gaintype); WriteAttrKey(elem, "biastype", bias_map, bias_sz, pact->biastype, def->actuator.biastype); diff --git a/test/xml/xml_native_writer_test.cc b/test/xml/xml_native_writer_test.cc index 6c9d6470..1527b201 100644 --- a/test/xml/xml_native_writer_test.cc +++ b/test/xml/xml_native_writer_test.cc @@ -844,6 +844,8 @@ TEST_F(XMLWriterTest, Actdim) { + + )"; @@ -851,6 +853,8 @@ TEST_F(XMLWriterTest, Actdim) { ASSERT_THAT(model, NotNull()); std::string saved_xml = SaveAndReadXml(model); EXPECT_THAT(saved_xml, HasSubstr("actdim=\"2\"")); + EXPECT_THAT(saved_xml, Not(HasSubstr("actdim=\"1\""))); + EXPECT_THAT(saved_xml, Not(HasSubstr("actdim=\"0\""))); mj_deleteModel(model); }