Repository navigation
Conversation
Restore the hand and finger hierarchy, correct collision assets and naming references, and use CAD-derived hand COM/inertia at the community mass. Preserve the TCP at 186 mm from link7 across single-arm, bimanual and standalone models.
stevenaya
force-pushed
the
v1-model-fixing
branch
from
October 13, 2026 16:55
8356d44 to
a56a37c
Compare
kou
pushed a commit
to enactic/openarm_mujoco
that referenced
this pull request
Oct 16, 2026
) Recalculate V1 link7, hand and finger mass properties together using the **94 g L-bracket assembly**, **312 g assembled gripper**, the motor's **300 g nominal mass**, and [openarm_hardware 1.0.1, `STEP/OpenArm01_follower.step`](https://github.com/enactic/openarm_hardware/blob/1.0.1/STEP/OpenArm01_follower.step) for component geometry and mounting screws. | Body | Mass | | --- | --- | | `link7` | **0.405497127 kg** | | `hand` | **0.172311174 kg** | | Each finger | **0.074449987 kg** | These total 726.708274 g: the 300 g motor, the weighed 94 g and 312 g assemblies, and 20.708274 g of CAD mounting screws outside the weighed assemblies (11.497 g in `link7`, 9.211 g in `hand` and fingers). See the [measured allocation](enactic/openarm_description#79) for details. CAD COMs and tensors are transformed into each link frame and combined with the parallel-axis theorem. At 22 mm travel per finger, half of each rod's mass and inertia goes to hand and half to its finger. Link7 contains the motor, L-bracket and their mounting screws; hand contains the support, rail and rotor; fingers contain the translating assemblies. Apply COM-centered X-symmetry to link7 (`Ixy = Ixz = 0`) and mirror its left-arm COM and tensor in Y. Use identical hand/finger parameters on both arms, with finger body axes aligned to hand. Keep the `link7 → hand → fingers / TCP` hierarchy. The arm-body masses sum to **6.088692878 kg** for the single arm and **12.177385756 kg** for both arms, excluding the pedestal. Validation: CAD mass allocation, tensor validity and left/right symmetry checks pass. Both robot models and the V1 scene run 1000 steps without warnings.
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The V1 parallel gripper has inconsistent joint/mesh origins, invalid finger inertia tensors and inconsistent component mass assignments. Correct the gripper frames and collision geometry using openarm_mujoco#82, organize the end effector as
link7 → hand → fingers / TCP, and recalculate link7, hand and finger masses, COMs and inertias from measured assemblies and CAD. Use the same end-effector parameters in single-arm, bimanual and standalone models. Set the parallel-gripper joint limits to 150.75 N and 0.661 m/s using the V1 linkage geometry and DM4310 specifications.Split PRs
This Draft PR tracks the complete V1 changes. Each split PR covers one functional change; dependent model updates are validated with their prerequisites.
The example URDF update #82 and prefix fix #83 are ready for review. Remaining splits follow this order:
link7 → hand → fingers / TCP, with hand Z=100.1 mm and finger origins=(0, ±5, 15) mm in hand. Convert mesh/COM offsets together; preserve the existing 186 mm TCP until split 8.Regenerate the example URDF with each subsequent model change. Frame conversions keep geometry and inertial coordinates together. The broader component-directory refactor and dispatcher TCP-override support remain separate follow-ups.
Changes
Treat empty
arm_prefixlikeright_withreflect=+1. The default single arm uses unmirrored arm meshes, right-arm COM/inertia expressions and J7 axis+Y. Joint names, origins and limits retain the single-arm convention, including J2 at −100° to +100°.Use
link7 → hand → fingers / hand_tcp. Placehand100.1 mm fromlink7and finger origins at(0, ±5, 15)mm in the hand frame, or(0, ±5, 115.1)mm relative to link7. Adopt the Isaac Lab TCP reference at(0, 0, 0.1931)m relative tolink7, moving it forward from description's 186 mm reference. Use a 93 mm hand-local TCP offset (193.1 − 100.1) for single-arm, bimanual and standalone configurations, with TCP axes aligned to link7.Keep both finger link frames aligned with
hand. Rotate the opposing finger mesh by 180° about Z through its visual/collision origins, and express its mesh offset and COM in the unrotated link frame. Usefinger_joint1axis0 -1 0andfinger_joint2axis0 1 0, with mimic multiplier +1. Both fingers reuse one positively scaled mesh.Recalculate link7, hand and both fingers as a coordinated mass/COM/inertia update: 405.497127 g, 172.311174 g and 74.449987 g per finger. Use the CAD component allocation and measured masses below; apply the link7 X-symmetry approximation and the correct left-arm reflection.
Replace the legacy pedestal mass properties in V1 and V2 with 3.74 kg, COM (−0.016206894902, 0, 0.244091987626) m, and CAD-derived diagonal inertia (0.248946829107, 0.253033907704, 0.0140271775534) kg·m². Set all three cross terms to zero and retain the full base collision STL.
Copy hand and finger collision STL assets from MuJoCo, covering the hand rail and rounded ends and correcting the finger collision shape. Remove the accidentally exported Blender Cube from
link0.dae.Make the standalone parallel gripper call the same gripper macro as the complete robot, with
base_linkas its mounting frame. The standalone entry forwards its TCP arguments directly to the shared macro. Set TCP defaults in the shared macro and standalone entry, and share the configured joint limits.Set the shared parallel-gripper limits to
effort: 150.75andvelocity: 0.661for single-arm, bimanual and standalone configurations, and regenerate the example URDF.Fix
no_prefixreferences in gripper attachment, body mounting and single-arm ROS2 control joint names. Regenerate the V1 bimanual example URDF.Measured end-effector allocation
Source: openarm_hardware 1.0.1,
STEP/OpenArm01_follower.step, calibrated with the measured assemblies below.The motor uses its 300 g nominal mass. CAD fasteners add 20.708274 g outside the 94 g and 312 g weighed assemblies. The complete end assembly is therefore 726.708274 g. The four support-to-rail screws contribute a CAD estimate of 3.031322 g inside the 312 g measurement, leaving 63.968678 g for the plastic jaws and their mounting screws.
link7handCAD geometry supplies each part's COM and central inertia. Measured masses calibrate the part groups; the slider mass is fitted to the remaining measured mass. Transform each tensor into its receiving link frame, then combine it with the parallel-axis theorem. At 22 mm travel per finger, split each rod's mass and central inertia equally between hand and its finger, retaining the rod's CAD COM for both contributions. This preserves the assembly's spatial inertia at the reference opening while approximating the rod motion over the stroke.
Inertia entries below are about each body's COM, expressed in its link axes. The order is
(Ixx, Iyy, Izz, Ixy, Ixz, Iyz), in kg·m².link7(-0.000098974547, 0.003372444724, 0.061389197292)(3.63783092067e-4, 3.35119095023e-4, 1.86511272319e-4, 0, 0, 7.09488421932e-5)hand(0, 0, 0.005122940872)(2.50930641371e-4, 5.56062761675e-5, 2.90609333842e-4, 1.18380219510e-5, 0, 0)left_finger(-0.004646697332, 0.012178906515, 0.013352894473)(3.28426861725e-5, 4.17523619255e-5, 1.88211631821e-5, -4.81353477950e-7, -4.11024098296e-6, 3.50430778680e-6)right_finger(0.004646697332, -0.012178906515, 0.013352894473)(3.28426861725e-5, 4.17523619255e-5, 1.88211631821e-5, -4.81353477950e-7, 4.11024098296e-6, -3.50430778680e-6)Apply COM-centered X-symmetry to
link7:I_sym = (I + Sx I Sx)/2,Sx = diag(-1, 1, 1). This sets Ixy = Ixz = 0, retaining its mass, COM, diagonal terms and Iyz. The tensor changes by 0.0893% in Frobenius norm and removes the small CAD asymmetry that tilted the displayed inertia box horizontally. Mirror the leftlink7withSy = diag(1, -1, 1); the hand and finger assembly uses the same orientation on both arms.Pedestal mass properties
V1 and V2 use the same pedestal STL. The measured metal base is 3.55 kg, excluding the arm assemblies, their link0 attachment screws and the plastic chest cover. The cover weighs approximately 190 g, giving 3.74 kg for
body_link0.Integrate the public V1 STEP solids, apply their assembly transforms and combine their central inertias with the parallel-axis theorem. The metal assembly's CAD/material estimate is 3.667916108 kg; scale its mass and tensor by
3.55 / 3.667916108. Add the cover at 0.190 kg using its CAD mass distribution. Keep the resulting COM and diagonal terms, and set Ixy = Ixz = Iyz = 0 in the body-link axes.The body link remains in the URDF tree. Update both versions' configuration files and the body inertial blocks in their example URDFs.
Parallel gripper joint limits
finger_jointis prismatic: effort is in N and velocity is in m/s. Letqbe one finger's travel, so the total jaw opening is2q.The complete-robot macro previously hardcoded
effort=333andvelocity=10, while the standalone gripper read YAML valueseffort=9andvelocity=20.943946. Both now readfinger_joint.limitfrom the shared YAML, including lower/upper bounds. The table below compares the previous complete-robot values with the unified values.The V1 CAD linkage gives
J = |dq/dθ|between 0.0315659627 and 0.0464337254 m/rad over the 44 mm finger stroke. The minimum occurs at closure; the maximum occurs at a total opening of 50.4571 mm. Using the DM4310's 7 N·m peak torque and 200 rpm no-load maximum speed:effort7 / Jmax = 150.752496 NvelocityJmin × 200 × 2π / 60 = 0.661115976 m/sThe force limit uses the single active opening coordinate, with the other finger following through mimic, and matches openarm_mujoco#87. Torque and speed values describe separate peak-torque and no-load operating points. The existing linear position mapping in the ROS2 hardware interface is unchanged.
Open items
openarm_ros2::return_to_zero()sends the0.044 mgripper joint target directly as0.044 rad. Both the initial command and the loop commands needjoint_to_motor_radians(), producing −1.0472 rad for the existing 44 mm open target. The correction is prepared locally inopenarm_ros2for the later PR split.link7.Validation
Base update validated on
0f60e8f2; end-effector allocation was validated onbd269c85.(0, 0, 0.1931)m relative to link7, with aligned axes. Joint limits areeffort=150.75N andvelocity=0.661m/s.check_urdfandgit diff --checkpass.Related history