Repository navigation
Joint Model
For developers. How the addon attaches a robot to the ground, and where it keeps the joint values.
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_linkfallback inrbt_placement.py. Priority: BaseFrame datum → GroundedJoint →Reference1of the first joint.
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.
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.
Millimeters and degrees at the FreeCAD boundary. The kinematics backends convert internally. See Kinematics.