Skip to content

Joint Model

Nishendra Singh edited this page Aug 19, 2026 · 3 revisions

For developers. How the addon attaches a robot to the ground, and where it keeps the joint values.

BaseFrame root

Each robot roots at one editable BaseFrame LCS (App::LocalCoordinateSystem, name in BASE_FRAME_NAME) at the assembly root. There is no GroundedJoint object: the Assembly solver grounds a root-level unattached datum by itself (see getGroundedParts in FreeCAD's AssemblyObject.cpp).

  • Joint 0 connects BaseFrame → first part. The reference is (lcs, "Z_Axis."). The dot at the end means "whole object element".
  • The type of joint 0 sets the robot kind: Fixed = usual robot, Slider = rail, Revolute = turntable.
  • Move the BaseFrame to move the full robot. The placement sync is in App/rbt_placement.py.
  • Old documents with a GroundedJoint load through the base_link fallback in rbt_placement.py. Priority: BaseFrame datum → GroundedJoint → Reference1 of the first joint.

Joint values

The joint values live on the Offset2 property of the assembly joints:

  • Revolute: joint.Offset2 = App.Placement(Vector(), App.Rotation(yaw, 0, 0)): yaw around the Z axis of the joint's JCS, degrees.
  • Prismatic (Slider): Offset2.Base.z, millimeters.

Per-joint direction

The Assembly solver can align a child JCS in the same direction or Z-flipped. Thus the creator finds the rotation direction of each joint geometrically and keeps it on the robot in Robot_joints_dir.

Panel-space value = Offset2 value ÷ per-joint direction. The jog panel (Gui/taskpanel_rbt_animate.py) applies this. Thus a positive slider movement always turns the joint in the same direction.

Units

Millimeters and degrees at the FreeCAD boundary. The kinematics backends convert internally. See Kinematics.

Clone this wiki locally