Joints

Joint editor panel

In a robotic system’s kinematic chain, a joint is the fundamental connection that defines the relative motion between two structural links. Much like the human body, the type of joint determines exactly how the attached parts can move. For instance, you might use a revolute joint to model a spinning shoulder or a knee hinge, a prismatic joint to constrain a linear sliding track, or a free/floating joint to represent the unconstrained motion of a drone traversing 3D space.

ARMOR allows you to configure joint limits, damping, and initial poses dynamically. Each field in the editor maps directly to a property in the underlying URDF — allowing you to work with structural form controls rather than writing raw XML by hand. For the complete specification, see the official ROS URDF joint documentation.

Editor Interface

When managing a joint’s properties in the ARMOR editor, the input methods are structurally mapped to prevent formatting errors and guarantee URDF validation:

Joints can be edited in two ways:

See Robot Editor for a full description of each variant.

URDF Joint Structure

A URDF <joint> tag specifies multiple distinct elements governing its kinematics and physical properties. All defined fields in the URDF standard are fully accessible within the ARMOR editor:

Core Properties

Field Description
Name A string uniquely identifying the joint within the robot.
Type Selecting the joint’s kinematic behavior (mapped via picker).
Parent Link The foundational link attached to the joint (mapped via constrained picker).
Child Link The dependent link whose movement is dictated by the joint (mapped via constrained picker).

Geometry & Kinematics

Field Description
Origin The spatial transform setting the position (x, y, z) and orientation (roll, pitch, yaw) of the joint frame relative to the parent link frame.
Axis A normalized vector (x, y, z) defining the axis of rotation for revolute constraints or the axis of translation for prismatic joints.

Limits (revolute & prismatic)

The Limits block establishes the physical boundary conditions and maximum exertion capabilities of the joint:

Field Description
Lower Minimum position in radians (revolute) or metres (prismatic).
Upper Maximum position in radians (revolute) or metres (prismatic).
Effort Maximum force or torque the joint can transmit.
Velocity Maximum velocity the joint can physically reach.

Dynamics

Controls how the joint behaves under dynamic simulation conditions (e.g. in MuJoCo):

Field Description
Damping Resistance proportional to velocity. Higher values produce smoother, slower motion.
Friction Static friction at the joint: the constant resistance the joint must overcome before it starts to move.

Advanced Constraints

Field Description
Calibration Used to set the reference rising or falling positions for the joint’s absolute reference point.
Mimic Forces the joint to mimic the position of a different joint in the system, mathematically bound utilizing a multiplier and offset.
Safety Controller Determines joint movement boundaries dynamically (soft limits, k_position, k_velocity) to gently prevent self-collision or over-exertion as the joint approaches its hard boundaries.

Joint Types

Type Degrees of Freedom Notes
revolute 1 (rotation, limited) Most common for arm joints
continuous 1 (rotation, unlimited) Wheels, spinners
prismatic 1 (translation, limited) Linear actuators
fixed 0 Rigid connection between links
floating 6 (rotation and translation) Unconstrained motion (drones)
planar 3 (translation/rotation) Moving on a flat 2D plane

Mimic Joints in Simulation

A URDF <mimic joint="..." multiplier="..." offset="..."/> makes one joint follow another: the second finger of a gripper that moves with the first, or the rods of a parallelogram linkage. In the editor you set it with the Mimic fields above: the joint to follow, a multiplier (default 1), and an offset (default 0).

When the robot loads, ARMOR turns each valid mimic into a real MuJoCo equality constraint. When you press Play, the follower tracks multiplier × driver + offset, instead of falling or swinging on its own. Chains of mimic joints work too, including parallelogram linkages built from several stacked mimics, such as the MR-3 Mini from Modena Robotics and the HighTorque Mini Hi.

The constraint is deliberately stiff, because a mimic stands for a rigid mechanical coupling, not a spring. A soft constraint would let a loaded chain of mimics sag visibly away from its target.

ARMOR skips a mimic without showing an error when:

A skipped mimic is still saved in the URDF, but it has no effect on the simulation.

Writing it by hand in MJCF

If you write the equivalent constraint yourself in MuJoCo’s <equality> block, note the order of the attributes. In <joint joint1="..." joint2="..." polycoef="..."/>, joint1 is the dependent joint and joint2 is the one it follows, which is the reverse of how most people read it. The constraint is joint1 = polycoef[0] + polycoef[1] × joint2 + ..., so a URDF mimic becomes:

<equality>
  <joint joint1="follower" joint2="driver" polycoef="offset multiplier 0 0 0"/>
</equality>