Improvements related to models where joint-actuator relationship is not one-to-one:

- Add `joint-actuatorforcerange` for clamping total actuator force at joints. Add `sensor-jointactuatorfrc` for sensing total actuator forces on a single joint.
See [documentation](https://mujoco.readthedocs.io/en/latest//modeling.html#actuator-force-clamping) for justification and use cases.
- Add simple car model to `model/`.
- Move actuation-related test models into `engine/testdata/actuation/`.

PiperOrigin-RevId: 549355941
Change-Id: I27f6c1f80426d73a2811ef5ae74684a228b2fbd1
This commit is contained in:
Yuval Tassa
2023-07-19 10:28:24 -07:00
committed by Copybara-Service
parent 7603b07a20
commit 51aa375af0
29 changed files with 453 additions and 105 deletions
+47
View File
@@ -0,0 +1,47 @@
<mujoco>
<compiler autolimits="true"/>
<option density="1000"/>
<worldbody>
<geom type="plane" size="10 10 .1" rgba="1 1 1 1"/>
<light pos="0 0 20"/>
<site name="anchor_tendon" pos="0 0 9" size="0.03" rgba="0 0 1 1"/>
<body name="body_hinge" pos="5 0 3">
<geom type="box" size="1.5 .1 .1" pos="0 0 2.0"/>
<joint name="hinge" type="hinge" pos="0 0 2.0" axis="0 1 0" range="-25 5"/>
</body>
<body name="body_tendon" pos="0 0 5">
<freejoint/>
<geom type="box" size=".5 .5 .5"/>
<site name="box_tendon" pos=".5 .5 .5" rgba="0 0 1 1" size="0.03"/>
</body>
<body name="body_slider" pos="5 -2 2">
<geom type="box" size=".5 .5 .5"/>
<joint name="slider" type="slide" pos=".5 0 0" axis="1 0 0" range="-25 5"/>
</body>
<body name="body_site" pos="2 2 .5">
<freejoint/>
<geom type="box" size=".5 .5 .5"/>
<site name="box_site" pos="0 0 .5" rgba="0 0 1 1" size="0.1"/>
</body>
<body name="body_stateless" pos="5 2 2">
<geom type="box" size=".5 .5 .5"/>
<joint name="stateless" type="slide" pos=".5 0 0" axis="1 0 0" range="-25 5"/>
</body>
</worldbody>
<tendon>
<spatial name="tendon" limited="true" range="0 4" damping="100" width="0.03">
<site site="anchor_tendon"/>
<site site="box_tendon"/>
</spatial>
</tendon>
<actuator>
<general name="stateless" joint="stateless" ctrllimited="true" ctrlrange="-20 20"/>
<general name="hinge" joint="hinge" dyntype="integrator" ctrllimited="true" ctrlrange="-20 20"/>
<muscle name="tendon" tendon="tendon" ctrllimited="true" ctrlrange="0 2"/>
<general name="slider" joint="slider" dyntype="integrator" ctrllimited="true" ctrlrange="-20 20"/>
<general name="site" site="box_site" dyntype="integrator" gear="0 0 1 0 0 0" ctrllimited="true" ctrlrange="0 10000"/>
</actuator>
</mujoco>
+19
View File
@@ -0,0 +1,19 @@
<mujoco>
<compiler autolimits="true"/>
<option integrator="implicitfast"/>
<worldbody>
<geom type="plane" size="1 1 .01"/>
<light pos="0 0 2"/>
<body pos="0 0 .3">
<joint name="hinge" axis="0 1 0"/>
<geom type="capsule" size=".01" fromto="0 0 0 .2 0 0"/>
<geom size=".03" pos=".2 0 0"/>
</body>
</worldbody>
<actuator>
<damper name="damper" joint="hinge" kv="10" ctrlrange="0 1"/>
</actuator>
</mujoco>
+26
View File
@@ -0,0 +1,26 @@
<mujoco>
<compiler autolimits="true"/>
<option integrator="implicitfast"/>
<worldbody>
<geom type="plane" size="1 1 .01"/>
<light pos="0 0 2"/>
<body pos="0 0 .3">
<joint name="hinge" damping=".01" actuatorforcerange="-.4 .4"/>
<geom type="capsule" size=".01" fromto="0 0 0 .2 0 0"/>
<geom size=".03" pos=".2 0 0"/>
</body>
</worldbody>
<actuator>
<motor name="motor" joint="hinge" ctrlrange="-1 1"/>
<damper name="damper" joint="hinge" kv="10" ctrlrange="0 1"/>
</actuator>
<sensor>
<actuatorfrc name="motor" actuator="motor"/>
<actuatorfrc name="damper" actuator="damper"/>
<jointactuatorfrc name="hinge" joint="hinge"/>
</sensor>
</mujoco>
+72
View File
@@ -0,0 +1,72 @@
<mujoco>
<compiler autolimits="true"/>
<!--
Adding a high fluid viscosity and using implicit integration for extra stabillity.
Extra stabillity is required because the abstract "arm" model is not very realistic.
(e.g. 4 consecutive ball joints is not a realistic kinematic design)
-->
<option viscosity="10" integrator="implicit">
<flag gravity="disable" contact="disable"/>
</option>
<statistic meansize=".05"/>
<default>
<default class="translation">
<general gainprm="100" biasprm="0 -100 -10" biastype="affine" ctrlrange="-.25 .25"/>
</default>
<default class="rotation">
<!--
Note that the rotational control range is purposefully limited to (-pi/2, pi/2) to avoid the
documented instabillity near pi, which is due to taking quaternion differences.
Increase this range to pi or bigger in order to see the instabillity.
See here for more details https://mujoco.readthedocs.io/en/latest/XMLreference.html#actuator
-->
<general gainprm=".5" biasprm="0 -.5 -.05" biastype="affine" ctrlrange="-1.571 1.571"/>
</default>
<!--
Clamping the total actuator torque at the joints means that the motion produced by the Cartesian
commands is achievable by individual joint actuators with the specified torque limits.
See https://mujoco.readthedocs.io/en/latest//modeling.html#actuator-force-clamping
-->
<joint stiffness="1e-1" actuatorforcerange="-1 1"/>
<site type="box" size=".012 .012 .012" rgba=".7 .7 .8 1"/>
</default>
<worldbody>
<light pos="0 0 2"/>
<geom type="box" size=".25 .25 .01" pos="0 0 -.01"/>
<site name="reference" pos="0 0 .25"/>
<body name="arm" pos="-.25 .25 0">
<joint axis="1 0 0"/>
<joint axis="0 1 0"/>
<geom type="box" size=".01" fromto="0 0 0 0 0 .25"/>
<body pos="0 0 .25">
<joint axis="0 1 0"/>
<joint axis="0 0 1"/>
<geom type="box" size=".01" fromto="0 0 0 .25 0 0"/>
<body pos=".25 0 0">
<joint axis="1 0 0"/>
<joint axis="0 0 1"/>
<geom type="box" size=".01" fromto="0 0 0 0 -.2 0"/>
<body pos="0 -.2 0">
<joint axis="1 0 0"/>
<joint axis="0 0 1"/>
<joint axis="0 1 0"/>
<geom type="box" size=".01" fromto="0 0 0 0 -.05 0"/>
<site name="end_effector" pos="0 -.05 0"/>
</body>
</body>
</body>
</body>
</worldbody>
<actuator>
<general name="x" site="end_effector" refsite="reference" gear="1 0 0 0 0 0" class="translation"/>
<general name="y" site="end_effector" refsite="reference" gear="0 1 0 0 0 0" class="translation"/>
<general name="z" site="end_effector" refsite="reference" gear="0 0 1 0 0 0" class="translation"/>
<general name="rx" site="end_effector" refsite="reference" gear="0 0 0 1 0 0" class="rotation"/>
<general name="ry" site="end_effector" refsite="reference" gear="0 0 0 0 1 0" class="rotation"/>
<general name="rz" site="end_effector" refsite="reference" gear="0 0 0 0 0 1" class="rotation"/>
</actuator>
</mujoco>
+25
View File
@@ -0,0 +1,25 @@
<mujoco>
<option density="1000">
<flag gravity="disable"/>
</option>
<worldbody>
<geom type="plane" size="10 10 .1" rgba="1 1 1 1"/>
<light pos="0 0 20"/>
<body name="body_stateless" pos="0 0 .5">
<freejoint/>
<geom type="box" size=".5 .5 .1" pos="0 0 .4"/>
<site name="capsule" pos=".5 .5 .5" rgba="0 0 1 1" size=".1 .1" type="capsule"/>
<site name="ellipsoid" pos=".5 -.5 .5" rgba="0 0 1 1" size=".1 .3 .1" type="ellipsoid" euler="0 0 -45"/>
<site name="cylinder" pos="0 0 .5" rgba="0 0 1 1" size=".2 .1" type="cylinder"/>
<site name="box" pos="-.5 -.5 .5" rgba="0 0 1 1" size=".1 .1 .2" type="box"/>
</body>
</worldbody>
<actuator>
<general name="ellipsoid" site="ellipsoid" gear="0 1 0 0 0 0" ctrllimited="true" ctrlrange="-100 100"/>
<general name="cylinder" site="cylinder" gear="0 0 0 0 0 1" ctrllimited="true" ctrlrange="-100 100"/>
<general name="box" site="box" dyntype="integrator" gear="0 0 1 0 0 0" ctrllimited="true" ctrlrange="-100 100"/>
<general name="capsule" site="capsule" dyntype="integrator" gear="0 0 1 0 0 0" ctrllimited="true" ctrlrange="-100 100"/>
</actuator>
</mujoco>