diff --git a/CMakeLists.txt b/CMakeLists.txt
index 684bc3bec..20d732d51 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -60,6 +60,16 @@ set(MUJOCO_MPC_MUJOCO_GIT_TAG
CACHE STRING "Git revision for MuJoCo."
)
+set(MUJOCO_MPC_MENAGERIE_GIT_TAG
+ aef3ee5c07ea51506e893a62fd832773ff0162c8
+ CACHE STRING "Git revision for MuJoCo Menagerie."
+)
+
+set(MUJOCO_MPC_DM_CONTROL_GIT_TAG
+ 774f46182140106e22725914aad3c6299ed91edd
+ CACHE STRING "Git revision for dm_control."
+)
+
findorfetch(
USE_SYSTEM_PACKAGE
OFF
@@ -160,7 +170,7 @@ unset(BUILD_SHARED_LIBS_OLD)
FetchContent_Declare(
menagerie
GIT_REPOSITORY https://github.com/google-deepmind/mujoco_menagerie.git
- GIT_TAG main
+ GIT_TAG ${MUJOCO_MPC_MENAGERIE_GIT_TAG}
)
FetchContent_GetProperties(menagerie)
@@ -168,6 +178,17 @@ if(NOT menagerie_POPULATED)
FetchContent_Populate(menagerie)
endif()
+FetchContent_Declare(
+ dm_control
+ GIT_REPOSITORY https://github.com/google-deepmind/dm_control.git
+ GIT_TAG ${MUJOCO_MPC_DM_CONTROL_GIT_TAG}
+)
+
+FetchContent_GetProperties(dm_control)
+if(NOT dm_control_POPULATED)
+ FetchContent_Populate(dm_control)
+endif()
+
if(NOT TARGET lodepng)
FetchContent_Declare(
lodepng
diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md
index c2e01a1b1..c4df15bf1 100644
--- a/docs/CONTRIBUTING.md
+++ b/docs/CONTRIBUTING.md
@@ -32,7 +32,13 @@ This code adheres to the [Google style](https://google.github.io/styleguide/).
## New Tasks
-When submitting a PR for a new task using models from [MuJoCo Menagerie](https://github.com/google-deepmind/mujoco_menagerie), do not include assets directly. Instead, modify the task [CMakeLists](mjpc/tasks/CMakeLists.txt) to copy these assets to the build binary.
+When submitting a PR for a new task that depends on third-party models, including from [MuJoCo Menagerie](https://github.com/google-deepmind/mujoco_menagerie) and [dm_control](https://github.com/google-deepmind/dm_control), do not include the xml model or assets in the task directly. Instead, modify the task [CMakeLists](mjpc/tasks/CMakeLists.txt) to copy the xml model and/or assets to the build binary.
+
+If the xml model needs to be modified, create a patch that is applied in the [CMakeLists](mjpc/tasks/CMakeLists.txt). A [patch](https://github.com/google-deepmind/mujoco_mpc/blob/main/mjpc/tasks/op3/op3.xml.patch) can be generated using the following command:
+```
+diff -u {original}.xml {modified}.xml > {modified}.xml.patch
+```
+The first three lines of the generated patch file will need to be be adapted for your use case. Please see an [example](https://github.com/google-deepmind/mujoco_mpc/blob/main/mjpc/tasks/op3/op3.xml.patch) for a template.
## Unit Tests
diff --git a/mjpc/tasks/CMakeLists.txt b/mjpc/tasks/CMakeLists.txt
index 4112694dc..e152534af 100644
--- a/mjpc/tasks/CMakeLists.txt
+++ b/mjpc/tasks/CMakeLists.txt
@@ -16,7 +16,55 @@
# built binary.
add_custom_target(
- copy_menagerie_resources ALL
+ copy_model_resources ALL
+ ## dm_control models
+ # acrobot
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${dm_control_SOURCE_DIR}/dm_control/suite/acrobot.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/acrobot/acrobot.xml
+ COMMAND patch -o ${CMAKE_CURRENT_BINARY_DIR}/acrobot/acrobot_modified.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/acrobot/acrobot.xml
+ <${CMAKE_CURRENT_SOURCE_DIR}/acrobot/acrobot.xml.patch
+ # cartpole
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${dm_control_SOURCE_DIR}/dm_control/suite/cartpole.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/cartpole/cartpole.xml
+ COMMAND patch -o ${CMAKE_CURRENT_BINARY_DIR}/cartpole/cartpole_modified.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/cartpole/cartpole.xml
+ <${CMAKE_CURRENT_SOURCE_DIR}/cartpole/cartpole.xml.patch
+ # humanoid
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${dm_control_SOURCE_DIR}/dm_control/suite/humanoid.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/humanoid/humanoid.xml
+ COMMAND patch -o ${CMAKE_CURRENT_BINARY_DIR}/humanoid/humanoid_modified.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/humanoid/humanoid.xml
+ <${CMAKE_CURRENT_SOURCE_DIR}/humanoid/humanoid.xml.patch
+ # particle
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${dm_control_SOURCE_DIR}/dm_control/suite/point_mass.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/particle/particle.xml
+ COMMAND patch -o ${CMAKE_CURRENT_BINARY_DIR}/particle/particle_modified.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/particle/particle.xml
+ <${CMAKE_CURRENT_SOURCE_DIR}/particle/particle.xml.patch
+ # swimmer
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${dm_control_SOURCE_DIR}/dm_control/suite/swimmer.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/swimmer/swimmer.xml
+ COMMAND patch -o ${CMAKE_CURRENT_BINARY_DIR}/swimmer/swimmer_modified.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/swimmer/swimmer.xml
+ <${CMAKE_CURRENT_SOURCE_DIR}/swimmer/swimmer.xml.patch
+ # walker
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${dm_control_SOURCE_DIR}/dm_control/suite/walker.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/walker/walker.xml
+ COMMAND patch -o ${CMAKE_CURRENT_BINARY_DIR}/walker/walker_modified.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/walker/walker.xml
+ <${CMAKE_CURRENT_SOURCE_DIR}/walker/walker.xml.patch
+
+ ## Menagerie models
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${menagerie_SOURCE_DIR}/shadow_hand/right_hand.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/hand/right_hand.xml
COMMAND ${CMAKE_COMMAND} -E copy
${menagerie_SOURCE_DIR}/wonik_allegro/right_hand.xml
${CMAKE_CURRENT_BINARY_DIR}/allegro/right_hand.xml
@@ -29,21 +77,39 @@ add_custom_target(
COMMAND ${CMAKE_COMMAND} -E copy_directory
${menagerie_SOURCE_DIR}/shadow_hand/assets
${CMAKE_CURRENT_BINARY_DIR}/hand/assets
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${menagerie_SOURCE_DIR}/franka_emika_panda/panda.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/panda/panda.xml
COMMAND ${CMAKE_COMMAND} -E copy_directory
${menagerie_SOURCE_DIR}/franka_emika_panda/assets
${CMAKE_CURRENT_BINARY_DIR}/panda/assets
+ COMMAND patch -o ${CMAKE_CURRENT_BINARY_DIR}/panda/panda_modified.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/panda/panda.xml
+ <${CMAKE_CURRENT_SOURCE_DIR}/panda/panda.xml.patch
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${menagerie_SOURCE_DIR}/unitree_a1/a1.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/quadruped/a1.xml
COMMAND ${CMAKE_COMMAND} -E copy_directory
${menagerie_SOURCE_DIR}/unitree_a1/assets
${CMAKE_CURRENT_BINARY_DIR}/quadruped/assets
+ COMMAND patch -o ${CMAKE_CURRENT_BINARY_DIR}/quadruped/a1_modified.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/quadruped/a1.xml
+ <${CMAKE_CURRENT_SOURCE_DIR}/quadruped/a1.xml.patch
COMMAND ${CMAKE_COMMAND} -E copy_directory
${menagerie_SOURCE_DIR}/franka_emika_panda
${CMAKE_CURRENT_BINARY_DIR}/manipulation
COMMAND ${CMAKE_COMMAND} -E copy_directory
${menagerie_SOURCE_DIR}/robotiq_2f85
${CMAKE_CURRENT_BINARY_DIR}/manipulation
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${menagerie_SOURCE_DIR}/skydio_x2/x2.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/quadrotor/quadrotor.xml
COMMAND ${CMAKE_COMMAND} -E copy_directory
${menagerie_SOURCE_DIR}/skydio_x2/assets
${CMAKE_CURRENT_BINARY_DIR}/quadrotor/assets
+ COMMAND patch -o ${CMAKE_CURRENT_BINARY_DIR}/quadrotor/quadrotor_modified.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/quadrotor/quadrotor.xml
+ <${CMAKE_CURRENT_SOURCE_DIR}/quadrotor/quadrotor.xml.patch
## Cube solve task
# copy cube model from MuJoCo
COMMAND ${CMAKE_COMMAND} -E copy
@@ -97,7 +163,7 @@ add_custom_target(
COMMAND ${Python_EXECUTABLE}
${CMAKE_CURRENT_BINARY_DIR}/manipulation/merge_panda_robotiq.py
${CMAKE_CURRENT_BINARY_DIR}/manipulation/panda_robotiq.xml
- COMMENT "Copying menagerie assets into binary directory")
+ COMMENT "Copying Menagerie and dm_control assets into binary directory")
add_custom_target(copy_resources ALL
COMMAND ${CMAKE_COMMAND} -E copy_directory
@@ -105,6 +171,6 @@ add_custom_target(copy_resources ALL
${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Copying tasks into binary directory")
-add_dependencies(copy_menagerie_resources copy_resources)
+add_dependencies(copy_model_resources copy_resources)
-add_dependencies(libmjpc copy_menagerie_resources)
+add_dependencies(libmjpc copy_model_resources)
diff --git a/mjpc/tasks/acrobot/acrobot.xml b/mjpc/tasks/acrobot/acrobot.xml
deleted file mode 100644
index 4bb92814b..000000000
--- a/mjpc/tasks/acrobot/acrobot.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mjpc/tasks/acrobot/acrobot.xml.patch b/mjpc/tasks/acrobot/acrobot.xml.patch
new file mode 100644
index 000000000..1466a34a1
--- /dev/null
+++ b/mjpc/tasks/acrobot/acrobot.xml.patch
@@ -0,0 +1,28 @@
+diff --git a/acrobot_modified.xml b/acrobot_modified.xml
+--- a/acrobot_modified.xml
++++ b/acrobot_modified.xml
+@@ -6,22 +6,18 @@
+ IEEE control systems 15, no. 1 (1995): 49-55.
+ -->
+
+-
+-
+-
+-
+
+
+
+
+
+-
+
+
+
+-
++
+
+
+
diff --git a/mjpc/tasks/acrobot/task.xml b/mjpc/tasks/acrobot/task.xml
index af2d020ff..3c9900b14 100644
--- a/mjpc/tasks/acrobot/task.xml
+++ b/mjpc/tasks/acrobot/task.xml
@@ -1,6 +1,7 @@
-
+
+
diff --git a/mjpc/tasks/cartpole/cartpole.xml b/mjpc/tasks/cartpole/cartpole.xml
deleted file mode 100644
index 18b778dde..000000000
--- a/mjpc/tasks/cartpole/cartpole.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mjpc/tasks/cartpole/cartpole.xml.patch b/mjpc/tasks/cartpole/cartpole.xml.patch
new file mode 100644
index 000000000..742fd0167
--- /dev/null
+++ b/mjpc/tasks/cartpole/cartpole.xml.patch
@@ -0,0 +1,37 @@
+diff --git a/cartpole_modified.xml b/cartpole_modified.xml
+--- a/cartpole_modified.xml
++++ b/cartpole_modified.xml
+@@ -1,10 +1,6 @@
+-
+-
+-
+-
+-
+-
diff --git a/mjpc/tasks/cartpole/task.xml b/mjpc/tasks/cartpole/task.xml
index 77722aca5..46c2002b6 100644
--- a/mjpc/tasks/cartpole/task.xml
+++ b/mjpc/tasks/cartpole/task.xml
@@ -1,6 +1,7 @@
-
+
+
diff --git a/mjpc/tasks/hand/right_hand.xml b/mjpc/tasks/hand/right_hand.xml
deleted file mode 100644
index d0f50d98b..000000000
--- a/mjpc/tasks/hand/right_hand.xml
+++ /dev/null
@@ -1,345 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mjpc/tasks/hand/task.xml b/mjpc/tasks/hand/task.xml
index 9f9ef120f..55d1a813f 100644
--- a/mjpc/tasks/hand/task.xml
+++ b/mjpc/tasks/hand/task.xml
@@ -47,6 +47,7 @@
+
diff --git a/mjpc/tasks/humanoid/humanoid.xml b/mjpc/tasks/humanoid/humanoid.xml
deleted file mode 100644
index 1875b3922..000000000
--- a/mjpc/tasks/humanoid/humanoid.xml
+++ /dev/null
@@ -1,231 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mjpc/tasks/humanoid/humanoid.xml.patch b/mjpc/tasks/humanoid/humanoid.xml.patch
new file mode 100644
index 000000000..6375430bd
--- /dev/null
+++ b/mjpc/tasks/humanoid/humanoid.xml.patch
@@ -0,0 +1,386 @@
+diff --git a/humanoid_modified.xml b/humanoid_modified.xml
+--- a/humanoid_modified.xml
++++ b/humanoid_modified.xml
+@@ -1,202 +1,231 @@
+-
+-
+-
+-
++
+
+
+
+-
+-
+
+
++
+
+-
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+
+-
++
+
+-
++
++
++
++
++
++
++
++
++
++
+
+
+
+-
+-
+-
++
++
+
+-
+-
++
++
++
++
++
++
++
++
+
++
++
++
++
++
++
++
++
++
++
++
+
+
+
+
+-
+-
++
++
+
+
+
+
+-
+
+-
+-
++
+
+
+-
++
+
+
+-
+-
+-
+-
+-
+-
+-
++
++
++
++
++
++
++
+
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+
+
+
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+
+
+
+
+
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
++
++
++
++
++
++
++
++
++
++
++
++
+
+
+
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
++
++
++
++
++
++
++
++
++
++
++
++
+
+
+
+
+
+
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+
+
+
+
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+
+
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+
+-
diff --git a/mjpc/tasks/humanoid/stand/stand.cc b/mjpc/tasks/humanoid/stand/stand.cc
index 9bf54888f..5f961a092 100644
--- a/mjpc/tasks/humanoid/stand/stand.cc
+++ b/mjpc/tasks/humanoid/stand/stand.cc
@@ -17,7 +17,6 @@
#include
#include
-#include "mjpc/task.h"
#include "mjpc/utilities.h"
diff --git a/mjpc/tasks/humanoid/stand/task.xml b/mjpc/tasks/humanoid/stand/task.xml
index be205167a..b44dde25b 100644
--- a/mjpc/tasks/humanoid/stand/task.xml
+++ b/mjpc/tasks/humanoid/stand/task.xml
@@ -1,6 +1,7 @@
-
+
+
diff --git a/mjpc/tasks/humanoid/tracking/task.xml b/mjpc/tasks/humanoid/tracking/task.xml
index a632c1dd5..fceae194a 100644
--- a/mjpc/tasks/humanoid/tracking/task.xml
+++ b/mjpc/tasks/humanoid/tracking/task.xml
@@ -1,6 +1,7 @@
-
+
+
diff --git a/mjpc/tasks/humanoid/walk/task.xml b/mjpc/tasks/humanoid/walk/task.xml
index 99ecd8b44..99b65b701 100644
--- a/mjpc/tasks/humanoid/walk/task.xml
+++ b/mjpc/tasks/humanoid/walk/task.xml
@@ -1,6 +1,7 @@
-
+
+
diff --git a/mjpc/tasks/panda/panda.xml b/mjpc/tasks/panda/panda.xml
deleted file mode 100644
index 4bbb1bbd8..000000000
--- a/mjpc/tasks/panda/panda.xml
+++ /dev/null
@@ -1,278 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mjpc/tasks/panda/panda.xml.patch b/mjpc/tasks/panda/panda.xml.patch
new file mode 100644
index 000000000..dd03406ab
--- /dev/null
+++ b/mjpc/tasks/panda/panda.xml.patch
@@ -0,0 +1,177 @@
+diff --git a/panda_modified.xml b/panda_modified.xml
+--- a/panda_modified.xml
++++ b/panda_modified.xml
+@@ -1,13 +1,12 @@
+
+
+
+-
++
+
+
+
+
+-
+-
++
+
+
+
+@@ -119,7 +118,7 @@
+
+
+
++ fullinertia="0.00315 0.00388 0.004285 8.2904e-7 0.00015 8.2299e-6"/>
+
+
+
+@@ -132,39 +131,39 @@
+
+
+
+-
++
+
+-
++ fullinertia="0.70337 0.70661 0.0091170 -0.00013900 0.0067720 0.019169"/>
++
+
+
+-
++
+
++ fullinertia="0.0079620 2.8110e-2 2.5995e-2 -3.925e-3 1.0254e-2 7.04e-4"/>
+
+
+
+-
++
+
+
++ fullinertia="3.7242e-2 3.6155e-2 1.083e-2 -4.761e-3 -1.1396e-2 -1.2805e-2"/>
+
+
+
+
+
+-
++
+
+-
++ fullinertia="2.5853e-2 1.9552e-2 2.8323e-2 7.796e-3 -1.332e-3 8.641e-3"/>
++
+
+
+
+
+
+-
++
+
++ fullinertia="3.5549e-2 2.9474e-2 8.627e-3 -2.117e-3 -4.037e-3 2.29e-4"/>
+
+
+
+@@ -172,9 +171,9 @@
+
+
+
+-
++
+
++ fullinertia="1.964e-3 4.354e-3 5.433e-3 1.09e-4 -1.158e-3 3.41e-4"/>
+
+
+
+@@ -194,10 +193,11 @@
+
+
+
+-
++
++
+
+-
++ fullinertia="1.2516e-2 1.0027e-2 4.815e-3 -4.28e-4 -1.196e-3 -7.41e-4"/>
++
+
+
+
+@@ -207,7 +207,7 @@
+
+
+
+-
++
+
+
+
+@@ -215,7 +215,8 @@
+
+
+
+-
++
++
+
+
+
+@@ -226,8 +227,10 @@
+
+
+
++
++
+
+-
++
+
+
+
+@@ -238,6 +241,8 @@
+
+
+
++
++
+
+
+
+@@ -262,22 +267,12 @@
+
+
+
+-
+-
+-
+-
+-
+-
+-
+-
+-
++
++
++
++
++
++
++
+
+-
+-
+-
+-
+
diff --git a/mjpc/tasks/panda/task.xml b/mjpc/tasks/panda/task.xml
index 5bc408edf..c14a14592 100644
--- a/mjpc/tasks/panda/task.xml
+++ b/mjpc/tasks/panda/task.xml
@@ -72,5 +72,6 @@
-
+
+
diff --git a/mjpc/tasks/particle/particle.xml b/mjpc/tasks/particle/particle.xml
deleted file mode 100644
index 0ab38f86a..000000000
--- a/mjpc/tasks/particle/particle.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mjpc/tasks/particle/particle.xml.patch b/mjpc/tasks/particle/particle.xml.patch
new file mode 100644
index 000000000..524e33530
--- /dev/null
+++ b/mjpc/tasks/particle/particle.xml.patch
@@ -0,0 +1,57 @@
+diff --git a/particle_modified.xml b/particle_modified.xml
+--- a/particle_modified.xml
++++ b/particle_modified.xml
+@@ -1,9 +1,5 @@
+-
+-
+-
+-
+-
+-
++
++
+
+
+
+@@ -13,9 +9,12 @@
+
+
+
++
++
++
+
+
+-
++
+
+
+
+@@ -26,24 +25,12 @@
+
+
+
++
+
+-
+-
+
+
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+
+-
+-
++
++
+
+
diff --git a/mjpc/tasks/particle/task.xml b/mjpc/tasks/particle/task.xml
index 81b42ddae..e55168d47 100644
--- a/mjpc/tasks/particle/task.xml
+++ b/mjpc/tasks/particle/task.xml
@@ -1,6 +1,7 @@
-
+
+
diff --git a/mjpc/tasks/particle/task_timevarying.xml b/mjpc/tasks/particle/task_timevarying.xml
index 68f815f3f..be3ced241 100644
--- a/mjpc/tasks/particle/task_timevarying.xml
+++ b/mjpc/tasks/particle/task_timevarying.xml
@@ -1,6 +1,7 @@
-
+
+
diff --git a/mjpc/tasks/quadrotor/quadrotor.xml b/mjpc/tasks/quadrotor/quadrotor.xml
deleted file mode 100644
index 621acc0bc..000000000
--- a/mjpc/tasks/quadrotor/quadrotor.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mjpc/tasks/quadrotor/quadrotor.xml.patch b/mjpc/tasks/quadrotor/quadrotor.xml.patch
new file mode 100644
index 000000000..4aecd1afc
--- /dev/null
+++ b/mjpc/tasks/quadrotor/quadrotor.xml.patch
@@ -0,0 +1,33 @@
+diff --git a/quadrotor_modified.xml b/quadrotor_modified.xml
+--- a/quadrotor_modified.xml
++++ b/quadrotor_modified.xml
+@@ -25,13 +25,12 @@
+
+
+
+-
+
+
+
+
+
+-
++
+
+
+
+@@ -58,14 +57,4 @@
+
+
+
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+
diff --git a/mjpc/tasks/quadrotor/task.xml b/mjpc/tasks/quadrotor/task.xml
index 040ff5708..aa1ee6125 100644
--- a/mjpc/tasks/quadrotor/task.xml
+++ b/mjpc/tasks/quadrotor/task.xml
@@ -1,6 +1,7 @@
-
+
+
diff --git a/mjpc/tasks/quadruped/a1.xml b/mjpc/tasks/quadruped/a1.xml
deleted file mode 100644
index ac6a3741b..000000000
--- a/mjpc/tasks/quadruped/a1.xml
+++ /dev/null
@@ -1,205 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mjpc/tasks/quadruped/a1.xml.patch b/mjpc/tasks/quadruped/a1.xml.patch
new file mode 100644
index 000000000..2f7d91a5d
--- /dev/null
+++ b/mjpc/tasks/quadruped/a1.xml.patch
@@ -0,0 +1,239 @@
+diff --git a/a1_modified.xml b/a1_modified.xml
+--- a/a1_modified.xml
++++ b/a1_modified.xml
+@@ -1,24 +1,24 @@
+-
+-
++
++
+
+-
++
+
+
+
+-
+-
+-
++
++
++
+
+
+
+
+
+-
+-
++
++
+
+
+-
+-
++
++
+
+
+
+@@ -47,8 +47,8 @@
+
+
+
+
+
+@@ -67,11 +67,13 @@
+
+
+
+-
+-
++
++
++
++
+
+
++ fullinertia="0.0158533 0.0377999 0.0456542 -3.66e-05 -6.11e-05 -2.75e-05"/>
+
+
+
+@@ -82,126 +84,122 @@
+
+
+
+-
++
+
+
+
+
+-
++
+
+
+
+
+
+
+-
++
+
+
+
+
+-
++
++
+
+
+
+
+-
++
+
+
+
+
+
+-
++
+
+
+
+
+
+
+-
++
+
+
+
+
+-
++
++
+
+
+
+-
+-
++
++
+
+
+
+
+-
++
+
+
+
+
+
+
+-
++
+
+
+
+
+-
++
++
+
+
+
+-
+-
++
++
+
+
+
+
+-
++
+
+
+
+
+
+
+-
++
+
+
+
+
+-
++
++
+
+
+
+
+
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+
diff --git a/mjpc/tasks/quadruped/task_flat.xml b/mjpc/tasks/quadruped/task_flat.xml
index 0543c23e2..7826fa4b8 100644
--- a/mjpc/tasks/quadruped/task_flat.xml
+++ b/mjpc/tasks/quadruped/task_flat.xml
@@ -79,7 +79,8 @@
-
+
+
diff --git a/mjpc/tasks/quadruped/task_hill.xml b/mjpc/tasks/quadruped/task_hill.xml
index 812c90365..cbd57abee 100644
--- a/mjpc/tasks/quadruped/task_hill.xml
+++ b/mjpc/tasks/quadruped/task_hill.xml
@@ -23,7 +23,8 @@
-
+
+
diff --git a/mjpc/tasks/swimmer/swimmer.cc b/mjpc/tasks/swimmer/swimmer.cc
index 59350dfa7..a12b745b6 100644
--- a/mjpc/tasks/swimmer/swimmer.cc
+++ b/mjpc/tasks/swimmer/swimmer.cc
@@ -18,7 +18,6 @@
#include
#include
-#include "mjpc/task.h"
#include "mjpc/utilities.h"
namespace mjpc {
diff --git a/mjpc/tasks/swimmer/swimmer.xml b/mjpc/tasks/swimmer/swimmer.xml
deleted file mode 100644
index 2117c26b9..000000000
--- a/mjpc/tasks/swimmer/swimmer.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mjpc/tasks/swimmer/swimmer.xml.patch b/mjpc/tasks/swimmer/swimmer.xml.patch
new file mode 100644
index 000000000..a72c17b6d
--- /dev/null
+++ b/mjpc/tasks/swimmer/swimmer.xml.patch
@@ -0,0 +1,110 @@
+diff --git a/swimmer_modified.xml b/swimmer_modified.xml
+--- a/swimmer_modified.xml
++++ b/swimmer_modified.xml
+@@ -1,38 +1,35 @@
+
+-
+-
+-
+-
+-
++
+
+
+
+
+
+-
++
+
+-
++
+
+
+-
++
+
+
+
+
+
+
+-
++
+
+
+
+-
++
+
+
+-
+-
+-
+-
+-
++
++
++
++
++
+
+
+
+@@ -40,18 +37,45 @@
+
+
+
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+
+-
+-
+
+
+-
+-
+-
+-
+-
+-
+-
+-
++
++
++
++
++
++
++
+
+
diff --git a/mjpc/tasks/swimmer/task.xml b/mjpc/tasks/swimmer/task.xml
index 68b41572f..f969490f1 100644
--- a/mjpc/tasks/swimmer/task.xml
+++ b/mjpc/tasks/swimmer/task.xml
@@ -1,6 +1,7 @@
-
+
+
diff --git a/mjpc/tasks/walker/task.xml b/mjpc/tasks/walker/task.xml
index 9bd702f31..c698c8db3 100644
--- a/mjpc/tasks/walker/task.xml
+++ b/mjpc/tasks/walker/task.xml
@@ -1,6 +1,7 @@
-
+
+
diff --git a/mjpc/tasks/walker/walker.xml b/mjpc/tasks/walker/walker.xml
deleted file mode 100644
index 448333408..000000000
--- a/mjpc/tasks/walker/walker.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mjpc/tasks/walker/walker.xml.patch b/mjpc/tasks/walker/walker.xml.patch
new file mode 100644
index 000000000..c421faa5a
--- /dev/null
+++ b/mjpc/tasks/walker/walker.xml.patch
@@ -0,0 +1,46 @@
+diff --git a/walker_modified.xml b/walker_modified.xml
+--- a/walker_modified.xml
++++ b/walker_modified.xml
+@@ -1,8 +1,4 @@
+-
+-
+-
+-
+-
++
+
+
+
+@@ -19,15 +15,18 @@
+
+
+
+-
++
++
++
+
+
+-
+-
++
++
+
+
+
+
++
+
+
+
+@@ -55,10 +54,6 @@
+
+
+
+-
+-
+-
+-
+
+
+
diff --git a/mjpc/test/direct/direct_optimize_test.cc b/mjpc/test/direct/direct_optimize_test.cc
index ee65f0bfd..498ca3a74 100644
--- a/mjpc/test/direct/direct_optimize_test.cc
+++ b/mjpc/test/direct/direct_optimize_test.cc
@@ -181,87 +181,5 @@ TEST(DirectOptimize, Box3D) {
mj_deleteModel(model);
}
-TEST(DirectOptimize, Quadruped) {
- // verbose
- bool verbose = false;
-
- // load model
- mjModel* model = LoadTestModel("estimator/quadruped/task.xml");
- mjData* data = mj_makeData(model);
-
- // discrete inverse dynamics
- model->opt.enableflags |= mjENBL_INVDISCRETE;
-
- // dimension
- int nq = model->nq, nv = model->nv, nu = model->nu;
- int ns = model->nsensordata;
-
- if (verbose) {
- printf("Quadruped dimensions:\n");
- printf("nq: %i\n", nq);
- printf("nv: %i\n", nv);
- printf("nu: %i\n", nu);
- printf("ns: %i\n", ns);
- }
-
- // ----- simulate ----- //
- int T = 64;
- if (verbose) printf("T: %i\n", T);
- Simulation sim(model, T);
- auto controller = [](double* ctrl, double time) {};
- sim.Rollout(controller);
-
- // ----- optimizer ----- //
-
- // initialize
- Direct optimizer(model, T);
- optimizer.settings.verbose_optimize = verbose;
- mju_copy(optimizer.configuration.Data(), sim.qpos.Data(), nq * T);
- mju_copy(optimizer.configuration_previous.Data(), sim.qpos.Data(), nq * T);
- mju_copy(optimizer.force_measurement.Data(), sim.qfrc_actuator.Data(),
- nv * T);
- mju_copy(optimizer.sensor_measurement.Data(), sim.sensor.Data(), ns * T);
-
- // ----- random perturbation ----- //
-
- // loop over configurations
- for (int t = 0; t < T; t++) {
- // unpack
- double* q = optimizer.configuration.Get(t);
- std::vector noise(nv);
- // add noise
- for (int i = 0; i < nv; i++) {
- // absl::BitGen gen_;
- noise[i] = 0.05; // * absl::Gaussian(gen_, 0.0, 1.0);
- }
- // integrate configuration
- mj_integratePos(model, q, noise.data(), 1.0);
- }
-
- // settings
- optimizer.settings.max_smoother_iterations = 1;
- optimizer.settings.max_search_iterations = 10;
-
- // set weights
- std::fill(optimizer.noise_process.begin(), optimizer.noise_process.end(),
- 1.0);
- std::fill(optimizer.noise_sensor.begin(), optimizer.noise_sensor.end(), 1.0);
-
- // optimize
- optimizer.Optimize();
-
- // error
- std::vector configuration_error(nq * T);
- mju_sub(configuration_error.data(), optimizer.configuration.Data(),
- sim.qpos.Data(), nq * T);
-
- // test cost decrease
- EXPECT_LE(optimizer.GetCost(), optimizer.GetCostInitial());
-
- // delete data + model
- mj_deleteData(data);
- mj_deleteModel(model);
-}
-
} // namespace
} // namespace mjpc
diff --git a/mjpc/test/testdata/box.xml b/mjpc/test/testdata/box.xml
index 2d153843c..750b776c4 100644
--- a/mjpc/test/testdata/box.xml
+++ b/mjpc/test/testdata/box.xml
@@ -24,15 +24,5 @@
-
-
-
diff --git a/mjpc/test/testdata/cartpole.xml b/mjpc/test/testdata/cartpole.xml
deleted file mode 100644
index ef43dbcd8..000000000
--- a/mjpc/test/testdata/cartpole.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mjpc/test/testdata/cartpole_residual.h b/mjpc/test/testdata/cartpole_residual.h
deleted file mode 100644
index 32e2732f4..000000000
--- a/mjpc/test/testdata/cartpole_residual.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2022 DeepMind Technologies Limited
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef MJPC_TASKS_CARTPOLE_RESIDUAL_H_
-#define MJPC_TASKS_CARTPOLE_RESIDUAL_H_
-
-#include
-#include
-#include "mjpc/task.h"
-#include
-
-class CartpoleTestTask : public mjpc::Task {
- public:
- CartpoleTestTask() : residual_(this) {}
- std::string Name() const override {return ""; }
- std::string XmlPath() const override { return ""; }
-
- private:
- class ResidualFn : public mjpc::BaseResidualFn {
- public:
- explicit ResidualFn(const CartpoleTestTask* task)
- : mjpc::BaseResidualFn(task) {}
- void Residual(const mjModel* model, const mjData* data,
- double* residual) const override {
- // goal position
- mju_copy(residual, data->qpos, model->nq);
- residual[1] -= 3.141592;
-
- // goal velocity
- mju_copy(residual + 2, data->qvel, model->nv);
-
- // action
- mju_copy(residual + 4, data->ctrl, model->nu);
- }
- };
- std::unique_ptr ResidualLocked() const override {
- return std::make_unique(residual_);
- }
- ResidualFn* InternalResidual() override { return &residual_; }
-
- ResidualFn residual_;
-};
-
-#endif // MJPC_TASKS_CARTPOLE_RESIDUAL_H_
diff --git a/mjpc/test/testdata/cartpole_task.xml b/mjpc/test/testdata/cartpole_task.xml
deleted file mode 100644
index ae7c286ed..000000000
--- a/mjpc/test/testdata/cartpole_task.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mjpc/test/testdata/estimator/box/task1.xml b/mjpc/test/testdata/estimator/box/task1.xml
deleted file mode 100644
index 18dd2b25c..000000000
--- a/mjpc/test/testdata/estimator/box/task1.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mjpc/test/testdata/estimator/box/task2.xml b/mjpc/test/testdata/estimator/box/task2.xml
deleted file mode 100644
index 20d7ab306..000000000
--- a/mjpc/test/testdata/estimator/box/task2.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mjpc/test/testdata/estimator/box/task3D.xml b/mjpc/test/testdata/estimator/box/task3D.xml
deleted file mode 100644
index 9d5ed7efd..000000000
--- a/mjpc/test/testdata/estimator/box/task3D.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mjpc/test/testdata/estimator/quadruped/a1.xml b/mjpc/test/testdata/estimator/quadruped/a1.xml
deleted file mode 100644
index 95194b773..000000000
--- a/mjpc/test/testdata/estimator/quadruped/a1.xml
+++ /dev/null
@@ -1,209 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mjpc/test/testdata/estimator/quadruped/task.xml b/mjpc/test/testdata/estimator/quadruped/task.xml
deleted file mode 100644
index 27d38f8f9..000000000
--- a/mjpc/test/testdata/estimator/quadruped/task.xml
+++ /dev/null
@@ -1,128 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-